1 // : vi ts=4 sw=4 noet :
3 ==================================================================================
4 Copyright (c) 2019 Nokia
5 Copyright (c) 2018-2019 AT&T Intellectual Property.
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 ==================================================================================
22 Mmemonic: rt_static_test.c
23 Abstract: Test the route table funcitons. These are meant to be included at compile
24 time by the test driver.
26 Author: E. Scott Daniels
38 #include "../src/common/include/rmr.h"
39 #include "../src/common/include/rmr_agnostic.h"
41 typedef struct entry_info {
47 Create a dummy endpoint for some direct function calls.
49 static endpoint_t* mk_ep( char* name ) {
52 ep = (endpoint_t *) malloc( sizeof( struct endpoint ) );
53 ep->name = strdup( name );
54 ep->proto = strdup( "tcp" );
55 ep->addr = strdup( "address" );
64 This is the main route table test. It sets up a very specific table
65 for testing (not via the generic setup function for other test
68 static int rt_test( ) {
69 uta_ctx_t* ctx; // context needed to test load static rt
70 route_table_t* rt; // route table
71 route_table_t* crt; // cloned route table
72 rtable_ent_t* rte; // entry in the table
73 endpoint_t* ep; // endpoint added
74 int more = 0; // more flag from round robin
75 int errors = 0; // number errors found
81 ei_t entries[50]; // end point information
82 int gcounts[5]; // number of groups in this set
83 int ecounts[5]; // number of elements per group
84 int mtypes[5]; // msg type for each group set
90 char* seed_fname; // seed file
93 setenv( "ENV_VERBOSE_FILE", ".ut_rmr_verbose", 1 ); // allow for verbose code in rtc to be driven
94 i = open( ".ut_rmr_verbose", O_RDWR | O_CREAT, 0644 );
100 gcounts[0] = 1; // build entry info -- this is hackish, but saves writing another parser
103 entries[enu].group = 0; entries[enu].ep_name = "yahoo.com:4561"; enu++; // use a dns resolvable name to test that
104 entries[enu].group = 0; entries[enu].ep_name = "localhost:4562"; enu++; // rest can default to some dummy ip
109 entries[enu].group = 0; entries[enu].ep_name = "localhost:4561"; enu++;
110 entries[enu].group = 0; entries[enu].ep_name = "localhost:4568"; enu++;
111 entries[enu].group = 0; entries[enu].ep_name = "localhost:4569"; enu++;
113 gcounts[2] = 0; // 0 groups means use same rte, this is the next gropup
116 entries[enu].group = 1; entries[enu].ep_name = "localhost:4561"; enu++;
117 entries[enu].group = 1; entries[enu].ep_name = "localhost:4562"; enu++;
119 gcounts[3] = 1; // 0 groups means use same rte, this is the next gropup
122 entries[enu].group = 0; entries[enu].ep_name = "localhost:4563"; enu++;
123 entries[enu].group = 0; entries[enu].ep_name = "localhost:4564"; enu++;
125 gcounts[4] = 1; // 0 groups means use same rte, this is the next gropup
128 entries[enu].group = 0; entries[enu].ep_name = "localhost:4565"; enu++;
131 rt = uta_rt_init( ); // get us a route table
132 if( (errors += fail_if_nil( rt, "pointer to route table" )) ) {
133 fprintf( stderr, "<FAIL> abort: cannot continue without a route table\n" );
139 for( i = 0; i < sizeof( gcounts )/sizeof( int ); i++ ) { // add entries defined above
141 rte = uta_add_rte( rt, mtypes[i], gcounts[i] ); // get/create entry for message type
142 if( (errors += fail_if_nil( rte, "route table entry" )) ) {
143 fprintf( stderr, "<FAIL> abort: cannot continue without a route table entry\n" );
148 fprintf( stderr, "<SNAFU> internal testing error -- rte was nil for gcount == 0\n" );
153 for( k = 0; k < ecounts[i]; k++ ) {
154 ep = uta_add_ep( rt, rte, entries[enu].ep_name, entries[enu].group );
155 errors += fail_if_nil( ep, "endpoint" );
160 crt = uta_rt_clone( rt );
161 errors += fail_if_nil( crt, "cloned route table" );
163 ep = uta_get_ep( rt, "localhost:4561" );
164 errors += fail_if_nil( ep, "end point (fetch by name)" );
165 ep = uta_get_ep( rt, "bad_name:4560" );
166 errors += fail_not_nil( ep, "end point (fetch by name with bad name)" );
168 state = uta_epsock_byname( rt, "localhost:4561" ); // this should be found
169 errors += fail_if_true( state < 0, "socket (by name) returned socket less than 0 when expected >= 0 socket" );
172 for( i = 0; i < 10; i++ ) { // round robin return value should be different each time
173 value = uta_epsock_rr( rt, 1, 0, &more ); // nano returns the socket which should be different than the last call
174 errors += fail_if_equal( value, alt_value, "round robiin sockets with multiple end points" );
175 errors += fail_if_false( more, "more for mtype==1" );
180 for( i = 0; i < 10; i++ ) { // this mtype has only one endpoint, so rr should be same each time
181 value = uta_epsock_rr( rt, 3, 0, NULL ); // also test ability to deal properly with nil more pointer
183 errors += fail_not_equal( value, alt_value, "round robin sockets with one endpoint" );
184 errors += fail_not_equal( more, -1, "more value changed in single group instance" );
189 value = uta_epsock_rr( rt, 289486, 0, &more ); // non-existant message type; should return false (0)
190 errors += fail_if_true( value >= 0, "socket for bad hash key was valid" );
192 uta_rt_clone( NULL ); // verify null parms don't crash things
194 uta_epsock_rr( NULL, 1, 0, &more ); // drive null case for coverage
195 uta_add_rte( NULL, 99, 1 );
197 fprintf( stderr, "<INFO> adding end points with nil data; warnings from RMr code are expected\n" );
198 uta_add_ep( NULL, NULL, "foo", 1 );
199 uta_add_ep( rt, NULL, "foo", 1 );
201 buf = uta_fib( ".gitignore" );
202 errors += fail_if_nil( buf, "buffer from read file into buffer" );
206 buf = uta_fib( "no-file" );
207 errors += fail_if_nil( buf, "buffer from read file into buffer (no file)" );
216 if( (ctx = (uta_ctx_t *) malloc( sizeof( uta_ctx_t ) )) != NULL ) {
217 memset( ctx, 0, sizeof( *ctx ) );
219 if( (seed_fname = getenv( "RMR_SEED_RT" )) != NULL ) {
220 if( ! (fail_if_nil( rt, "pointer to rt for load test" )) ) {
221 read_static_rt( ctx, 0 );
222 unsetenv( "RMR_SEED_RT" ); // unset to test the does not exist condition
223 read_static_rt( ctx, 0 );
225 fprintf( stderr, "<FAIL> cannot gen rt for load test\n" );
228 read_static_rt( ctx, 0 ); // not defined, just drive for that one case
232 uta_fib( "no-suhch-file" ); // drive some error checking for coverage
234 rt = uta_rt_init( ); // get us a route table
235 state = uta_link2( NULL );
236 errors += fail_not_equal( state, -1, "link2 did not return (a==) -1 when given nil pointers" );
239 state = rt_link2_ep( NULL );
240 errors += fail_not_equal( state, 0, "link2_ep did not return (a) bad when given nil pointers" );
242 state = rt_link2_ep( ep );
243 errors += fail_not_equal( state, 1, "link2_ep did not return (a) bad when given an ep to use to open" );
246 state = rt_link2_ep( ep );
247 errors += fail_not_equal( state, 1, "link2_ep did not return (a) bad when given an ep which was set open" );
249 state = uta_epsock_rr( rt, 122, 0, NULL );
250 errors += fail_not_equal( state, -1, "uta_epsock_rr returned bad state when given nil socket pointer" );
252 state = uta_epsock_rr( rt, 0, -1, NULL );
253 errors += fail_not_equal( state, -1, "uta_epsock_rr returned bad state (a) when given negative group number" );
255 state = rt_link2_ep( NULL );
256 errors += fail_if_equal( state, -1, "call to link2_ep with nil ep returned true when false expected" );
259 return !!errors; // 1 or 0 regardless of count