1#!/bin/sh - 2# 3# Copyright (c) 1992 The Regents of the University of California. 4# All rights reserved. 5# 6# %sccs.include.redist.sh% 7# 8# @(#)run.test 5.9 (Berkeley) 11/13/92 9# 10 11# db regression tests 12 13main() 14{ 15 DICT=/usr/share/dict/words 16 PROG=obj/dbtest 17 TMP1=t1 18 TMP2=t2 19 TMP3=t3 20 21 test1 22 test2 23 test3 24 test4 25 test5 26 test6 27 test7 28 test8 29 test9 30 rm -f $TMP1 $TMP2 $TMP3 31} 32 33# Take the first hundred entries in the dictionary, and make them 34# be key/data pairs. 35test1() 36{ 37 printf "Test 1: btree, hash: small key, small data pairs\n" 38 sed 200q $DICT > $TMP1 39 for type in btree hash; do 40 rm -f $TMP2 $TMP3 41 for i in `sed 200q $DICT`; do 42 printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i 43 done > $TMP2 44 $PROG -o $TMP3 $type $TMP2 45 if (cmp -s $TMP1 $TMP3) ; then 46 else 47 printf "test1: type %s: failed\n" $type 48 exit 1 49 fi 50 done 51 printf "Test 1: recno: small key, small data pairs\n" 52 rm -f $TMP2 $TMP3 53 sed 200q $DICT | 54 awk '{ 55 ++i; 56 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); 57 }' > $TMP2 58 $PROG -o $TMP3 recno $TMP2 59 if (cmp -s $TMP1 $TMP3) ; then 60 else 61 printf "test1: type recno: failed\n" 62 exit 1 63 fi 64} 65 66# Take the first hundred entries in the dictionary, and give them 67# each a medium size data entry. 68test2() 69{ 70 printf "Test 2: btree, hash: small key, medium data pairs\n" 71 mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 72 echo $mdata | 73 awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1 74 for type in hash btree; do 75 rm -f $TMP2 $TMP3 76 for i in `sed 200q $DICT`; do 77 printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i 78 done > $TMP2 79 $PROG -o $TMP3 $type $TMP2 80 if (cmp -s $TMP1 $TMP3) ; then 81 else 82 printf "test2: type %s: failed\n" $type 83 exit 1 84 fi 85 done 86 printf "Test 2: recno: small key, medium data pairs\n" 87 rm -f $TMP2 $TMP3 88 echo $mdata | 89 awk '{ for (i = 1; i < 201; ++i) 90 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); 91 }' > $TMP2 92 $PROG -o $TMP3 recno $TMP2 93 if (cmp -s $TMP1 $TMP3) ; then 94 else 95 printf "test2: type recno: failed\n" 96 exit 1 97 fi 98} 99 100# Insert the programs in /bin with their paths as their keys. 101test3() 102{ 103 printf "Test 3: btree, hash: small key, big data pairs\n" 104 rm -f $TMP1 105 (find /bin -type f -print | xargs cat) > $TMP1 106 for type in hash btree; do 107 rm -f $TMP2 $TMP3 108 for i in `find /bin -type f -print`; do 109 printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i 110 done > $TMP2 111 $PROG -o $TMP3 $type $TMP2 112 if (cmp -s $TMP1 $TMP3) ; then 113 else 114 printf "test3: type %s: failed\n" $type 115 exit 1 116 fi 117 done 118 printf "Test 3: recno: big data pairs\n" 119 rm -f $TMP2 $TMP3 120 find /bin -type f -print | 121 awk '{ 122 ++i; 123 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i); 124 }' > $TMP2 125 $PROG -o $TMP3 recno $TMP2 126 if (cmp -s $TMP1 $TMP3) ; then 127 else 128 printf "test3: type recno: failed\n" 129 exit 1 130 fi 131} 132 133# Do random recno entries. 134test4() 135{ 136 printf "Test 4: recno: random entries\n" 137 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 138 awk '{ 139 for (i = 37; i <= 37 + 88 * 17; i += 17) 140 printf("input key %d: %.*s\n", i, i % 41, $0); 141 for (i = 1; i <= 15; ++i) 142 printf("input key %d: %.*s\n", i, i % 41, $0); 143 for (i = 19234; i <= 19234 + 61 * 27; i += 27) 144 printf("input key %d: %.*s\n", i, i % 41, $0); 145 exit 146 }' > $TMP1 147 rm -f TMP2 $TMP3 148 cat $TMP1 | 149 awk 'BEGIN { 150 i = 37; 151 incr = 17; 152 } 153 { 154 printf("p\nk%d\nd%s\n", i, $0); 155 if (i == 19234 + 61 * 27) 156 exit; 157 if (i == 37 + 88 * 17) { 158 i = 1; 159 incr = 1; 160 } else if (i == 15) { 161 i = 19234; 162 incr = 27; 163 } else 164 i += incr; 165 } 166 END { 167 for (i = 37; i <= 37 + 88 * 17; i += 17) 168 printf("g\nk%d\n", i); 169 for (i = 1; i <= 15; ++i) 170 printf("g\nk%d\n", i); 171 for (i = 19234; i <= 19234 + 61 * 27; i += 27) 172 printf("g\nk%d\n", i); 173 }' > $TMP2 174 $PROG -o $TMP3 recno $TMP2 175 if (cmp -s $TMP1 $TMP3) ; then 176 else 177 printf "test4: type recno: failed\n" 178 exit 1 179 fi 180} 181 182# Do reverse order recno entries. 183test5() 184{ 185 printf "Test 5: recno: reverse order entries\n" 186 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 187 awk ' { 188 for (i = 1500; i; --i) 189 printf("input key %d: %.*s\n", i, i % 34, $0); 190 exit; 191 }' > $TMP1 192 rm -f TMP2 $TMP3 193 cat $TMP1 | 194 awk 'BEGIN { 195 i = 1500; 196 } 197 { 198 printf("p\nk%d\nd%s\n", i, $0); 199 --i; 200 } 201 END { 202 for (i = 1500; i; --i) 203 printf("g\nk%d\n", i); 204 }' > $TMP2 205 $PROG -o $TMP3 recno $TMP2 206 if (cmp -s $TMP1 $TMP3) ; then 207 else 208 printf "test5: type recno: failed\n" 209 exit 1 210 fi 211} 212 213# Do alternating order recno entries. 214test6() 215{ 216 printf "Test 6: recno: alternating order entries\n" 217 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 218 awk ' { 219 for (i = 1; i < 1200; i += 2) 220 printf("input key %d: %.*s\n", i, i % 34, $0); 221 for (i = 2; i < 1200; i += 2) 222 printf("input key %d: %.*s\n", i, i % 34, $0); 223 exit; 224 }' > $TMP1 225 rm -f TMP2 $TMP3 226 cat $TMP1 | 227 awk 'BEGIN { 228 i = 1; 229 even = 0; 230 } 231 { 232 printf("p\nk%d\nd%s\n", i, $0); 233 i += 2; 234 if (i >= 1200) { 235 if (even == 1) 236 exit; 237 even = 1; 238 i = 2; 239 } 240 } 241 END { 242 for (i = 1; i < 1200; ++i) 243 printf("g\nk%d\n", i); 244 }' > $TMP2 245 $PROG -o $TMP3 recno $TMP2 246 sort -o $TMP1 $TMP1 247 sort -o $TMP3 $TMP3 248 if (cmp -s $TMP1 $TMP3) ; then 249 else 250 printf "test6: type recno: failed\n" 251 exit 1 252 fi 253} 254 255# Delete cursor record 256test7() 257{ 258 printf "Test 7: btree, recno: delete cursor record\n" 259 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 260 awk '{ 261 for (i = 1; i <= 120; ++i) 262 printf("%05d: input key %d: %s\n", i, i, $0); 263 printf("%05d: input key %d: %s\n", 120, 120, $0); 264 printf("get failed, no such key\n"); 265 printf("%05d: input key %d: %s\n", 1, 1, $0); 266 printf("%05d: input key %d: %s\n", 2, 2, $0); 267 exit; 268 }' > $TMP1 269 rm -f TMP2 $TMP3 270 271 # Test that R_CURSOR doesn't succeed before cursor initialized 272 for type in btree recno; do 273 cat $TMP1 | 274 awk '{ 275 if (i == 10) 276 exit; 277 printf("p\nk%d\nd%s\n", ++i, $0); 278 } 279 END { 280 printf("fR_CURSOR\nr\nk1\n"); 281 printf("etest7 R_CURSOR SHOULD HAVE FAILED\n"); 282 }' > $TMP2 283 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1 284 if [ -s $TMP3 ] ; then 285 printf "test7: R_CURSOR SHOULD HAVE FAILED\n" 286 exit 1 287 fi 288 done 289 290 for type in btree recno; do 291 cat $TMP1 | 292 awk '{ 293 if (i == 120) 294 exit; 295 printf("p\nk%d\nd%s\n", ++i, $0); 296 } 297 END { 298 printf("fR_NEXT\n"); 299 for (i = 1; i <= 120; ++i) 300 printf("s\n"); 301 printf("fR_CURSOR\ns\nk120\n"); 302 printf("r\nk120\n"); 303 printf("fR_NEXT\ns\n"); 304 printf("fR_CURSOR\ns\nk1\n"); 305 printf("r\nk1\n"); 306 printf("fR_FIRST\ns\n"); 307 }' > $TMP2 308 $PROG -o $TMP3 recno $TMP2 309 if (cmp -s $TMP1 $TMP3) ; then 310 else 311 printf "test7: type $type: failed\n" 312 exit 1 313 fi 314 done 315} 316 317# Make sure that overflow pages are reused. 318test8() 319{ 320 printf "Test 8: btree, hash: repeated small key, big data pairs\n" 321 rm -f $TMP1 322 awk 'BEGIN { 323 for (i = 1; i <= 10; ++i) { 324 printf("p\nkkey1\nD/bin/sh\n"); 325 printf("p\nkkey2\nD/bin/csh\n"); 326 if (i % 8 == 0) { 327 printf("c\nkkey2\nD/bin/csh\n"); 328 printf("c\nkkey1\nD/bin/sh\n"); 329 printf("e\t%d of 10 (comparison)\r\n", i); 330 } else 331 printf("e\t%d of 10 \r\n", i); 332 printf("r\nkkey1\nr\nkkey2\n"); 333 } 334 printf("e\n"); 335 printf("eend of test8 run\n"); 336 }' > $TMP1 337 $PROG btree $TMP1 338 $PROG hash $TMP1 339 # No explicit test for success. 340} 341 342# Try a variety of bucketsizes and fill factors for hashing 343test9() 344{ 345 printf\ 346 "Test 9: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n" 347 awk 'BEGIN { 348 for (i = 1; i <= 10000; ++i) 349 printf("%.*s\n", i % 34, 350 "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"); 351 }' > $TMP1 352 sed 10000q $DICT | 353 awk '{ 354 ++i; 355 printf("p\nk%s\nd%.*s\n", $0, i % 34, 356 "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"); 357 }' > $TMP2 358 sed 10000q $DICT | 359 awk '{ 360 ++i; 361 printf("g\nk%s\n", $0); 362 }' >> $TMP2 363 bsize=256 364 for ffactor in 11 14 21; do 365 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 366 $PROG -o$TMP3 \ 367 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 368 hash $TMP2 369 if (cmp -s $TMP1 $TMP3) ; then 370 else 371 printf "test9: type hash:\ 372bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 373 exit 1 374 fi 375 done 376 bsize=512 377 for ffactor in 21 28 43; do 378 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 379 $PROG -o$TMP3 \ 380 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 381 hash $TMP2 382 if (cmp -s $TMP1 $TMP3) ; then 383 else 384 printf "test9: type hash:\ 385bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 386 exit 1 387 fi 388 done 389 bsize=1024 390 for ffactor in 43 57 85; do 391 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 392 $PROG -o$TMP3 \ 393 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 394 hash $TMP2 395 if (cmp -s $TMP1 $TMP3) ; then 396 else 397 printf "test9: type hash:\ 398bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 399 exit 1 400 fi 401 done 402 bsize=2048 403 for ffactor in 85 114 171; do 404 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 405 $PROG -o$TMP3 \ 406 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 407 hash $TMP2 408 if (cmp -s $TMP1 $TMP3) ; then 409 else 410 printf "test9: type hash:\ 411bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 412 exit 1 413 fi 414 done 415 bsize=4096 416 for ffactor in 171 228 341; do 417 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 418 $PROG -o$TMP3 \ 419 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 420 hash $TMP2 421 if (cmp -s $TMP1 $TMP3) ; then 422 else 423 printf "test9: type hash:\ 424bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 425 exit 1 426 fi 427 done 428 bsize=8192 429 for ffactor in 341 455 683; do 430 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 431 $PROG -o$TMP3 \ 432 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 433 hash $TMP2 434 if (cmp -s $TMP1 $TMP3) ; then 435 else 436 printf "test9: type hash:\ 437bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 438 exit 1 439 fi 440 done 441} 442 443main 444