blob: 1742e0157a6cca9ea173a1a60a56bae29163c058 [file] [log] [blame]
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -04001/*
2==================================================================================
E. Scott Daniels8790bf02019-04-23 12:59:28 +00003 Copyright (c) 2019 Nokia
4 Copyright (c) 2018-2019 AT&T Intellectual Property.
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -04005
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
E. Scott Daniels8790bf02019-04-23 12:59:28 +000010 http://www.apache.org/licenses/LICENSE-2.0
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040011
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
E. Scott Daniels8790bf02019-04-23 12:59:28 +000024 the symbol table portion of RMr. Run with:
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040025 ksh unit_test.ksh symtab_test.c
26 Date: 1 April 2019
27 Author: E. Scott Daniels
28*/
29
E. Scott Danielsd7109572019-04-18 14:01:16 +000030#define NO_DUMMY_RMR 1 // no dummy rmr functions; we don't pull in rmr.h or agnostic.h
E. Scott Danielsfc5c77b2020-02-21 13:24:29 -050031#define NO_EMULATION
32#define NO_PRIVATE_HEADERS
E. Scott Danielsd7109572019-04-18 14:01:16 +000033
E. Scott Danielsfc5c77b2020-02-21 13:24:29 -050034#include <rmr.h>
35#include <rmr_agnostic.h>
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040036#include "test_support.c"
E. Scott Danielsfc5c77b2020-02-21 13:24:29 -050037#include "rmr_symtab.h"
38
39#include "symtab.c" // module under test
40
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040041
42int state = GOOD; // overall pass/fail state 0==fail
43int counter; // global counter for for-each tests
44
45
46
E. Scott Daniels77526eb2020-09-17 16:39:31 -040047static int fetch( void* st, char* key, int class, int expected ) {
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040048 char* val;
E. Scott Daniels77526eb2020-09-17 16:39:31 -040049 int error = 0;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040050
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;
E. Scott Daniels77526eb2020-09-17 16:39:31 -040056 error = 1;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040057 }
E. Scott Daniels8790bf02019-04-23 12:59:28 +000058
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040059 } else {
60 fprintf( stderr, "[%s] string key fetch return nil\n", expected ? "FAIL" : "OK" );
61 if( expected ) {
62 state = BAD;
E. Scott Daniels77526eb2020-09-17 16:39:31 -040063 error = 1;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040064 }
65 }
E. Scott Daniels77526eb2020-09-17 16:39:31 -040066
67 return error;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040068}
69
E. Scott Daniels77526eb2020-09-17 16:39:31 -040070static int nfetch( void* st, int key, int expected ) {
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040071 char* val;
E. Scott Daniels77526eb2020-09-17 16:39:31 -040072 int error = 0;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040073
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;
E. Scott Daniels77526eb2020-09-17 16:39:31 -040079 error = 1;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040080 }
81 } else {
82 fprintf( stderr, "[%s] get return nil for key=%d\n", expected ? "FAIL" : "OK", key );
83 if( expected ) {
84 state = BAD;
E. Scott Daniels77526eb2020-09-17 16:39:31 -040085 error = 1;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040086 }
87 }
E. Scott Daniels77526eb2020-09-17 16:39:31 -040088
89 return error;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040090}
91
92
93/*
94 Driven by foreach class -- just incr the counter.
95*/
96static void each_counter( void* a, void* b, const char* c, void* d, void* e ) {
97 counter++;
98}
99
100int main( ) {
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000101 void* st;
102 char* foo = "foo";
103 char* bar = "bar";
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400104 char* goo = "goo"; // name not in symtab
105 int i;
106 int class = 1;
107 int s;
108 void* p;
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400109 int errors = 0;
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400110
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000111 st = rmr_sym_alloc( 10 ); // alloc with small value to force adjustment inside
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400112 errors += fail_if_nil( st, "symtab pointer" );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400113
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000114 s = rmr_sym_put( st, foo, class, bar ); // add entry with string key; returns 1 if it was inserted
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400115 errors += fail_if_false( s, "insert foo existed" );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400116
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000117 s = rmr_sym_put( st, foo, class+1, bar ); // add to table with a different class
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400118 errors += fail_if_false( s, "insert foo existed" );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400119
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000120 s = rmr_sym_put( st, foo, class, bar ); // inserted above, should return not inserted (0)
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400121 errors += fail_if_true( s, "insert foo existed" );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400122
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400123 errors += fetch( st, foo, class, 1 );
124 errors += fetch( st, goo, class, 0 ); // fetch non existant
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000125 rmr_sym_stats( st, 4 ); // early stats at verbose level 4 so chatter is minimised
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400126 rmr_sym_dump( st );
127
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400128 for( i = 2000; i < 3000; i++ ) { // bunch of dummy things to force chains in the table
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400129 rmr_sym_map( st, i, foo ); // add entry with unsigned integer key
130 }
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000131 rmr_sym_stats( st, 0 ); // just the small facts to verify the 1000 we stuffed in
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400132 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
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400136 errors += fail_if_false( s, "numeric add of key 1234 should not have existed" );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400137 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 );
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400142 errors += fail_if_false( counter, "expected counter after foreach to be non-zero" );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400143
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400144 errors += nfetch( st, 1234, 1 );
145 errors += nfetch( st, 2345, 1 );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400146
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000147 rmr_sym_del( st, foo, 0 );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400148
E. Scott Daniels8790bf02019-04-23 12:59:28 +0000149 rmr_sym_stats( st, 0 );
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400150
151 rmr_sym_free( NULL ); // ensure it doesn't barf when given a nil pointer
152 rmr_sym_free( st );
153
E. Scott Daniels77526eb2020-09-17 16:39:31 -0400154 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);
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400162}
163