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