xref: /csrg-svn/lib/libc/db/test/run.test (revision 56765)
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.10 (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	test10
31	rm -f $TMP1 $TMP2 $TMP3
32}
33
34# Take the first hundred entries in the dictionary, and make them
35# be key/data pairs.
36test1()
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 hundred entries in the dictionary, and give them
68# each a medium size data entry.
69test2()
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.
102test3()
103{
104	printf "Test 3: btree, 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 btree; 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: type %s: failed\n" $type
116			exit 1
117		fi
118	done
119	printf "Test 3: recno: big data pairs\n"
120	rm -f $TMP2 $TMP3
121	find /bin -type f -print |
122	awk '{
123		++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		printf "test3: type recno: failed\n"
130		exit 1
131	fi
132}
133
134# Do random recno entries.
135test4()
136{
137	printf "Test 4: recno: random entries\n"
138	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
139	awk '{
140		for (i = 37; i <= 37 + 88 * 17; i += 17)
141			printf("input key %d: %.*s\n", i, i % 41, $0);
142		for (i = 1; i <= 15; ++i)
143			printf("input key %d: %.*s\n", i, i % 41, $0);
144		for (i = 19234; i <= 19234 + 61 * 27; i += 27)
145			printf("input key %d: %.*s\n", i, i % 41, $0);
146		exit
147	}' > $TMP1
148	rm -f TMP2 $TMP3
149	cat $TMP1 |
150	awk 'BEGIN {
151			i = 37;
152			incr = 17;
153		}
154		{
155			printf("p\nk%d\nd%s\n", i, $0);
156			if (i == 19234 + 61 * 27)
157				exit;
158			if (i == 37 + 88 * 17) {
159				i = 1;
160				incr = 1;
161			} else if (i == 15) {
162				i = 19234;
163				incr = 27;
164			} else
165				i += incr;
166		}
167		END {
168			for (i = 37; i <= 37 + 88 * 17; i += 17)
169				printf("g\nk%d\n", i);
170			for (i = 1; i <= 15; ++i)
171				printf("g\nk%d\n", i);
172			for (i = 19234; i <= 19234 + 61 * 27; i += 27)
173				printf("g\nk%d\n", i);
174		}' > $TMP2
175	$PROG -o $TMP3 recno $TMP2
176	if (cmp -s $TMP1 $TMP3) ; then
177	else
178		printf "test4: type recno: failed\n"
179		exit 1
180	fi
181}
182
183# Do reverse order recno entries.
184test5()
185{
186	printf "Test 5: recno: reverse order entries\n"
187	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
188	awk ' {
189		for (i = 1500; i; --i)
190			printf("input key %d: %.*s\n", i, i % 34, $0);
191		exit;
192	}' > $TMP1
193	rm -f TMP2 $TMP3
194	cat $TMP1 |
195	awk 'BEGIN {
196			i = 1500;
197		}
198		{
199			printf("p\nk%d\nd%s\n", i, $0);
200			--i;
201		}
202		END {
203			for (i = 1500; i; --i)
204				printf("g\nk%d\n", i);
205		}' > $TMP2
206	$PROG -o $TMP3 recno $TMP2
207	if (cmp -s $TMP1 $TMP3) ; then
208	else
209		printf "test5: type recno: failed\n"
210		exit 1
211	fi
212}
213
214# Do alternating order recno entries.
215test6()
216{
217	printf "Test 6: recno: alternating order entries\n"
218	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
219	awk ' {
220		for (i = 1; i < 1200; i += 2)
221			printf("input key %d: %.*s\n", i, i % 34, $0);
222		for (i = 2; i < 1200; i += 2)
223			printf("input key %d: %.*s\n", i, i % 34, $0);
224		exit;
225	}' > $TMP1
226	rm -f TMP2 $TMP3
227	cat $TMP1 |
228	awk 'BEGIN {
229			i = 1;
230			even = 0;
231		}
232		{
233			printf("p\nk%d\nd%s\n", i, $0);
234			i += 2;
235			if (i >= 1200) {
236				if (even == 1)
237					exit;
238				even = 1;
239				i = 2;
240			}
241		}
242		END {
243			for (i = 1; i < 1200; ++i)
244				printf("g\nk%d\n", i);
245		}' > $TMP2
246	$PROG -o $TMP3 recno $TMP2
247	sort -o $TMP1 $TMP1
248	sort -o $TMP3 $TMP3
249	if (cmp -s $TMP1 $TMP3) ; then
250	else
251		printf "test6: type recno: failed\n"
252		exit 1
253	fi
254}
255
256# Delete cursor record
257test7()
258{
259	printf "Test 7: btree, recno: delete cursor record\n"
260	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
261	awk '{
262		for (i = 1; i <= 120; ++i)
263			printf("%05d: input key %d: %s\n", i, i, $0);
264		printf("%05d: input key %d: %s\n", 120, 120, $0);
265		printf("get failed, no such key\n");
266		printf("%05d: input key %d: %s\n", 1, 1, $0);
267		printf("%05d: input key %d: %s\n", 2, 2, $0);
268		exit;
269	}' > $TMP1
270	rm -f TMP2 $TMP3
271
272	for type in btree recno; do
273		cat $TMP1 |
274		awk '{
275			if (i == 120)
276				exit;
277			printf("p\nk%d\nd%s\n", ++i, $0);
278		}
279		END {
280			printf("fR_NEXT\n");
281			for (i = 1; i <= 120; ++i)
282				printf("s\n");
283			printf("fR_CURSOR\ns\nk120\n");
284			printf("r\nk120\n");
285			printf("fR_NEXT\ns\n");
286			printf("fR_CURSOR\ns\nk1\n");
287			printf("r\nk1\n");
288			printf("fR_FIRST\ns\n");
289		}' > $TMP2
290		$PROG -o $TMP3 recno $TMP2
291		if (cmp -s $TMP1 $TMP3) ; then
292		else
293			printf "test7: type $type: failed\n"
294			exit 1
295		fi
296	done
297}
298
299# Make sure that overflow pages are reused.
300test8()
301{
302	printf "Test 8: btree, hash: repeated small key, big data pairs\n"
303	rm -f $TMP1
304	awk 'BEGIN {
305		for (i = 1; i <= 10; ++i) {
306			printf("p\nkkey1\nD/bin/sh\n");
307			printf("p\nkkey2\nD/bin/csh\n");
308			if (i % 8 == 0) {
309				printf("c\nkkey2\nD/bin/csh\n");
310				printf("c\nkkey1\nD/bin/sh\n");
311				printf("e\t%d of 10 (comparison)\r\n", i);
312			} else
313				printf("e\t%d of 10             \r\n", i);
314			printf("r\nkkey1\nr\nkkey2\n");
315		}
316		printf("e\n");
317		printf("eend of test8 run\n");
318	}' > $TMP1
319	$PROG btree $TMP1
320	$PROG hash $TMP1
321	# No explicit test for success.
322}
323
324# Try a variety of bucketsizes and fill factors for hashing
325test9()
326{
327	printf\
328    "Test 9: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n"
329	awk 'BEGIN {
330		for (i = 1; i <= 10000; ++i)
331			printf("%.*s\n", i % 34,
332		    "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
333	}' > $TMP1
334	sed 10000q $DICT |
335	awk '{
336		++i;
337		printf("p\nk%s\nd%.*s\n", $0, i % 34,
338		    "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
339	}' > $TMP2
340	sed 10000q $DICT |
341	awk '{
342		++i;
343		printf("g\nk%s\n", $0);
344	}' >> $TMP2
345	bsize=256
346	for ffactor in 11 14 21; do
347		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
348		$PROG -o$TMP3 \
349		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
350		    hash $TMP2
351		if (cmp -s $TMP1 $TMP3) ; then
352		else
353			printf "test9: type hash:\
354bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
355			exit 1
356		fi
357	done
358	bsize=512
359	for ffactor in 21 28 43; do
360		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
361		$PROG -o$TMP3 \
362		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
363		    hash $TMP2
364		if (cmp -s $TMP1 $TMP3) ; then
365		else
366			printf "test9: type hash:\
367bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
368			exit 1
369		fi
370	done
371	bsize=1024
372	for ffactor in 43 57 85; do
373		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
374		$PROG -o$TMP3 \
375		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
376		    hash $TMP2
377		if (cmp -s $TMP1 $TMP3) ; then
378		else
379			printf "test9: type hash:\
380bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
381			exit 1
382		fi
383	done
384	bsize=2048
385	for ffactor in 85 114 171; do
386		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
387		$PROG -o$TMP3 \
388		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
389		    hash $TMP2
390		if (cmp -s $TMP1 $TMP3) ; then
391		else
392			printf "test9: type hash:\
393bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
394			exit 1
395		fi
396	done
397	bsize=4096
398	for ffactor in 171 228 341; do
399		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
400		$PROG -o$TMP3 \
401		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
402		    hash $TMP2
403		if (cmp -s $TMP1 $TMP3) ; then
404		else
405			printf "test9: type hash:\
406bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
407			exit 1
408		fi
409	done
410	bsize=8192
411	for ffactor in 341 455 683; do
412		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
413		$PROG -o$TMP3 \
414		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
415		    hash $TMP2
416		if (cmp -s $TMP1 $TMP3) ; then
417		else
418			printf "test9: type hash:\
419bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
420			exit 1
421		fi
422	done
423}
424
425# Test use of cursor flags without initialization
426test10()
427{
428	printf "Test 10: btree, recno: test cursor flag use\n"
429	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
430	awk '{
431		for (i = 1; i <= 120; ++i)
432			printf("%05d: input key %d: %s\n", i, i, $0);
433		printf("%05d: input key %d: %s\n", 120, 120, $0);
434		printf("get failed, no such key\n");
435		printf("%05d: input key %d: %s\n", 1, 1, $0);
436		printf("%05d: input key %d: %s\n", 2, 2, $0);
437		exit;
438	}' > $TMP1
439	rm -f TMP2 $TMP3
440
441	# Test that R_CURSOR doesn't succeed before cursor initialized
442	for type in btree recno; do
443		cat $TMP1 |
444		awk '{
445			if (i == 10)
446				exit;
447			printf("p\nk%d\nd%s\n", ++i, $0);
448		}
449		END {
450			printf("fR_CURSOR\nr\nk1\n");
451			printf("eR_CURSOR SHOULD HAVE FAILED\n");
452		}' > $TMP2
453		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
454		if [ -s $TMP3 ] ; then
455			printf "Test 10: delete: R_CURSOR SHOULD HAVE FAILED\n"
456			exit 1
457		fi
458	done
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\np\nk1\ndsome data\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			printf "Test 10: put: R_CURSOR SHOULD HAVE FAILED\n"
473			exit 1
474		fi
475	done
476}
477
478main
479