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