home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / lib / libc / db / test / run.test < prev    next >
Encoding:
Text File  |  1993-06-04  |  13.6 KB  |  617 lines

  1. #!/bin/sh -
  2. #
  3. #    @(#)run.test    8.1 (Berkeley) 6/4/93
  4. #
  5.  
  6. # db regression tests
  7.  
  8. main()
  9. {
  10.     DICT=/usr/share/dict/words
  11.     PROG=obj/dbtest
  12.     TMP1=t1
  13.     TMP2=t2
  14.     TMP3=t3
  15.  
  16.     test1
  17.     test2
  18.     test3
  19.     test4
  20.     test5
  21.     test6
  22.     test7
  23.     test8
  24.     test9
  25.     test10
  26.     test11
  27.     test12
  28.     test13
  29.     test20
  30.     rm -f $TMP1 $TMP2 $TMP3
  31.     exit 0
  32. }
  33.  
  34. # Take the first hundred entries in the dictionary, and make them
  35. # be key/data pairs.
  36. test1()
  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 200 entries in the dictionary, and give them
  68. # each a medium size data entry.
  69. test2()
  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.
  102. test3()
  103. {
  104.     printf "Test 3: 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; 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: %s: page size %d: failed\n" \
  116.                 $type $psize
  117.             exit 1
  118.         fi
  119.     done
  120.     printf "Test 3: btree: small key, big data pairs\n"
  121.     for psize in 512 16384 65536; do
  122.         printf "\tpage size %d\n" $psize
  123.         for type in btree; do
  124.             rm -f $TMP2 $TMP3
  125.             for i in `find /bin -type f -print`; do
  126.                 printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i
  127.             done > $TMP2
  128.             $PROG -i psize=$psize -o $TMP3 $type $TMP2
  129.             if (cmp -s $TMP1 $TMP3) ; then :
  130.             else
  131.                 printf "test3: %s: page size %d: failed\n" \
  132.                     $type $psize
  133.                 exit 1
  134.             fi
  135.         done
  136.     done
  137.     printf "Test 3: recno: big data pairs\n"
  138.     rm -f $TMP2 $TMP3
  139.     find /bin -type f -print | 
  140.     awk '{
  141.         ++i;
  142.         printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
  143.     }' > $TMP2
  144.     for psize in 512 16384 65536; do
  145.         printf "\tpage size %d\n" $psize
  146.         $PROG -i psize=$psize -o $TMP3 recno $TMP2
  147.         if (cmp -s $TMP1 $TMP3) ; then :
  148.         else
  149.             printf "test3: recno: page size %d: failed\n" $psize
  150.             exit 1
  151.         fi
  152.     done
  153. }
  154.  
  155. # Do random recno entries.
  156. test4()
  157. {
  158.     printf "Test 4: recno: random entries\n"
  159.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  160.     awk '{
  161.         for (i = 37; i <= 37 + 88 * 17; i += 17)
  162.             printf("input key %d: %.*s\n", i, i % 41, $0);
  163.         for (i = 1; i <= 15; ++i)
  164.             printf("input key %d: %.*s\n", i, i % 41, $0);
  165.         for (i = 19234; i <= 19234 + 61 * 27; i += 27)
  166.             printf("input key %d: %.*s\n", i, i % 41, $0);
  167.         exit
  168.     }' > $TMP1
  169.     rm -f TMP2 $TMP3
  170.     cat $TMP1 |
  171.     awk 'BEGIN {
  172.             i = 37;
  173.             incr = 17;
  174.         }
  175.         {
  176.             printf("p\nk%d\nd%s\n", i, $0);
  177.             if (i == 19234 + 61 * 27)
  178.                 exit;
  179.             if (i == 37 + 88 * 17) {
  180.                 i = 1;
  181.                 incr = 1;
  182.             } else if (i == 15) {
  183.                 i = 19234;
  184.                 incr = 27;
  185.             } else
  186.                 i += incr;
  187.         }
  188.         END {
  189.             for (i = 37; i <= 37 + 88 * 17; i += 17)
  190.                 printf("g\nk%d\n", i);
  191.             for (i = 1; i <= 15; ++i)
  192.                 printf("g\nk%d\n", i);
  193.             for (i = 19234; i <= 19234 + 61 * 27; i += 27)
  194.                 printf("g\nk%d\n", i);
  195.         }' > $TMP2
  196.     $PROG -o $TMP3 recno $TMP2
  197.     if (cmp -s $TMP1 $TMP3) ; then :
  198.     else
  199.         printf "test4: type recno: failed\n"
  200.         exit 1
  201.     fi
  202. }
  203.  
  204. # Do reverse order recno entries.
  205. test5()
  206. {
  207.     printf "Test 5: recno: reverse order entries\n"
  208.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  209.     awk ' {
  210.         for (i = 1500; i; --i)
  211.             printf("input key %d: %.*s\n", i, i % 34, $0);
  212.         exit;
  213.     }' > $TMP1
  214.     rm -f TMP2 $TMP3
  215.     cat $TMP1 |
  216.     awk 'BEGIN {
  217.             i = 1500;
  218.         }
  219.         {
  220.             printf("p\nk%d\nd%s\n", i, $0);
  221.             --i;
  222.         }
  223.         END {
  224.             for (i = 1500; i; --i) 
  225.                 printf("g\nk%d\n", i);
  226.         }' > $TMP2
  227.     $PROG -o $TMP3 recno $TMP2
  228.     if (cmp -s $TMP1 $TMP3) ; then :
  229.     else
  230.         printf "test5: type recno: failed\n"
  231.         exit 1
  232.     fi
  233. }
  234.         
  235. # Do alternating order recno entries.
  236. test6()
  237. {
  238.     printf "Test 6: recno: alternating order entries\n"
  239.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  240.     awk ' {
  241.         for (i = 1; i < 1200; i += 2)
  242.             printf("input key %d: %.*s\n", i, i % 34, $0);
  243.         for (i = 2; i < 1200; i += 2)
  244.             printf("input key %d: %.*s\n", i, i % 34, $0);
  245.         exit;
  246.     }' > $TMP1
  247.     rm -f TMP2 $TMP3
  248.     cat $TMP1 |
  249.     awk 'BEGIN {
  250.             i = 1;
  251.             even = 0;
  252.         }
  253.         {
  254.             printf("p\nk%d\nd%s\n", i, $0);
  255.             i += 2;
  256.             if (i >= 1200) {
  257.                 if (even == 1)
  258.                     exit;
  259.                 even = 1;
  260.                 i = 2;
  261.             }
  262.         }
  263.         END {
  264.             for (i = 1; i < 1200; ++i) 
  265.                 printf("g\nk%d\n", i);
  266.         }' > $TMP2
  267.     $PROG -o $TMP3 recno $TMP2
  268.     sort -o $TMP1 $TMP1
  269.     sort -o $TMP3 $TMP3
  270.     if (cmp -s $TMP1 $TMP3) ; then :
  271.     else
  272.         printf "test6: type recno: failed\n"
  273.         exit 1
  274.     fi
  275. }
  276.  
  277. # Delete cursor record
  278. test7()
  279. {
  280.     printf "Test 7: btree, recno: delete cursor record\n"
  281.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  282.     awk '{
  283.         for (i = 1; i <= 120; ++i)
  284.             printf("%05d: input key %d: %s\n", i, i, $0);
  285.         printf("%05d: input key %d: %s\n", 120, 120, $0);
  286.         printf("get failed, no such key\n");
  287.         printf("%05d: input key %d: %s\n", 1, 1, $0);
  288.         printf("%05d: input key %d: %s\n", 2, 2, $0);
  289.         exit;
  290.     }' > $TMP1
  291.     rm -f TMP2 $TMP3
  292.  
  293.     for type in btree recno; do
  294.         cat $TMP1 |
  295.         awk '{
  296.             if (i == 120)
  297.                 exit;
  298.             printf("p\nk%d\nd%s\n", ++i, $0);
  299.         }
  300.         END {
  301.             printf("fR_NEXT\n");
  302.             for (i = 1; i <= 120; ++i)
  303.                 printf("s\n");
  304.             printf("fR_CURSOR\ns\nk120\n");
  305.             printf("r\nk120\n");
  306.             printf("fR_NEXT\ns\n");
  307.             printf("fR_CURSOR\ns\nk1\n");
  308.             printf("r\nk1\n");
  309.             printf("fR_FIRST\ns\n");
  310.         }' > $TMP2
  311.         $PROG -o $TMP3 recno $TMP2
  312.         if (cmp -s $TMP1 $TMP3) ; then :
  313.         else
  314.             printf "test7: type $type: failed\n"
  315.             exit 1
  316.         fi
  317.     done
  318. }
  319.  
  320. # Make sure that overflow pages are reused.
  321. test8()
  322. {
  323.     printf "Test 8: btree, hash: repeated small key, big data pairs\n"
  324.     rm -f $TMP1
  325.     awk 'BEGIN {
  326.         for (i = 1; i <= 10; ++i) {
  327.             printf("p\nkkey1\nD/bin/sh\n");
  328.             printf("p\nkkey2\nD/bin/csh\n");
  329.             if (i % 8 == 0) {
  330.                 printf("c\nkkey2\nD/bin/csh\n");
  331.                 printf("c\nkkey1\nD/bin/sh\n");
  332.                 printf("e\t%d of 10 (comparison)\r\n", i);
  333.             } else
  334.                 printf("e\t%d of 10             \r\n", i);
  335.             printf("r\nkkey1\nr\nkkey2\n");
  336.         }
  337.         printf("e\n");
  338.         printf("eend of test8 run\n");
  339.     }' > $TMP1
  340.     $PROG btree $TMP1
  341.     $PROG hash $TMP1
  342.     # No explicit test for success.
  343. }
  344.  
  345. # Test btree duplicate keys
  346. test9()
  347. {
  348.     printf "Test 9: btree: duplicate keys\n"
  349.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  350.     awk '{
  351.         for (i = 1; i <= 543; ++i)
  352.             printf("%05d: input key %d: %s\n", i, i, $0);
  353.         exit;
  354.     }' > $TMP1
  355.     rm -f TMP2 $TMP3
  356.  
  357.     for type in btree; do
  358.         cat $TMP1 | 
  359.         awk '{
  360.             if (i++ % 2)
  361.                 printf("p\nkduplicatekey\nd%s\n", $0);
  362.             else
  363.                 printf("p\nkunique%dkey\nd%s\n", i, $0);
  364.         }
  365.         END {
  366.                 printf("o\n");
  367.         }' > $TMP2
  368.         $PROG -iflags=1 -o $TMP3 $type $TMP2
  369.         sort -o $TMP3 $TMP3
  370.         if (cmp -s $TMP1 $TMP3) ; then :
  371.         else
  372.             printf "test9: type $type: failed\n"
  373.             exit 1
  374.         fi
  375.     done
  376. }
  377.  
  378. # Test use of cursor flags without initialization
  379. test10()
  380. {
  381.     printf "Test 10: btree, recno: test cursor flag use\n"
  382.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  383.     awk '{
  384.         for (i = 1; i <= 20; ++i)
  385.             printf("%05d: input key %d: %s\n", i, i, $0);
  386.         exit;
  387.     }' > $TMP1
  388.     rm -f TMP2 $TMP3
  389.  
  390.     # Test that R_CURSOR doesn't succeed before cursor initialized
  391.     for type in btree recno; do
  392.         cat $TMP1 |
  393.         awk '{
  394.             if (i == 10)
  395.                 exit;
  396.             printf("p\nk%d\nd%s\n", ++i, $0);
  397.         }
  398.         END {
  399.             printf("fR_CURSOR\nr\nk1\n");
  400.             printf("eR_CURSOR SHOULD HAVE FAILED\n");
  401.         }' > $TMP2
  402.         $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
  403.         if [ -s $TMP3 ] ; then
  404.             printf "Test 10: delete: R_CURSOR SHOULD HAVE FAILED\n"
  405.             exit 1
  406.         fi
  407.     done
  408.     for type in btree recno; do
  409.         cat $TMP1 |
  410.         awk '{
  411.             if (i == 10)
  412.                 exit;
  413.             printf("p\nk%d\nd%s\n", ++i, $0);
  414.         }
  415.         END {
  416.             printf("fR_CURSOR\np\nk1\ndsome data\n");
  417.             printf("eR_CURSOR SHOULD HAVE FAILED\n");
  418.         }' > $TMP2
  419.         $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
  420.         if [ -s $TMP3 ] ; then
  421.             printf "Test 10: put: R_CURSOR SHOULD HAVE FAILED\n"
  422.             exit 1
  423.         fi
  424.     done
  425. }
  426.  
  427. # Test insert in reverse order.
  428. test11()
  429. {
  430.     printf "Test 11: recno: reverse order insert\n"
  431.     echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
  432.     awk '{
  433.         for (i = 1; i <= 779; ++i)
  434.             printf("%05d: input key %d: %s\n", i, i, $0);
  435.         exit;
  436.     }' > $TMP1
  437.     rm -f TMP2 $TMP3
  438.  
  439.     for type in recno; do
  440.         cat $TMP1 |
  441.         awk '{
  442.             if (i == 0) {
  443.                 i = 1;
  444.                 printf("p\nk1\nd%s\n", $0);
  445.                 printf("%s\n", "fR_IBEFORE");
  446.             } else
  447.                 printf("p\nk1\nd%s\n", $0);
  448.         }
  449.         END {
  450.                 printf("or\n");
  451.         }' > $TMP2
  452.         $PROG -o $TMP3 $type $TMP2
  453.         if (cmp -s $TMP1 $TMP3) ; then :
  454.         else
  455.             printf "test11: type $type: failed\n"
  456.             exit 1
  457.         fi
  458.     done
  459. }
  460.  
  461. # Take the first 20000 entries in the dictionary, reverse them, and give
  462. # them each a small size data entry.  Use a small page size to make sure
  463. # the btree split code gets hammered.
  464. test12()
  465. {
  466.     printf "Test 12: btree: lots of keys, small page size\n"
  467.     mdata=abcdefghijklmnopqrstuvwxy
  468.     echo $mdata |
  469.     awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
  470.     for type in btree; do
  471.         rm -f $TMP2 $TMP3
  472.         for i in `sed 20000q $DICT | rev`; do
  473.             printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i
  474.         done > $TMP2
  475.         $PROG -i psize=512 -o $TMP3 $type $TMP2
  476.         if (cmp -s $TMP1 $TMP3) ; then :
  477.         else
  478.             printf "test12: type %s: failed\n" $type
  479.             exit 1
  480.         fi
  481.     done
  482. }
  483.  
  484. # Test different byte orders.
  485. test13()
  486. {
  487.     printf "Test 13: btree, hash: differing byte orders\n"
  488.     sed 50q $DICT > $TMP1
  489.     for order in 1234 4321; do
  490.         for type in btree hash; do
  491.             rm -f byte.file $TMP2 $TMP3
  492.             for i in `sed 50q $DICT`; do
  493.                 printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i
  494.             done > $TMP2
  495.             $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
  496.             if (cmp -s $TMP1 $TMP3) ; then :
  497.             else
  498.                 printf "test13: %s/%s put failed\n" $type $order
  499.                 exit 1
  500.             fi
  501.             for i in `sed 50q $DICT`; do
  502.                 printf "g\nk%s\n" $i
  503.             done > $TMP2
  504.             $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
  505.             if (cmp -s $TMP1 $TMP3) ; then :
  506.             else
  507.                 printf "test13: %s/%s get failed\n" $type $order
  508.                 exit 1
  509.             fi
  510.         done
  511.     done
  512.     rm -f byte.file
  513. }
  514.  
  515. # Try a variety of bucketsizes and fill factors for hashing
  516. test20()
  517. {
  518.     printf\
  519.     "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n"
  520.     awk 'BEGIN {
  521.         for (i = 1; i <= 10000; ++i)
  522.             printf("%.*s\n", i % 34,
  523.             "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
  524.     }' > $TMP1
  525.     sed 10000q $DICT |
  526.     awk '{
  527.         ++i;
  528.         printf("p\nk%s\nd%.*s\n", $0, i % 34,
  529.             "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
  530.     }' > $TMP2
  531.     sed 10000q $DICT |
  532.     awk '{
  533.         ++i;
  534.         printf("g\nk%s\n", $0);
  535.     }' >> $TMP2
  536.     bsize=256
  537.     for ffactor in 11 14 21; do
  538.         printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
  539.         $PROG -o$TMP3 \
  540.             -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
  541.             hash $TMP2
  542.         if (cmp -s $TMP1 $TMP3) ; then :
  543.         else
  544.             printf "test20: type hash:\
  545. bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
  546.             exit 1
  547.         fi
  548.     done
  549.     bsize=512
  550.     for ffactor in 21 28 43; do
  551.         printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
  552.         $PROG -o$TMP3 \
  553.             -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
  554.             hash $TMP2
  555.         if (cmp -s $TMP1 $TMP3) ; then :
  556.         else
  557.             printf "test20: type hash:\
  558. bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
  559.             exit 1
  560.         fi
  561.     done
  562.     bsize=1024
  563.     for ffactor in 43 57 85; do
  564.         printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
  565.         $PROG -o$TMP3 \
  566.             -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
  567.             hash $TMP2
  568.         if (cmp -s $TMP1 $TMP3) ; then :
  569.         else
  570.             printf "test20: type hash:\
  571. bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
  572.             exit 1
  573.         fi
  574.     done
  575.     bsize=2048
  576.     for ffactor in 85 114 171; do
  577.         printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
  578.         $PROG -o$TMP3 \
  579.             -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
  580.             hash $TMP2
  581.         if (cmp -s $TMP1 $TMP3) ; then :
  582.         else
  583.             printf "test20: type hash:\
  584. bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
  585.             exit 1
  586.         fi
  587.     done
  588.     bsize=4096
  589.     for ffactor in 171 228 341; do
  590.         printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
  591.         $PROG -o$TMP3 \
  592.             -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
  593.             hash $TMP2
  594.         if (cmp -s $TMP1 $TMP3) ; then :
  595.         else
  596.             printf "test20: type hash:\
  597. bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
  598.             exit 1
  599.         fi
  600.     done
  601.     bsize=8192
  602.     for ffactor in 341 455 683; do
  603.         printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
  604.         $PROG -o$TMP3 \
  605.             -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
  606.             hash $TMP2
  607.         if (cmp -s $TMP1 $TMP3) ; then :
  608.         else
  609.             printf "test20: type hash:\
  610. bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
  611.             exit 1
  612.         fi
  613.     done
  614. }
  615.  
  616. main
  617.