Add safe connect, fix possible seg fault in RTC
[ric-plt/lib/rmr.git] / test / symtab_test.c
1 /*
2 ==================================================================================
3             Copyright (c) 2019 Nokia
4             Copyright (c) 2018-2019 AT&T Intellectual Property.
5
6    Licensed under the Apache License, Version 2.0 (the "License");
7    you may not use this file except in compliance with the License.
8    You may obtain a copy of the License at
9
10            http://www.apache.org/licenses/LICENSE-2.0
11
12    Unless required by applicable law or agreed to in writing, software
13    distributed under the License is distributed on an "AS IS" BASIS,
14    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15    See the License for the specific language governing permissions and
16    limitations under the License.
17 ==================================================================================
18 */
19
20
21 /*
22         Mnemonic:       symtab_test.c
23         Abstract:       This is the unit test module that will drive tests against
24                                 the symbol table portion of RMr.  Run with:
25                                         ksh unit_test.ksh symtab_test.c
26         Date:           1 April 2019
27         Author:         E. Scott Daniels
28 */
29
30 #define NO_DUMMY_RMR 1                  // no dummy rmr functions; we don't pull in rmr.h or agnostic.h
31 #define NO_EMULATION
32 #define NO_PRIVATE_HEADERS
33
34 #include <rmr.h>
35 #include <rmr_agnostic.h>
36 #include "test_support.c"
37 #include "rmr_symtab.h"
38
39 #include "symtab.c"                                                     // module under test
40
41
42 int state = GOOD;                                                       // overall pass/fail state 0==fail
43 int counter;                                                            // global counter for for-each tests
44
45
46
47 static void fetch( void* st, char* key, int class, int expected ) {
48         char* val;
49
50         val = rmr_sym_get( st, key, class );
51         if( val ) {
52                 fprintf( stderr, "[%s] get returns key=%s val=%s\n",  !expected ? "FAIL" : "OK", key, val );
53                 if( !expected ) {
54                         state = BAD;
55                 }
56
57         } else {
58                 fprintf( stderr, "[%s] string key fetch return nil\n", expected ? "FAIL" : "OK" );
59                 if( expected ) {
60                         state = BAD;
61                 }
62         }
63 }
64
65 static void nfetch( void* st, int key, int expected ) {
66         char* val;
67
68         val = rmr_sym_pull( st, key );
69         if( val ) {
70                 fprintf( stderr, "[%s] get returns key=%d val=%s\n", !expected ? "FAIL" : "OK", key, val );
71                 if( !expected )  {
72                         state = BAD;
73                 }
74         } else {
75                 fprintf( stderr, "[%s] get return nil for key=%d\n", expected ? "FAIL" : "OK", key );
76                 if( expected )  {
77                         state = BAD;
78                 }
79         }
80 }
81
82
83 /*
84         Driven by foreach class -- just incr the counter.
85 */
86 static void each_counter( void* a, void* b, const char* c, void* d, void* e ) {
87         counter++;
88 }
89
90 int main( ) {
91         void*   st;
92         char*   foo = "foo";
93         char*   bar = "bar";
94         char*   goo = "goo";                            // name not in symtab
95         int             i;
96         int             class = 1;
97         int             s;
98         void*   p;
99
100         st = rmr_sym_alloc( 10 );                                               // alloc with small value to force adjustment inside
101         fail_if_nil( st, "symtab pointer" );
102
103         s = rmr_sym_put( st, foo, class, bar );                 // add entry with string key; returns 1 if it was inserted
104         fail_if_false( s, "insert foo existed" );
105
106         s = rmr_sym_put( st, foo, class+1, bar );               // add to table with a different class
107         fail_if_false( s, "insert foo existed" );
108
109         s = rmr_sym_put( st, foo, class, bar );                 // inserted above, should return not inserted (0)
110         fail_if_true( s, "insert foo existed" );
111
112         fetch( st, foo, class, 1 );
113         fetch( st, goo, class, 0 );                                     // fetch non existant
114         rmr_sym_stats( st, 4 );                                                 // early stats at verbose level 4 so chatter is minimised
115         rmr_sym_dump( st );
116
117         for( i = 2000; i < 3000; i++ ) {                        // bunch of dummy things to force chains in the table
118                 rmr_sym_map( st, i, foo );                                      // add entry with unsigned integer key
119         }
120         rmr_sym_stats( st, 0 );                                                 // just the small facts to verify the 1000 we stuffed in
121         rmr_sym_ndel( st, 2001 );                                               // force a numeric key delete
122         rmr_sym_ndel( st, 12001 );                                              // delete numeric key not there
123
124         s = rmr_sym_map( st, 1234, foo );                                       // add known entries with unsigned integer key
125         fail_if_false( s, "numeric add of key 1234 should not have existed" );
126         s = rmr_sym_map( st, 2345, bar );
127         fail_if_true( s, "numeric add of key 2345 should have existed" );
128
129         counter = 0;
130         rmr_sym_foreach_class( st, 0, each_counter, NULL );
131         fail_if_false( counter, "expected counter after foreach to be non-zero" );
132
133         nfetch( st, 1234, 1 );
134         nfetch( st, 2345, 1 );
135
136
137         rmr_sym_del( st, foo, 0 );
138
139         rmr_sym_stats( st, 0 );
140
141         rmr_sym_free( NULL );                   // ensure it doesn't barf when given a nil pointer
142         rmr_sym_free( st );
143
144         return state;
145 }
146