xref: /original-bsd/lib/libc/db/test/run.test (revision 860e07fc)
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.4 (Berkeley) 08/28/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	rm -f $TMP1 $TMP2 $TMP3
30}
31
32# Take the first hundred entries in the dictionary, and make them
33# be key/data pairs.
34test1()
35{
36	printf "Test 1: btree, hash: small key, small data pairs\n"
37	sed 200q $DICT > $TMP1
38	for type in btree hash; do
39		rm -f $TMP2 $TMP3
40		for i in `sed 200q $DICT`; do
41			printf "p\nk%s\nd%s\ng\nk%s\n" $i $i $i
42		done > $TMP2
43		$PROG -o $TMP3 $type $TMP2
44		if (cmp -s $TMP1 $TMP3) ; then
45		else
46			printf "test1: type %s: failed\n" $type
47			exit 1
48		fi
49	done
50	printf "Test 1: recno: small key, small data pairs\n"
51	rm -f $TMP2 $TMP3
52	sed 200q $DICT |
53	awk '{
54		++i;
55		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
56	}' > $TMP2
57	$PROG -o $TMP3 recno $TMP2
58	if (cmp -s $TMP1 $TMP3) ; then
59	else
60		printf "test1: type recno: failed\n"
61		exit 1
62	fi
63}
64
65# Take the first hundred entries in the dictionary, and give them
66# each a medium size data entry.
67test2()
68{
69	printf "Test 2: btree, hash: small key, medium data pairs\n"
70	mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
71	echo $mdata |
72	awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
73	for type in hash btree; do
74		rm -f $TMP2 $TMP3
75		for i in `sed 200q $DICT`; do
76			printf "p\nk%s\nd%s\ng\nk%s\n" $i $mdata $i
77		done > $TMP2
78		$PROG -o $TMP3 $type $TMP2
79		if (cmp -s $TMP1 $TMP3) ; then
80		else
81			printf "test2: type %s: failed\n" $type
82			exit 1
83		fi
84	done
85	printf "Test 2: recno: small key, medium data pairs\n"
86	rm -f $TMP2 $TMP3
87	echo $mdata |
88	awk '{  for (i = 1; i < 201; ++i)
89		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
90	}' > $TMP2
91	$PROG -o $TMP3 recno $TMP2
92	if (cmp -s $TMP1 $TMP3) ; then
93	else
94		printf "test2: type recno: failed\n"
95		exit 1
96	fi
97}
98
99# Insert the programs in /bin with their paths as their keys.
100test3()
101{
102	printf "Test 3: btree, hash: small key, big data pairs\n"
103	rm -f $TMP1
104	(find /bin -type f -print | xargs cat) > $TMP1
105	for type in hash btree; do
106		rm -f $TMP2 $TMP3
107		for i in `find /bin -type f -print`; do
108			printf "p\nk%s\nD%s\ng\nk%s\n" $i $i $i
109		done > $TMP2
110		$PROG -o $TMP3 $type $TMP2
111		if (cmp -s $TMP1 $TMP3) ; then
112		else
113			printf "test2: type %s: failed\n" $type
114			exit 1
115		fi
116	done
117	printf "Test 3: recno: big data pairs\n"
118	rm -f $TMP2 $TMP3
119	find /bin -type f -print |
120	awk '{
121		++i;
122		printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
123	}' > $TMP2
124	$PROG -o $TMP3 recno $TMP2
125	if (cmp -s $TMP1 $TMP3) ; then
126	else
127		printf "test3: type recno: failed\n"
128		exit 1
129	fi
130}
131
132# Do random recno entries.
133test4()
134{
135	printf "Test 4: recno: random entries\n"
136	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
137	awk '{
138		for (i = 37; i <= 37 + 88 * 17; i += 17)
139			printf("input key %d: %.*s\n", i, i % 41, $0);
140		for (i = 1; i <= 15; ++i)
141			printf("input key %d: %.*s\n", i, i % 41, $0);
142		for (i = 19234; i <= 19234 + 61 * 27; i += 27)
143			printf("input key %d: %.*s\n", i, i % 41, $0);
144		exit
145	}' > $TMP1
146	rm -f TMP2 $TMP3
147	cat $TMP1 |
148	awk 'BEGIN {
149			i = 37;
150			incr = 17;
151		}
152		{
153			printf("p\nk%d\nd%s\n", i, $0);
154			if (i == 19234 + 61 * 27)
155				exit;
156			if (i == 37 + 88 * 17) {
157				i = 1;
158				incr = 1;
159			} else if (i == 15) {
160				i = 19234;
161				incr = 27;
162			} else
163				i += incr;
164		}
165		END {
166			for (i = 37; i <= 37 + 88 * 17; i += 17)
167				printf("g\nk%d\n", i);
168			for (i = 1; i <= 15; ++i)
169				printf("g\nk%d\n", i);
170			for (i = 19234; i <= 19234 + 61 * 27; i += 27)
171				printf("g\nk%d\n", i);
172		}' > $TMP2
173	$PROG -o $TMP3 recno $TMP2
174	if (cmp -s $TMP1 $TMP3) ; then
175	else
176		printf "test4: type recno: failed\n"
177		exit 1
178	fi
179}
180
181# Do reverse order recno entries.
182test5()
183{
184	printf "Test 5: recno: reverse order entries\n"
185	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
186	awk ' {
187		for (i = 1500; i; --i)
188			printf("input key %d: %.*s\n", i, i % 34, $0);
189		exit;
190	}' > $TMP1
191	rm -f TMP2 $TMP3
192	cat $TMP1 |
193	awk 'BEGIN {
194			i = 1500;
195		}
196		{
197			printf("p\nk%d\nd%s\n", i, $0);
198			--i;
199		}
200		END {
201			for (i = 1500; i; --i)
202				printf("g\nk%d\n", i);
203		}' > $TMP2
204	$PROG -o $TMP3 recno $TMP2
205	if (cmp -s $TMP1 $TMP3) ; then
206	else
207		printf "test5: type recno: failed\n"
208		exit 1
209	fi
210}
211
212# Do alternating order recno entries.
213test6()
214{
215	printf "Test 6: recno: alternating order entries\n"
216	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
217	awk ' {
218		for (i = 1; i < 1200; i += 2)
219			printf("input key %d: %.*s\n", i, i % 34, $0);
220		for (i = 2; i < 1200; i += 2)
221			printf("input key %d: %.*s\n", i, i % 34, $0);
222		exit;
223	}' > $TMP1
224	rm -f TMP2 $TMP3
225	cat $TMP1 |
226	awk 'BEGIN {
227			i = 1;
228			even = 0;
229		}
230		{
231			printf("p\nk%d\nd%s\n", i, $0);
232			i += 2;
233			if (i >= 1200) {
234				if (even == 1)
235					exit;
236				even = 1;
237				i = 2;
238			}
239		}
240		END {
241			for (i = 1; i < 1200; ++i)
242				printf("g\nk%d\n", i);
243		}' > $TMP2
244	$PROG -o $TMP3 recno $TMP2
245	sort -o $TMP1 $TMP1
246	sort -o $TMP3 $TMP3
247	if (cmp -s $TMP1 $TMP3) ; then
248	else
249		printf "test6: type recno: failed\n"
250		exit 1
251	fi
252}
253
254# Delete cursor record
255test7()
256{
257	printf "Test 7: btree, recno: delete cursor record\n"
258	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
259	awk '{
260		for (i = 1; i <= 120; ++i)
261			printf("%05d: input key %d: %s\n", i, i, $0);
262		printf("%05d: input key %d: %s\n", 120, 120, $0);
263		printf("get failed, no such key\n");
264		printf("%05d: input key %d: %s\n", 1, 1, $0);
265		printf("%05d: input key %d: %s\n", 2, 2, $0);
266		exit;
267	}' > $TMP1
268	rm -f TMP2 $TMP3
269	for type in btree recno; do
270		cat $TMP1 |
271		awk '{
272			if (i == 120)
273				exit;
274			printf("p\nk%d\nd%s\n", ++i, $0);
275		}
276		END {
277			printf("fR_NEXT\n");
278			for (i = 1; i <= 120; ++i)
279				printf("s\n");
280			printf("fR_CURSOR\ns\nk120\n");
281			printf("r\nk120\n");
282			printf("fR_NEXT\ns\n");
283			printf("fR_CURSOR\ns\nk1\n");
284			printf("r\nk1\n");
285			printf("fR_FIRST\ns\n");
286		}' > $TMP2
287		$PROG -o $TMP3 recno $TMP2
288		if (cmp -s $TMP1 $TMP3) ; then
289		else
290			printf "test7: type $type: failed\n"
291			exit 1
292		fi
293	done
294}
295
296# Try a variety of bucketsizes and fill factors for hashing
297test8()
298{
299	printf\
300    "Test 8: hash: bucketsize, fill factor; nelem 25000 cachesize 65536\n"
301	awk 'BEGIN {
302		for (i = 1; i <= 10000; ++i)
303			printf("%.*s\n", i % 34,
304		    "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
305	}' > $TMP1
306	sed 10000q $DICT |
307	awk '{
308		++i;
309		printf("p\nk%s\nd%.*s\n", $0, i % 34,
310		    "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg");
311	}' > $TMP2
312	sed 10000q $DICT |
313	awk '{
314		++i;
315		printf("g\nk%s\n", $0);
316	}' >> $TMP2
317	bsize=256
318	for ffactor in 11 14 21; do
319		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
320		$PROG -ot3 \
321		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
322		    hash $TMP2
323		if (cmp -s $TMP1 $TMP3) ; then
324		else
325			printf "test8: type hash:\
326bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
327			exit 1
328		fi
329	done
330	bsize=512
331	for ffactor in 21 28 43; do
332		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
333		$PROG -ot3 \
334		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
335		    hash $TMP2
336		if (cmp -s $TMP1 $TMP3) ; then
337		else
338			printf "test8: type hash:\
339bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
340			exit 1
341		fi
342	done
343	bsize=1024
344	for ffactor in 43 57 85; do
345		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
346		$PROG -ot3 \
347		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
348		    hash $TMP2
349		if (cmp -s $TMP1 $TMP3) ; then
350		else
351			printf "test8: type hash:\
352bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
353			exit 1
354		fi
355	done
356	bsize=2048
357	for ffactor in 85 114 171; do
358		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
359		$PROG -ot3 \
360		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
361		    hash $TMP2
362		if (cmp -s $TMP1 $TMP3) ; then
363		else
364			printf "test8: type hash:\
365bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
366			exit 1
367		fi
368	done
369	bsize=4096
370	for ffactor in 171 228 341; do
371		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
372		$PROG -ot3 \
373		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
374		    hash $TMP2
375		if (cmp -s $TMP1 $TMP3) ; then
376		else
377			printf "test8: type hash:\
378bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
379			exit 1
380		fi
381	done
382	bsize=8192
383	for ffactor in 341 455 683; do
384		printf "\tbucketsize %d, fill factor %d\n" $bsize, $ffactor
385		$PROG -ot3 \
386		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
387		    hash $TMP2
388		if (cmp -s $TMP1 $TMP3) ; then
389		else
390			printf "test8: type hash:\
391bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed\n"
392			exit 1
393		fi
394	done
395}
396
397main
398