t_mtree.sh revision 272343
1272343Sngie# $NetBSD: t_mtree.sh,v 1.6 2013/02/05 16:49:42 christos Exp $
2272343Sngie#
3272343Sngie# Copyright (c) 2009, 2012 The NetBSD Foundation, Inc.
4272343Sngie# All rights reserved.
5272343Sngie#
6272343Sngie# Redistribution and use in source and binary forms, with or without
7272343Sngie# modification, are permitted provided that the following conditions
8272343Sngie# are met:
9272343Sngie# 1. Redistributions of source code must retain the above copyright
10272343Sngie#    notice, this list of conditions and the following disclaimer.
11272343Sngie# 2. Redistributions in binary form must reproduce the above copyright
12272343Sngie#    notice, this list of conditions and the following disclaimer in the
13272343Sngie#    documentation and/or other materials provided with the distribution.
14272343Sngie#
15272343Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16272343Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17272343Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18272343Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19272343Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20272343Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21272343Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22272343Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23272343Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24272343Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25272343Sngie# POSSIBILITY OF SUCH DAMAGE.
26272343Sngie#
27272343Sngie
28272343Sngie# Postprocess mtree output, canonicalising portions that
29272343Sngie# are expected to differ from one run to another.
30272343Sngie#
31272343Sngie
32272343Sngieh_postprocess()
33272343Sngie{
34272343Sngie	sed -e '
35272343Sngie		/^#	   user: /s/:.*/: x/
36272343Sngie		/^#	machine: /s/:.*/: x/
37272343Sngie		/^#	   tree: /s/:.*/: x/
38272343Sngie		/^#	   date: /s/:.*/: x/
39272343Sngie		' \
40272343Sngie	    -e '/type=dir/s/ size=[0-9]*//'
41272343Sngie}
42272343Sngie
43272343Sngieh_check()
44272343Sngie{
45272343Sngie        diff -Nru "$1" "$2" || atf_fail "files $1 and $2 differ"
46272343Sngie}
47272343Sngie
48272343Sngie
49272343Sngieatf_test_case mtree_create
50272343Sngieatf_test_case netbsd6_create
51272343Sngiecreate_head()
52272343Sngie{
53272343Sngie	atf_set "descr" "Create a specfile describing a directory tree"
54272343Sngie}
55272343Sngie
56272343Sngiecreate_setup()
57272343Sngie{
58272343Sngie	# create some directories
59272343Sngie	rm -fr create
60272343Sngie	mkdir -p create/a/1 create/a/2 create/b
61272343Sngie	# create some files
62272343Sngie	for file in create/top.file.1 \
63272343Sngie		    create/a/a.file.1 \
64272343Sngie		    create/a/a.file.2 \
65272343Sngie		    create/a/1/a1.file.1 \
66272343Sngie		    create/b/b.file.1 \
67272343Sngie		    create/b/b.file.2
68272343Sngie	do
69272343Sngie		echo "$file" >$file
70272343Sngie	done
71272343Sngie	# hard link to file in same dir
72272343Sngie	ln create/b/b.file.1 create/b/b.hardlink.1
73272343Sngie	# hard link to file in another dir
74272343Sngie	ln create/b/b.file.2 create/a/a.hardlink.b2
75272343Sngie	# symlink to file
76272343Sngie	ln -s a.file.1 create/a.symlink.1
77272343Sngie	# symlink to dir
78272343Sngie	ln -s b create/top.symlink.b
79272343Sngie	# dangling symlink
80272343Sngie	ln -s nonexistent create/top.dangling
81272343Sngie}
82272343Sngie
83272343Sngiecreate_body()
84272343Sngie{
85272343Sngie	create_setup
86272343Sngie
87272343Sngie	# run mtree and check output
88272343Sngie	( cd create && mtree -F ${FLAVOR} -c -k type,nlink,link,size,sha256 ) >output.raw \
89272343Sngie	|| atf_fail "mtree exit status $?"
90272343Sngie	h_postprocess <output.raw >output
91272343Sngie	h_check "$(atf_get_srcdir)/${FLAVOR}_d_create.out" output
92272343Sngie}
93272343Sngie
94272343Sngiemtree_create_head() 
95272343Sngie{
96272343Sngie	FLAVOR=mtree create_head
97272343Sngie}
98272343Sngienetbsd6_create_head() 
99272343Sngie{
100272343Sngie	FLAVOR=netbsd6 create_head
101272343Sngie}
102272343Sngie
103272343Sngiemtree_create_body() 
104272343Sngie{
105272343Sngie	FLAVOR=mtree create_body
106272343Sngie}
107272343Sngienetbsd6_create_body() 
108272343Sngie{
109272343Sngie	FLAVOR=netbsd6 create_body
110272343Sngie}
111272343Sngie
112272343Sngie
113272343Sngieatf_test_case mtree_check
114272343Sngieatf_test_case netbsd6_check
115272343Sngiecheck_head()
116272343Sngie{
117272343Sngie	atf_set "descr" "Check a directory tree against a specfile"
118272343Sngie}
119272343Sngie
120272343Sngiecheck_body()
121272343Sngie{
122272343Sngie	# we use the same directory tree and specfile as in the "create" test
123272343Sngie	create_setup
124272343Sngie
125272343Sngie	# run mtree and check output
126272343Sngie	( cd create && mtree -F ${FLAVOR}  ) <"$(atf_get_srcdir)/${FLAVOR}_d_create.out" >output \
127272343Sngie	|| atf_fail "mtree exit status $?"
128272343Sngie	h_check /dev/null output
129272343Sngie}
130272343Sngie
131272343Sngiemtree_check_head() 
132272343Sngie{
133272343Sngie	FLAVOR=mtree check_head
134272343Sngie}
135272343Sngienetbsd6_check_head() 
136272343Sngie{
137272343Sngie	FLAVOR=netbsd6 check_head
138272343Sngie}
139272343Sngie
140272343Sngiemtree_check_body() 
141272343Sngie{
142272343Sngie	FLAVOR=mtree check_body
143272343Sngie}
144272343Sngienetbsd6_check_body() 
145272343Sngie{
146272343Sngie	FLAVOR=netbsd6 check_body
147272343Sngie}
148272343Sngie
149272343Sngie
150272343Sngieatf_test_case mtree_convert_C
151272343Sngieatf_test_case netbsd6_convert_C
152272343Sngieconvert_C_head()
153272343Sngie{
154272343Sngie	atf_set "descr" "Convert a specfile to mtree -C format, unsorted"
155272343Sngie}
156272343Sngie
157272343Sngieconvert_C_body()
158272343Sngie{
159272343Sngie	mtree -F ${FLAVOR} -C -K all <"$(atf_get_srcdir)/d_convert.in" >output
160272343Sngie	h_check "$(atf_get_srcdir)/d_convert_C.out" output
161272343Sngie}
162272343Sngie
163272343Sngiemtree_convert_C_head() 
164272343Sngie{
165272343Sngie	FLAVOR=mtree convert_C_head
166272343Sngie}
167272343Sngienetbsd6_convert_C_head() 
168272343Sngie{
169272343Sngie	FLAVOR=netbsd6 convert_C_head
170272343Sngie}
171272343Sngie
172272343Sngiemtree_convert_C_body() 
173272343Sngie{
174272343Sngie	FLAVOR=mtree convert_C_body
175272343Sngie}
176272343Sngienetbsd6_convert_C_body() 
177272343Sngie{
178272343Sngie	FLAVOR=netbsd6 convert_C_body
179272343Sngie}
180272343Sngie
181272343Sngie
182272343Sngieatf_test_case mtree_convert_C_S
183272343Sngieatf_test_case netbsd6_convert_C_S
184272343Sngieconvert_C_S_head()
185272343Sngie{
186272343Sngie	atf_set "descr" "Convert a specfile to mtree -C format, sorted"
187272343Sngie}
188272343Sngie
189272343Sngieconvert_C_S_body()
190272343Sngie{
191272343Sngie	mtree -F ${FLAVOR} -C -S -K all <"$(atf_get_srcdir)/d_convert.in" >output
192272343Sngie	h_check "$(atf_get_srcdir)/d_convert_C_S.out" output
193272343Sngie}
194272343Sngie
195272343Sngiemtree_convert_C_S_head() 
196272343Sngie{
197272343Sngie	FLAVOR=mtree convert_C_S_head
198272343Sngie}
199272343Sngienetbsd6_convert_C_S_head() 
200272343Sngie{
201272343Sngie	FLAVOR=netbsd6 convert_C_S_head
202272343Sngie}
203272343Sngie
204272343Sngiemtree_convert_C_S_body() 
205272343Sngie{
206272343Sngie	FLAVOR=mtree convert_C_S_body
207272343Sngie}
208272343Sngienetbsd6_convert_C_S_body() 
209272343Sngie{
210272343Sngie	FLAVOR=netbsd6 convert_C_S_body
211272343Sngie}
212272343Sngie
213272343Sngie
214272343Sngieatf_test_case mtree_convert_D
215272343Sngieatf_test_case netbsd6_convert_D
216272343Sngieconvert_D_head()
217272343Sngie{
218272343Sngie	atf_set "descr" "Convert a specfile to mtree -D format, unsorted"
219272343Sngie}
220272343Sngie
221272343Sngieconvert_D_body()
222272343Sngie{
223272343Sngie	mtree -F ${FLAVOR} -D -K all <"$(atf_get_srcdir)/d_convert.in" >output
224272343Sngie	h_check "$(atf_get_srcdir)/d_convert_D.out" output
225272343Sngie}
226272343Sngie
227272343Sngiemtree_convert_D_head() 
228272343Sngie{
229272343Sngie	FLAVOR=mtree convert_D_head
230272343Sngie}
231272343Sngienetbsd6_convert_D_head() 
232272343Sngie{
233272343Sngie	FLAVOR=netbsd6 convert_D_head
234272343Sngie}
235272343Sngie
236272343Sngiemtree_convert_D_body() 
237272343Sngie{
238272343Sngie	FLAVOR=mtree convert_D_body
239272343Sngie}
240272343Sngienetbsd6_convert_D_body() 
241272343Sngie{
242272343Sngie	FLAVOR=netbsd6 convert_D_body
243272343Sngie}
244272343Sngie
245272343Sngie
246272343Sngieatf_test_case mtree_convert_D_S
247272343Sngieatf_test_case netbsd6_convert_D_S
248272343Sngieconvert_D_S_head()
249272343Sngie{
250272343Sngie	atf_set "descr" "Convert a specfile to mtree -D format, sorted"
251272343Sngie}
252272343Sngie
253272343Sngieconvert_D_S_body()
254272343Sngie{
255272343Sngie	mtree -F ${FLAVOR} -D -S -K all <"$(atf_get_srcdir)/d_convert.in" >output
256272343Sngie	h_check "$(atf_get_srcdir)/d_convert_D_S.out" output
257272343Sngie}
258272343Sngie
259272343Sngiemtree_convert_D_S_head() 
260272343Sngie{
261272343Sngie	FLAVOR=mtree convert_D_S_head
262272343Sngie}
263272343Sngienetbsd6_convert_D_S_head() 
264272343Sngie{
265272343Sngie	FLAVOR=netbsd6 convert_D_S_head
266272343Sngie}
267272343Sngie
268272343Sngiemtree_convert_D_S_body() 
269272343Sngie{
270272343Sngie	FLAVOR=mtree convert_D_S_body
271272343Sngie}
272272343Sngienetbsd6_convert_D_S_body() 
273272343Sngie{
274272343Sngie	FLAVOR=netbsd6 convert_D_S_body
275272343Sngie}
276272343Sngie
277272343Sngie
278272343Sngieatf_test_case mtree_ignore
279272343Sngieatf_test_case netbs6_ignore
280272343Sngieignore_head()
281272343Sngie{
282272343Sngie	atf_set "descr" "Test that -d ignores symlinks (PR bin/41061)"
283272343Sngie}
284272343Sngie
285272343Sngieignore_body()
286272343Sngie{
287272343Sngie	mkdir newdir
288272343Sngie	mtree -F ${FLAVOR} -c | mtree -F ${FLAVOR} -Ck uid,gid,mode > mtree.spec
289272343Sngie	ln -s newdir otherdir
290272343Sngie
291272343Sngie	# This yields "extra: otherdir" even with -d.
292272343Sngie	# (PR bin/41061)
293272343Sngie	atf_check -s ignore -o empty -e empty -x "mtree -F ${FLAVOR} -d < mtree.spec"
294272343Sngie
295272343Sngie	# Delete the symlink and re-verify.
296272343Sngie	#
297272343Sngie	rm otherdir
298272343Sngie	atf_check -s ignore -o empty -e empty -x "mtree -F ${FLAVOR} -d < mtree.spec"
299272343Sngie}
300272343Sngie
301272343Sngiemtree_ignore_head() 
302272343Sngie{
303272343Sngie	FLAVOR=mtree ignore_head
304272343Sngie}
305272343Sngienetbsd6_ignore_head() 
306272343Sngie{
307272343Sngie	FLAVOR=netbsd6 ignore_head
308272343Sngie}
309272343Sngie
310272343Sngiemtree_ignore_body() 
311272343Sngie{
312272343Sngie	FLAVOR=mtree ignore_body
313272343Sngie}
314272343Sngienetbsd6_ignore_body() 
315272343Sngie{
316272343Sngie	FLAVOR=netbsd6 ignore_body
317272343Sngie}
318272343Sngie
319272343Sngie
320272343Sngieatf_test_case mtree_merge
321272343Sngieatf_test_case netbsd6_merge
322272343Sngiemerge_head()
323272343Sngie{
324272343Sngie	atf_set "descr" "Merge records of different type"
325272343Sngie}
326272343Sngie
327272343Sngiemerge_body()
328272343Sngie{
329272343Sngie	mtree -F ${FLAVOR} -C -M -K all <"$(atf_get_srcdir)/d_merge.in" >output
330272343Sngie	h_check "$(atf_get_srcdir)/d_merge_C_M.out" output
331272343Sngie	# same again, with sorting
332272343Sngie	mtree -F ${FLAVOR} -C -M -S -K all <"$(atf_get_srcdir)/d_merge.in" >output
333272343Sngie	h_check "$(atf_get_srcdir)/d_merge_C_M_S.out" output
334272343Sngie}
335272343Sngie
336272343Sngiemtree_merge_head() 
337272343Sngie{
338272343Sngie	FLAVOR=mtree merge_head
339272343Sngie}
340272343Sngienetbsd6_merge_head() 
341272343Sngie{
342272343Sngie	FLAVOR=netbsd6 merge_head
343272343Sngie}
344272343Sngie
345272343Sngiemtree_merge_body() 
346272343Sngie{
347272343Sngie	FLAVOR=mtree merge_body
348272343Sngie}
349272343Sngienetbsd6_merge_body() 
350272343Sngie{
351272343Sngie	FLAVOR=netbsd6 merge_body
352272343Sngie}
353272343Sngie
354272343Sngie
355272343Sngieatf_test_case mtree_nonemptydir
356272343Sngieatf_test_case netbsd6_nonemptydir
357272343Sngienonemptydir_head()
358272343Sngie{
359272343Sngie	atf_set "descr" "Test that new non-empty " \
360272343Sngie			"directories are recorded (PR bin/25693)"
361272343Sngie}
362272343Sngie
363272343Sngienonemptydir_body()
364272343Sngie{
365272343Sngie	mkdir testdir
366272343Sngie	cd testdir
367272343Sngie
368272343Sngie	mtree -F ${FLAVOR} -c > mtree.spec
369272343Sngie
370272343Sngie	if [ ! -f mtree.spec ]; then
371272343Sngie		atf_fail "mtree failed"
372272343Sngie	fi
373272343Sngie
374272343Sngie	touch bar
375272343Sngie	atf_check -s ignore -o save:output -x "mtree -F ${FLAVOR} -f mtree.spec"
376272343Sngie
377272343Sngie	if [ ! -n "$(egrep "extra: bar" output)" ]; then
378272343Sngie		atf_fail "mtree did not record changes (PR bin/25693)"
379272343Sngie	fi
380272343Sngie}
381272343Sngie
382272343Sngiemtree_nonemptydir_head() 
383272343Sngie{
384272343Sngie	FLAVOR=mtree nonemptydir_head
385272343Sngie}
386272343Sngienetbsd6_nonemptydir_head() 
387272343Sngie{
388272343Sngie	FLAVOR=netbsd6 nonemptydir_head
389272343Sngie}
390272343Sngie
391272343Sngiemtree_nonemptydir_body() 
392272343Sngie{
393272343Sngie	FLAVOR=mtree nonemptydir_body
394272343Sngie}
395272343Sngienetbsd6_nonemptydir_body() 
396272343Sngie{
397272343Sngie	FLAVOR=netbsd6 nonemptydir_body
398272343Sngie}
399272343Sngie
400272343Sngie
401272343Sngieatf_init_test_cases()
402272343Sngie{
403272343Sngie	atf_add_test_case mtree_create
404272343Sngie	atf_add_test_case mtree_check
405272343Sngie	atf_add_test_case mtree_convert_C
406272343Sngie	atf_add_test_case mtree_convert_C_S
407272343Sngie	atf_add_test_case mtree_convert_D
408272343Sngie	atf_add_test_case mtree_convert_D_S
409272343Sngie	atf_add_test_case mtree_ignore
410272343Sngie	atf_add_test_case mtree_merge
411272343Sngie	atf_add_test_case mtree_nonemptydir
412272343Sngie
413272343Sngie	atf_add_test_case netbsd6_create
414272343Sngie	atf_add_test_case netbsd6_check
415272343Sngie	atf_add_test_case netbsd6_convert_C
416272343Sngie	atf_add_test_case netbsd6_convert_C_S
417272343Sngie	atf_add_test_case netbsd6_convert_D
418272343Sngie	atf_add_test_case netbsd6_convert_D_S
419272343Sngie	atf_add_test_case netbsd6_ignore
420272343Sngie	atf_add_test_case netbsd6_merge
421272343Sngie	atf_add_test_case netbsd6_nonemptydir
422272343Sngie}
423