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.6 (Berkeley) 10/09/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 for type in btree recno; do 271 cat $TMP1 | 272 awk '{ 273 if (i == 120) 274 exit; 275 printf("p\nk%d\nd%s\n", ++i, $0); 276 } 277 END { 278 printf("fR_NEXT\n"); 279 for (i = 1; i <= 120; ++i) 280 printf("s\n"); 281 printf("fR_CURSOR\ns\nk120\n"); 282 printf("r\nk120\n"); 283 printf("fR_NEXT\ns\n"); 284 printf("fR_CURSOR\ns\nk1\n"); 285 printf("r\nk1\n"); 286 printf("fR_FIRST\ns\n"); 287 }' > $TMP2 288 $PROG -o $TMP3 recno $TMP2 289 if (cmp -s $TMP1 $TMP3) ; then 290 else 291 printf "test7: type $type: failed\n" 292 exit 1 293 fi 294 done 295} 296 297# Make sure that overflow pages are reused. 298test8() 299{ 300 printf "Test 8: btree, hash: repeated small key, big data pairs\n" 301 rm -f $TMP1 302 awk 'BEGIN { 303 for (i = 1; i <= 100; ++i) { 304 printf("p\nkkey1\nD/bin/sh\n"); 305 printf("p\nkkey2\nD/bin/csh\n"); 306 printf("r\nkkey1\nr\nkkey2\n"); 307 } 308 }' > $TMP1 309 $PROG -o $TMP2 btree $TMP1 310 $PROG -o $TMP2 hash $TMP1 311 # No explicit test for success. 312} 313 314# Try a variety of bucketsizes and fill factors for hashing 315test9() 316{ 317 printf\ 318 "Test 9: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n" 319 awk 'BEGIN { 320 for (i = 1; i <= 10000; ++i) 321 printf("%.*s\n", i % 34, 322 "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"); 323 }' > $TMP1 324 sed 10000q $DICT | 325 awk '{ 326 ++i; 327 printf("p\nk%s\nd%.*s\n", $0, i % 34, 328 "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"); 329 }' > $TMP2 330 sed 10000q $DICT | 331 awk '{ 332 ++i; 333 printf("g\nk%s\n", $0); 334 }' >> $TMP2 335 bsize=256 336 for ffactor in 11 14 21; do 337 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 338 $PROG -o$TMP3 \ 339 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 340 hash $TMP2 341 if (cmp -s $TMP1 $TMP3) ; then 342 else 343 printf "test9: type hash:\ 344bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 345 exit 1 346 fi 347 done 348 bsize=512 349 for ffactor in 21 28 43; do 350 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 351 $PROG -o$TMP3 \ 352 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 353 hash $TMP2 354 if (cmp -s $TMP1 $TMP3) ; then 355 else 356 printf "test9: type hash:\ 357bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 358 exit 1 359 fi 360 done 361 bsize=1024 362 for ffactor in 43 57 85; do 363 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 364 $PROG -o$TMP3 \ 365 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 366 hash $TMP2 367 if (cmp -s $TMP1 $TMP3) ; then 368 else 369 printf "test9: type hash:\ 370bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 371 exit 1 372 fi 373 done 374 bsize=2048 375 for ffactor in 85 114 171; do 376 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 377 $PROG -o$TMP3 \ 378 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 379 hash $TMP2 380 if (cmp -s $TMP1 $TMP3) ; then 381 else 382 printf "test9: type hash:\ 383bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 384 exit 1 385 fi 386 done 387 bsize=4096 388 for ffactor in 171 228 341; do 389 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 390 $PROG -o$TMP3 \ 391 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 392 hash $TMP2 393 if (cmp -s $TMP1 $TMP3) ; then 394 else 395 printf "test9: type hash:\ 396bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 397 exit 1 398 fi 399 done 400 bsize=8192 401 for ffactor in 341 455 683; do 402 printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor 403 $PROG -o$TMP3 \ 404 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 405 hash $TMP2 406 if (cmp -s $TMP1 $TMP3) ; then 407 else 408 printf "test9: type hash:\ 409bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n" 410 exit 1 411 fi 412 done 413} 414 415main 416