BSD 4_4 release
[unix-history] / usr / src / lib / libc / db / test / run.test
#!/bin/sh -
#
# @(#)run.test 8.1 (Berkeley) 6/4/93
#
# db regression tests
main()
{
DICT=/usr/share/dict/words
PROG=obj/dbtest
TMP1=t1
TMP2=t2
TMP3=t3
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
test11
test12
test13
test20
rm -f $TMP1 $TMP2 $TMP3
exit 0
}
# Take the first hundred entries in the dictionary, and make them
# be key/data pairs.
test1()
{
printf "Test 1: btree, hash: small key, small data pairs\n"
sed 200q $DICT > $TMP1
for type in btree hash; do
rm -f $TMP2 $TMP3
for i in `sed 200q $DICT`; do
printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i
done > $TMP2
$PROG -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test1: type %s: failed\n" $type
exit 1
fi
done
printf "Test 1: recno: small key, small data pairs\n"
rm -f $TMP2 $TMP3
sed 200q $DICT |
awk '{
++i;
printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
}' > $TMP2
$PROG -o $TMP3 recno $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test1: type recno: failed\n"
exit 1
fi
}
# Take the first 200 entries in the dictionary, and give them
# each a medium size data entry.
test2()
{
printf "Test 2: btree, hash: small key, medium data pairs\n"
mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
echo $mdata |
awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
for type in hash btree; do
rm -f $TMP2 $TMP3
for i in `sed 200q $DICT`; do
printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i
done > $TMP2
$PROG -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test2: type %s: failed\n" $type
exit 1
fi
done
printf "Test 2: recno: small key, medium data pairs\n"
rm -f $TMP2 $TMP3
echo $mdata |
awk '{ for (i = 1; i < 201; ++i)
printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
}' > $TMP2
$PROG -o $TMP3 recno $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test2: type recno: failed\n"
exit 1
fi
}
# Insert the programs in /bin with their paths as their keys.
test3()
{
printf "Test 3: hash: small key, big data pairs\n"
rm -f $TMP1
(find /bin -type f -print | xargs cat) > $TMP1
for type in hash; do
rm -f $TMP2 $TMP3
for i in `find /bin -type f -print`; do
printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i
done > $TMP2
$PROG -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test3: %s: page size %d: failed\n" \
$type $psize
exit 1
fi
done
printf "Test 3: btree: small key, big data pairs\n"
for psize in 512 16384 65536; do
printf "\tpage size %d\n" $psize
for type in btree; do
rm -f $TMP2 $TMP3
for i in `find /bin -type f -print`; do
printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i
done > $TMP2
$PROG -i psize=$psize -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test3: %s: page size %d: failed\n" \
$type $psize
exit 1
fi
done
done
printf "Test 3: recno: big data pairs\n"
rm -f $TMP2 $TMP3
find /bin -type f -print |
awk '{
++i;
printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
}' > $TMP2
for psize in 512 16384 65536; do
printf "\tpage size %d\n" $psize
$PROG -i psize=$psize -o $TMP3 recno $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test3: recno: page size %d: failed\n" $psize
exit 1
fi
done
}
# Do random recno entries.
test4()
{
printf "Test 4: recno: random entries\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk '{
for (i = 37; i <= 37 + 88 * 17; i += 17)
printf("input key %d: %.*s\n", i, i % 41, $0);
for (i = 1; i <= 15; ++i)
printf("input key %d: %.*s\n", i, i % 41, $0);
for (i = 19234; i <= 19234 + 61 * 27; i += 27)
printf("input key %d: %.*s\n", i, i % 41, $0);
exit
}' > $TMP1
rm -f TMP2 $TMP3
cat $TMP1 |
awk 'BEGIN {
i = 37;
incr = 17;
}
{
printf("p\nk%d\nd%s\n", i, $0);
if (i == 19234 + 61 * 27)
exit;
if (i == 37 + 88 * 17) {
i = 1;
incr = 1;
} else if (i == 15) {
i = 19234;
incr = 27;
} else
i += incr;
}
END {
for (i = 37; i <= 37 + 88 * 17; i += 17)
printf("g\nk%d\n", i);
for (i = 1; i <= 15; ++i)
printf("g\nk%d\n", i);
for (i = 19234; i <= 19234 + 61 * 27; i += 27)
printf("g\nk%d\n", i);
}' > $TMP2
$PROG -o $TMP3 recno $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test4: type recno: failed\n"
exit 1
fi
}
# Do reverse order recno entries.
test5()
{
printf "Test 5: recno: reverse order entries\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk ' {
for (i = 1500; i; --i)
printf("input key %d: %.*s\n", i, i % 34, $0);
exit;
}' > $TMP1
rm -f TMP2 $TMP3
cat $TMP1 |
awk 'BEGIN {
i = 1500;
}
{
printf("p\nk%d\nd%s\n", i, $0);
--i;
}
END {
for (i = 1500; i; --i)
printf("g\nk%d\n", i);
}' > $TMP2
$PROG -o $TMP3 recno $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test5: type recno: failed\n"
exit 1
fi
}
# Do alternating order recno entries.
test6()
{
printf "Test 6: recno: alternating order entries\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk ' {
for (i = 1; i < 1200; i += 2)
printf("input key %d: %.*s\n", i, i % 34, $0);
for (i = 2; i < 1200; i += 2)
printf("input key %d: %.*s\n", i, i % 34, $0);
exit;
}' > $TMP1
rm -f TMP2 $TMP3
cat $TMP1 |
awk 'BEGIN {
i = 1;
even = 0;
}
{
printf("p\nk%d\nd%s\n", i, $0);
i += 2;
if (i >= 1200) {
if (even == 1)
exit;
even = 1;
i = 2;
}
}
END {
for (i = 1; i < 1200; ++i)
printf("g\nk%d\n", i);
}' > $TMP2
$PROG -o $TMP3 recno $TMP2
sort -o $TMP1 $TMP1
sort -o $TMP3 $TMP3
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test6: type recno: failed\n"
exit 1
fi
}
# Delete cursor record
test7()
{
printf "Test 7: btree, recno: delete cursor record\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk '{
for (i = 1; i <= 120; ++i)
printf("%05d: input key %d: %s\n", i, i, $0);
printf("%05d: input key %d: %s\n", 120, 120, $0);
printf("get failed, no such key\n");
printf("%05d: input key %d: %s\n", 1, 1, $0);
printf("%05d: input key %d: %s\n", 2, 2, $0);
exit;
}' > $TMP1
rm -f TMP2 $TMP3
for type in btree recno; do
cat $TMP1 |
awk '{
if (i == 120)
exit;
printf("p\nk%d\nd%s\n", ++i, $0);
}
END {
printf("fR_NEXT\n");
for (i = 1; i <= 120; ++i)
printf("s\n");
printf("fR_CURSOR\ns\nk120\n");
printf("r\nk120\n");
printf("fR_NEXT\ns\n");
printf("fR_CURSOR\ns\nk1\n");
printf("r\nk1\n");
printf("fR_FIRST\ns\n");
}' > $TMP2
$PROG -o $TMP3 recno $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test7: type $type: failed\n"
exit 1
fi
done
}
# Make sure that overflow pages are reused.
test8()
{
printf "Test 8: btree, hash: repeated small key, big data pairs\n"
rm -f $TMP1
awk 'BEGIN {
for (i = 1; i <= 10; ++i) {
printf("p\nkkey1\nD/bin/sh\n");
printf("p\nkkey2\nD/bin/csh\n");
if (i % 8 == 0) {
printf("c\nkkey2\nD/bin/csh\n");
printf("c\nkkey1\nD/bin/sh\n");
printf("e\t%d of 10 (comparison)\r\n", i);
} else
printf("e\t%d of 10 \r\n", i);
printf("r\nkkey1\nr\nkkey2\n");
}
printf("e\n");
printf("eend of test8 run\n");
}' > $TMP1
$PROG btree $TMP1
$PROG hash $TMP1
# No explicit test for success.
}
# Test btree duplicate keys
test9()
{
printf "Test 9: btree: duplicate keys\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk '{
for (i = 1; i <= 543; ++i)
printf("%05d: input key %d: %s\n", i, i, $0);
exit;
}' > $TMP1
rm -f TMP2 $TMP3
for type in btree; do
cat $TMP1 |
awk '{
if (i++ % 2)
printf("p\nkduplicatekey\nd%s\n", $0);
else
printf("p\nkunique%dkey\nd%s\n", i, $0);
}
END {
printf("o\n");
}' > $TMP2
$PROG -iflags=1 -o $TMP3 $type $TMP2
sort -o $TMP3 $TMP3
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test9: type $type: failed\n"
exit 1
fi
done
}
# Test use of cursor flags without initialization
test10()
{
printf "Test 10: btree, recno: test cursor flag use\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk '{
for (i = 1; i <= 20; ++i)
printf("%05d: input key %d: %s\n", i, i, $0);
exit;
}' > $TMP1
rm -f TMP2 $TMP3
# Test that R_CURSOR doesn't succeed before cursor initialized
for type in btree recno; do
cat $TMP1 |
awk '{
if (i == 10)
exit;
printf("p\nk%d\nd%s\n", ++i, $0);
}
END {
printf("fR_CURSOR\nr\nk1\n");
printf("eR_CURSOR SHOULD HAVE FAILED\n");
}' > $TMP2
$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
if [ -s $TMP3 ] ; then
printf "Test 10: delete: R_CURSOR SHOULD HAVE FAILED\n"
exit 1
fi
done
for type in btree recno; do
cat $TMP1 |
awk '{
if (i == 10)
exit;
printf("p\nk%d\nd%s\n", ++i, $0);
}
END {
printf("fR_CURSOR\np\nk1\ndsome data\n");
printf("eR_CURSOR SHOULD HAVE FAILED\n");
}' > $TMP2
$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
if [ -s $TMP3 ] ; then
printf "Test 10: put: R_CURSOR SHOULD HAVE FAILED\n"
exit 1
fi
done
}
# Test insert in reverse order.
test11()
{
printf "Test 11: recno: reverse order insert\n"
echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
awk '{
for (i = 1; i <= 779; ++i)
printf("%05d: input key %d: %s\n", i, i, $0);
exit;
}' > $TMP1
rm -f TMP2 $TMP3
for type in recno; do
cat $TMP1 |
awk '{
if (i == 0) {
i = 1;
printf("p\nk1\nd%s\n", $0);
printf("%s\n", "fR_IBEFORE");
} else
printf("p\nk1\nd%s\n", $0);
}
END {
printf("or\n");
}' > $TMP2
$PROG -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test11: type $type: failed\n"
exit 1
fi
done
}
# Take the first 20000 entries in the dictionary, reverse them, and give
# them each a small size data entry. Use a small page size to make sure
# the btree split code gets hammered.
test12()
{
printf "Test 12: btree: lots of keys, small page size\n"
mdata=abcdefghijklmnopqrstuvwxy
echo $mdata |
awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
for type in btree; do
rm -f $TMP2 $TMP3
for i in `sed 20000q $DICT | rev`; do
printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i
done > $TMP2
$PROG -i psize=512 -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test12: type %s: failed\n" $type
exit 1
fi
done
}
# Test different byte orders.
test13()
{
printf "Test 13: btree, hash: differing byte orders\n"
sed 50q $DICT > $TMP1
for order in 1234 4321; do
for type in btree hash; do
rm -f byte.file $TMP2 $TMP3
for i in `sed 50q $DICT`; do
printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i
done > $TMP2
$PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test13: %s/%s put failed\n" $type $order
exit 1
fi
for i in `sed 50q $DICT`; do
printf "g\nk%s\n" $i
done > $TMP2
$PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test13: %s/%s get failed\n" $type $order
exit 1
fi
done
done
rm -f byte.file
}
# Try a variety of bucketsizes and fill factors for hashing
test20()
{
printf\
"Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n"
awk 'BEGIN {
for (i = 1; i <= 10000; ++i)
printf("%.*s\n", i % 34,
"abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
}' > $TMP1
sed 10000q $DICT |
awk '{
++i;
printf("p\nk%s\nd%.*s\n", $0, i % 34,
"abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
}' > $TMP2
sed 10000q $DICT |
awk '{
++i;
printf("g\nk%s\n", $0);
}' >> $TMP2
bsize=256
for ffactor in 11 14 21; do
printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
$PROG -o$TMP3 \
-ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
hash $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test20: type hash:\
bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
exit 1
fi
done
bsize=512
for ffactor in 21 28 43; do
printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
$PROG -o$TMP3 \
-ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
hash $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test20: type hash:\
bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
exit 1
fi
done
bsize=1024
for ffactor in 43 57 85; do
printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
$PROG -o$TMP3 \
-ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
hash $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test20: type hash:\
bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
exit 1
fi
done
bsize=2048
for ffactor in 85 114 171; do
printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
$PROG -o$TMP3 \
-ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
hash $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test20: type hash:\
bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
exit 1
fi
done
bsize=4096
for ffactor in 171 228 341; do
printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
$PROG -o$TMP3 \
-ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
hash $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test20: type hash:\
bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
exit 1
fi
done
bsize=8192
for ffactor in 341 455 683; do
printf "\tbucketsize %d, fill factor %d\n" $bsize $ffactor
$PROG -o$TMP3 \
-ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
hash $TMP2
if (cmp -s $TMP1 $TMP3) ; then :
else
printf "test20: type hash:\
bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
exit 1
fi
done
}
main