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