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