Add first set of SI95 unit tests and health check
[ric-plt/lib/rmr.git] / test / sr_si_static_test.c
1 // : vi ts=4 sw=4 noet :
2 /*
3 ==================================================================================
4             Copyright (c) 2020 Nokia
5             Copyright (c) 2020 AT&T Intellectual Property.
6
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
10
11            http://www.apache.org/licenses/LICENSE-2.0
12
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 ==================================================================================
19 */
20
21 /*
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.
25
26         Author:         E. Scott Daniels
27         Date:           21 February 2020
28 */
29
30 #include <unistd.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <strings.h>
34 #include <errno.h>
35 #include <string.h>
36 #include <stdint.h>
37 #include <pthread.h>
38 #include <semaphore.h>
39
40 #include "rmr.h"
41 #include "rmr_agnostic.h"
42
43 // ----------- local test support ----------------------------------------------------------
44 #define CLONE   1                       // convenience constants for payload realloc tests
45 #define NO_CLONE 0
46 #define COPY 1
47 #define NO_COPY 0
48
49 /*
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.
52
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.
57
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.
60 */
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
67         int             whid = -1;
68         int             last_whid;
69         int     state;
70         int     nn_dummy_sock;                                  // dummy needed to drive send
71         int             size;
72         int             i;
73         void*   p;
74         char*   payload_str;
75
76         ctx = mk_dummy_ctx();                                                                   // in the si world we need some rings in the context
77
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 );
83
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
86
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" );
89
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" );
94
95         /*
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" );
99         */
100
101         mbuf = rmr_alloc_msg( ctx, 2048 );
102         mbuf->len = 10;
103         mbuf->mtype = 1;
104
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" );
110         rmr_free_msg( mb2 );
111
112         mbuf = rmr_send_msg( NULL, mbuf );
113         errors += fail_if_nil( mbuf, "send with nil context but buffere didn't return buffer" );
114         if( mbuf ) {
115                 errors += fail_not_equal( mbuf->state, RMR_ERR_BADARG, "send with buffer but nil context didn't return right state" );
116         } else {
117                 //mbuf = rmr_rcv_msg( ctx, NULL );
118 mbuf = rmr_alloc_msg( ctx, 2048 );
119         }
120
121         //size = 2048 - em_hdr_size();          // emulated receive allocates 2K buffers -- subtract off header size
122         size = 2048;
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
125
126         rmr_free_msg( mbuf );
127
128
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 );
133         if( i >= 0 ) {
134                 write( i, "2\n", 2 );
135                 close( i );
136         }
137         ctx->shutdown = 1;                      // should force rtc to quit on first pass
138         rtc( NULL );                            // coverage test with nil pointer
139 /*
140         rtc( ctx );
141
142         setenv( "RMR_RTG_SVC", "4567", 1 );             // drive for edge case coverage to ensure no nil pointer etc
143         rtc( ctx );
144         setenv( "RMR_RTG_SVC", "tcp:4567", 1 );
145         rtc( ctx );
146         setenv( "RMR_RTG_SVC", "tcp:4567:error", 1 );
147         rtc( ctx );
148 */
149
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.
154
155         payload_str = "Stand Up and Cheer; OU78-82";
156
157
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" );
163
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" );
166
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" );
169
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)" );
178
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" );
190
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" );
202
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" );
209
210
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" );
222
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" );
229
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" );
242
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" );
249
250
251         return !!errors;
252 }