xref: /freebsd/usr.sbin/etcupdate/tests/tests_test.sh (revision 179fa75e6e218d71a85a6b17ccc231036a148543)
1d14afb2aSJulio Merino#!/bin/sh
2d14afb2aSJulio Merino#
3*179fa75eSJohn Baldwin# Copyright (c) 2010 Hudson River Trading LLC
4d14afb2aSJulio Merino# Written by: John H. Baldwin <jhb@FreeBSD.org>
5d14afb2aSJulio Merino# All rights reserved.
6d14afb2aSJulio Merino#
7d14afb2aSJulio Merino# Redistribution and use in source and binary forms, with or without
8d14afb2aSJulio Merino# modification, are permitted provided that the following conditions
9d14afb2aSJulio Merino# are met:
10d14afb2aSJulio Merino# 1. Redistributions of source code must retain the above copyright
11d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer.
12d14afb2aSJulio Merino# 2. Redistributions in binary form must reproduce the above copyright
13d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer in the
14d14afb2aSJulio Merino#    documentation and/or other materials provided with the distribution.
15d14afb2aSJulio Merino#
16d14afb2aSJulio Merino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17d14afb2aSJulio Merino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18d14afb2aSJulio Merino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19d14afb2aSJulio Merino# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20d14afb2aSJulio Merino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d14afb2aSJulio Merino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22d14afb2aSJulio Merino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d14afb2aSJulio Merino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d14afb2aSJulio Merino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d14afb2aSJulio Merino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d14afb2aSJulio Merino# SUCH DAMAGE.
27d14afb2aSJulio Merino#
28d14afb2aSJulio Merino# $FreeBSD$
29d14afb2aSJulio Merino
30d14afb2aSJulio Merino# Various regression tests to run for the 'update' command.
31d14afb2aSJulio Merino
32d14afb2aSJulio MerinoFAILED=no
33d14afb2aSJulio MerinoWORKDIR=work
34d14afb2aSJulio Merino
35d14afb2aSJulio Merinousage()
36d14afb2aSJulio Merino{
37d14afb2aSJulio Merino	echo "Usage: tests.sh [-s script] [-w workdir]"
38d14afb2aSJulio Merino	exit 1
39d14afb2aSJulio Merino}
40d14afb2aSJulio Merino
41d14afb2aSJulio Merino# Allow the user to specify an alternate work directory or script.
42d14afb2aSJulio MerinoCOMMAND=etcupdate
43d14afb2aSJulio Merinowhile getopts "s:w:" option; do
44d14afb2aSJulio Merino	case $option in
45d14afb2aSJulio Merino		s)
46d14afb2aSJulio Merino			COMMAND="sh $OPTARG"
47d14afb2aSJulio Merino			;;
48d14afb2aSJulio Merino		w)
49d14afb2aSJulio Merino			WORKDIR=$OPTARG
50d14afb2aSJulio Merino			;;
51d14afb2aSJulio Merino		*)
52d14afb2aSJulio Merino			echo
53d14afb2aSJulio Merino			usage
54d14afb2aSJulio Merino			;;
55d14afb2aSJulio Merino	esac
56d14afb2aSJulio Merinodone
57d14afb2aSJulio Merinoshift $((OPTIND - 1))
58d14afb2aSJulio Merinoif [ $# -ne 0 ]; then
59d14afb2aSJulio Merino	usage
60d14afb2aSJulio Merinofi
61d14afb2aSJulio Merino
62d14afb2aSJulio MerinoCONFLICTS=$WORKDIR/conflicts
63d14afb2aSJulio MerinoOLD=$WORKDIR/old
64d14afb2aSJulio MerinoNEW=$WORKDIR/current
65d14afb2aSJulio MerinoTEST=$WORKDIR/test
66d14afb2aSJulio Merino
67d14afb2aSJulio Merino# The various states of the comparison of a file between two trees.
68d14afb2aSJulio Merinostates="equal first second difftype difflinks difffiles"
69d14afb2aSJulio Merino
70d14afb2aSJulio Merinobuild_trees()
71d14afb2aSJulio Merino{
72d14afb2aSJulio Merino	local i j k
73d14afb2aSJulio Merino
74d14afb2aSJulio Merino	rm -rf $OLD $NEW $TEST $CONFLICTS
75d14afb2aSJulio Merino	mkdir -p $OLD/etc $NEW/etc $TEST/etc
76d14afb2aSJulio Merino
77d14afb2aSJulio Merino	# For an given file, there are three different pair-wise
78d14afb2aSJulio Merino	# relations between the three threes (old, new, and test): old
79d14afb2aSJulio Merino	# vs new, old vs test, and new vs test.  Each of these
80d14afb2aSJulio Merino	# relations takes on one of six different states from the
81d14afb2aSJulio Merino	# 'compare()' function in etcupdate: equal, onlyfirst,
82d14afb2aSJulio Merino	# onlysecond, difftype, difflinks, difffiles.  In addition,
83d14afb2aSJulio Merino	# there are special considerations for considering cases such
84d14afb2aSJulio Merino	# as a file merge that results in conflicts versus one that
85d14afb2aSJulio Merino	# does not, special treatment of directories, etc.  The tests
86d14afb2aSJulio Merino	# below attempt to enumerate the three dimensional test matrix
87d14afb2aSJulio Merino	# by having the path name use the three different tree states
88d14afb2aSJulio Merino	# for the parent directories.
89d14afb2aSJulio Merino	#
90d14afb2aSJulio Merino	# Note that if the old and new files are identical (so first
91d14afb2aSJulio Merino	# compare is "equal"), then the second and third comparisons
92d14afb2aSJulio Merino	# will be the same.
93d14afb2aSJulio Merino	#
94d14afb2aSJulio Merino	# Note also that etcupdate only cares about files that are
95d14afb2aSJulio Merino	# present in at least one of the old or new trees.  Thus, none
96d14afb2aSJulio Merino	# of the '*/second/second' cases are relevant.
97d14afb2aSJulio Merino
98d14afb2aSJulio Merino	for i in $states; do
99d14afb2aSJulio Merino		for j in $states; do
100d14afb2aSJulio Merino			for k in $states; do
101d14afb2aSJulio Merino				mkdir -p $OLD/$i/$j/$k $NEW/$i/$j/$k \
102d14afb2aSJulio Merino				    $TEST/$i/$j/$k
103d14afb2aSJulio Merino			done
104d14afb2aSJulio Merino		done
105d14afb2aSJulio Merino	done
106d14afb2aSJulio Merino
107d14afb2aSJulio Merino	# /equal/equal/equal: Everything is equal.  Nothing should happen.
108d14afb2aSJulio Merino	for i in $OLD $NEW $TEST; do
109d14afb2aSJulio Merino		mkfifo $i/equal/equal/equal/fifo
110d14afb2aSJulio Merino		echo "foo" > $i/equal/equal/equal/file
111d14afb2aSJulio Merino		mkdir $i/equal/equal/equal/dir
112d14afb2aSJulio Merino		ln -s "bar" $i/equal/equal/equal/link
113d14afb2aSJulio Merino	done
114d14afb2aSJulio Merino
115d14afb2aSJulio Merino	# /equal/first/first: The file is missing from the test
116d14afb2aSJulio Merino	# directory.  Nothing should happen.
117d14afb2aSJulio Merino	for i in $OLD $NEW; do
118d14afb2aSJulio Merino		mkfifo $i/equal/first/first/fifo
119d14afb2aSJulio Merino		echo "foo" > $i/equal/first/first/file
120d14afb2aSJulio Merino		mkdir $i/equal/first/first/dir
121d14afb2aSJulio Merino		ln -s "bar" $i/equal/first/first/link
122d14afb2aSJulio Merino	done
123d14afb2aSJulio Merino
124d14afb2aSJulio Merino	# /equal/difftype/difftype: The local file is a different
125d14afb2aSJulio Merino	# type.  Nothing should happen.
126d14afb2aSJulio Merino	for i in $OLD $NEW; do
127d14afb2aSJulio Merino		mkfifo $i/equal/difftype/difftype/fifo
128d14afb2aSJulio Merino		mkdir $i/equal/difftype/difftype/fromdir
129d14afb2aSJulio Merino	done
130d14afb2aSJulio Merino	echo "bar" > $TEST/equal/difftype/difftype/fifo
131d14afb2aSJulio Merino	ln -s "test" $TEST/equal/difftype/difftype/fromdir
132d14afb2aSJulio Merino
133d14afb2aSJulio Merino	# /equal/difflinks/difflinks: The local file is a modified
134d14afb2aSJulio Merino	# link. Nothing should happen.
135d14afb2aSJulio Merino	for i in $OLD $NEW; do
136d14afb2aSJulio Merino		ln -s "foo" $i/equal/difflinks/difflinks/link
137d14afb2aSJulio Merino	done
138d14afb2aSJulio Merino	ln -s "bar" $TEST/equal/difflinks/difflinks/link
139d14afb2aSJulio Merino
140d14afb2aSJulio Merino	# /equal/difffiles/difffiles: The local file is a modified
141d14afb2aSJulio Merino	# file.  Nothing should happen.
142d14afb2aSJulio Merino	for i in $OLD $NEW; do
143d14afb2aSJulio Merino		echo "foo" > $i/equal/difffiles/difffiles/file
144d14afb2aSJulio Merino	done
145d14afb2aSJulio Merino	echo "bar" > $TEST/equal/difffiles/difffiles/file
146d14afb2aSJulio Merino
147d14afb2aSJulio Merino	# /first/equal/second: Remove unmodified files.  The files
148d14afb2aSJulio Merino	# should all be removed.
149d14afb2aSJulio Merino	for i in $OLD $TEST; do
150d14afb2aSJulio Merino		mkfifo $i/first/equal/second/fifo
151d14afb2aSJulio Merino		echo "foo" > $i/first/equal/second/file
152d14afb2aSJulio Merino		mkdir $i/first/equal/second/emptydir
153d14afb2aSJulio Merino		ln -s "bar" $i/first/equal/second/link
154d14afb2aSJulio Merino		mkdir $i/first/equal/second/fulldir
155d14afb2aSJulio Merino		echo "foo" > $i/first/equal/second/fulldir/file
156d14afb2aSJulio Merino	done
157d14afb2aSJulio Merino
158d14afb2aSJulio Merino	# /first/equal/*: Cannot occur.  If the file is missing from
159d14afb2aSJulio Merino	# new, then new vs test will always be 'second'.
160d14afb2aSJulio Merino
161d14afb2aSJulio Merino	# /first/first/equal: Removed files are already removed.
162d14afb2aSJulio Merino	# Nothing should happen.
163d14afb2aSJulio Merino	mkfifo $OLD/first/first/equal/fifo
164d14afb2aSJulio Merino	echo "foo" > $OLD/first/first/equal/file
165d14afb2aSJulio Merino	mkdir $OLD/first/first/equal/dir
166d14afb2aSJulio Merino	ln -s "bar" $OLD/first/first/equal/link
167d14afb2aSJulio Merino
168d14afb2aSJulio Merino	# /first/first/*: Cannot occur.  The files are missing from
169d14afb2aSJulio Merino	# both new and test.
170d14afb2aSJulio Merino
171d14afb2aSJulio Merino	# /first/second/*: Cannot happen, if the file is in old for
172d14afb2aSJulio Merino	# old vs new, it cannot be missing for old vs test.
173d14afb2aSJulio Merino
174d14afb2aSJulio Merino	# /first/difftype/second: File with different local type
175d14afb2aSJulio Merino	# removed.  Should generate a warning.
176d14afb2aSJulio Merino	mkfifo $OLD/first/difftype/second/fifo
177d14afb2aSJulio Merino	mkdir $TEST/first/difftype/second/fifo
178d14afb2aSJulio Merino
179d14afb2aSJulio Merino	# /first/difftype/*: Cannot happen since the file is missing
180d14afb2aSJulio Merino	# from new but present in test.
181d14afb2aSJulio Merino
182d14afb2aSJulio Merino	# /first/difflinks/second: Modified link removed.  Should
183d14afb2aSJulio Merino	# generate a warning.
184d14afb2aSJulio Merino	ln -s "old link" $OLD/first/difflinks/second/link
185d14afb2aSJulio Merino	ln -s "test link" $TEST/first/difflinks/second/link
186d14afb2aSJulio Merino
187d14afb2aSJulio Merino	# /first/difflinks/*: Cannot happen since the file is missing
188d14afb2aSJulio Merino	# from new but present in test.
189d14afb2aSJulio Merino
190d14afb2aSJulio Merino	# /first/difffiles/second: Modified file removed.  Should
191d14afb2aSJulio Merino	# generate a warning.
192d14afb2aSJulio Merino	echo "foo" > $OLD/first/difffiles/second/file
193d14afb2aSJulio Merino	echo "bar" > $TEST/first/difffiles/second/file
194d14afb2aSJulio Merino
195d14afb2aSJulio Merino	# /first/difffiles/*: Cannot happen since the file is missing
196d14afb2aSJulio Merino	# from new but present in test.
197d14afb2aSJulio Merino
198d14afb2aSJulio Merino	# /second/equal/first: Added a new file that isn't present in
199d14afb2aSJulio Merino	# test.  The empty directory should be ignored.
200d14afb2aSJulio Merino	echo "bar" > $NEW/second/equal/first/file
201d14afb2aSJulio Merino	mkfifo $NEW/second/equal/first/fifo
202d14afb2aSJulio Merino	ln -s "new" $NEW/second/equal/first/link
203d14afb2aSJulio Merino	mkdir $NEW/second/equal/first/emptydir
204d14afb2aSJulio Merino	mkdir $NEW/second/equal/first/fulldir
205d14afb2aSJulio Merino	echo "foo" > $NEW/second/equal/first/fulldir/file
206d14afb2aSJulio Merino
207d14afb2aSJulio Merino	# /second/equal/*: Cannot happen since the file is missing
208d14afb2aSJulio Merino	# from test but present in new.
209d14afb2aSJulio Merino
210d14afb2aSJulio Merino	# /second/first/*: Cannot happen since the file is missing
211d14afb2aSJulio Merino	# from old.
212d14afb2aSJulio Merino
213d14afb2aSJulio Merino	# /second/second/equal: Newly added file is already present in
214d14afb2aSJulio Merino	# the test directory and identical to the new file.  Nothing
215d14afb2aSJulio Merino	# should happen.
216d14afb2aSJulio Merino	for i in $NEW $TEST; do
217d14afb2aSJulio Merino		mkfifo $i/second/second/equal/fifo
218d14afb2aSJulio Merino		echo "foo" > $i/second/second/equal/file
219d14afb2aSJulio Merino		mkdir $i/second/second/equal/dir
220d14afb2aSJulio Merino		ln -s "bar" $i/second/second/equal/link
221d14afb2aSJulio Merino	done
222d14afb2aSJulio Merino
223d14afb2aSJulio Merino	# /second/second/first: Cannot happen.  The file is in dest in
224d14afb2aSJulio Merino	# the second test, so it can't be missing from the third test.
225d14afb2aSJulio Merino
226d14afb2aSJulio Merino	# /second/second/second: Cannot happen.  The file is in new in
227d14afb2aSJulio Merino	# the first test, so it can't be missing from the third test.
228d14afb2aSJulio Merino
229d14afb2aSJulio Merino	# /second/second/difftype: Newly added file conflicts with
230d14afb2aSJulio Merino	# existing file in test tree of a different type.  Should
231d14afb2aSJulio Merino	# generate a warning.
232d14afb2aSJulio Merino	mkdir $NEW/second/second/difftype/dir
233d14afb2aSJulio Merino	mkfifo $TEST/second/second/difftype/dir
234d14afb2aSJulio Merino
235d14afb2aSJulio Merino	# /second/second/difflinks: Newly added link conflicts with
236d14afb2aSJulio Merino	# existing link in test tree.  Should generate a warning.
237d14afb2aSJulio Merino	ln -s "new link" $NEW/second/second/difflinks/link
238d14afb2aSJulio Merino	ln -s "test link" $TEST/second/second/difflinks/link
239d14afb2aSJulio Merino
240d14afb2aSJulio Merino	# /second/second/difffiles: Newly added file conflicts with
241d14afb2aSJulio Merino	# existing file in test tree.  Should generate a warning.
242d14afb2aSJulio Merino	echo "new" > $NEW/second/second/difffiles/file
243d14afb2aSJulio Merino	echo "test" > $TEST/second/second/difffiles/file
244d14afb2aSJulio Merino
245d14afb2aSJulio Merino	# /second/difftype/*: Cannot happen since the file is missing
246d14afb2aSJulio Merino	# from old.
247d14afb2aSJulio Merino
248d14afb2aSJulio Merino	# /second/difflinks/*: Cannot happen since the file is missing
249d14afb2aSJulio Merino	# from old.
250d14afb2aSJulio Merino
251d14afb2aSJulio Merino	# /second/difffiles/*: Cannot happen since the file is missing
252d14afb2aSJulio Merino	# from old.
253d14afb2aSJulio Merino
254d14afb2aSJulio Merino	# /difftype/equal/difftype: Unmodified file has changed type.
255d14afb2aSJulio Merino	# File should be updated to the new file.  In the 'todir' case
256d14afb2aSJulio Merino	# the directory won't actually be created because it is empty.
257d14afb2aSJulio Merino	for i in $OLD $TEST; do
258d14afb2aSJulio Merino		echo "foo" > $i/difftype/equal/difftype/file
259d14afb2aSJulio Merino		mkdir $i/difftype/equal/difftype/fromdir
260d14afb2aSJulio Merino		ln -s "old" $i/difftype/equal/difftype/todir
261d14afb2aSJulio Merino	done
262d14afb2aSJulio Merino	ln -s "test" $NEW/difftype/equal/difftype/file
263d14afb2aSJulio Merino	mkfifo $NEW/difftype/equal/difftype/fromdir
264d14afb2aSJulio Merino	mkdir $NEW/difftype/equal/difftype/todir
265d14afb2aSJulio Merino
266d14afb2aSJulio Merino	# /difftype/equal/*: Cannot happen.  Since the old file is a
267d14afb2aSJulio Merino	# difftype from the new file and the test file is identical to
268d14afb2aSJulio Merino	# the old file, the test file must be a difftype from the new
269d14afb2aSJulio Merino	# file.
270d14afb2aSJulio Merino
271d14afb2aSJulio Merino	# /difftype/first/first: A removed file has changed type.
272d14afb2aSJulio Merino	# This should generate a warning.
273d14afb2aSJulio Merino	mkfifo $OLD/difftype/first/first/fifo
274d14afb2aSJulio Merino	mkdir $NEW/difftype/first/first/fifo
275d14afb2aSJulio Merino
276d14afb2aSJulio Merino	# /difftype/first/*: Cannot happen.  Since the new file exists
277d14afb2aSJulio Merino	# and the dest file is missing, the last test must be 'first'.
278d14afb2aSJulio Merino
279d14afb2aSJulio Merino	# /difftype/second/*: Cannot happen.  The old file exists in
280d14afb2aSJulio Merino	# the first test, so it cannot be missing in the second test.
281d14afb2aSJulio Merino
282d14afb2aSJulio Merino	# /difftype/difftype/equal: A file has changed type, but the
283d14afb2aSJulio Merino	# file in the test directory already matches the new file.  Do
284d14afb2aSJulio Merino	# nothing.
285d14afb2aSJulio Merino	echo "foo" > $OLD/difftype/difftype/equal/fifo
286d14afb2aSJulio Merino	mkfifo $OLD/difftype/difftype/equal/file
287d14afb2aSJulio Merino	for i in $NEW $TEST; do
288d14afb2aSJulio Merino		mkfifo $i/difftype/difftype/equal/fifo
289d14afb2aSJulio Merino		echo "bar" > $i/difftype/difftype/equal/file
290d14afb2aSJulio Merino	done
291d14afb2aSJulio Merino
292d14afb2aSJulio Merino	# /difftype/difftype/first: Cannot happen.  The dest file
293d14afb2aSJulio Merino	# exists in the second test.
294d14afb2aSJulio Merino
295d14afb2aSJulio Merino	# /difftype/difftype/second: Cannot happen.  The new file
296d14afb2aSJulio Merino	# exists in the first test.
297d14afb2aSJulio Merino
298d14afb2aSJulio Merino	# /difftype/difftype/difftype: All three files (old, new, and
299d14afb2aSJulio Merino	# test) are different types from each other.  This should
300d14afb2aSJulio Merino	# generate a warning.
301d14afb2aSJulio Merino	mkfifo $OLD/difftype/difftype/difftype/one
302d14afb2aSJulio Merino	mkdir $NEW/difftype/difftype/difftype/one
303d14afb2aSJulio Merino	echo "foo" > $TEST/difftype/difftype/difftype/one
304d14afb2aSJulio Merino	mkdir $OLD/difftype/difftype/difftype/two
305d14afb2aSJulio Merino	echo "baz" > $NEW/difftype/difftype/difftype/two
306d14afb2aSJulio Merino	ln -s "bar" $TEST/difftype/difftype/difftype/two
307d14afb2aSJulio Merino
308d14afb2aSJulio Merino	# /difftype/difftype/difflinks: A file has changed from a
309d14afb2aSJulio Merino	# non-link to a link in both the new and test trees, but the
310d14afb2aSJulio Merino	# target of the new and test links differ.  This should
311d14afb2aSJulio Merino	# generate a new link conflict.
312d14afb2aSJulio Merino	mkfifo $OLD/difftype/difftype/difflinks/link
313d14afb2aSJulio Merino	ln -s "new" $NEW/difftype/difftype/difflinks/link
314d14afb2aSJulio Merino	ln -s "test" $TEST/difftype/difftype/difflinks/link
315d14afb2aSJulio Merino
316d14afb2aSJulio Merino	# /difftype/difftype/difffile: A file has changed from a
317d14afb2aSJulio Merino	# non-regular file to a regular file in both the new and test
318d14afb2aSJulio Merino	# trees, but the contents in the new and test files differ.
319d14afb2aSJulio Merino	# This should generate a new file conflict.
320d14afb2aSJulio Merino	ln -s "old" $OLD/difftype/difftype/difffiles/file
321d14afb2aSJulio Merino	echo "foo" > $NEW/difftype/difftype/difffiles/file
322d14afb2aSJulio Merino	echo "bar" > $TEST/difftype/difftype/difffiles/file
323d14afb2aSJulio Merino
324d14afb2aSJulio Merino	# /difflinks/equal/difflinks: An unmodified symlink has
325d14afb2aSJulio Merino	# changed.  The link should be updated.
326d14afb2aSJulio Merino	for i in $OLD $TEST; do
327d14afb2aSJulio Merino		ln -s "old" $i/difflinks/equal/difflinks/link
328d14afb2aSJulio Merino	done
329d14afb2aSJulio Merino	ln -s "new" $NEW/difflinks/equal/difflinks/link
330d14afb2aSJulio Merino
331d14afb2aSJulio Merino	# /difflinks/equal/*: Cannot happen.  Since old is identical
332d14afb2aSJulio Merino	# to test, the third test must be 'difflinks'.
333d14afb2aSJulio Merino
334d14afb2aSJulio Merino	# /difflinks/first/first: A modified link is missing in the
335d14afb2aSJulio Merino	# test tree.  This should generate a warning.
336d14afb2aSJulio Merino	ln -s "old" $OLD/difflinks/first/first/link
337d14afb2aSJulio Merino	ln -s "new" $NEW/difflinks/first/first/link
338d14afb2aSJulio Merino
339d14afb2aSJulio Merino	# /difflinks/first/*: Cannot happen.  Since the test file is
340d14afb2aSJulio Merino	# missing in the second test, it must be missing in the third
341d14afb2aSJulio Merino	# test.
342d14afb2aSJulio Merino
343d14afb2aSJulio Merino	# /difflinks/second/*: Cannot happen.  The old link is present
344d14afb2aSJulio Merino	# in the first test, so it cannot be missing in the second
345d14afb2aSJulio Merino	# test.
346d14afb2aSJulio Merino
347d14afb2aSJulio Merino	# /difflinks/difftype/difftype: An updated link has been
348d14afb2aSJulio Merino	# changed to a different file type in the test tree.  This
349d14afb2aSJulio Merino	# should generate a warning.
350d14afb2aSJulio Merino	ln -s "old" $OLD/difflinks/difftype/difftype/link
351d14afb2aSJulio Merino	ln -s "new" $NEW/difflinks/difftype/difftype/link
352d14afb2aSJulio Merino	echo "test" > $TEST/difflinks/difftype/difftype/link
353d14afb2aSJulio Merino
354d14afb2aSJulio Merino	# /difflinks/difftype/*: Cannot happen.  The old and new files
355d14afb2aSJulio Merino	# are both links and the test file is not a link, so the third
356d14afb2aSJulio Merino	# test must be 'difftype'.
357d14afb2aSJulio Merino
358d14afb2aSJulio Merino	# /difflinks/difflinks/equal: An updated link has already been
359d14afb2aSJulio Merino	# updated to the new target in the test tree.  Nothing should
360d14afb2aSJulio Merino	# happen.
361d14afb2aSJulio Merino	ln -s "old" $OLD/difflinks/difflinks/equal/link
362d14afb2aSJulio Merino	for i in $NEW $TEST; do
363d14afb2aSJulio Merino		ln -s "new" $i/difflinks/difflinks/equal/link
364d14afb2aSJulio Merino	done
365d14afb2aSJulio Merino
366d14afb2aSJulio Merino	# /difflinks/difflinks/difflinks: An updated link has been
367d14afb2aSJulio Merino	# modified in the test tree and doesn't match either the old
368d14afb2aSJulio Merino	# or new links.  This should generate a warning.
369d14afb2aSJulio Merino	ln -s "old" $OLD/difflinks/difflinks/difflinks/link
370d14afb2aSJulio Merino	ln -s "new" $NEW/difflinks/difflinks/difflinks/link
371d14afb2aSJulio Merino	ln -s "test" $TEST/difflinks/difflinks/difflinks/link
372d14afb2aSJulio Merino
373d14afb2aSJulio Merino	# /difflinks/difflinks/*: Cannot happen.  All three files are
374d14afb2aSJulio Merino	# links from the first two tests, so the third test can only
375d14afb2aSJulio Merino	# be 'equal' or 'difflink'.
376d14afb2aSJulio Merino
377d14afb2aSJulio Merino	# /difflinks/difffiles/*: Cannot happen.  The old file is a
378d14afb2aSJulio Merino	# link in the first test, so it cannot be a regular file in
379d14afb2aSJulio Merino	# the second.
380d14afb2aSJulio Merino
381d14afb2aSJulio Merino	# /difffiles/equal/difffiles: An unmodified file has been
382d14afb2aSJulio Merino	# changed in new tree.  The file should be updated to the new
383d14afb2aSJulio Merino	# version.
384d14afb2aSJulio Merino	for i in $OLD $TEST; do
385d14afb2aSJulio Merino		echo "foo" > $i/difffiles/equal/difffiles/file
386d14afb2aSJulio Merino	done
387d14afb2aSJulio Merino	echo "bar" > $NEW/difffiles/equal/difffiles/file
388d14afb2aSJulio Merino
389d14afb2aSJulio Merino	# /difffiles/equal/*: Cannot happen.  Since the old file is
390d14afb2aSJulio Merino	# identical to the test file, the third test must be
391d14afb2aSJulio Merino	# 'difffiles'.
392d14afb2aSJulio Merino
393d14afb2aSJulio Merino	# /difffiles/first/first: A removed file has been changed in
394d14afb2aSJulio Merino	# the new tree.  This should generate a warning.
395d14afb2aSJulio Merino	echo "foo" > $OLD/difffiles/first/first/file
396d14afb2aSJulio Merino	echo "bar" > $NEW/difffiles/first/first/file
397d14afb2aSJulio Merino
398d14afb2aSJulio Merino	# /difffiles/first/*: Cannot happen.  The new file is a
399d14afb2aSJulio Merino	# regular file from the first test and the test file is
400d14afb2aSJulio Merino	# missing in the second test, so the third test must be
401d14afb2aSJulio Merino	# 'first'.
402d14afb2aSJulio Merino
403d14afb2aSJulio Merino	# /difffiles/second/*: Cannot happen.  The old file is present
404d14afb2aSJulio Merino	# in the first test, so it must be present in the second test.
405d14afb2aSJulio Merino
406d14afb2aSJulio Merino	# /difffiles/difftype/difftype: An updated regular file has
407d14afb2aSJulio Merino	# been changed to a different file type in the test tree.
408d14afb2aSJulio Merino	# This should generate a warning.
409d14afb2aSJulio Merino	echo "old" > $OLD/difffiles/difftype/difftype/file
410d14afb2aSJulio Merino	echo "new" > $NEW/difffiles/difftype/difftype/file
411d14afb2aSJulio Merino	mkfifo $TEST/difffiles/difftype/difftype/file
412d14afb2aSJulio Merino
413d14afb2aSJulio Merino	# /difffiles/difftype/*: Cannot happen.  The new file is known
414d14afb2aSJulio Merino	# to be a regular file from the first test, and the test file
415d14afb2aSJulio Merino	# is known to exist as a different file type from the second
416d14afb2aSJulio Merino	# test.  The third test must be 'difftype'.
417d14afb2aSJulio Merino
418d14afb2aSJulio Merino	# /difffiles/difflink/*: Cannot happen.  The old file is known
419d14afb2aSJulio Merino	# to be a regular file from the first test, so it cannot be a
420d14afb2aSJulio Merino	# link in the second test.
421d14afb2aSJulio Merino
422d14afb2aSJulio Merino	# /difffiles/difffiles/equal: An updated regular file has
423d14afb2aSJulio Merino	# already been updated to match the new file in the test tree.
424d14afb2aSJulio Merino	# Nothing should happen.
425d14afb2aSJulio Merino	echo "foo" > $OLD/difffiles/difffiles/equal/file
426d14afb2aSJulio Merino	for i in $NEW $TEST; do
427d14afb2aSJulio Merino		echo "bar" > $i/difffiles/difffiles/equal/file
428d14afb2aSJulio Merino	done
429d14afb2aSJulio Merino
430d14afb2aSJulio Merino	# /difffiles/difffiles/difffiles: A modified regular file was
431d14afb2aSJulio Merino	# updated in the new tree.  The changes should be merged into
432d14afb2aSJulio Merino	# to the new file if possible.  If the merge fails, a conflict
433d14afb2aSJulio Merino	# should be generated.
434d14afb2aSJulio Merino	cat > $OLD/difffiles/difffiles/difffiles/simple <<EOF
435d14afb2aSJulio Merinothis is an old line
436d14afb2aSJulio Merino
437d14afb2aSJulio MerinoEOF
438d14afb2aSJulio Merino	cat > $NEW/difffiles/difffiles/difffiles/simple <<EOF
439d14afb2aSJulio Merinothis is a new line
440d14afb2aSJulio Merino
441d14afb2aSJulio MerinoEOF
442d14afb2aSJulio Merino	cat > $TEST/difffiles/difffiles/difffiles/simple <<EOF
443d14afb2aSJulio Merinothis is an old line
444d14afb2aSJulio Merino
445d14afb2aSJulio Merinothis is a local line
446d14afb2aSJulio MerinoEOF
447d14afb2aSJulio Merino	cat > $OLD/difffiles/difffiles/difffiles/conflict <<EOF
448d14afb2aSJulio Merinothis is an old file
449d14afb2aSJulio MerinoEOF
450d14afb2aSJulio Merino	cat > $NEW/difffiles/difffiles/difffiles/conflict <<EOF
451d14afb2aSJulio Merinothis is a new file
452d14afb2aSJulio MerinoEOF
453d14afb2aSJulio Merino	cat > $TEST/difffiles/difffiles/difffiles/conflict <<EOF
454d14afb2aSJulio Merinothis is a test file
455d14afb2aSJulio MerinoEOF
456d14afb2aSJulio Merino
457d14afb2aSJulio Merino	# /difffiles/difffiles/*: Cannot happen.  From the first three
458d14afb2aSJulio Merino	# tests, all three files are regular files.  The test file can
459d14afb2aSJulio Merino	# either be identical to the new file ('equal') or not
460d14afb2aSJulio Merino	# ('difffiles').
461d14afb2aSJulio Merino
462d14afb2aSJulio Merino	## Tests for adding directories
463d14afb2aSJulio Merino	mkdir -p $OLD/adddir $NEW/adddir $TEST/adddir
464d14afb2aSJulio Merino
465d14afb2aSJulio Merino	# /adddir/conflict: Add a new file in a directory that already
466d14afb2aSJulio Merino	# exists as a file.  This should generate two warnings.
467d14afb2aSJulio Merino	mkdir $NEW/adddir/conflict
468d14afb2aSJulio Merino	touch $NEW/adddir/conflict/newfile
469d14afb2aSJulio Merino	touch $TEST/adddir/conflict
470d14afb2aSJulio Merino
471d14afb2aSJulio Merino	# /adddir/partial: Add a new file in a directory.  The
472d14afb2aSJulio Merino	# directory already exists in the test tree and contains a
473d14afb2aSJulio Merino	# different local file.  The new file from the new tree should
474d14afb2aSJulio Merino	# be added.
475d14afb2aSJulio Merino	for i in $NEW $TEST; do
476d14afb2aSJulio Merino		mkdir $i/adddir/partial
477d14afb2aSJulio Merino	done
478d14afb2aSJulio Merino	echo "foo" > $NEW/adddir/partial/file
479d14afb2aSJulio Merino	mkfifo $TEST/adddir/partial/fifo
480d14afb2aSJulio Merino
481d14afb2aSJulio Merino	## Tests for removing directories
482d14afb2aSJulio Merino	mkdir -p $OLD/rmdir $NEW/rmdir $TEST/rmdir
483d14afb2aSJulio Merino
484d14afb2aSJulio Merino	# /rmdir/extra: Do not remove a directory with an extra local file.
485d14afb2aSJulio Merino	# This should generate a warning.
486d14afb2aSJulio Merino	for i in $OLD $TEST; do
487d14afb2aSJulio Merino		mkdir $i/rmdir/extra
488d14afb2aSJulio Merino	done
489d14afb2aSJulio Merino	echo "foo" > $TEST/rmdir/extra/localfile.txt
490d14afb2aSJulio Merino
491d14afb2aSJulio Merino	# /rmdir/conflict: Do not remove a directory with a conflicted
492d14afb2aSJulio Merino	# remove file.  This should generate a warning.
493d14afb2aSJulio Merino	for i in $OLD $TEST; do
494d14afb2aSJulio Merino		mkdir $i/rmdir/conflict
495d14afb2aSJulio Merino	done
496d14afb2aSJulio Merino	mkfifo $OLD/rmdir/conflict/difftype
497d14afb2aSJulio Merino	mkdir $TEST/rmdir/conflict/difftype
498d14afb2aSJulio Merino
499d14afb2aSJulio Merino	# /rmdir/partial: Remove a complete hierarchy when part of the
500d14afb2aSJulio Merino	# tree has already been removed locally.
501d14afb2aSJulio Merino	for i in $OLD $TEST; do
502d14afb2aSJulio Merino		mkdir -p $i/rmdir/partial/subdir
503d14afb2aSJulio Merino		mkfifo $i/rmdir/partial/subdir/fifo
504d14afb2aSJulio Merino	done
505d14afb2aSJulio Merino	echo "foo" > $OLD/rmdir/partial/subdir/file
506d14afb2aSJulio Merino
507d14afb2aSJulio Merino	## Tests for converting files to directories and vice versa
508d14afb2aSJulio Merino	for i in $OLD $NEW $TEST; do
509d14afb2aSJulio Merino		for j in already old fromdir todir; do
510d14afb2aSJulio Merino			mkdir -p $i/dirchange/$j
511d14afb2aSJulio Merino		done
512d14afb2aSJulio Merino	done
513d14afb2aSJulio Merino
514d14afb2aSJulio Merino	# /dirchange/already/fromdir: Convert a directory tree to a
515d14afb2aSJulio Merino	# file without conflicts where the test tree already has the
516d14afb2aSJulio Merino	# new file.  Nothing should happen.
517d14afb2aSJulio Merino	mkdir $OLD/dirchange/already/fromdir
518d14afb2aSJulio Merino	echo "blah" > $OLD/dirchange/already/fromdir/somefile
519d14afb2aSJulio Merino	for i in $NEW $TEST; do
520d14afb2aSJulio Merino		echo "bar" > $i/dirchange/already/fromdir
521d14afb2aSJulio Merino	done
522d14afb2aSJulio Merino
523d14afb2aSJulio Merino	# /dirchange/already/todir: Convert an unmodified file to a
524d14afb2aSJulio Merino	# directory tree where the test tree already has the new
525d14afb2aSJulio Merino	# tree.  Nothing should happen.
526d14afb2aSJulio Merino	echo "baz" > $OLD/dirchange/already/todir
527d14afb2aSJulio Merino	for i in $NEW $TEST; do
528d14afb2aSJulio Merino		mkdir $i/dirchange/already/todir
529d14afb2aSJulio Merino		echo "blah" > $i/dirchange/already/todir/somefile
530d14afb2aSJulio Merino	done
531d14afb2aSJulio Merino
532d14afb2aSJulio Merino	# /dirchange/old/fromdir: Convert a directory tree to a file.
533d14afb2aSJulio Merino	# The old files are unmodified and should be changed to the new tree.
534d14afb2aSJulio Merino	for i in $OLD $TEST; do
535d14afb2aSJulio Merino		mkdir $i/dirchange/old/fromdir
536d14afb2aSJulio Merino		echo "blah" > $i/dirchange/old/fromdir/somefile
537d14afb2aSJulio Merino	done
538d14afb2aSJulio Merino	echo "bar" > $NEW/dirchange/old/fromdir
539d14afb2aSJulio Merino
540d14afb2aSJulio Merino	# /dirchange/old/todir: Convert a file to a directory tree.
541d14afb2aSJulio Merino	# The old file is unmodified and should be changed to the new
542d14afb2aSJulio Merino	# tree.
543d14afb2aSJulio Merino	for i in $OLD $TEST; do
544d14afb2aSJulio Merino		echo "foo" > $i/dirchange/old/todir
545d14afb2aSJulio Merino	done
546d14afb2aSJulio Merino	mkdir $NEW/dirchange/old/todir
547d14afb2aSJulio Merino	echo "bar" > $NEW/dirchange/old/todir/file
548d14afb2aSJulio Merino
549d14afb2aSJulio Merino	# /dirchange/fromdir/extradir: Convert a directory tree to a
550d14afb2aSJulio Merino	# file.  The test tree includes an extra file in the directory
551d14afb2aSJulio Merino	# that is not present in the old tree.  This should generate a
552d14afb2aSJulio Merino	# warning.
553d14afb2aSJulio Merino	for i in $OLD $TEST; do
554d14afb2aSJulio Merino		mkdir $i/dirchange/fromdir/extradir
555d14afb2aSJulio Merino		echo "foo" > $i/dirchange/fromdir/extradir/file
556d14afb2aSJulio Merino	done
557d14afb2aSJulio Merino	mkfifo $TEST/dirchange/fromdir/extradir/fifo
558d14afb2aSJulio Merino	ln -s "bar" $NEW/dirchange/fromdir/extradir
559d14afb2aSJulio Merino
560d14afb2aSJulio Merino	# /dirchange/fromdir/conflict: Convert a directory tree to a
561d14afb2aSJulio Merino	# file.  The test tree includes a local change that generates
562d14afb2aSJulio Merino	# a warning and prevents the removal of the directory.
563d14afb2aSJulio Merino	for i in $OLD $TEST; do
564d14afb2aSJulio Merino		mkdir $i/dirchange/fromdir/conflict
565d14afb2aSJulio Merino	done
566d14afb2aSJulio Merino	echo "foo" > $OLD/dirchange/fromdir/conflict/somefile
567d14afb2aSJulio Merino	echo "bar" > $TEST/dirchange/fromdir/conflict/somefile
568d14afb2aSJulio Merino	mkfifo $NEW/dirchange/fromdir/conflict
569d14afb2aSJulio Merino
570d14afb2aSJulio Merino	# /dirchange/todir/difffile: Convert a file to a directory
571d14afb2aSJulio Merino	# tree.  The test tree has a locally modified version of the
572d14afb2aSJulio Merino	# file so that the conversion fails with a warning.
573d14afb2aSJulio Merino	echo "foo" > $OLD/dirchange/todir/difffile
574d14afb2aSJulio Merino	mkdir $NEW/dirchange/todir/difffile
575d14afb2aSJulio Merino	echo "baz" > $NEW/dirchange/todir/difffile/file
576d14afb2aSJulio Merino	echo "bar" > $TEST/dirchange/todir/difffile
577d14afb2aSJulio Merino
578d14afb2aSJulio Merino	# /dirchange/todir/difftype: Similar to the previous test, but
579d14afb2aSJulio Merino	# the conflict is due to a change in the file type.
580d14afb2aSJulio Merino	echo "foo" > $OLD/dirchange/todir/difftype
581d14afb2aSJulio Merino	mkdir $NEW/dirchange/todir/difftype
582d14afb2aSJulio Merino	echo "baz" > $NEW/dirchange/todir/difftype/file
583d14afb2aSJulio Merino	mkfifo $TEST/dirchange/todir/difftype
584d14afb2aSJulio Merino
585d14afb2aSJulio Merino	## Tests for post-install actions
586d14afb2aSJulio Merino
587d14afb2aSJulio Merino	# - Adding /etc/master.passwd should cause pwd_mkdb to be run
588d14afb2aSJulio Merino	echo "foo:*:16000:100::0:0:& user:/home/foo:/bin/tcsh" > \
589d14afb2aSJulio Merino	    $NEW/etc/master.passwd
590d14afb2aSJulio Merino
591d14afb2aSJulio Merino	# - Verify that updating an unmodified /etc/login.conf builds
592d14afb2aSJulio Merino	# /etc/login.conf.db.
593d14afb2aSJulio Merino	cat > $OLD/etc/login.conf <<EOF
594d14afb2aSJulio Merinodefault:\\
595d14afb2aSJulio Merino	:passwd_format=md5:
596d14afb2aSJulio MerinoEOF
597d14afb2aSJulio Merino	cat > $NEW/etc/login.conf <<EOF
598d14afb2aSJulio Merinodefault:\\
599d14afb2aSJulio Merino	:passwd_format=md5:\\
600d14afb2aSJulio Merino	:copyright=/etc/COPYRIGHT
601d14afb2aSJulio MerinoEOF
602d14afb2aSJulio Merino	cp $OLD/etc/login.conf $TEST/etc/login.conf
603d14afb2aSJulio Merino
604d14afb2aSJulio Merino	# - Verify that a merge without conflicts to /etc/mail/aliases
605d14afb2aSJulio Merino	# will trigger a newaliases run request.
606d14afb2aSJulio Merino	mkdir -p $OLD/etc/mail $NEW/etc/mail $TEST/etc/mail
607d14afb2aSJulio Merino	cat > $OLD/etc/mail/aliases <<EOF
608d14afb2aSJulio Merino# root: me@my.domain
609d14afb2aSJulio Merino
610d14afb2aSJulio Merino# Basic system aliases -- these MUST be present
611d14afb2aSJulio MerinoMAILER-DAEMON: postmaster
612d14afb2aSJulio Merinopostmaster: root
613d14afb2aSJulio MerinoEOF
614d14afb2aSJulio Merino	cat > $NEW/etc/mail/aliases <<EOF
615d14afb2aSJulio Merino# root: me@my.domain
616d14afb2aSJulio Merino
617d14afb2aSJulio Merino# Basic system aliases -- these MUST be present
618d14afb2aSJulio MerinoMAILER-DAEMON: postmaster
619d14afb2aSJulio Merinopostmaster: root
620d14afb2aSJulio Merino
621d14afb2aSJulio Merino# General redirections for pseudo accounts
622d14afb2aSJulio Merino_dhcp:  root
623d14afb2aSJulio Merino_pflogd: root
624d14afb2aSJulio MerinoEOF
625d14afb2aSJulio Merino	cat > $TEST/etc/mail/aliases <<EOF
626d14afb2aSJulio Merinoroot: someone@example.com
627d14afb2aSJulio Merino
628d14afb2aSJulio Merino# Basic system aliases -- these MUST be present
629d14afb2aSJulio MerinoMAILER-DAEMON: postmaster
630d14afb2aSJulio Merinopostmaster: root
631d14afb2aSJulio MerinoEOF
632d14afb2aSJulio Merino
633d14afb2aSJulio Merino	# - Verify that updating an unmodified /etc/services builds
634d14afb2aSJulio Merino	# /var/db/services.db.
635d14afb2aSJulio Merino	cat > $OLD/etc/services <<EOF
636d14afb2aSJulio Merinortmp		  1/ddp	   #Routing Table Maintenance Protocol
637d14afb2aSJulio Merinotcpmux		  1/tcp	   #TCP Port Service Multiplexer
638d14afb2aSJulio Merinotcpmux		  1/udp	   #TCP Port Service Multiplexer
639d14afb2aSJulio MerinoEOF
640d14afb2aSJulio Merino	cat > $NEW/etc/services <<EOF
641d14afb2aSJulio Merinortmp		  1/ddp	   #Routing Table Maintenance Protocol
642d14afb2aSJulio Merinotcpmux		  1/tcp	   #TCP Port Service Multiplexer
643d14afb2aSJulio Merinotcpmux		  1/udp	   #TCP Port Service Multiplexer
644d14afb2aSJulio Merinonbp		  2/ddp	   #Name Binding Protocol
645d14afb2aSJulio Merinocompressnet	  2/tcp	   #Management Utility
646d14afb2aSJulio Merinocompressnet	  2/udp	   #Management Utility
647d14afb2aSJulio MerinoEOF
648d14afb2aSJulio Merino	cp $OLD/etc/services $TEST/etc/services
649d14afb2aSJulio Merino	mkdir -p $TEST/var/db
650d14afb2aSJulio Merino}
651d14afb2aSJulio Merino
652d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST
653d14afb2aSJulio Merinomissing()
654d14afb2aSJulio Merino{
655d14afb2aSJulio Merino	if [ -e $TEST/$1 -o -L $TEST/$1 ]; then
656d14afb2aSJulio Merino		echo "File $1 should be missing"
657d14afb2aSJulio Merino		FAILED=yes
658d14afb2aSJulio Merino	fi
659d14afb2aSJulio Merino}
660d14afb2aSJulio Merino
661d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST
662d14afb2aSJulio Merinopresent()
663d14afb2aSJulio Merino{
664d14afb2aSJulio Merino	if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then
665d14afb2aSJulio Merino		echo "File $1 should be present"
666d14afb2aSJulio Merino		FAILED=yes
667d14afb2aSJulio Merino	fi
668d14afb2aSJulio Merino}
669d14afb2aSJulio Merino
670d14afb2aSJulio Merino# $1 - relative path to file that should be a fifo in TEST
671d14afb2aSJulio Merinofifo()
672d14afb2aSJulio Merino{
673d14afb2aSJulio Merino	if ! [ -p $TEST/$1 ]; then
674d14afb2aSJulio Merino		echo "File $1 should be a FIFO"
675d14afb2aSJulio Merino		FAILED=yes
676d14afb2aSJulio Merino	fi
677d14afb2aSJulio Merino}
678d14afb2aSJulio Merino
679d14afb2aSJulio Merino# $1 - relative path to file that should be a directory in TEST
680d14afb2aSJulio Merinodir()
681d14afb2aSJulio Merino{
682d14afb2aSJulio Merino	if ! [ -d $TEST/$1 ]; then
683d14afb2aSJulio Merino		echo "File $1 should be a directory"
684d14afb2aSJulio Merino		FAILED=yes
685d14afb2aSJulio Merino	fi
686d14afb2aSJulio Merino}
687d14afb2aSJulio Merino
688d14afb2aSJulio Merino# $1 - relative path to file that should be a symlink in TEST
689d14afb2aSJulio Merino# $2 - optional value of the link
690d14afb2aSJulio Merinolink()
691d14afb2aSJulio Merino{
692d14afb2aSJulio Merino	local val
693d14afb2aSJulio Merino
694d14afb2aSJulio Merino	if ! [ -L $TEST/$1 ]; then
695d14afb2aSJulio Merino		echo "File $1 should be a link"
696d14afb2aSJulio Merino		FAILED=yes
697d14afb2aSJulio Merino	elif [ $# -gt 1 ]; then
698d14afb2aSJulio Merino		val=`readlink $TEST/$1`
699d14afb2aSJulio Merino		if [ "$val" != "$2" ]; then
700d14afb2aSJulio Merino			echo "Link $1 should link to \"$2\""
701d14afb2aSJulio Merino			FAILED=yes
702d14afb2aSJulio Merino		fi
703d14afb2aSJulio Merino	fi
704d14afb2aSJulio Merino}
705d14afb2aSJulio Merino
706d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST
707d14afb2aSJulio Merino# $2 - optional string that should match file contents
708d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present
709d14afb2aSJulio Merinofile()
710d14afb2aSJulio Merino{
711d14afb2aSJulio Merino	local contents sum
712d14afb2aSJulio Merino
713d14afb2aSJulio Merino	if ! [ -f $TEST/$1 ]; then
714d14afb2aSJulio Merino		echo "File $1 should be a regular file"
715d14afb2aSJulio Merino		FAILED=yes
716d14afb2aSJulio Merino	elif [ $# -eq 2 ]; then
717d14afb2aSJulio Merino		contents=`cat $TEST/$1`
718d14afb2aSJulio Merino		if [ "$contents" != "$2" ]; then
719d14afb2aSJulio Merino			echo "File $1 has wrong contents"
720d14afb2aSJulio Merino			FAILED=yes
721d14afb2aSJulio Merino		fi
722d14afb2aSJulio Merino	elif [ $# -eq 3 ]; then
723d14afb2aSJulio Merino		sum=`md5 -q $TEST/$1`
724d14afb2aSJulio Merino		if [ "$sum" != "$3" ]; then
725d14afb2aSJulio Merino			echo "File $1 has wrong contents"
726d14afb2aSJulio Merino			FAILED=yes
727d14afb2aSJulio Merino		fi
728d14afb2aSJulio Merino	fi
729d14afb2aSJulio Merino}
730d14afb2aSJulio Merino
731d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict
732d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents
733d14afb2aSJulio Merinoconflict()
734d14afb2aSJulio Merino{
735d14afb2aSJulio Merino	local sum
736d14afb2aSJulio Merino
737d14afb2aSJulio Merino	if ! [ -f $CONFLICTS/$1 ]; then
738d14afb2aSJulio Merino		echo "File $1 missing conflict"
739d14afb2aSJulio Merino		FAILED=yes
740d14afb2aSJulio Merino	elif [ $# -gt 1 ]; then
741d14afb2aSJulio Merino		sum=`md5 -q $CONFLICTS/$1`
742d14afb2aSJulio Merino		if [ "$sum" != "$2" ]; then
743d14afb2aSJulio Merino			echo "Conflict $1 has wrong contents"
744d14afb2aSJulio Merino			FAILED=yes
745d14afb2aSJulio Merino		fi
746d14afb2aSJulio Merino	fi
747d14afb2aSJulio Merino}
748d14afb2aSJulio Merino
749d14afb2aSJulio Merinocheck_trees()
750d14afb2aSJulio Merino{
751d14afb2aSJulio Merino
752d14afb2aSJulio Merino	echo "Checking tree for correct results:"
753d14afb2aSJulio Merino
754d14afb2aSJulio Merino	## /equal/equal/equal:
755d14afb2aSJulio Merino	fifo /equal/equal/equal/fifo
756d14afb2aSJulio Merino	file /equal/equal/equal/file "foo"
757d14afb2aSJulio Merino	dir /equal/equal/equal/dir
758d14afb2aSJulio Merino	link /equal/equal/equal/link "bar"
759d14afb2aSJulio Merino
760d14afb2aSJulio Merino	## /equal/first/first:
761d14afb2aSJulio Merino	missing /equal/first/first/fifo
762d14afb2aSJulio Merino	missing /equal/first/first/file
763d14afb2aSJulio Merino	missing /equal/first/first/dir
764d14afb2aSJulio Merino	missing /equal/first/first/link
765d14afb2aSJulio Merino
766d14afb2aSJulio Merino	## /equal/difftype/difftype:
767d14afb2aSJulio Merino	file /equal/difftype/difftype/fifo "bar"
768d14afb2aSJulio Merino	link /equal/difftype/difftype/fromdir "test"
769d14afb2aSJulio Merino
770d14afb2aSJulio Merino	## /equal/difflinks/difflinks:
771d14afb2aSJulio Merino	link /equal/difflinks/difflinks/link "bar"
772d14afb2aSJulio Merino
773d14afb2aSJulio Merino	## /equal/difffiles/difffiles:
774d14afb2aSJulio Merino	file /equal/difffiles/difffiles/file "bar"
775d14afb2aSJulio Merino
776d14afb2aSJulio Merino	## /first/equal/second:
777d14afb2aSJulio Merino	missing /first/equal/second/fifo
778d14afb2aSJulio Merino	missing /first/equal/second/file
779d14afb2aSJulio Merino	missing /first/equal/second/emptydir
780d14afb2aSJulio Merino	missing /first/equal/second/link
781d14afb2aSJulio Merino	missing /first/equal/second/fulldir
782d14afb2aSJulio Merino
783d14afb2aSJulio Merino	## /first/first/equal:
784d14afb2aSJulio Merino	missing /first/first/equal/fifo
785d14afb2aSJulio Merino	missing /first/first/equal/file
786d14afb2aSJulio Merino	missing /first/first/equal/dir
787d14afb2aSJulio Merino	missing /first/first/equal/link
788d14afb2aSJulio Merino
789d14afb2aSJulio Merino	## /first/difftype/second:
790d14afb2aSJulio Merino	present /first/difftype/second/fifo
791d14afb2aSJulio Merino
792d14afb2aSJulio Merino	## /first/difflinks/second:
793d14afb2aSJulio Merino	link /first/difflinks/second/link "test link"
794d14afb2aSJulio Merino
795d14afb2aSJulio Merino	## /first/difffiles/second:
796d14afb2aSJulio Merino	file /first/difffiles/second/file "bar"
797d14afb2aSJulio Merino
798d14afb2aSJulio Merino	## /second/equal/first:
799d14afb2aSJulio Merino	file /second/equal/first/file "bar"
800d14afb2aSJulio Merino	fifo /second/equal/first/fifo
801d14afb2aSJulio Merino	link /second/equal/first/link "new"
802d14afb2aSJulio Merino	missing /second/equal/first/emptydir
803d14afb2aSJulio Merino	file /second/equal/first/fulldir/file "foo"
804d14afb2aSJulio Merino
805d14afb2aSJulio Merino	## /second/second/equal:
806d14afb2aSJulio Merino	fifo /second/second/equal/fifo
807d14afb2aSJulio Merino	file /second/second/equal/file "foo"
808d14afb2aSJulio Merino	dir /second/second/equal/dir
809d14afb2aSJulio Merino	link /second/second/equal/link "bar"
810d14afb2aSJulio Merino
811d14afb2aSJulio Merino	## /second/second/difftype:
812d14afb2aSJulio Merino	fifo /second/second/difftype/dir
813d14afb2aSJulio Merino
814d14afb2aSJulio Merino	## /second/second/difflinks:
815d14afb2aSJulio Merino	link /second/second/difflinks/link "test link"
816d14afb2aSJulio Merino
817d14afb2aSJulio Merino	## /second/second/difffiles:
818d14afb2aSJulio Merino	file /second/second/difffiles/file "test"
819d14afb2aSJulio Merino	conflict /second/second/difffiles/file 4f2ee8620a251fd53f06bb6112eb6ffa
820d14afb2aSJulio Merino
821d14afb2aSJulio Merino	## /difftype/equal/difftype:
822d14afb2aSJulio Merino	link /difftype/equal/difftype/file "test"
823d14afb2aSJulio Merino	fifo /difftype/equal/difftype/fromdir
824d14afb2aSJulio Merino	missing /difftype/equal/difftype/todir
825d14afb2aSJulio Merino
826d14afb2aSJulio Merino	## /difftype/first/first:
827d14afb2aSJulio Merino	missing /difftype/first/first/fifo
828d14afb2aSJulio Merino
829d14afb2aSJulio Merino	## /difftype/difftype/equal:
830d14afb2aSJulio Merino	fifo /difftype/difftype/equal/fifo
831d14afb2aSJulio Merino	file /difftype/difftype/equal/file "bar"
832d14afb2aSJulio Merino
833d14afb2aSJulio Merino	## /difftype/difftype/difftype:
834d14afb2aSJulio Merino	file /difftype/difftype/difftype/one "foo"
835d14afb2aSJulio Merino	link /difftype/difftype/difftype/two "bar"
836d14afb2aSJulio Merino
837d14afb2aSJulio Merino	## /difftype/difftype/difflinks:
838d14afb2aSJulio Merino	link /difftype/difftype/difflinks/link "test"
839d14afb2aSJulio Merino
840d14afb2aSJulio Merino	## /difftype/difftype/difffile:
841d14afb2aSJulio Merino	conflict /difftype/difftype/difffiles/file \
842d14afb2aSJulio Merino	    117f2bcd1f6491f6044e79e5a57a9229
843d14afb2aSJulio Merino
844d14afb2aSJulio Merino	## /difflinks/equal/difflinks:
845d14afb2aSJulio Merino	link /difflinks/equal/difflinks/link "new"
846d14afb2aSJulio Merino
847d14afb2aSJulio Merino	## /difflinks/first/first:
848d14afb2aSJulio Merino	missing /difflinks/first/first/link
849d14afb2aSJulio Merino
850d14afb2aSJulio Merino	## /difflinks/difftype/difftype:
851d14afb2aSJulio Merino	file /difflinks/difftype/difftype/link "test"
852d14afb2aSJulio Merino
853d14afb2aSJulio Merino	## /difflinks/difflinks/equal:
854d14afb2aSJulio Merino	link /difflinks/difflinks/equal/link "new"
855d14afb2aSJulio Merino
856d14afb2aSJulio Merino	## /difflinks/difflinks/difflinks:
857d14afb2aSJulio Merino	link /difflinks/difflinks/difflinks/link "test"
858d14afb2aSJulio Merino
859d14afb2aSJulio Merino	## /difffiles/equal/difffiles:
860d14afb2aSJulio Merino	file /difffiles/equal/difffiles/file "bar"
861d14afb2aSJulio Merino
862d14afb2aSJulio Merino	## /difffiles/first/first:
863d14afb2aSJulio Merino	missing /difffiles/first/first/file
864d14afb2aSJulio Merino
865d14afb2aSJulio Merino	## /difffiles/difftype/difftype:
866d14afb2aSJulio Merino	fifo /difffiles/difftype/difftype/file
867d14afb2aSJulio Merino
868d14afb2aSJulio Merino	## /difffiles/difffiles/equal:
869d14afb2aSJulio Merino	file /difffiles/difffiles/equal/file "bar"
870d14afb2aSJulio Merino
871d14afb2aSJulio Merino	## /difffiles/difffiles/difffiles:
872d14afb2aSJulio Merino	file /difffiles/difffiles/difffiles/simple "" \
873d14afb2aSJulio Merino	    cabc7e5e80b0946d79edd555e9648486
874d14afb2aSJulio Merino	file /difffiles/difffiles/difffiles/conflict "this is a test file"
875d14afb2aSJulio Merino	conflict /difffiles/difffiles/difffiles/conflict \
876d14afb2aSJulio Merino	    8261cfdd89280c4a6c26e4ac86541fe9
877d14afb2aSJulio Merino
878d14afb2aSJulio Merino	## /adddir/conflict:
879d14afb2aSJulio Merino	file /adddir/conflict
880d14afb2aSJulio Merino
881d14afb2aSJulio Merino	## /adddir/partial:
882d14afb2aSJulio Merino	file /adddir/partial/file "foo"
883d14afb2aSJulio Merino	fifo /adddir/partial/fifo
884d14afb2aSJulio Merino
885d14afb2aSJulio Merino	## /rmdir/extra:
886d14afb2aSJulio Merino	dir /rmdir/extra
887d14afb2aSJulio Merino	file /rmdir/extra/localfile.txt "foo"
888d14afb2aSJulio Merino
889d14afb2aSJulio Merino	## /rmdir/conflict:
890d14afb2aSJulio Merino	dir /rmdir/conflict/difftype
891d14afb2aSJulio Merino	present /rmdir/conflict
892d14afb2aSJulio Merino
893d14afb2aSJulio Merino	## /rmdir/partial:
894d14afb2aSJulio Merino	missing /rmdir/partial
895d14afb2aSJulio Merino
896d14afb2aSJulio Merino	## /dirchange/already/fromdir:
897d14afb2aSJulio Merino	file /dirchange/already/fromdir "bar"
898d14afb2aSJulio Merino
899d14afb2aSJulio Merino	## /dirchange/already/todir:
900d14afb2aSJulio Merino	file /dirchange/already/todir/somefile "blah"
901d14afb2aSJulio Merino
902d14afb2aSJulio Merino	## /dirchange/old/fromdir:
903d14afb2aSJulio Merino	file /dirchange/old/fromdir "bar"
904d14afb2aSJulio Merino
905d14afb2aSJulio Merino	## /dirchange/old/todir
906d14afb2aSJulio Merino	file /dirchange/old/todir/file "bar"
907d14afb2aSJulio Merino
908d14afb2aSJulio Merino	## /dirchange/fromdir/extradir:
909d14afb2aSJulio Merino	missing /dirchange/fromdir/extradir/file
910d14afb2aSJulio Merino	fifo /dirchange/fromdir/extradir/fifo
911d14afb2aSJulio Merino
912d14afb2aSJulio Merino	## /dirchange/fromdir/conflict:
913d14afb2aSJulio Merino	file /dirchange/fromdir/conflict/somefile "bar"
914d14afb2aSJulio Merino
915d14afb2aSJulio Merino	## /dirchange/todir/difffile:
916d14afb2aSJulio Merino	file /dirchange/todir/difffile "bar"
917d14afb2aSJulio Merino
918d14afb2aSJulio Merino	## /dirchange/todir/difftype:
919d14afb2aSJulio Merino	fifo /dirchange/todir/difftype
920d14afb2aSJulio Merino
921d14afb2aSJulio Merino	## Tests for post-install actions
922d14afb2aSJulio Merino	file /etc/master.passwd
923d14afb2aSJulio Merino	file /etc/passwd
924d14afb2aSJulio Merino	file /etc/pwd.db
925d14afb2aSJulio Merino	file /etc/spwd.db
926d14afb2aSJulio Merino	file /etc/login.conf "" 7774a0f9a3a372c7c109c32fd31c4b6b
927d14afb2aSJulio Merino	file /etc/login.conf.db
928d14afb2aSJulio Merino	file /etc/mail/aliases "" 7d598f89ec040ab56af54011bdb83337
929d14afb2aSJulio Merino	file /etc/services "" 37fb6a8d1273f3b78329d431f21d9c7d
930d14afb2aSJulio Merino	file /var/db/services.db
931d14afb2aSJulio Merino}
932d14afb2aSJulio Merino
933d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then
934d14afb2aSJulio Merino	echo "must be root"
935d14afb2aSJulio Merino	exit 0
936d14afb2aSJulio Merinofi
937d14afb2aSJulio Merino
938d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then
939d14afb2aSJulio Merino	echo "WARNING: /etc/etcupdate.conf settings may break some tests."
940d14afb2aSJulio Merinofi
941d14afb2aSJulio Merino
942d14afb2aSJulio Merinobuild_trees
943d14afb2aSJulio Merino
944d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out
945d14afb2aSJulio Merino
946d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
947d14afb2aSJulio Merino  D /dirchange/fromdir/extradir/file
948d14afb2aSJulio Merino  D /dirchange/old/fromdir/somefile
949d14afb2aSJulio Merino  D /first/equal/second/fifo
950d14afb2aSJulio Merino  D /first/equal/second/file
951d14afb2aSJulio Merino  D /first/equal/second/fulldir/file
952d14afb2aSJulio Merino  D /first/equal/second/link
953d14afb2aSJulio Merino  D /rmdir/partial/subdir/fifo
954d14afb2aSJulio Merino  D /rmdir/partial/subdir
955d14afb2aSJulio Merino  D /rmdir/partial
956d14afb2aSJulio Merino  D /first/equal/second/fulldir
957d14afb2aSJulio Merino  D /first/equal/second/emptydir
958d14afb2aSJulio Merino  C /difffiles/difffiles/difffiles/conflict
959d14afb2aSJulio Merino  M /difffiles/difffiles/difffiles/simple
960d14afb2aSJulio Merino  U /difffiles/equal/difffiles/file
961d14afb2aSJulio Merino  U /difflinks/equal/difflinks/link
962d14afb2aSJulio Merino  C /difftype/difftype/difffiles/file
963d14afb2aSJulio Merino  U /difftype/equal/difftype/file
964d14afb2aSJulio Merino  U /difftype/equal/difftype/fromdir
965d14afb2aSJulio Merino  D /difftype/equal/difftype/todir
966d14afb2aSJulio Merino  U /dirchange/old/fromdir
967d14afb2aSJulio Merino  U /dirchange/old/todir
968d14afb2aSJulio Merino  U /etc/login.conf
969d14afb2aSJulio Merino  M /etc/mail/aliases
970d14afb2aSJulio Merino  U /etc/services
971d14afb2aSJulio Merino  A /adddir/partial/file
972d14afb2aSJulio Merino  A /dirchange/old/todir/file
973d14afb2aSJulio Merino  A /etc/master.passwd
974d14afb2aSJulio Merino  A /second/equal/first/fifo
975d14afb2aSJulio Merino  A /second/equal/first/file
976d14afb2aSJulio Merino  A /second/equal/first/fulldir/file
977d14afb2aSJulio Merino  A /second/equal/first/link
978d14afb2aSJulio Merino  C /second/second/difffiles/file
979d14afb2aSJulio MerinoWarnings:
980d14afb2aSJulio Merino  Modified regular file remains: /dirchange/fromdir/conflict/somefile
981d14afb2aSJulio Merino  Modified regular file remains: /first/difffiles/second/file
982d14afb2aSJulio Merino  Modified symbolic link remains: /first/difflinks/second/link
983d14afb2aSJulio Merino  Modified directory remains: /first/difftype/second/fifo
984d14afb2aSJulio Merino  Modified directory remains: /rmdir/conflict/difftype
985d14afb2aSJulio Merino  Non-empty directory remains: /rmdir/extra
986d14afb2aSJulio Merino  Non-empty directory remains: /rmdir/conflict
987d14afb2aSJulio Merino  Modified mismatch: /difffiles/difftype/difftype/file (regular file vs fifo file)
988d14afb2aSJulio Merino  Removed file changed: /difffiles/first/first/file
989d14afb2aSJulio Merino  Modified link changed: /difflinks/difflinks/difflinks/link ("old" became "new")
990d14afb2aSJulio Merino  Modified mismatch: /difflinks/difftype/difftype/link (symbolic link vs regular file)
991d14afb2aSJulio Merino  Removed link changed: /difflinks/first/first/link ("old" became "new")
992d14afb2aSJulio Merino  New link conflict: /difftype/difftype/difflinks/link ("new" vs "test")
993d14afb2aSJulio Merino  Modified regular file changed: /difftype/difftype/difftype/one (fifo file became directory)
994d14afb2aSJulio Merino  Modified symbolic link changed: /difftype/difftype/difftype/two (directory became regular file)
995d14afb2aSJulio Merino  Remove mismatch: /difftype/first/first/fifo (fifo file became directory)
996d14afb2aSJulio Merino  Modified directory changed: /dirchange/fromdir/conflict (directory became fifo file)
997d14afb2aSJulio Merino  Modified directory changed: /dirchange/fromdir/extradir (directory became symbolic link)
998d14afb2aSJulio Merino  Modified regular file changed: /dirchange/todir/difffile (regular file became directory)
999d14afb2aSJulio Merino  Modified fifo file changed: /dirchange/todir/difftype (regular file became directory)
1000d14afb2aSJulio Merino  New file mismatch: /adddir/conflict (directory vs regular file)
1001d14afb2aSJulio Merino  Directory mismatch: $TEST/adddir/conflict (regular file)
1002d14afb2aSJulio Merino  Directory mismatch: $TEST/dirchange/todir/difffile (regular file)
1003d14afb2aSJulio Merino  Directory mismatch: $TEST/dirchange/todir/difftype (fifo file)
1004d14afb2aSJulio Merino  New link conflict: /second/second/difflinks/link ("new link" vs "test link")
1005d14afb2aSJulio Merino  New file mismatch: /second/second/difftype/dir (directory vs fifo file)
1006d14afb2aSJulio Merino  Needs update: /etc/mail/aliases.db (requires manual update via newaliases(1))
1007d14afb2aSJulio MerinoEOF
1008d14afb2aSJulio Merino
1009d14afb2aSJulio Merinoecho "Differences for -n:"
1010d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \
1011d14afb2aSJulio Merino    || failed=YES
1012d14afb2aSJulio Merino
1013d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
1014d14afb2aSJulio Merino
1015d14afb2aSJulio Merinoecho "Differences for real:"
1016d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
1017d14afb2aSJulio Merino    || failed=YES
1018d14afb2aSJulio Merino
1019d14afb2aSJulio Merinocheck_trees
1020d14afb2aSJulio Merino
1021d14afb2aSJulio Merino[ "${FAILED}" = no ]
1022