feat(API): Add trace data functions
[ric-plt/lib/rmr.git] / test / wormhole_static_test.c
1 // : vi ts=4 sw=4 noet :
2 /*
3 ==================================================================================
4         Copyright (c) 2019 Nokia 
5         Copyright (c) 2018-2019 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:       wormhole_static.c
23         Abstract:       Specific tests for wormhole. This module is included directly by
24                                 the test driver at compile time.
25
26         Author:         E. Scott Daniels
27         Date:           3 April 2019
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
38 #include "../src/common/include/rmr.h"
39 #include "../src/common/include/rmr_agnostic.h"
40
41
42 /*
43         Note that the last tests in this function destroy the context and message so
44         any tests added MUST be ahead of those tests. 
45 */
46 static int worm_test( ) {
47         uta_ctx_t* ctx;                 // context needed to test load static rt
48         char    wbuf[1024];
49         int errors = 0;                 // number errors found
50         int     i;
51
52         rmr_mbuf_t*     mbuf;           // mbuf to send to peer
53         int             whid = -1;
54         int             last_whid;
55
56         ctx = (uta_ctx_t *) malloc( sizeof( uta_ctx_t ) );
57         if( ctx == NULL ) {
58                 fail_if_nil( ctx, "could not allocate dummy context" );
59                 return 1;
60         }
61         memset( ctx, 0, sizeof( *ctx ) );
62         ctx->my_name = strdup( "tester" );
63
64         gen_rt( ctx );
65
66         whid = rmr_wh_open( NULL, NULL );
67         errors += fail_not_equal( whid, -1, "call to wh_open with invalid values did not return bad whid" );
68
69
70         whid = rmr_wh_open( ctx, NULL );
71         errors += fail_not_equal( whid, -1, "call to wh_open with invalid target did not return bad whid" );
72
73         whid = rmr_wh_open( ctx, "" );
74         errors += fail_not_equal( whid, -1, "call to wh_open with empty target did not return bad whid" );
75
76         whid = rmr_wh_open( ctx, "localhost:89219" );
77         errors += fail_if_equal( whid, -1, "call to wh_open with valid target failed" );
78
79         rmr_wh_close( ctx, 4 );                                 // test for coverage only; [5] should have nil pointer
80         rmr_wh_close( ctx, 50 );                                        // test for coverage only; more than allocated reference
81
82         last_whid = whid;
83         whid = rmr_wh_open( ctx, "localhost:89219" );
84         errors += fail_not_equal( whid, last_whid, "call to wh_open with duplicate target did not return the same whid" );
85
86         for( i = 0; i < 20; i++ ) {                                                                                             // test ability to extend the table
87                 snprintf( wbuf, sizeof( wbuf ), "localhost:864%02d", i );                       // new address for each so whid is different
88                 whid = rmr_wh_open( ctx, wbuf );
89                 snprintf( wbuf, sizeof( wbuf ), "call to wh_open failed for iteration = %d", i );
90                 errors += fail_if_equal( whid, -1, wbuf );
91                 if( i ) {
92                         snprintf( wbuf, sizeof( wbuf ), "call to wh_open for iteration = %d returned same whid: %d", i, whid );
93                         errors += fail_if_equal( whid, last_whid, wbuf );
94                 }
95
96                 last_whid = whid;
97         }
98
99         rmr_wh_close( ctx, 3 );         // close one, then open a new one to verify that hole is found
100         whid = rmr_wh_open( ctx, "localhost:21961" );
101         errors += fail_not_equal( whid, 3, "attempt to fill in a hole didn't return expected" );
102
103         rmr_wh_send_msg( NULL, 0, NULL );                       // tests for coverage
104         rmr_wh_send_msg( ctx, 0, NULL );
105
106         mbuf = rmr_alloc_msg( ctx, 2048 );                      // get an muf to pass round
107         errors += fail_if_nil( mbuf, "unable to allocate mbuf for send tests (giving up on send tests)" );
108         while( mbuf ) {
109                 if( !(mbuf = rmr_wh_send_msg( ctx, 50, mbuf )) ) {              // test for coverage
110                         errors += fail_if_nil( mbuf, "send didn't return an mbuf (skip rest of send tests)" );
111                         break;
112                 }
113
114                 mbuf = rmr_wh_send_msg( ctx, 4, mbuf );
115                 errors += fail_not_equal( mbuf->state, RMR_OK, "valid wormhole send failed" );
116                 errors += fail_not_equal( errno, 0, "errno after valid wormhole send was not 0" );
117
118                 rmr_wh_close( ctx, 4 );
119                 mbuf = rmr_wh_send_msg( ctx, 4, mbuf );
120                 rmr_wh_send_msg( ctx, 4, mbuf );
121                 errors += fail_not_equal( mbuf->state, RMR_ERR_WHID, "send on closed wormhole didn't set correct state in msg" );
122
123                 break;
124         }
125
126
127         // WARNING:  these tests destroy the context, so they MUST be last
128         if( mbuf ) {                    // only if we got an mbuf
129                 errno = 0;
130                 mbuf->header = NULL;
131                 mbuf = rmr_wh_send_msg( ctx, 5, mbuf );         // coverage test on mbuf header check
132                 errors += fail_not_equal( errno, EBADMSG, "wh_send didn't set errno after bad mbuf send" );
133                 errors += fail_not_equal( mbuf->state, RMR_ERR_NOHDR, "send with bad header did now set msg state correctly" );
134
135                 errno = 0;
136                 wh_nuke( ctx );
137                 ctx->wormholes = NULL;
138                 mbuf = rmr_wh_send_msg( ctx, 4, mbuf );         // coverage test on mbuf header check
139                 errors += fail_not_equal( errno, EINVAL, "wh_send didn't set errno after send without wormole reference" );
140                 errors += fail_not_equal( mbuf->state, RMR_ERR_NOWHOPEN, "wh_send didn't set msg state after send without wormole reference" );
141
142                 rmr_free_msg( mbuf );
143         }
144
145         if( ctx ) {
146                 free( ctx->my_name );
147                 free( ctx );
148         }
149
150         return !!errors;                        // 1 or 0 regardless of count
151 }