1742e0157a6cca9ea173a1a60a56bae29163c058
[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 int fetch( void* st, char* key, int class, int expected ) {
48         char* val;
49         int error = 0;
50
51         val = rmr_sym_get( st, key, class );
52         if( val ) {
53                 fprintf( stderr, "[%s] get returns key=%s val=%s\n",  !expected ? "FAIL" : "OK", key, val );
54                 if( !expected ) {
55                         state = BAD;
56                         error = 1;
57                 }
58
59         } else {
60                 fprintf( stderr, "[%s] string key fetch return nil\n", expected ? "FAIL" : "OK" );
61                 if( expected ) {
62                         state = BAD;
63                         error = 1;
64                 }
65         }
66
67         return error;
68 }
69
70 static int nfetch( void* st, int key, int expected ) {
71         char* val;
72         int             error = 0;
73
74         val = rmr_sym_pull( st, key );
75         if( val ) {
76                 fprintf( stderr, "[%s] get returns key=%d val=%s\n", !expected ? "FAIL" : "OK", key, val );
77                 if( !expected )  {
78                         state = BAD;
79                         error = 1;
80                 }
81         } else {
82                 fprintf( stderr, "[%s] get return nil for key=%d\n", expected ? "FAIL" : "OK", key );
83                 if( expected )  {
84                         state = BAD;
85                         error = 1;
86                 }
87         }
88
89         return error;
90 }
91
92
93 /*
94         Driven by foreach class -- just incr the counter.
95 */
96 static void each_counter( void* a, void* b, const char* c, void* d, void* e ) {
97         counter++;
98 }
99
100 int main( ) {
101         void*   st;
102         char*   foo = "foo";
103         char*   bar = "bar";
104         char*   goo = "goo";                            // name not in symtab
105         int             i;
106         int             class = 1;
107         int             s;
108         void*   p;
109         int             errors = 0;
110
111         st = rmr_sym_alloc( 10 );                                               // alloc with small value to force adjustment inside
112         errors += fail_if_nil( st, "symtab pointer" );
113
114         s = rmr_sym_put( st, foo, class, bar );                 // add entry with string key; returns 1 if it was inserted
115         errors += fail_if_false( s, "insert foo existed" );
116
117         s = rmr_sym_put( st, foo, class+1, bar );               // add to table with a different class
118         errors += fail_if_false( s, "insert foo existed" );
119
120         s = rmr_sym_put( st, foo, class, bar );                 // inserted above, should return not inserted (0)
121         errors += fail_if_true( s, "insert foo existed" );
122
123         errors += fetch( st, foo, class, 1 );
124         errors += fetch( st, goo, class, 0 );                   // fetch non existant
125         rmr_sym_stats( st, 4 );                                                 // early stats at verbose level 4 so chatter is minimised
126         rmr_sym_dump( st );
127
128         for( i = 2000; i < 3000; i++ ) {                                // bunch of dummy things to force chains in the table
129                 rmr_sym_map( st, i, foo );                                      // add entry with unsigned integer key
130         }
131         rmr_sym_stats( st, 0 );                                                 // just the small facts to verify the 1000 we stuffed in
132         rmr_sym_ndel( st, 2001 );                                               // force a numeric key delete
133         rmr_sym_ndel( st, 12001 );                                              // delete numeric key not there
134
135         s = rmr_sym_map( st, 1234, foo );                                       // add known entries with unsigned integer key
136         errors += fail_if_false( s, "numeric add of key 1234 should not have existed" );
137         s = rmr_sym_map( st, 2345, bar );
138         fail_if_true( s, "numeric add of key 2345 should have existed" );
139
140         counter = 0;
141         rmr_sym_foreach_class( st, 0, each_counter, NULL );
142         errors += fail_if_false( counter, "expected counter after foreach to be non-zero" );
143
144         errors += nfetch( st, 1234, 1 );
145         errors += nfetch( st, 2345, 1 );
146
147         rmr_sym_del( st, foo, 0 );
148
149         rmr_sym_stats( st, 0 );
150
151         rmr_sym_free( NULL );                   // ensure it doesn't barf when given a nil pointer
152         rmr_sym_free( st );
153
154         test_summary( errors, "symtab tests" );
155         if( state + errors == 0 ) {
156                 fprintf( stderr, "<PASS> all symtab tests were OK\n\n" );
157         } else {
158                 fprintf( stderr, "<FAIL> %d errors in symtab code\n\n", errors );
159         }
160
161         return !!(state + errors);
162 }
163