2 ==================================================================================
3 Copyright (c) 2019 Nokia
4 Copyright (c) 2018-2019 AT&T Intellectual Property.
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
10 http://www.apache.org/licenses/LICENSE-2.0
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 ==================================================================================
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
27 Author: E. Scott Daniels
30 #define NO_DUMMY_RMR 1 // no dummy rmr functions; we don't pull in rmr.h or agnostic.h
32 #define NO_PRIVATE_HEADERS
35 #include <rmr_agnostic.h>
36 #include "test_support.c"
37 #include "rmr_symtab.h"
39 #include "symtab.c" // module under test
42 int state = GOOD; // overall pass/fail state 0==fail
43 int counter; // global counter for for-each tests
47 static int fetch( void* st, char* key, int class, int expected ) {
51 val = rmr_sym_get( st, key, class );
53 fprintf( stderr, "[%s] get returns key=%s val=%s\n", !expected ? "FAIL" : "OK", key, val );
60 fprintf( stderr, "[%s] string key fetch return nil\n", expected ? "FAIL" : "OK" );
70 static int nfetch( void* st, int key, int expected ) {
74 val = rmr_sym_pull( st, key );
76 fprintf( stderr, "[%s] get returns key=%d val=%s\n", !expected ? "FAIL" : "OK", key, val );
82 fprintf( stderr, "[%s] get return nil for key=%d\n", expected ? "FAIL" : "OK", key );
94 Driven by foreach class -- just incr the counter.
96 static void each_counter( void* a, void* b, const char* c, void* d, void* e ) {
104 char* goo = "goo"; // name not in symtab
111 st = rmr_sym_alloc( 10 ); // alloc with small value to force adjustment inside
112 errors += fail_if_nil( st, "symtab pointer" );
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" );
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" );
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" );
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
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
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
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" );
141 rmr_sym_foreach_class( st, 0, each_counter, NULL );
142 errors += fail_if_false( counter, "expected counter after foreach to be non-zero" );
144 errors += nfetch( st, 1234, 1 );
145 errors += nfetch( st, 2345, 1 );
147 rmr_sym_del( st, foo, 0 );
149 rmr_sym_stats( st, 0 );
151 rmr_sym_free( NULL ); // ensure it doesn't barf when given a nil pointer
154 test_summary( errors, "symtab tests" );
155 if( state + errors == 0 ) {
156 fprintf( stderr, "<PASS> all symtab tests were OK\n\n" );
158 fprintf( stderr, "<FAIL> %d errors in symtab code\n\n", errors );
161 return !!(state + errors);