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