Initial import from FreeBSD RELENG_4:
[dragonfly.git] / lib / libc / db / test / run.test
1 #!/bin/sh -
2 #
3 #       @(#)run.test    8.10 (Berkeley) 7/26/94
4 #
5
6 # db regression tests
7 main()
8 {
9
10         PROG=./dbtest
11         TMP1=t1
12         TMP2=t2
13         TMP3=t3
14
15         if [ -f /usr/share/dict/words ]; then
16                 DICT=/usr/share/dict/words
17         elif [ -f /usr/dict/words ]; then
18                 DICT=/usr/dict/words
19         else
20                 echo 'run.test: no dictionary'
21                 exit 1
22         fi
23         
24         if [ $# -eq 0 ]; then
25                 for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
26                         test$t
27                 done
28         else
29                 while [ $# -gt 0 ]
30                         do case "$1" in
31                         test*)
32                                 $1;;
33                         [0-9]*)
34                                 test$1;;
35                         btree)
36                                 for t in 1 2 3 7 8 9 10 12 13; do
37                                         test$t
38                                 done;;
39                         hash)
40                                 for t in 1 2 3 8 13 20; do
41                                         test$t
42                                 done;;
43                         recno)
44                                 for t in 1 2 3 4 5 6 7 10 11; do
45                                         test$t
46                                 done;;
47                         *)
48                                 echo "run.test: unknown test $1"
49                                 echo "usage: run.test test# | type"
50                                 exit 1
51                         esac
52                         shift
53                 done
54         fi
55         rm -f $TMP1 $TMP2 $TMP3
56         exit 0
57 }
58
59 # Take the first hundred entries in the dictionary, and make them
60 # be key/data pairs.
61 test1()
62 {
63         echo "Test 1: btree, hash: small key, small data pairs"
64         sed 200q $DICT > $TMP1
65         for type in btree hash; do
66                 rm -f $TMP2 $TMP3
67                 for i in `sed 200q $DICT`; do
68                         echo p
69                         echo k$i
70                         echo d$i
71                         echo g
72                         echo k$i
73                 done > $TMP2
74                 $PROG -o $TMP3 $type $TMP2
75                 if (cmp -s $TMP1 $TMP3) ; then :
76                 else
77                         echo "test1: type $type: failed"
78                         exit 1
79                 fi
80         done
81         echo "Test 1: recno: small key, small data pairs"
82         rm -f $TMP2 $TMP3
83         sed 200q $DICT |
84         awk '{ 
85                 ++i;
86                 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
87         }' > $TMP2
88         $PROG -o $TMP3 recno $TMP2
89         if (cmp -s $TMP1 $TMP3) ; then :
90         else
91                 echo "test1: type recno: failed"
92                 exit 1
93         fi
94 }
95
96 # Take the first 200 entries in the dictionary, and give them
97 # each a medium size data entry.
98 test2()
99 {
100         echo "Test 2: btree, hash: small key, medium data pairs"
101         mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
102         echo $mdata |
103         awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
104         for type in hash btree; do
105                 rm -f $TMP2 $TMP3
106                 for i in `sed 200q $DICT`; do
107                         echo p
108                         echo k$i
109                         echo d$mdata
110                         echo g
111                         echo k$i
112                 done > $TMP2
113                 $PROG -o $TMP3 $type $TMP2
114                 if (cmp -s $TMP1 $TMP3) ; then :
115                 else
116                         echo "test2: type $type: failed"
117                         exit 1
118                 fi
119         done
120         echo "Test 2: recno: small key, medium data pairs"
121         rm -f $TMP2 $TMP3
122         echo $mdata | 
123         awk '{  for (i = 1; i < 201; ++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                 echo "test2: type recno: failed"
130                 exit 1
131         fi
132 }
133
134 # Insert the programs in /bin with their paths as their keys.
135 test3()
136 {
137         echo "Test 3: hash: small key, big data pairs"
138         rm -f $TMP1
139         (find /bin -type f -print | xargs cat) > $TMP1
140         for type in hash; do
141                 rm -f $TMP2 $TMP3
142                 for i in `find /bin -type f -print`; do
143                         echo p
144                         echo k$i
145                         echo D$i
146                         echo g
147                         echo k$i
148                 done > $TMP2
149                 $PROG -o $TMP3 $type $TMP2
150                 if (cmp -s $TMP1 $TMP3) ; then :
151                 else
152                         echo "test3: $type: failed"
153                         exit 1
154                 fi
155         done
156         echo "Test 3: btree: small key, big data pairs"
157         for psize in 512 16384 65536; do
158                 echo "    page size $psize"
159                 for type in btree; do
160                         rm -f $TMP2 $TMP3
161                         for i in `find /bin -type f -print`; do
162                                 echo p
163                                 echo k$i
164                                 echo D$i
165                                 echo g
166                                 echo k$i
167                         done > $TMP2
168                         $PROG -i psize=$psize -o $TMP3 $type $TMP2
169                         if (cmp -s $TMP1 $TMP3) ; then :
170                         else
171                                 echo "test3: $type: page size $psize: failed"
172                                 exit 1
173                         fi
174                 done
175         done
176         echo "Test 3: recno: big data pairs"
177         rm -f $TMP2 $TMP3
178         find /bin -type f -print | 
179         awk '{
180                 ++i;
181                 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
182         }' > $TMP2
183         for psize in 512 16384 65536; do
184                 echo "    page size $psize"
185                 $PROG -i psize=$psize -o $TMP3 recno $TMP2
186                 if (cmp -s $TMP1 $TMP3) ; then :
187                 else
188                         echo "test3: recno: page size $psize: failed"
189                         exit 1
190                 fi
191         done
192 }
193
194 # Do random recno entries.
195 test4()
196 {
197         echo "Test 4: recno: random entries"
198         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
199         awk '{
200                 for (i = 37; i <= 37 + 88 * 17; i += 17) {
201                         if (i % 41)
202                                 s = substr($0, 1, i % 41);
203                         else
204                                 s = substr($0, 1);
205                         printf("input key %d: %s\n", i, s);
206                 }
207                 for (i = 1; i <= 15; ++i) {
208                         if (i % 41)
209                                 s = substr($0, 1, i % 41);
210                         else
211                                 s = substr($0, 1);
212                         printf("input key %d: %s\n", i, s);
213                 }
214                 for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
215                         if (i % 41)
216                                 s = substr($0, 1, i % 41);
217                         else
218                                 s = substr($0, 1);
219                         printf("input key %d: %s\n", i, s);
220                 }
221                 exit
222         }' > $TMP1
223         rm -f $TMP2 $TMP3
224         cat $TMP1 |
225         awk 'BEGIN {
226                         i = 37;
227                         incr = 17;
228                 }
229                 {
230                         printf("p\nk%d\nd%s\n", i, $0);
231                         if (i == 19234 + 61 * 27)
232                                 exit;
233                         if (i == 37 + 88 * 17) {
234                                 i = 1;
235                                 incr = 1;
236                         } else if (i == 15) {
237                                 i = 19234;
238                                 incr = 27;
239                         } else
240                                 i += incr;
241                 }
242                 END {
243                         for (i = 37; i <= 37 + 88 * 17; i += 17)
244                                 printf("g\nk%d\n", i);
245                         for (i = 1; i <= 15; ++i)
246                                 printf("g\nk%d\n", i);
247                         for (i = 19234; i <= 19234 + 61 * 27; i += 27)
248                                 printf("g\nk%d\n", i);
249                 }' > $TMP2
250         $PROG -o $TMP3 recno $TMP2
251         if (cmp -s $TMP1 $TMP3) ; then :
252         else
253                 echo "test4: type recno: failed"
254                 exit 1
255         fi
256 }
257
258 # Do reverse order recno entries.
259 test5()
260 {
261         echo "Test 5: recno: reverse order entries"
262         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
263         awk ' {
264                 for (i = 1500; i; --i) {
265                         if (i % 34)
266                                 s = substr($0, 1, i % 34);
267                         else
268                                 s = substr($0, 1);
269                         printf("input key %d: %s\n", i, s);
270                 }
271                 exit;
272         }' > $TMP1
273         rm -f $TMP2 $TMP3
274         cat $TMP1 |
275         awk 'BEGIN {
276                         i = 1500;
277                 }
278                 {
279                         printf("p\nk%d\nd%s\n", i, $0);
280                         --i;
281                 }
282                 END {
283                         for (i = 1500; i; --i) 
284                                 printf("g\nk%d\n", i);
285                 }' > $TMP2
286         $PROG -o $TMP3 recno $TMP2
287         if (cmp -s $TMP1 $TMP3) ; then :
288         else
289                 echo "test5: type recno: failed"
290                 exit 1
291         fi
292 }
293                 
294 # Do alternating order recno entries.
295 test6()
296 {
297         echo "Test 6: recno: alternating order entries"
298         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
299         awk ' {
300                 for (i = 1; i < 1200; i += 2) {
301                         if (i % 34)
302                                 s = substr($0, 1, i % 34);
303                         else
304                                 s = substr($0, 1);
305                         printf("input key %d: %s\n", i, s);
306                 }
307                 for (i = 2; i < 1200; i += 2) {
308                         if (i % 34)
309                                 s = substr($0, 1, i % 34);
310                         else
311                                 s = substr($0, 1);
312                         printf("input key %d: %s\n", i, s);
313                 }
314                 exit;
315         }' > $TMP1
316         rm -f $TMP2 $TMP3
317         cat $TMP1 |
318         awk 'BEGIN {
319                         i = 1;
320                         even = 0;
321                 }
322                 {
323                         printf("p\nk%d\nd%s\n", i, $0);
324                         i += 2;
325                         if (i >= 1200) {
326                                 if (even == 1)
327                                         exit;
328                                 even = 1;
329                                 i = 2;
330                         }
331                 }
332                 END {
333                         for (i = 1; i < 1200; ++i) 
334                                 printf("g\nk%d\n", i);
335                 }' > $TMP2
336         $PROG -o $TMP3 recno $TMP2
337         sort -o $TMP1 $TMP1
338         sort -o $TMP3 $TMP3
339         if (cmp -s $TMP1 $TMP3) ; then :
340         else
341                 echo "test6: type recno: failed"
342                 exit 1
343         fi
344 }
345
346 # Delete cursor record
347 test7()
348 {
349         echo "Test 7: btree, recno: delete cursor record"
350         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
351         awk '{
352                 for (i = 1; i <= 120; ++i)
353                         printf("%05d: input key %d: %s\n", i, i, $0);
354                 printf("%05d: input key %d: %s\n", 120, 120, $0);
355                 printf("seq failed, no such key\n");
356                 printf("%05d: input key %d: %s\n", 1, 1, $0);
357                 printf("%05d: input key %d: %s\n", 2, 2, $0);
358                 exit;
359         }' > $TMP1
360         rm -f $TMP2 $TMP3
361
362         for type in btree recno; do
363                 cat $TMP1 |
364                 awk '{
365                         if (i == 120)
366                                 exit;
367                         printf("p\nk%d\nd%s\n", ++i, $0);
368                 }
369                 END {
370                         printf("fR_NEXT\n");
371                         for (i = 1; i <= 120; ++i)
372                                 printf("s\n");
373                         printf("fR_CURSOR\ns\nk120\n");
374                         printf("r\n");
375                         printf("fR_NEXT\ns\n");
376                         printf("fR_CURSOR\ns\nk1\n");
377                         printf("r\n");
378                         printf("fR_FIRST\ns\n");
379                 }' > $TMP2
380                 $PROG -o $TMP3 recno $TMP2
381                 if (cmp -s $TMP1 $TMP3) ; then :
382                 else
383                         echo "test7: type $type: failed"
384                         exit 1
385                 fi
386         done
387 }
388
389 # Make sure that overflow pages are reused.
390 test8()
391 {
392         echo "Test 8: btree, hash: repeated small key, big data pairs"
393         rm -f $TMP1
394         echo "" | 
395         awk 'BEGIN {
396                 for (i = 1; i <= 10; ++i) {
397                         printf("p\nkkey1\nD/bin/sh\n");
398                         printf("p\nkkey2\nD/bin/csh\n");
399                         if (i % 8 == 0) {
400                                 printf("c\nkkey2\nD/bin/csh\n");
401                                 printf("c\nkkey1\nD/bin/sh\n");
402                                 printf("e\t%d of 10 (comparison)\n", i);
403                         } else
404                                 printf("e\t%d of 10             \n", i);
405                         printf("r\nkkey1\nr\nkkey2\n");
406                 }
407         }' > $TMP1
408         $PROG btree $TMP1
409 #       $PROG hash $TMP1
410         # No explicit test for success.
411 }
412
413 # Test btree duplicate keys
414 test9()
415 {
416         echo "Test 9: btree: duplicate keys"
417         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
418         awk '{
419                 for (i = 1; i <= 543; ++i)
420                         printf("%05d: input key %d: %s\n", i, i, $0);
421                 exit;
422         }' > $TMP1
423         rm -f $TMP2 $TMP3
424
425         for type in btree; do
426                 cat $TMP1 | 
427                 awk '{
428                         if (i++ % 2)
429                                 printf("p\nkduplicatekey\nd%s\n", $0);
430                         else
431                                 printf("p\nkunique%dkey\nd%s\n", i, $0);
432                 }
433                 END {
434                                 printf("o\n");
435                 }' > $TMP2
436                 $PROG -iflags=1 -o $TMP3 $type $TMP2
437                 sort -o $TMP3 $TMP3
438                 if (cmp -s $TMP1 $TMP3) ; then :
439                 else
440                         echo "test9: type $type: failed"
441                         exit 1
442                 fi
443         done
444 }
445
446 # Test use of cursor flags without initialization
447 test10()
448 {
449         echo "Test 10: btree, recno: test cursor flag use"
450         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
451         awk '{
452                 for (i = 1; i <= 20; ++i)
453                         printf("%05d: input key %d: %s\n", i, i, $0);
454                 exit;
455         }' > $TMP1
456         rm -f $TMP2 $TMP3
457
458         # Test that R_CURSOR doesn't succeed before cursor initialized
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\nr\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                         echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
473                         exit 1
474                 fi
475         done
476         for type in btree recno; do
477                 cat $TMP1 |
478                 awk '{
479                         if (i == 10)
480                                 exit;
481                         printf("p\nk%d\nd%s\n", ++i, $0);
482                 }
483                 END {
484                         printf("fR_CURSOR\np\nk1\ndsome data\n");
485                         printf("eR_CURSOR SHOULD HAVE FAILED\n");
486                 }' > $TMP2
487                 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
488                 if [ -s $TMP3 ] ; then
489                         echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
490                         exit 1
491                 fi
492         done
493 }
494
495 # Test insert in reverse order.
496 test11()
497 {
498         echo "Test 11: recno: reverse order insert"
499         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
500         awk '{
501                 for (i = 1; i <= 779; ++i)
502                         printf("%05d: input key %d: %s\n", i, i, $0);
503                 exit;
504         }' > $TMP1
505         rm -f $TMP2 $TMP3
506
507         for type in recno; do
508                 cat $TMP1 |
509                 awk '{
510                         if (i == 0) {
511                                 i = 1;
512                                 printf("p\nk1\nd%s\n", $0);
513                                 printf("%s\n", "fR_IBEFORE");
514                         } else
515                                 printf("p\nk1\nd%s\n", $0);
516                 }
517                 END {
518                                 printf("or\n");
519                 }' > $TMP2
520                 $PROG -o $TMP3 $type $TMP2
521                 if (cmp -s $TMP1 $TMP3) ; then :
522                 else
523                         echo "test11: type $type: failed"
524                         exit 1
525                 fi
526         done
527 }
528
529 # Take the first 20000 entries in the dictionary, reverse them, and give
530 # them each a small size data entry.  Use a small page size to make sure
531 # the btree split code gets hammered.
532 test12()
533 {
534         echo "Test 12: btree: lots of keys, small page size"
535         mdata=abcdefghijklmnopqrstuvwxy
536         echo $mdata |
537         awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
538         for type in btree; do
539                 rm -f $TMP2 $TMP3
540                 for i in `sed 20000q $DICT | rev`; do
541                         echo p
542                         echo k$i
543                         echo d$mdata
544                         echo g
545                         echo k$i
546                 done > $TMP2
547                 $PROG -i psize=512 -o $TMP3 $type $TMP2
548                 if (cmp -s $TMP1 $TMP3) ; then :
549                 else
550                         echo "test12: type $type: failed"
551                         exit 1
552                 fi
553         done
554 }
555
556 # Test different byte orders.
557 test13()
558 {
559         echo "Test 13: btree, hash: differing byte orders"
560         sed 50q $DICT > $TMP1
561         for order in 1234 4321; do
562                 for type in btree hash; do
563                         rm -f byte.file $TMP2 $TMP3
564                         for i in `sed 50q $DICT`; do
565                                 echo p
566                                 echo k$i
567                                 echo d$i
568                                 echo g
569                                 echo k$i
570                         done > $TMP2
571                         $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
572                         if (cmp -s $TMP1 $TMP3) ; then :
573                         else
574                                 echo "test13: $type/$order put failed"
575                                 exit 1
576                         fi
577                         for i in `sed 50q $DICT`; do
578                                 echo g
579                                 echo k$i
580                         done > $TMP2
581                         $PROG -s \
582                             -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
583                         if (cmp -s $TMP1 $TMP3) ; then :
584                         else
585                                 echo "test13: $type/$order get failed"
586                                 exit 1
587                         fi
588                 done
589         done
590         rm -f byte.file
591 }
592
593 # Try a variety of bucketsizes and fill factors for hashing
594 test20()
595 {
596         echo\
597     "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
598         echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
599         awk '{
600                 for (i = 1; i <= 10000; ++i) {
601                         if (i % 34)
602                                 s = substr($0, 1, i % 34);
603                         else
604                                 s = substr($0, 1);
605                         printf("%s\n", s);
606                 }
607                 exit;
608         }' > $TMP1
609         sed 10000q $DICT |
610         awk 'BEGIN {
611                 ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
612         }
613         {
614                 if (++i % 34)
615                         s = substr(ds, 1, i % 34);
616                 else
617                         s = substr(ds, 1);
618                 printf("p\nk%s\nd%s\n", $0, s);
619         }' > $TMP2
620         sed 10000q $DICT |
621         awk '{
622                 ++i;
623                 printf("g\nk%s\n", $0);
624         }' >> $TMP2
625         bsize=256
626         for ffactor in 11 14 21; do
627                 echo "    bucketsize $bsize, fill factor $ffactor"
628                 $PROG -o$TMP3 \
629                     -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
630                     hash $TMP2
631                 if (cmp -s $TMP1 $TMP3) ; then :
632                 else
633                         echo "test20: type hash:\
634 bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
635                         exit 1
636                 fi
637         done
638         bsize=512
639         for ffactor in 21 28 43; do
640                 echo "    bucketsize $bsize, fill factor $ffactor"
641                 $PROG -o$TMP3 \
642                     -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
643                     hash $TMP2
644                 if (cmp -s $TMP1 $TMP3) ; then :
645                 else
646                         echo "test20: type hash:\
647 bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
648                         exit 1
649                 fi
650         done
651         bsize=1024
652         for ffactor in 43 57 85; do
653                 echo "    bucketsize $bsize, fill factor $ffactor"
654                 $PROG -o$TMP3 \
655                     -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
656                     hash $TMP2
657                 if (cmp -s $TMP1 $TMP3) ; then :
658                 else
659                         echo "test20: type hash:\
660 bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
661                         exit 1
662                 fi
663         done
664         bsize=2048
665         for ffactor in 85 114 171; do
666                 echo "    bucketsize $bsize, fill factor $ffactor"
667                 $PROG -o$TMP3 \
668                     -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
669                     hash $TMP2
670                 if (cmp -s $TMP1 $TMP3) ; then :
671                 else
672                         echo "test20: type hash:\
673 bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
674                         exit 1
675                 fi
676         done
677         bsize=4096
678         for ffactor in 171 228 341; do
679                 echo "    bucketsize $bsize, fill factor $ffactor"
680                 $PROG -o$TMP3 \
681                     -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
682                     hash $TMP2
683                 if (cmp -s $TMP1 $TMP3) ; then :
684                 else
685                         echo "test20: type hash:\
686 bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
687                         exit 1
688                 fi
689         done
690         bsize=8192
691         for ffactor in 341 455 683; do
692                 echo "    bucketsize $bsize, fill factor $ffactor"
693                 $PROG -o$TMP3 \
694                     -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
695                     hash $TMP2
696                 if (cmp -s $TMP1 $TMP3) ; then :
697                 else
698                         echo "test20: type hash:\
699 bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
700                         exit 1
701                 fi
702         done
703 }
704
705 main $*