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