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; // two context structs needed to test route table collector
64 uta_ctx_t* real_ctx; // real one to force odd situations for error testing
65 int errors = 0; // number errors found
66 rmr_mbuf_t* mbuf; // mbuf to send/receive
67 rmr_mbuf_t* mb2; // second mbuf when needed
71 int nn_dummy_sock; // dummy needed to drive send
74 int flags = 0; // flags needed to pass to rtc funcitons
78 ctx = mk_dummy_ctx(); // in the si world we need some rings in the context
79 pctx = mk_dummy_ctx();
81 ctx->max_plen = RMR_MAX_RCV_BYTES + sizeof( uta_mhdr_t );
82 ctx->max_mlen = ctx->max_plen + sizeof( uta_mhdr_t );
83 ctx->my_name = strdup( "dummy-test" );
84 ctx->my_ip = strdup( "30.4.19.86:1111" );
85 uta_lookup_rtg( ctx );
87 gen_rt( ctx ); // forces a static load with some known info since we don't start the rtc()
88 gen_rt( ctx ); // force a second load to test cloning
90 p = rt_ensure_ep( NULL, "foo" ); // drive for coverage
91 errors += fail_not_nil( p, "rt_ensure_ep did not return nil when given nil route table" );
93 state = rmr_ready( NULL );
94 errors += fail_if_true( state, "reported ready when given a nil context" );
95 state = rmr_ready( ctx );
96 errors += fail_if_false( state, "reported not ready when it should be" );
99 rcv_msg under SI is deprecated -- do not attempt to call
100 mbuf = rcv_msg( ctx, NULL );
101 errors += fail_if_nil( mbuf, "no mbuf returned on receive test" );
104 mbuf = rmr_alloc_msg( ctx, 2048 );
108 mb2 = clone_msg( mbuf );
109 errors += fail_if_nil( mb2, "clone message returned nil pointer" );
110 errors += fail_not_equal( mbuf->flags, mb2->flags, "clone did not duplicate flags" );
111 errors += fail_not_equal( mbuf->alloc_len, mb2->alloc_len, "clone did not dup alloc-len" );
112 errors += fail_not_equal( mbuf->state, mb2->state, "clone did not dup state" );
115 mbuf = rmr_send_msg( NULL, mbuf );
116 errors += fail_if_nil( mbuf, "send with nil context but buffere didn't return buffer" );
118 errors += fail_not_equal( mbuf->state, RMR_ERR_BADARG, "send with buffer but nil context didn't return right state" );
120 mbuf = rmr_alloc_msg( ctx, 2048 );
123 //size = 2048 - em_hdr_size(); // emulated receive allocates 2K buffers -- subtract off header size
125 state = rmr_payload_size( mbuf );
126 errors += fail_not_equal( state, size, "payload size didn't return expected value" ); // receive should always give 4k buffer
128 rmr_free_msg( mbuf );
131 // -------- drive rtc in a 'static' (not pthreaded) mode to get some coverage; no 'results' to be verified -----
133 It is impossible to drive the message loop of the rtc from a unit test because
134 we cannot generate a message that will arrive on its private RMR context.
137 setenv( ENV_RTG_RAW, "0", 1 ); // rtc is never raw under SI
138 setenv( ENV_VERBOSE_FILE, ".ut_rmr_verbose", 1 ); // allow for verbose code in rtc to be driven
139 i = open( ".ut_rmr_verbose", O_RDWR | O_CREAT, 0654 );
141 write( i, "2\n", 2 );
144 ctx->shutdown = 1; // should force rtc to quit on first pass
145 rtc( NULL ); // coverage test with nil pointer
147 rtc_file( NULL ); // the static file only collector
152 setenv( "RMR_RTG_SVC", "4567", 1 ); // drive for edge case coverage to ensure no nil pointer etc
154 setenv( "RMR_RTG_SVC", "tcp:4567", 1 );
156 setenv( "RMR_RTG_SVC", "tcp:4567:error", 1 );
158 setenv( "RMR_RTG_SVC", "localhost:4589", 1 ); // should force a request to be sent though no reponse back.
161 payload_str = "newrt|start|abc-def\nmse|10|-1|host1:43086\nmse|20|-1|host1:43086\nnewrt|end|2\n";
162 mbuf = mk_populated_msg( 1024, 0, 20, -2, strlen( payload_str ) );
163 memcpy( mbuf->payload, payload_str, mbuf->len );
164 rtc_parse_msg( ctx, pctx, mbuf, 5, &flags );
166 mbuf = mk_populated_msg( 1024, 0, 90, -2, strlen( payload_str ) ); // drive with invalid message type for coverage
167 rtc_parse_msg( ctx, pctx, mbuf, 5, &flags );
170 // ------------- reallocation tests ------------------------------------------------------------
171 // we use mk_populated_msg() to create a message with mid/sid/plen pushed into the transport
172 // header to simulate a message having been sent and received which is what causes this data
173 // to push into the wire packet.
175 payload_str = "Stand Up and Cheer; OU78-82";
178 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
179 memcpy( mbuf->payload, payload_str, mbuf->len );
180 mb2 = realloc_payload( mbuf, 512, NO_COPY, NO_CLONE );
181 errors += fail_if_nil( mb2, "realloc_payload (no copy) returned a nil pointer when reallocating with smaller size" );
182 errors += fail_if_false( mbuf == mb2, "non-clone realloc payload (no copy) of smaller size did not return the same buffer" );
184 mb2 = realloc_payload( NULL, 512, NO_COPY, NO_CLONE );
185 errors += fail_not_nil( mb2, "realloc payload did not return nil pointer when passed nil mbuf" );
187 mb2 = realloc_payload( mbuf, 0, NO_COPY, NO_CLONE );
188 errors += fail_not_nil( mb2, "realloc payload did not return nil pointer when passed bad len" );
190 fprintf( stderr, "<TEST> no copy/no clone test starts\n" );
191 mb2 = realloc_payload( mbuf, 2048, NO_COPY, NO_CLONE );
192 errors += fail_if_false( mbuf == mb2, "realloc payload (no copy) of larger size did not return the same msg buffer(1)" );
193 errors += fail_not_equal( mb2->mtype, -1, "realloc payload (no copy) did not reset mtype(a) to expected(b) value" );
194 errors += fail_not_equal( mb2->sub_id, -1, "realloc payload (no copy) did not reset sub-id(a) to expected(b) value" );
195 errors += fail_if_nil( mb2, "realloc payload returned (no copy) a nil pointer when increasing payload len" );
196 errors += fail_not_equal( mb2->len, 0, "realloc payload payload len(a) not expected(b):" );
197 errors += fail_not_equal( rmr_payload_size( mb2), 2048, "realloc payload alloc len(a) not expected(b)" );
199 fprintf( stderr, "<TEST> copy/no clone test starts\n" );
200 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
201 memcpy( mbuf->payload, payload_str, mbuf->len );
202 mb2 = realloc_payload( mbuf, 2048, COPY, NO_CLONE );
203 errors += fail_if_false( mbuf == mb2, "non-clone realloc payload (copy) of larger size did not return the same msg buffer(2)" );
204 errors += fail_if_nil( mb2, "realloc payload (copy) returned a nil pointer when increasing payload len)" );
205 errors += fail_not_equal( mb2->mtype, 99, "realloc payload (copy) did not reset mtype(a) to expected(b) value" );
206 errors += fail_not_equal( mb2->sub_id, 100, "realloc payload (copy) did not reset sub-id(a) to expected(b) value" );
207 errors += fail_if_equal( mb2->len, 0, "realloc payload (copy) msg len(a) not expected(b)" );
208 errors += fail_not_equal( rmr_payload_size( mb2), 2048, "realloc payload (copy) alloc len(a) not expected(b)" );
209 errors += fail_not_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(copy) didn't copy payload" );
211 fprintf( stderr, "<TEST> copy/clone test starts requested buffer smaller 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, 512, COPY, CLONE );
215 errors += fail_if_true( mbuf == mb2, "realloc payload (clone+copy) of larger size did not return different message buffers" );
216 errors += fail_if_nil( mb2, "realloc payload (clone+copy) returned a nil pointer when increasing payload len)" );
217 errors += fail_not_equal( mb2->mtype, 99, "realloc payload (clone+copy) did not reset mtype(a) to expected(b) value" );
218 errors += fail_not_equal( mb2->sub_id, 100, "realloc payload (clone+copy) did not reset sub-id(a) to expected(b) value" );
219 errors += fail_not_equal( mb2->len, strlen( payload_str ), "realloc payload (clone+copy) msg len(a) not expected(b)" );
220 errors += fail_not_equal( rmr_payload_size( mb2), 1024, "realloc payload (clone+copy) alloc len(a) not expected(b)" );
221 errors += fail_not_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(clone+copy) 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) validation of unchanged mbuf->mtype fails" );
225 errors += fail_not_equal( mbuf->sub_id, 100, "realloc payload (clone+copy) validation of unchanged mbuf->subid fails" );
226 errors += fail_not_equal( mbuf->len, strlen( payload_str ), "realloc payload (clone+copy) validation of unchanged payload len fails" );
227 errors += fail_not_equal( rmr_payload_size( mbuf ), 1024, "realloc payload (clone+copy) validation of unchanged alloc length fails" );
228 errors += fail_not_equal( strncmp( payload_str, mbuf->payload, strlen( payload_str )), 0, "realloc payload(clone+copy) validation of unchanged payload fails" );
231 fprintf( stderr, "<TEST> 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, COPY, CLONE );
235 errors += fail_if_true( mbuf == mb2, "realloc payload(clone+copy/lg) of larger size did not return different message buffers" );
236 errors += fail_if_nil( mb2, "realloc payload (clone+copy/lg) returned a nil pointer when increasing payload len)" );
237 errors += fail_not_equal( mb2->mtype, 99, "realloc payload (clone+copy/lg) did not reset mtype(a) to expected(b) value" );
238 errors += fail_not_equal( mb2->sub_id, 100, "realloc payload (clone+copy/lg) did not reset sub-id(a) to expected(b) value" );
239 errors += fail_not_equal( mb2->len, strlen( payload_str ), "realloc payload (clone+copy/lg) msg len(a) not expected(b)" );
240 errors += fail_not_equal( rmr_payload_size( mb2), 2048, "realloc payload (clone+copy/lg) alloc len(a) not expected(b)" );
241 errors += fail_not_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(clone+copy/lg) didn't copy payload" );
243 // with a clone, we must verify that original message looks sane too
244 errors += fail_not_equal( mbuf->mtype, 99, "realloc payload (clone+copy/lg) validation of unchanged mbuf->mtype fails" );
245 errors += fail_not_equal( mbuf->sub_id, 100, "realloc payload (clone+copy/lg) validation of unchanged mbuf->subid fails" );
246 errors += fail_not_equal( mbuf->len, strlen( payload_str ), "realloc payload (clone+copy/lg) validation of unchanged payload len fails" );
247 errors += fail_not_equal( rmr_payload_size( mbuf ), 1024, "realloc payload (clone+copy/lg) validation of unchanged alloc length fails" );
248 errors += fail_not_equal( strncmp( payload_str, mbuf->payload, strlen( payload_str )), 0, "realloc payload(clone+copy/lg) validation of unchanged payload fails" );
250 // original message should be unharmed, and new message should have no type/sid or payload len; total alloc len should be requested enlargement
251 fprintf( stderr, "<TEST> no copy/clone test starts requested buf is larger than original\n" );
252 mbuf = mk_populated_msg( 1024, 0, 99, 100, strlen( payload_str ) );
253 memcpy( mbuf->payload, payload_str, mbuf->len );
254 mb2 = realloc_payload( mbuf, 2048, NO_COPY, CLONE );
255 errors += fail_if_true( mbuf == mb2, "realloc payload (clone+nocopy) of larger size did not return different message buffers" );
256 errors += fail_if_nil( mb2, "realloc payload (clone+nocopy) returned a nil pointer when increasing payload len)" );
257 errors += fail_not_equal( mb2->mtype, -1, "realloc payload (clone+nocopy) did not reset mtype(a) to expected(b) value" );
258 errors += fail_not_equal( mb2->sub_id, -1, "realloc payload (clone+nocopy) did not reset sub-id(a) to expected(b) value" );
259 errors += fail_not_equal( mb2->len, 0, "realloc payload (clone+nocopy) msg len(a) not expected(b)" );
260 errors += fail_not_equal( rmr_payload_size( mb2 ), 2048, "realloc payload (clone+nocopy) alloc len(a) not expected(b)" );
261 //errors += fail_if_equal( strncmp( payload_str, mb2->payload, strlen( payload_str )), 0, "realloc payload(clone+nocopy) copied payload when not supposed to" );
263 // with a clone, we must verify that original message looks sane too
264 errors += fail_not_equal( mbuf->mtype, 99, "realloc payload (clone+nocopy) validation of unchanged mbuf->mtype fails" );
265 errors += fail_not_equal( mbuf->sub_id, 100, "realloc payload (clone+nocopy) validation of unchanged mbuf->subid fails" );
266 errors += fail_not_equal( mbuf->len, strlen( payload_str ), "realloc payload (clone+nocopy) validation of unchanged payload len fails" );
267 errors += fail_not_equal( rmr_payload_size( mbuf ), 1024, "realloc payload (clone+nocopy) validation of unchanged alloc length fails" );
268 errors += fail_not_equal( strncmp( payload_str, mbuf->payload, strlen( payload_str )), 0, "realloc payload (clone+nocopy) validation of unchanged payload fails" );