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.12 (Berkeley) 12/04/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 test10 31 test11 32 test20 33 rm -f $TMP1 $TMP2 $TMP3 34 exit 0 35} 36 37# Take the first hundred entries in the dictionary, and make them 38# be key/data pairs. 39test1() 40{ 41 printf "Test 1: btree, hash: small key, small data pairs\n" 42 sed 200q $DICT > $TMP1 43 for type in btree hash; do 44 rm -f $TMP2 $TMP3 45 for i in `sed 200q $DICT`; do 46 printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i 47 done > $TMP2 48 $PROG -o $TMP3 $type $TMP2 49 if (cmp -s $TMP1 $TMP3) ; then 50 else 51 printf "test1: type %s: failed\n" $type 52 exit 1 53 fi 54 done 55 printf "Test 1: recno: small key, small data pairs\n" 56 rm -f $TMP2 $TMP3 57 sed 200q $DICT | 58 awk '{ 59 ++i; 60 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); 61 }' > $TMP2 62 $PROG -o $TMP3 recno $TMP2 63 if (cmp -s $TMP1 $TMP3) ; then 64 else 65 printf "test1: type recno: failed\n" 66 exit 1 67 fi 68} 69 70# Take the first hundred entries in the dictionary, and give them 71# each a medium size data entry. 72test2() 73{ 74 printf "Test 2: btree, hash: small key, medium data pairs\n" 75 mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 76 echo $mdata | 77 awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1 78 for type in hash btree; do 79 rm -f $TMP2 $TMP3 80 for i in `sed 200q $DICT`; do 81 printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i 82 done > $TMP2 83 $PROG -o $TMP3 $type $TMP2 84 if (cmp -s $TMP1 $TMP3) ; then 85 else 86 printf "test2: type %s: failed\n" $type 87 exit 1 88 fi 89 done 90 printf "Test 2: recno: small key, medium data pairs\n" 91 rm -f $TMP2 $TMP3 92 echo $mdata | 93 awk '{ for (i = 1; i < 201; ++i) 94 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); 95 }' > $TMP2 96 $PROG -o $TMP3 recno $TMP2 97 if (cmp -s $TMP1 $TMP3) ; then 98 else 99 printf "test2: type recno: failed\n" 100 exit 1 101 fi 102} 103 104# Insert the programs in /bin with their paths as their keys. 105test3() 106{ 107 printf "Test 3: btree, hash: small key, big data pairs\n" 108 rm -f $TMP1 109 (find /bin -type f -print | xargs cat) > $TMP1 110 for type in hash btree; do 111 rm -f $TMP2 $TMP3 112 for i in `find /bin -type f -print`; do 113 printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i 114 done > $TMP2 115 $PROG -o $TMP3 $type $TMP2 116 if (cmp -s $TMP1 $TMP3) ; then 117 else 118 printf "test3: type %s: failed\n" $type 119 exit 1 120 fi 121 done 122 printf "Test 3: recno: big data pairs\n" 123 rm -f $TMP2 $TMP3 124 find /bin -type f -print | 125 awk '{ 126 ++i; 127 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i); 128 }' > $TMP2 129 $PROG -o $TMP3 recno $TMP2 130 if (cmp -s $TMP1 $TMP3) ; then 131 else 132 printf "test3: type recno: failed\n" 133 exit 1 134 fi 135} 136 137# Do random recno entries. 138test4() 139{ 140 printf "Test 4: recno: random entries\n" 141 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 142 awk '{ 143 for (i = 37; i <= 37 + 88 * 17; i += 17) 144 printf("input key %d: %.*s\n", i, i % 41, $0); 145 for (i = 1; i <= 15; ++i) 146 printf("input key %d: %.*s\n", i, i % 41, $0); 147 for (i = 19234; i <= 19234 + 61 * 27; i += 27) 148 printf("input key %d: %.*s\n", i, i % 41, $0); 149 exit 150 }' > $TMP1 151 rm -f TMP2 $TMP3 152 cat $TMP1 | 153 awk 'BEGIN { 154 i = 37; 155 incr = 17; 156 } 157 { 158 printf("p\nk%d\nd%s\n", i, $0); 159 if (i == 19234 + 61 * 27) 160 exit; 161 if (i == 37 + 88 * 17) { 162 i = 1; 163 incr = 1; 164 } else if (i == 15) { 165 i = 19234; 166 incr = 27; 167 } else 168 i += incr; 169 } 170 END { 171 for (i = 37; i <= 37 + 88 * 17; i += 17) 172 printf("g\nk%d\n", i); 173 for (i = 1; i <= 15; ++i) 174 printf("g\nk%d\n", i); 175 for (i = 19234; i <= 19234 + 61 * 27; i += 27) 176 printf("g\nk%d\n", i); 177 }' > $TMP2 178 $PROG -o $TMP3 recno $TMP2 179 if (cmp -s $TMP1 $TMP3) ; then 180 else 181 printf "test4: type recno: failed\n" 182 exit 1 183 fi 184} 185 186# Do reverse order recno entries. 187test5() 188{ 189 printf "Test 5: recno: reverse order entries\n" 190 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 191 awk ' { 192 for (i = 1500; i; --i) 193 printf("input key %d: %.*s\n", i, i % 34, $0); 194 exit; 195 }' > $TMP1 196 rm -f TMP2 $TMP3 197 cat $TMP1 | 198 awk 'BEGIN { 199 i = 1500; 200 } 201 { 202 printf("p\nk%d\nd%s\n", i, $0); 203 --i; 204 } 205 END { 206 for (i = 1500; i; --i) 207 printf("g\nk%d\n", i); 208 }' > $TMP2 209 $PROG -o $TMP3 recno $TMP2 210 if (cmp -s $TMP1 $TMP3) ; then 211 else 212 printf "test5: type recno: failed\n" 213 exit 1 214 fi 215} 216 217# Do alternating order recno entries. 218test6() 219{ 220 printf "Test 6: recno: alternating order entries\n" 221 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 222 awk ' { 223 for (i = 1; i < 1200; i += 2) 224 printf("input key %d: %.*s\n", i, i % 34, $0); 225 for (i = 2; i < 1200; i += 2) 226 printf("input key %d: %.*s\n", i, i % 34, $0); 227 exit; 228 }' > $TMP1 229 rm -f TMP2 $TMP3 230 cat $TMP1 | 231 awk 'BEGIN { 232 i = 1; 233 even = 0; 234 } 235 { 236 printf("p\nk%d\nd%s\n", i, $0); 237 i += 2; 238 if (i >= 1200) { 239 if (even == 1) 240 exit; 241 even = 1; 242 i = 2; 243 } 244 } 245 END { 246 for (i = 1; i < 1200; ++i) 247 printf("g\nk%d\n", i); 248 }' > $TMP2 249 $PROG -o $TMP3 recno $TMP2 250 sort -o $TMP1 $TMP1 251 sort -o $TMP3 $TMP3 252 if (cmp -s $TMP1 $TMP3) ; then 253 else 254 printf "test6: type recno: failed\n" 255 exit 1 256 fi 257} 258 259# Delete cursor record 260test7() 261{ 262 printf "Test 7: btree, recno: delete cursor record\n" 263 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 264 awk '{ 265 for (i = 1; i <= 120; ++i) 266 printf("%05d: input key %d: %s\n", i, i, $0); 267 printf("%05d: input key %d: %s\n", 120, 120, $0); 268 printf("get failed, no such key\n"); 269 printf("%05d: input key %d: %s\n", 1, 1, $0); 270 printf("%05d: input key %d: %s\n", 2, 2, $0); 271 exit; 272 }' > $TMP1 273 rm -f TMP2 $TMP3 274 275 for type in btree recno; do 276 cat $TMP1 | 277 awk '{ 278 if (i == 120) 279 exit; 280 printf("p\nk%d\nd%s\n", ++i, $0); 281 } 282 END { 283 printf("fR_NEXT\n"); 284 for (i = 1; i <= 120; ++i) 285 printf("s\n"); 286 printf("fR_CURSOR\ns\nk120\n"); 287 printf("r\nk120\n"); 288 printf("fR_NEXT\ns\n"); 289 printf("fR_CURSOR\ns\nk1\n"); 290 printf("r\nk1\n"); 291 printf("fR_FIRST\ns\n"); 292 }' > $TMP2 293 $PROG -o $TMP3 recno $TMP2 294 if (cmp -s $TMP1 $TMP3) ; then 295 else 296 printf "test7: type $type: failed\n" 297 exit 1 298 fi 299 done 300} 301 302# Make sure that overflow pages are reused. 303test8() 304{ 305 printf "Test 8: btree, hash: repeated small key, big data pairs\n" 306 rm -f $TMP1 307 awk 'BEGIN { 308 for (i = 1; i <= 10; ++i) { 309 printf("p\nkkey1\nD/bin/sh\n"); 310 printf("p\nkkey2\nD/bin/csh\n"); 311 if (i % 8 == 0) { 312 printf("c\nkkey2\nD/bin/csh\n"); 313 printf("c\nkkey1\nD/bin/sh\n"); 314 printf("e\t%d of 10 (comparison)\r\n", i); 315 } else 316 printf("e\t%d of 10 \r\n", i); 317 printf("r\nkkey1\nr\nkkey2\n"); 318 } 319 printf("e\n"); 320 printf("eend of test8 run\n"); 321 }' > $TMP1 322 $PROG btree $TMP1 323 $PROG hash $TMP1 324 # No explicit test for success. 325} 326 327# Test btree duplicate keys 328test9() 329{ 330 printf "Test 9: btree: duplicate keys\n" 331 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 332 awk '{ 333 for (i = 1; i <= 543; ++i) 334 printf("%05d: input key %d: %s\n", i, i, $0); 335 exit; 336 }' > $TMP1 337 rm -f TMP2 $TMP3 338 339 for type in btree; do 340 cat $TMP1 | 341 awk '{ 342 if (i++ % 2) 343 printf("p\nkduplicatekey\nd%s\n", $0); 344 else 345 printf("p\nkunique%dkey\nd%s\n", i, $0); 346 } 347 END { 348 printf("o\n"); 349 }' > $TMP2 350 $PROG -iflags=1 -o $TMP3 $type $TMP2 351 sort -o $TMP3 $TMP3 352 if (cmp -s $TMP1 $TMP3) ; then 353 else 354 printf "test9: type $type: failed\n" 355 exit 1 356 fi 357 done 358} 359 360# Test use of cursor flags without initialization 361test10() 362{ 363 printf "Test 10: btree, recno: test cursor flag use\n" 364 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 365 awk '{ 366 for (i = 1; i <= 20; ++i) 367 printf("%05d: input key %d: %s\n", i, i, $0); 368 exit; 369 }' > $TMP1 370 rm -f TMP2 $TMP3 371 372 # Test that R_CURSOR doesn't succeed before cursor initialized 373 for type in btree recno; do 374 cat $TMP1 | 375 awk '{ 376 if (i == 10) 377 exit; 378 printf("p\nk%d\nd%s\n", ++i, $0); 379 } 380 END { 381 printf("fR_CURSOR\nr\nk1\n"); 382 printf("eR_CURSOR SHOULD HAVE FAILED\n"); 383 }' > $TMP2 384 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1 385 if [ -s $TMP3 ] ; then 386 printf "Test 10: delete: R_CURSOR SHOULD HAVE FAILED\n" 387 exit 1 388 fi 389 done 390 for type in btree recno; do 391 cat $TMP1 | 392 awk '{ 393 if (i == 10) 394 exit; 395 printf("p\nk%d\nd%s\n", ++i, $0); 396 } 397 END { 398 printf("fR_CURSOR\np\nk1\ndsome data\n"); 399 printf("eR_CURSOR SHOULD HAVE FAILED\n"); 400 }' > $TMP2 401 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1 402 if [ -s $TMP3 ] ; then 403 printf "Test 10: put: R_CURSOR SHOULD HAVE FAILED\n" 404 exit 1 405 fi 406 done 407} 408 409# Test insert in reverse order. 410test11() 411{ 412 printf "Test 11: recno: reverse order insert\n" 413 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 414 awk '{ 415 for (i = 1; i <= 779; ++i) 416 printf("%05d: input key %d: %s\n", i, i, $0); 417 exit; 418 }' > $TMP1 419 rm -f TMP2 $TMP3 420 421 for type in recno; do 422 cat $TMP1 | 423 awk '{ 424 if (i == 0) { 425 i = 1; 426 printf("p\nk1\nd%s\n", $0); 427 printf("%s\n", "fR_IBEFORE"); 428 } else 429 printf("p\nk1\nd%s\n", $0); 430 } 431 END { 432 printf("or\n"); 433 }' > $TMP2 434 $PROG -o $TMP3 $type $TMP2 435 if (cmp -s $TMP1 $TMP3) ; then 436 else 437 printf "test11: type $type: failed\n" 438 exit 1 439 fi 440 done 441} 442 443# Try a variety of bucketsizes and fill factors for hashing 444test20() 445{ 446 printf\ 447 "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n" 448 awk 'BEGIN { 449 for (i = 1; i <= 10000; ++i) 450 printf("%.*s\n", i % 34, 451 "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"); 452 }' > $TMP1 453 sed 10000q $DICT | 454 awk '{ 455 ++i; 456 printf("p\nk%s\nd%.*s\n", $0, i % 34, 457 "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"); 458 }' > $TMP2 459 sed 10000q $DICT | 460 awk '{ 461 ++i; 462 printf("g\nk%s\n", $0); 463 }' >> $TMP2 464 bsize=256 465 for ffactor in 11 14 21; do 466 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 467 $PROG -o$TMP3 \ 468 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 469 hash $TMP2 470 if (cmp -s $TMP1 $TMP3) ; then 471 else 472 printf "test20: type hash:\ 473bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 474 exit 1 475 fi 476 done 477 bsize=512 478 for ffactor in 21 28 43; do 479 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 480 $PROG -o$TMP3 \ 481 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 482 hash $TMP2 483 if (cmp -s $TMP1 $TMP3) ; then 484 else 485 printf "test20: type hash:\ 486bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 487 exit 1 488 fi 489 done 490 bsize=1024 491 for ffactor in 43 57 85; do 492 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 493 $PROG -o$TMP3 \ 494 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 495 hash $TMP2 496 if (cmp -s $TMP1 $TMP3) ; then 497 else 498 printf "test20: type hash:\ 499bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 500 exit 1 501 fi 502 done 503 bsize=2048 504 for ffactor in 85 114 171; do 505 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 506 $PROG -o$TMP3 \ 507 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 508 hash $TMP2 509 if (cmp -s $TMP1 $TMP3) ; then 510 else 511 printf "test20: type hash:\ 512bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 513 exit 1 514 fi 515 done 516 bsize=4096 517 for ffactor in 171 228 341; do 518 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 519 $PROG -o$TMP3 \ 520 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 521 hash $TMP2 522 if (cmp -s $TMP1 $TMP3) ; then 523 else 524 printf "test20: type hash:\ 525bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 526 exit 1 527 fi 528 done 529 bsize=8192 530 for ffactor in 341 455 683; do 531 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 532 $PROG -o$TMP3 \ 533 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 534 hash $TMP2 535 if (cmp -s $TMP1 $TMP3) ; then 536 else 537 printf "test20: type hash:\ 538bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 539 exit 1 540 fi 541 done 542} 543 544main 545