Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

bdbtest2.cc

Go to the documentation of this file.
00001 /* 00002 * Note: this test program should be exactly the same as the one in 00003 * gdbmtest.cc, because the APIs should be identical. 00004 */ 00005 00006 #include "wvbdbhash.h" 00007 #include "wvhashtable.h" 00008 #include "wvstream.h" 00009 00010 typedef WvBdbHash<WvString,WvString> StrStrMap; 00011 00012 // a tradition dict to store the key/values we're going to test the bdb hash 00013 // with 00014 struct KeyVal 00015 { 00016 WvString key; 00017 WvString val; 00018 KeyVal(WvStringParm k, WvStringParm v) : key(k), val(v) { } 00019 }; 00020 DeclareWvDict(KeyVal, WvString, key); 00021 KeyValDict keyvals(3); 00022 KeyValDict::Iter gi(keyvals); 00023 00024 bool iterdone; 00025 00026 bool cmptest(WvStringParm wantkey, WvStringParm wantval, WvStringParm gotkey, 00027 WvStringParm gotval) 00028 { 00029 if (wantkey != gotkey || wantval != gotval) { 00030 wvcon->print("expect '%s'/'%s', got '%s'/'%s' - FAILED\n", 00031 wantkey, wantval, gotkey, gotval); 00032 return false; 00033 } else { 00034 wvcon->print("expect '%s'/'%s' - PASSED\n", wantkey, gotval); 00035 return true; 00036 } 00037 } 00038 00039 bool itertest(StrStrMap::Iter &i, WvStringParm key, WvStringParm want) 00040 { 00041 i.rewind(key); i.next(); 00042 return cmptest(key, want, i.key(), i()); 00043 } 00044 00045 bool itertest2(StrStrMap &ss, WvStringParm key, WvStringParm want) 00046 { 00047 StrStrMap::Iter i(ss); 00048 return itertest(i, key, want); 00049 } 00050 00051 void itertest3(WvStream &s, void *userdata) 00052 { 00053 StrStrMap &ss = *((StrStrMap *) userdata); 00054 iterdone = !gi.next(); 00055 if (!iterdone) itertest2(ss, gi->key, gi->val); 00056 s.alarm(0); 00057 } 00058 00059 00060 int alpha(const KeyVal *a, const KeyVal *b) 00061 { 00062 return strcmp(a->key, b->key); 00063 } 00064 00065 00066 bool runtests(StrStrMap &ss) 00067 { 00068 bool good = true; 00069 00070 { 00071 wvcon->print("\nSimple iter:\n"); 00072 StrStrMap::Iter i1(ss); 00073 KeyValDict::Sorter i2(keyvals, alpha); 00074 i1.rewind(); i2.rewind(); 00075 for (;;) 00076 { 00077 bool i1ok = i1.next(); 00078 bool i2ok = i2.next(); 00079 if (i1ok != i2ok) 00080 wvcon->print("\nnext() return value out of sync: " 00081 "expected %s, got %s - FAILED\n", i2ok, i1ok); 00082 if (!i1ok || !i2ok) break; 00083 00084 good = cmptest(i2->key, i2->val, i1.key(), i1()) && good; 00085 } 00086 } 00087 00088 { 00089 wvcon->print("\nMultiple rewinds:\n"); 00090 StrStrMap::Iter i(ss); 00091 KeyValDict::Iter i2(keyvals); 00092 for (i2.rewind(); i2.next(); ) 00093 good = itertest(i, i2->key, i2->val) && good; 00094 } 00095 00096 { 00097 wvcon->print("\nRecreation of iter:\n"); 00098 KeyValDict::Iter i2(keyvals); 00099 for (i2.rewind(); i2.next(); ) 00100 good = itertest2(ss, i2->key, i2->val) && good; 00101 } 00102 00103 { 00104 wvcon->print("\nRecreation of iter through a callback:\n"); 00105 WvStream s; 00106 s.setcallback(itertest3, &ss); 00107 s.alarm(0); 00108 gi.rewind(); 00109 iterdone = false; 00110 while (!iterdone) 00111 if (s.select(-1)) s.callback(); 00112 } 00113 00114 { 00115 wvcon->print("\nNested iters:\n"); 00116 StrStrMap::Iter i1(ss); 00117 KeyValDict::Sorter i2(keyvals, alpha); 00118 i2.rewind(); i1.rewind(); 00119 for (;;) 00120 { 00121 bool i1ok = i1.next(); 00122 bool i2ok = i2.next(); 00123 if (i1ok != i2ok) 00124 wvcon->print("\nnext() return value out of sync: " 00125 "expected %s, got %s - FAILED\n", i2ok, i1ok); 00126 if (!i1ok || !i2ok) break; 00127 00128 fprintf(stderr, "\n"); 00129 good = cmptest(i2->key, i2->val, i1.key(), i1()) && good; 00130 fprintf(stderr, "\n"); 00131 KeyValDict::Iter i3(keyvals); 00132 for (i3.rewind(); i3.next(); ) 00133 good = itertest2(ss, i3->key, i3->val) && good; 00134 } 00135 } 00136 00137 { 00138 wvcon->print("\nUpdate during an iter:\n"); 00139 StrStrMap::Iter i1(ss); 00140 KeyValDict::Sorter i2(keyvals, alpha); 00141 i2.rewind(); i1.rewind(); 00142 for (;;) 00143 { 00144 bool i1ok = i1.next(); 00145 bool i2ok = i2.next(); 00146 if (i1ok != i2ok) 00147 wvcon->print("\nnext() return value out of sync: " 00148 "expected %s, got %s - FAILED\n", i2ok, i1ok); 00149 if (!i1ok || !i2ok) break; 00150 00151 if (i1.key() == "hello") { 00152 i1() = "everybody"; 00153 i1.save(); 00154 } 00155 00156 if (i2->key == "hello") 00157 good = cmptest(i2->key, "everybody", i1.key(), i1()) && good; 00158 else 00159 good = cmptest(i2->key, i2->val, i1.key(), i1()) && good; 00160 } 00161 } 00162 00163 { 00164 wvcon->print("\nDelete during an iter:\n"); 00165 StrStrMap::Iter i1(ss); 00166 KeyValDict::Sorter i2(keyvals, alpha); 00167 i2.rewind(); i1.rewind(); 00168 for (;;) 00169 { 00170 bool i1ok = i1.next(); 00171 bool i2ok = i2.next(); 00172 if (i1ok != i2ok) 00173 wvcon->print("\nnext() return value out of sync: " 00174 "expected %s, got %s - FAILED\n", i2ok, i1ok); 00175 if (!i1ok || !i2ok) break; 00176 00177 if (i1.key() == "hello") 00178 i1.xunlink(); 00179 00180 if (i2->key == "hello") { 00181 // good = cmptest(i2->key, "everybody", i1.key(), i1()) && good; 00182 // key invalid now - how do we test this? 00183 } 00184 else 00185 good = cmptest(i2->key, i2->val, i1.key(), i1()) && good; 00186 } 00187 } 00188 00189 return good; 00190 } 00191 00192 int main() 00193 { 00194 keyvals.add(new KeyVal("hello", "world"), true); 00195 keyvals.add(new KeyVal("i like", "muffins"), true); 00196 keyvals.add(new KeyVal("/foo/bar", "baz"), true); 00197 keyvals.add(new KeyVal("/", "slash"), true); 00198 keyvals.add(new KeyVal("/foo", "kung foo!"), true); 00199 00200 { 00201 // named db 00202 StrStrMap ss("rewindfile"); 00203 wvcon->print("\nPopulating named db... "); 00204 ss.zap(); 00205 KeyValDict::Iter i(keyvals); 00206 for (i.rewind(); i.next(); ) 00207 ss.add(i->key, i->val, true); 00208 wvcon->print("done\n"); 00209 00210 runtests(ss); 00211 00212 // now be sure zap doesn't crash 00213 assert(ss.isok()); 00214 ss.seterr("Fake err"); 00215 assert(!ss.isok()); 00216 ss.zap(); 00217 fprintf(stderr, "After zap, isok is %d (%s)\n", ss.isok(), ss.errstr().cstr()); 00218 } 00219 00220 { 00221 // anon db 00222 StrStrMap ss; 00223 wvcon->print("\nPopulating anon db... "); 00224 KeyValDict::Iter i(keyvals); 00225 for (i.rewind(); i.next(); ) 00226 ss.add(i->key, i->val); 00227 wvcon->print("done\n"); 00228 00229 runtests(ss); 00230 00231 // now be sure zap doesn't crash 00232 assert(ss.isok()); 00233 ss.seterr("Fake err"); 00234 assert(!ss.isok()); 00235 ss.zap(); 00236 fprintf(stderr, "After zap, isok is %d (%s)\n", ss.isok(), ss.errstr().cstr()); 00237 } 00238 }

Generated on Tue Oct 5 01:09:19 2004 for WvStreams by doxygen 1.3.7