1 // : vi ts=4 sw=4 noet :
3 ==================================================================================
4 Copyright (c) 2020 Nokia
5 Copyright (c) 2020 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: sr_si_static_test.c
23 Abstract: Test the send/receive funcitons. These are meant to be included at compile
24 time by the test driver.
26 Author: E. Scott Daniels
27 Date: 21 February 2020
38 #include <semaphore.h>
41 #include "rmr_agnostic.h"
43 // ----------- local test support ----------------------------------------------------------
44 #define CLONE 1 // convenience constants for payload realloc tests
50 Drive the send and receive functions. We also drive as much of the route
51 table collector as is possible without a real rtg process running somewhere.
53 Send and receive functions are indirectly exercised from the rmr_si_static_test
54 module as it tests the user facing send/receive/call/rts functions. These tests
55 should exercise specific cases for the internal functions as they will not
56 specifically be driven elsewhere.
58 This requires the gen_rt funcition that is in the test_gen_rt module and should
59 have been included by the test module(s) which include this.
61 static int sr_si_test() {
62 uta_ctx_t* ctx; // context needed to test load static rt
63 uta_ctx_t* real_ctx; // real one to force odd situations for error testing
64 int errors = 0; // number errors found
65 rmr_mbuf_t* mbuf; // mbuf to send/receive
66 rmr_mbuf_t* mb2; // second mbuf when needed
70 int nn_dummy_sock; // dummy needed to drive send
76 ctx = mk_dummy_ctx(); // in the si world we need some rings in the context
78 ctx->max_plen = RMR_MAX_RCV_BYTES + sizeof( uta_mhdr_t );
79 ctx->max_mlen = ctx->max_plen + sizeof( uta_mhdr_t );
80 ctx->my_name = strdup( "dummy-test" );
81 ctx->my_ip = strdup( "30.4.19.86:1111" );
82 uta_lookup_rtg( ctx );
84 gen_rt( ctx ); // forces a static load with some known info since we don't start the rtc()
85 gen_rt( ctx ); // force a second load to test cloning
87 p = rt_ensure_ep( NULL, "foo" ); // drive for coverage
88 errors += fail_not_nil( p, "rt_ensure_ep did not return nil when given nil route table" );
90 state = rmr_ready( NULL );
91 errors += fail_if_true( state, "reported ready when given a nil context" );
92 state = rmr_ready( ctx );
93 errors += fail_if_false( state, "reported not ready when it should be" );
96 rcv_msg under SI is deprecated -- do not attempt to call
97 mbuf = rcv_msg( ctx, NULL );
98 errors += fail_if_nil( mbuf, "no mbuf returned on receive test" );
101 mbuf = rmr_alloc_msg( ctx, 2048 );
105 mb2 = clone_msg( mbuf );
106 errors += fail_if_nil( mb2, "clone message returned nil pointer" );
107 errors += fail_not_equal( mbuf->flags, mb2->flags, "clone did not duplicate flags" );
108 errors += fail_not_equal( mbuf->alloc_len, mb2->alloc_len, "clone did not dup alloc-len" );
109 errors += fail_not_equal( mbuf->state, mb2->state, "clone did not dup state" );
112 mbuf = rmr_send_msg( NULL, mbuf );
113 errors += fail_if_nil( mbuf, "send with nil context but buffere didn't return buffer" );
115 errors += fail_not_equal( mbuf->state, RMR_ERR_BADARG, "send with buffer but nil context didn't return right state" );
117 //mbuf = rmr_rcv_msg( ctx, NULL );
118 mbuf = rmr_alloc_msg( ctx, 2048 );
121 //size = 2048 - em_hdr_size(); // emulated receive allocates 2K buffers -- subtract off header size
123 state = rmr_payload_size( mbuf );
124 errors += fail_not_equal( state, size, "payload size didn't return expected value" ); // receive should always give 4k buffer
126 rmr_free_msg( mbuf );
129 // ---- drive rtc in a 'static' (not pthreaded) mode to get some coverage; no 'results' to be verified -----
130 setenv( ENV_RTG_RAW, "0", 1 ); // rtc is never raw under SI
131 setenv( ENV_VERBOSE_FILE, ".ut_rmr_verbose", 1 ); // allow for verbose code in rtc to be driven
132 i = open( ".ut_rmr_verbose", O_RDWR | O_CREAT, 0654 );
134 write( i, "2\n", 2 );
137 ctx->shutdown = 1; // should force rtc to quit on first pass
138 rtc( NULL ); // coverage test with nil pointer
142 setenv( "RMR_RTG_SVC", "4567", 1 ); // drive for edge case coverage to ensure no nil pointer etc
144 setenv( "RMR_RTG_SVC", "tcp:4567", 1 );
146 setenv( "RMR_RTG_SVC", "tcp:4567:error", 1 );
150 // ------------- reallocation tests ------------------------------------------------------------
151 // we use mk_populated_msg() to create a message with mid/sid/plen pushed into the transport
152 // header to simulate a message having been sent and received which is what causes this data
153 // to push into the wire packet.
155 payload_str = "Stand Up and Cheer; OU78-82";
158 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
159 memcpy( mbuf->payload, payload_str, mbuf->len );
160 mb2 = realloc_payload( mbuf, 512, NO_COPY, NO_CLONE );
161 errors += fail_if_nil( mb2, "realloc_payload (no copy) returned a nil pointer when reallocating with smaller size" );
162 errors += fail_if_false( mbuf == mb2, "non-clone realloc payload (no copy) of smaller size did not return the same buffer" );
164 mb2 = realloc_payload( NULL, 512, NO_COPY, NO_CLONE );
165 errors += fail_not_nil( mb2, "realloc payload did not return nil pointer when passed nil mbuf" );
167 mb2 = realloc_payload( mbuf, 0, NO_COPY, NO_CLONE );
168 errors += fail_not_nil( mb2, "realloc payload did not return nil pointer when passed bad len" );
170 fprintf( stderr, "<TEST> no copy/no clone test starts\n" );
171 mb2 = realloc_payload( mbuf, 2048, NO_COPY, NO_CLONE );
172 errors += fail_if_false( mbuf == mb2, "realloc payload (no copy) of larger size did not return the same msg buffer(1)" );
173 errors += fail_not_equal( mb2->mtype, -1, "realloc payload (no copy) did not reset mtype(a) to expected(b) value" );
174 errors += fail_not_equal( mb2->sub_id, -1, "realloc payload (no copy) did not reset sub-id(a) to expected(b) value" );
175 errors += fail_if_nil( mb2, "realloc payload returned (no copy) a nil pointer when increasing payload len" );
176 errors += fail_not_equal( mb2->len, 0, "realloc payload payload len(a) not expected(b):" );
177 errors += fail_not_equal( rmr_payload_size( mb2), 2048, "realloc payload alloc len(a) not expected(b)" );
179 fprintf( stderr, "<TEST> copy/no clone test starts\n" );
180 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
181 memcpy( mbuf->payload, payload_str, mbuf->len );
182 mb2 = realloc_payload( mbuf, 2048, COPY, NO_CLONE );
183 errors += fail_if_false( mbuf == mb2, "non-clone realloc payload (copy) of larger size did not return the same msg buffer(2)" );
184 errors += fail_if_nil( mb2, "realloc payload (copy) returned a nil pointer when increasing payload len)" );
185 errors += fail_not_equal( mb2->mtype, 99, "realloc payload (copy) did not reset mtype(a) to expected(b) value" );
186 errors += fail_not_equal( mb2->sub_id, 100, "realloc payload (copy) did not reset sub-id(a) to expected(b) value" );
187 errors += fail_if_equal( mb2->len, 0, "realloc payload (copy) msg len(a) not expected(b)" );
188 errors += fail_not_equal( rmr_payload_size( mb2), 2048, "realloc payload (copy) alloc len(a) not expected(b)" );
189 errors += fail_not_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(copy) didn't copy payload" );
191 fprintf( stderr, "<TEST> copy/clone test starts requested buffer smaller than original\n" );
192 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
193 memcpy( mbuf->payload, payload_str, mbuf->len );
194 mb2 = realloc_payload( mbuf, 512, COPY, CLONE );
195 errors += fail_if_true( mbuf == mb2, "realloc payload (clone+copy) of larger size did not return different message buffers" );
196 errors += fail_if_nil( mb2, "realloc payload (clone+copy) returned a nil pointer when increasing payload len)" );
197 errors += fail_not_equal( mb2->mtype, 99, "realloc payload (clone+copy) did not reset mtype(a) to expected(b) value" );
198 errors += fail_not_equal( mb2->sub_id, 100, "realloc payload (clone+copy) did not reset sub-id(a) to expected(b) value" );
199 errors += fail_not_equal( mb2->len, strlen( payload_str ), "realloc payload (clone+copy) msg len(a) not expected(b)" );
200 errors += fail_not_equal( rmr_payload_size( mb2), 1024, "realloc payload (clone+copy) alloc len(a) not expected(b)" );
201 errors += fail_not_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(clone+copy) didn't copy payload" );
203 // with a clone, we must verify that original message looks sane too
204 errors += fail_not_equal( mbuf->mtype, 99, "realloc payload (clone+copy) validation of unchanged mbuf->mtype fails" );
205 errors += fail_not_equal( mbuf->sub_id, 100, "realloc payload (clone+copy) validation of unchanged mbuf->subid fails" );
206 errors += fail_not_equal( mbuf->len, strlen( payload_str ), "realloc payload (clone+copy) validation of unchanged payload len fails" );
207 errors += fail_not_equal( rmr_payload_size( mbuf ), 1024, "realloc payload (clone+copy) validation of unchanged alloc length fails" );
208 errors += fail_not_equal( strncmp( payload_str, mbuf->payload, strlen( payload_str )), 0, "realloc payload(clone+copy) validation of unchanged payload fails" );
211 fprintf( stderr, "<TEST> copy/clone test starts requested buf is larger than original\n" );
212 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
213 memcpy( mbuf->payload, payload_str, mbuf->len );
214 mb2 = realloc_payload( mbuf, 2048, COPY, CLONE );
215 errors += fail_if_true( mbuf == mb2, "realloc payload(clone+copy/lg) of larger size did not return different message buffers" );
216 errors += fail_if_nil( mb2, "realloc payload (clone+copy/lg) returned a nil pointer when increasing payload len)" );
217 errors += fail_not_equal( mb2->mtype, 99, "realloc payload (clone+copy/lg) did not reset mtype(a) to expected(b) value" );
218 errors += fail_not_equal( mb2->sub_id, 100, "realloc payload (clone+copy/lg) did not reset sub-id(a) to expected(b) value" );
219 errors += fail_not_equal( mb2->len, strlen( payload_str ), "realloc payload (clone+copy/lg) msg len(a) not expected(b)" );
220 errors += fail_not_equal( rmr_payload_size( mb2), 2048, "realloc payload (clone+copy/lg) alloc len(a) not expected(b)" );
221 errors += fail_not_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(clone+copy/lg) didn't copy payload" );
223 // with a clone, we must verify that original message looks sane too
224 errors += fail_not_equal( mbuf->mtype, 99, "realloc payload (clone+copy/lg) validation of unchanged mbuf->mtype fails" );
225 errors += fail_not_equal( mbuf->sub_id, 100, "realloc payload (clone+copy/lg) validation of unchanged mbuf->subid fails" );
226 errors += fail_not_equal( mbuf->len, strlen( payload_str ), "realloc payload (clone+copy/lg) validation of unchanged payload len fails" );
227 errors += fail_not_equal( rmr_payload_size( mbuf ), 1024, "realloc payload (clone+copy/lg) validation of unchanged alloc length fails" );
228 errors += fail_not_equal( strncmp( payload_str, mbuf->payload, strlen( payload_str )), 0, "realloc payload(clone+copy/lg) validation of unchanged payload fails" );
230 // original message should be unharmed, and new message should have no type/sid or payload len; total alloc len should be requested enlargement
231 fprintf( stderr, "<TEST> no copy/clone test starts requested buf is larger than original\n" );
232 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
233 memcpy( mbuf->payload, payload_str, mbuf->len );
234 mb2 = realloc_payload( mbuf, 2048, NO_COPY, CLONE );
235 errors += fail_if_true( mbuf == mb2, "realloc payload (clone+nocopy) of larger size did not return different message buffers" );
236 errors += fail_if_nil( mb2, "realloc payload (clone+nocopy) returned a nil pointer when increasing payload len)" );
237 errors += fail_not_equal( mb2->mtype, -1, "realloc payload (clone+nocopy) did not reset mtype(a) to expected(b) value" );
238 errors += fail_not_equal( mb2->sub_id, -1, "realloc payload (clone+nocopy) did not reset sub-id(a) to expected(b) value" );
239 errors += fail_not_equal( mb2->len, 0, "realloc payload (clone+nocopy) msg len(a) not expected(b)" );
240 errors += fail_not_equal( rmr_payload_size( mb2 ), 2048, "realloc payload (clone+nocopy) alloc len(a) not expected(b)" );
241 errors += fail_if_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(clone+nocopy) copied payload when not supposed to" );
243 // with a clone, we must verify that original message looks sane too
244 errors += fail_not_equal( mbuf->mtype, 99, "realloc payload (clone+nocopy) validation of unchanged mbuf->mtype fails" );
245 errors += fail_not_equal( mbuf->sub_id, 100, "realloc payload (clone+nocopy) validation of unchanged mbuf->subid fails" );
246 errors += fail_not_equal( mbuf->len, strlen( payload_str ), "realloc payload (clone+nocopy) validation of unchanged payload len fails" );
247 errors += fail_not_equal( rmr_payload_size( mbuf ), 1024, "realloc payload (clone+nocopy) validation of unchanged alloc length fails" );
248 errors += fail_not_equal( strncmp( payload_str, mbuf->payload, strlen( payload_str )), 0, "realloc payload (clone+nocopy) validation of unchanged payload fails" );