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 ==================================================================================
23 Mnemonic: tools_testh.c
24 Abstract: Unit tests for the RMr tools module.
25 Author: E. Scott Daniels
39 #include <semaphore.h>
42 #include "rmr_agnostic.h"
43 #include "test_support.c" // our private library of test tools
45 // ===== dummy context for tools testing so we don't have to pull in all of the nano/nng specific stuff =====
47 char* my_name; // dns name of this host to set in sender field of a message
48 int shutdown; // thread notification if we need to tell them to stop
49 int max_mlen; // max message length payload+header
50 int max_plen; // max payload length
51 int flags; // CTXFL_ constants
52 int nrtele; // number of elements in the routing table
53 int send_retries; // number of retries send_msg() should attempt if eagain/timeout indicated by nng
54 //nng_socket nn_sock; // our general listen socket
55 route_table_t* rtable; // the active route table
56 route_table_t* old_rtable; // the previously used rt, sits here to allow for draining
57 route_table_t* new_rtable; // route table under construction
58 if_addrs_t* ip_list; // list manager of the IP addresses that are on our known interfaces
59 void* mring; // ring where msgs are queued while waiting for a call response msg
61 char* rtg_addr; // addr/port of the route table generation publisher
62 int rtg_port; // the port that the rtg listens on
64 wh_mgt_t* wormholes; // management of user opened wormholes
65 //epoll_stuff_t* eps; // epoll information needed for the rcv with timeout call
67 //pthread_t rtc_th; // thread info for the rtc listener
71 #include "tools_static.c"
79 char* buf = "2,Fred,Wilma,Barney,Betty,Dino,Pebbles,Bambam,Mr. Slate,Gazoo";
80 char* dbuf; // duplicated buf since C marks a const string is unumtable
82 uta_ctx_t ctx; // context for uta_lookup test
86 // ------------------ tokenise tests -----------------------------------------------------------
88 i = uta_tokenise( dbuf, tokens, 127, ',' );
89 errors += fail_not_equal( i, 10, "unexpected number of tokens returned (comma sep)" );
90 for( j = 0; j < i; j++ ) {
91 //fprintf( stderr, ">>>> [%d] (%s)\n", j, tokens[j] );
92 errors += fail_if_nil( tokens[j], "token from buffer" );
94 errors += fail_not_equal( strcmp( tokens[4], "Betty" ), 0, "4th token wasn't 'Betty'" );
98 i = uta_tokenise( dbuf, tokens, 127, '|' );
99 errors += fail_not_equal( i, 1, "unexpected number of tokens returned (bar sep)" );
102 // ------------ has str tests -----------------------------------------------------------------
103 j = uta_has_str( buf, "Mr. Slate", ',', 1 ); // should fail (-1) because user should use strcmp in this situation
104 errors += fail_if_true( j >= 0, "test to ensure has str rejects small max" );
106 j = uta_has_str( buf, "Mr. Slate", ',', 27 );
107 errors += fail_if_true( j < 0, "has string did not find Mr. Slate" );
109 j = uta_has_str( buf, "Mrs. Slate", ',', 27 );
110 errors += fail_if_true( j >= 0, "has string not found Mrs. Slate" );
112 // ------------ host name 2 ip tests ---------------------------------------------------------
113 hname = uta_h2ip( "192.168.1.2" );
114 errors += fail_not_equal( strcmp( hname, "192.168.1.2" ), 0, "h2ip did not return IP address when given address" );
115 errors += fail_if_nil( hname, "h2ip did not return a pointer" );
117 hname = uta_h2ip( "yahoo.com" );
118 errors += fail_if_nil( hname, "h2ip did not return a pointer" );
120 hname = uta_h2ip( "yahoo.com:1234" ); // should ignore the port
121 errors += fail_if_nil( hname, "h2ip did not return a pointer" );
123 // ------------ rtg lookup test -------------------------------------------------------------
127 i = uta_lookup_rtg( NULL ); // ensure it handles a nil context
128 errors += fail_if_true( i, "rtg lookup returned that it found something when not expected to (nil context)" );
130 setenv( "RMR_RTG_SVC", "localhost:1234", 1);
131 i = uta_lookup_rtg( &ctx );
132 errors += fail_if_false( i, "rtg lookup returned that it did not find something when expected to" );
133 errors += fail_if_nil( ctx.rtg_addr, "rtg lookup did not return a pointer (with port)" );
134 errors += fail_not_equal( ctx.rtg_port, 1234, "rtg lookup did not capture the port" );
136 setenv( "RMR_RTG_SVC", "localhost", 1); // test ability to generate default port
137 uta_lookup_rtg( &ctx );
138 errors += fail_if_nil( ctx.rtg_addr, "rtg lookup did not return a pointer (no port)" );
139 errors += fail_not_equal( ctx.rtg_port, 5656, "rtg lookup did not return default port" );
141 unsetenv( "RMR_RTG_SVC" ); // this should fail as the default name (rtg) will be unknown during testing
142 i = uta_lookup_rtg( &ctx );
143 errors += fail_if_true( i, "rtg lookup returned that it found something when not expected to" );
146 // ------------ my ip stuff -----------------------------------------------------------------
148 if_list = mk_ip_list( "1235" );
149 errors += fail_if_nil( if_list, "mk_ip_list returned nil pointer" );
151 i = has_myip( NULL, NULL, ',', 128 ); // should be false if pointers are nil
152 errors += fail_if_true( i, "has_myip returned true when given nil buffer" );
154 i = has_myip( "buffer contents not valid", NULL, ',', 128 ); // should be false if pointers are nil
155 errors += fail_if_true( i, "has_myip returned true when given nil list" );
157 i = has_myip( "buffer contents not valid", NULL, ',', 1 ); // should be false if max < 2
158 errors += fail_if_true( i, "has_myip returned true when given small max value" );
160 i = has_myip( "buffer.contents.not.valid", if_list, ',', 128 ); // should be false as there is nothing valid in the list
161 errors += fail_if_true( i, "has_myip returned true when given a buffer with no valid info" );
164 setenv( "RMR_BIND_IF", "192.168.4.30", 1 ); // drive the case where we have a hard set interface; and set known interface in list
165 if_list = mk_ip_list( "1235" );
166 errors += fail_if_nil( if_list, "mk_ip_list with env set returned nil pointer" );
168 i = has_myip( "192.168.1.2:1235,192.168.4.30:1235,192.168.2.19:4567", if_list, ',', 128 ); // should find our ip in middle
169 errors += fail_if_false( i, "has_myip did not find IP in middle of list" );
171 i = has_myip( "192.168.4.30:1235,192.168.2.19:4567,192.168.2.19:2222", if_list, ',', 128 ); // should find our ip at head
172 errors += fail_if_false( i, "has_myip did not find IP at head of list" );
174 i = has_myip( "192.168.23.45:4444,192.168.1.2:1235,192.168.4.30:1235", if_list, ',', 128 ); // should find our ip at end
175 errors += fail_if_false( i, "has_myip did not find IP at tail of list" );
177 i = has_myip( "192.168.4.30:1235", if_list, ',', 128 ); // should find our ip when only in list
178 errors += fail_if_false( i, "has_myip did not find IP when only one in list" );
180 return errors > 0; // overall exit code bad if errors