xref: /csrg-svn/lib/libc/db/test/run.test (revision 57001)
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.12 (Berkeley) 12/04/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	test11
32	test20
33	rm -f $TMP1 $TMP2 $TMP3
34	exit 0
35}
36
37# Take the first hundred entries in the dictionary, and make them
38# be key/data pairs.
39test1()
40{
41	printf "Test 1: btree, hash: small key, small data pairs\n"
42	sed 200q $DICT > $TMP1
43	for type in btree hash; do
44		rm -f $TMP2 $TMP3
45		for i in `sed 200q $DICT`; do
46			printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i
47		done > $TMP2
48		$PROG -o $TMP3 $type $TMP2
49		if (cmp -s $TMP1 $TMP3) ; then
50		else
51			printf "test1: type %s: failed\n" $type
52			exit 1
53		fi
54	done
55	printf "Test 1: recno: small key, small data pairs\n"
56	rm -f $TMP2 $TMP3
57	sed 200q $DICT |
58	awk '{
59		++i;
60		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
61	}' > $TMP2
62	$PROG -o $TMP3 recno $TMP2
63	if (cmp -s $TMP1 $TMP3) ; then
64	else
65		printf "test1: type recno: failed\n"
66		exit 1
67	fi
68}
69
70# Take the first hundred entries in the dictionary, and give them
71# each a medium size data entry.
72test2()
73{
74	printf "Test 2: btree, hash: small key, medium data pairs\n"
75	mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
76	echo $mdata |
77	awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
78	for type in hash btree; do
79		rm -f $TMP2 $TMP3
80		for i in `sed 200q $DICT`; do
81			printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i
82		done > $TMP2
83		$PROG -o $TMP3 $type $TMP2
84		if (cmp -s $TMP1 $TMP3) ; then
85		else
86			printf "test2: type %s: failed\n" $type
87			exit 1
88		fi
89	done
90	printf "Test 2: recno: small key, medium data pairs\n"
91	rm -f $TMP2 $TMP3
92	echo $mdata |
93	awk '{  for (i = 1; i < 201; ++i)
94		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
95	}' > $TMP2
96	$PROG -o $TMP3 recno $TMP2
97	if (cmp -s $TMP1 $TMP3) ; then
98	else
99		printf "test2: type recno: failed\n"
100		exit 1
101	fi
102}
103
104# Insert the programs in /bin with their paths as their keys.
105test3()
106{
107	printf "Test 3: btree, hash: small key, big data pairs\n"
108	rm -f $TMP1
109	(find /bin -type f -print | xargs cat) > $TMP1
110	for type in hash btree; do
111		rm -f $TMP2 $TMP3
112		for i in `find /bin -type f -print`; do
113			printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i
114		done > $TMP2
115		$PROG -o $TMP3 $type $TMP2
116		if (cmp -s $TMP1 $TMP3) ; then
117		else
118			printf "test3: type %s: failed\n" $type
119			exit 1
120		fi
121	done
122	printf "Test 3: recno: big data pairs\n"
123	rm -f $TMP2 $TMP3
124	find /bin -type f -print |
125	awk '{
126		++i;
127		printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
128	}' > $TMP2
129	$PROG -o $TMP3 recno $TMP2
130	if (cmp -s $TMP1 $TMP3) ; then
131	else
132		printf "test3: type recno: failed\n"
133		exit 1
134	fi
135}
136
137# Do random recno entries.
138test4()
139{
140	printf "Test 4: recno: random entries\n"
141	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
142	awk '{
143		for (i = 37; i <= 37 + 88 * 17; i += 17)
144			printf("input key %d: %.*s\n", i, i % 41, $0);
145		for (i = 1; i <= 15; ++i)
146			printf("input key %d: %.*s\n", i, i % 41, $0);
147		for (i = 19234; i <= 19234 + 61 * 27; i += 27)
148			printf("input key %d: %.*s\n", i, i % 41, $0);
149		exit
150	}' > $TMP1
151	rm -f TMP2 $TMP3
152	cat $TMP1 |
153	awk 'BEGIN {
154			i = 37;
155			incr = 17;
156		}
157		{
158			printf("p\nk%d\nd%s\n", i, $0);
159			if (i == 19234 + 61 * 27)
160				exit;
161			if (i == 37 + 88 * 17) {
162				i = 1;
163				incr = 1;
164			} else if (i == 15) {
165				i = 19234;
166				incr = 27;
167			} else
168				i += incr;
169		}
170		END {
171			for (i = 37; i <= 37 + 88 * 17; i += 17)
172				printf("g\nk%d\n", i);
173			for (i = 1; i <= 15; ++i)
174				printf("g\nk%d\n", i);
175			for (i = 19234; i <= 19234 + 61 * 27; i += 27)
176				printf("g\nk%d\n", i);
177		}' > $TMP2
178	$PROG -o $TMP3 recno $TMP2
179	if (cmp -s $TMP1 $TMP3) ; then
180	else
181		printf "test4: type recno: failed\n"
182		exit 1
183	fi
184}
185
186# Do reverse order recno entries.
187test5()
188{
189	printf "Test 5: recno: reverse order entries\n"
190	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
191	awk ' {
192		for (i = 1500; i; --i)
193			printf("input key %d: %.*s\n", i, i % 34, $0);
194		exit;
195	}' > $TMP1
196	rm -f TMP2 $TMP3
197	cat $TMP1 |
198	awk 'BEGIN {
199			i = 1500;
200		}
201		{
202			printf("p\nk%d\nd%s\n", i, $0);
203			--i;
204		}
205		END {
206			for (i = 1500; i; --i)
207				printf("g\nk%d\n", i);
208		}' > $TMP2
209	$PROG -o $TMP3 recno $TMP2
210	if (cmp -s $TMP1 $TMP3) ; then
211	else
212		printf "test5: type recno: failed\n"
213		exit 1
214	fi
215}
216
217# Do alternating order recno entries.
218test6()
219{
220	printf "Test 6: recno: alternating order entries\n"
221	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
222	awk ' {
223		for (i = 1; i < 1200; i += 2)
224			printf("input key %d: %.*s\n", i, i % 34, $0);
225		for (i = 2; i < 1200; i += 2)
226			printf("input key %d: %.*s\n", i, i % 34, $0);
227		exit;
228	}' > $TMP1
229	rm -f TMP2 $TMP3
230	cat $TMP1 |
231	awk 'BEGIN {
232			i = 1;
233			even = 0;
234		}
235		{
236			printf("p\nk%d\nd%s\n", i, $0);
237			i += 2;
238			if (i >= 1200) {
239				if (even == 1)
240					exit;
241				even = 1;
242				i = 2;
243			}
244		}
245		END {
246			for (i = 1; i < 1200; ++i)
247				printf("g\nk%d\n", i);
248		}' > $TMP2
249	$PROG -o $TMP3 recno $TMP2
250	sort -o $TMP1 $TMP1
251	sort -o $TMP3 $TMP3
252	if (cmp -s $TMP1 $TMP3) ; then
253	else
254		printf "test6: type recno: failed\n"
255		exit 1
256	fi
257}
258
259# Delete cursor record
260test7()
261{
262	printf "Test 7: btree, recno: delete cursor record\n"
263	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
264	awk '{
265		for (i = 1; i <= 120; ++i)
266			printf("%05d: input key %d: %s\n", i, i, $0);
267		printf("%05d: input key %d: %s\n", 120, 120, $0);
268		printf("get failed, no such key\n");
269		printf("%05d: input key %d: %s\n", 1, 1, $0);
270		printf("%05d: input key %d: %s\n", 2, 2, $0);
271		exit;
272	}' > $TMP1
273	rm -f TMP2 $TMP3
274
275	for type in btree recno; do
276		cat $TMP1 |
277		awk '{
278			if (i == 120)
279				exit;
280			printf("p\nk%d\nd%s\n", ++i, $0);
281		}
282		END {
283			printf("fR_NEXT\n");
284			for (i = 1; i <= 120; ++i)
285				printf("s\n");
286			printf("fR_CURSOR\ns\nk120\n");
287			printf("r\nk120\n");
288			printf("fR_NEXT\ns\n");
289			printf("fR_CURSOR\ns\nk1\n");
290			printf("r\nk1\n");
291			printf("fR_FIRST\ns\n");
292		}' > $TMP2
293		$PROG -o $TMP3 recno $TMP2
294		if (cmp -s $TMP1 $TMP3) ; then
295		else
296			printf "test7: type $type: failed\n"
297			exit 1
298		fi
299	done
300}
301
302# Make sure that overflow pages are reused.
303test8()
304{
305	printf "Test 8: btree, hash: repeated small key, big data pairs\n"
306	rm -f $TMP1
307	awk 'BEGIN {
308		for (i = 1; i <= 10; ++i) {
309			printf("p\nkkey1\nD/bin/sh\n");
310			printf("p\nkkey2\nD/bin/csh\n");
311			if (i % 8 == 0) {
312				printf("c\nkkey2\nD/bin/csh\n");
313				printf("c\nkkey1\nD/bin/sh\n");
314				printf("e\t%d of 10 (comparison)\r\n", i);
315			} else
316				printf("e\t%d of 10             \r\n", i);
317			printf("r\nkkey1\nr\nkkey2\n");
318		}
319		printf("e\n");
320		printf("eend of test8 run\n");
321	}' > $TMP1
322	$PROG btree $TMP1
323	$PROG hash $TMP1
324	# No explicit test for success.
325}
326
327# Test btree duplicate keys
328test9()
329{
330	printf "Test 9: btree: duplicate keys\n"
331	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
332	awk '{
333		for (i = 1; i <= 543; ++i)
334			printf("%05d: input key %d: %s\n", i, i, $0);
335		exit;
336	}' > $TMP1
337	rm -f TMP2 $TMP3
338
339	for type in btree; do
340		cat $TMP1 |
341		awk '{
342			if (i++ % 2)
343				printf("p\nkduplicatekey\nd%s\n", $0);
344			else
345				printf("p\nkunique%dkey\nd%s\n", i, $0);
346		}
347		END {
348				printf("o\n");
349		}' > $TMP2
350		$PROG -iflags=1 -o $TMP3 $type $TMP2
351		sort -o $TMP3 $TMP3
352		if (cmp -s $TMP1 $TMP3) ; then
353		else
354			printf "test9: type $type: failed\n"
355			exit 1
356		fi
357	done
358}
359
360# Test use of cursor flags without initialization
361test10()
362{
363	printf "Test 10: btree, recno: test cursor flag use\n"
364	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
365	awk '{
366		for (i = 1; i <= 20; ++i)
367			printf("%05d: input key %d: %s\n", i, i, $0);
368		exit;
369	}' > $TMP1
370	rm -f TMP2 $TMP3
371
372	# Test that R_CURSOR doesn't succeed before cursor initialized
373	for type in btree recno; do
374		cat $TMP1 |
375		awk '{
376			if (i == 10)
377				exit;
378			printf("p\nk%d\nd%s\n", ++i, $0);
379		}
380		END {
381			printf("fR_CURSOR\nr\nk1\n");
382			printf("eR_CURSOR SHOULD HAVE FAILED\n");
383		}' > $TMP2
384		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
385		if [ -s $TMP3 ] ; then
386			printf "Test 10: delete: R_CURSOR SHOULD HAVE FAILED\n"
387			exit 1
388		fi
389	done
390	for type in btree recno; do
391		cat $TMP1 |
392		awk '{
393			if (i == 10)
394				exit;
395			printf("p\nk%d\nd%s\n", ++i, $0);
396		}
397		END {
398			printf("fR_CURSOR\np\nk1\ndsome data\n");
399			printf("eR_CURSOR SHOULD HAVE FAILED\n");
400		}' > $TMP2
401		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
402		if [ -s $TMP3 ] ; then
403			printf "Test 10: put: R_CURSOR SHOULD HAVE FAILED\n"
404			exit 1
405		fi
406	done
407}
408
409# Test insert in reverse order.
410test11()
411{
412	printf "Test 11: recno: reverse order insert\n"
413	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
414	awk '{
415		for (i = 1; i <= 779; ++i)
416			printf("%05d: input key %d: %s\n", i, i, $0);
417		exit;
418	}' > $TMP1
419	rm -f TMP2 $TMP3
420
421	for type in recno; do
422		cat $TMP1 |
423		awk '{
424			if (i == 0) {
425				i = 1;
426				printf("p\nk1\nd%s\n", $0);
427				printf("%s\n", "fR_IBEFORE");
428			} else
429				printf("p\nk1\nd%s\n", $0);
430		}
431		END {
432				printf("or\n");
433		}' > $TMP2
434		$PROG -o $TMP3 $type $TMP2
435		if (cmp -s $TMP1 $TMP3) ; then
436		else
437			printf "test11: type $type: failed\n"
438			exit 1
439		fi
440	done
441}
442
443# Try a variety of bucketsizes and fill factors for hashing
444test20()
445{
446	printf\
447    "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n"
448	awk 'BEGIN {
449		for (i = 1; i <= 10000; ++i)
450			printf("%.*s\n", i % 34,
451		    "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
452	}' > $TMP1
453	sed 10000q $DICT |
454	awk '{
455		++i;
456		printf("p\nk%s\nd%.*s\n", $0, i % 34,
457		    "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
458	}' > $TMP2
459	sed 10000q $DICT |
460	awk '{
461		++i;
462		printf("g\nk%s\n", $0);
463	}' >> $TMP2
464	bsize=256
465	for ffactor in 11 14 21; do
466		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
467		$PROG -o$TMP3 \
468		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
469		    hash $TMP2
470		if (cmp -s $TMP1 $TMP3) ; then
471		else
472			printf "test20: type hash:\
473bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
474			exit 1
475		fi
476	done
477	bsize=512
478	for ffactor in 21 28 43; do
479		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
480		$PROG -o$TMP3 \
481		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
482		    hash $TMP2
483		if (cmp -s $TMP1 $TMP3) ; then
484		else
485			printf "test20: type hash:\
486bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
487			exit 1
488		fi
489	done
490	bsize=1024
491	for ffactor in 43 57 85; do
492		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
493		$PROG -o$TMP3 \
494		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
495		    hash $TMP2
496		if (cmp -s $TMP1 $TMP3) ; then
497		else
498			printf "test20: type hash:\
499bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
500			exit 1
501		fi
502	done
503	bsize=2048
504	for ffactor in 85 114 171; do
505		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
506		$PROG -o$TMP3 \
507		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
508		    hash $TMP2
509		if (cmp -s $TMP1 $TMP3) ; then
510		else
511			printf "test20: type hash:\
512bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
513			exit 1
514		fi
515	done
516	bsize=4096
517	for ffactor in 171 228 341; do
518		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
519		$PROG -o$TMP3 \
520		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
521		    hash $TMP2
522		if (cmp -s $TMP1 $TMP3) ; then
523		else
524			printf "test20: type hash:\
525bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
526			exit 1
527		fi
528	done
529	bsize=8192
530	for ffactor in 341 455 683; do
531		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
532		$PROG -o$TMP3 \
533		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
534		    hash $TMP2
535		if (cmp -s $TMP1 $TMP3) ; then
536		else
537			printf "test20: type hash:\
538bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
539			exit 1
540		fi
541	done
542}
543
544main
545