xref: /freebsd/usr.sbin/etcupdate/tests/ignore_test.sh (revision d14afb2adcbf0db6625f582abf0c7154e4e005bd)
1*d14afb2aSJulio Merino#!/bin/sh
2*d14afb2aSJulio Merino#
3*d14afb2aSJulio Merino# Copyright (c) 2010 Advanced Computing Technologies LLC
4*d14afb2aSJulio Merino# Written by: John H. Baldwin <jhb@FreeBSD.org>
5*d14afb2aSJulio Merino# All rights reserved.
6*d14afb2aSJulio Merino#
7*d14afb2aSJulio Merino# Redistribution and use in source and binary forms, with or without
8*d14afb2aSJulio Merino# modification, are permitted provided that the following conditions
9*d14afb2aSJulio Merino# are met:
10*d14afb2aSJulio Merino# 1. Redistributions of source code must retain the above copyright
11*d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer.
12*d14afb2aSJulio Merino# 2. Redistributions in binary form must reproduce the above copyright
13*d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer in the
14*d14afb2aSJulio Merino#    documentation and/or other materials provided with the distribution.
15*d14afb2aSJulio Merino#
16*d14afb2aSJulio Merino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*d14afb2aSJulio Merino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*d14afb2aSJulio Merino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*d14afb2aSJulio Merino# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*d14afb2aSJulio Merino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*d14afb2aSJulio Merino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*d14afb2aSJulio Merino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*d14afb2aSJulio Merino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*d14afb2aSJulio Merino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*d14afb2aSJulio Merino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*d14afb2aSJulio Merino# SUCH DAMAGE.
27*d14afb2aSJulio Merino#
28*d14afb2aSJulio Merino# $FreeBSD$
29*d14afb2aSJulio Merino
30*d14afb2aSJulio Merino# Various regression tests to test the -I flag to the 'update' command.
31*d14afb2aSJulio Merino
32*d14afb2aSJulio MerinoFAILED=no
33*d14afb2aSJulio MerinoWORKDIR=work
34*d14afb2aSJulio Merino
35*d14afb2aSJulio Merinousage()
36*d14afb2aSJulio Merino{
37*d14afb2aSJulio Merino	echo "Usage: ignore.sh [-s script] [-w workdir]"
38*d14afb2aSJulio Merino	exit 1
39*d14afb2aSJulio Merino}
40*d14afb2aSJulio Merino
41*d14afb2aSJulio Merino# Allow the user to specify an alternate work directory or script.
42*d14afb2aSJulio MerinoCOMMAND=etcupdate
43*d14afb2aSJulio Merinowhile getopts "s:w:" option; do
44*d14afb2aSJulio Merino	case $option in
45*d14afb2aSJulio Merino		s)
46*d14afb2aSJulio Merino			COMMAND="sh $OPTARG"
47*d14afb2aSJulio Merino			;;
48*d14afb2aSJulio Merino		w)
49*d14afb2aSJulio Merino			WORKDIR=$OPTARG
50*d14afb2aSJulio Merino			;;
51*d14afb2aSJulio Merino		*)
52*d14afb2aSJulio Merino			echo
53*d14afb2aSJulio Merino			usage
54*d14afb2aSJulio Merino			;;
55*d14afb2aSJulio Merino	esac
56*d14afb2aSJulio Merinodone
57*d14afb2aSJulio Merinoshift $((OPTIND - 1))
58*d14afb2aSJulio Merinoif [ $# -ne 0 ]; then
59*d14afb2aSJulio Merino	usage
60*d14afb2aSJulio Merinofi
61*d14afb2aSJulio Merino
62*d14afb2aSJulio MerinoCONFLICTS=$WORKDIR/conflicts
63*d14afb2aSJulio MerinoOLD=$WORKDIR/old
64*d14afb2aSJulio MerinoNEW=$WORKDIR/current
65*d14afb2aSJulio MerinoTEST=$WORKDIR/test
66*d14afb2aSJulio Merino
67*d14afb2aSJulio Merino# These tests deal with ignoring certain patterns of files.  We run the
68*d14afb2aSJulio Merino# test multiple times ignoring different patterns.
69*d14afb2aSJulio Merinobuild_trees()
70*d14afb2aSJulio Merino{
71*d14afb2aSJulio Merino	local i
72*d14afb2aSJulio Merino
73*d14afb2aSJulio Merino	rm -rf $OLD $NEW $TEST $CONFLICTS
74*d14afb2aSJulio Merino	mkdir -p $OLD $NEW $TEST
75*d14afb2aSJulio Merino
76*d14afb2aSJulio Merino	for i in $OLD $NEW $TEST; do
77*d14afb2aSJulio Merino		mkdir -p $i/tree
78*d14afb2aSJulio Merino	done
79*d14afb2aSJulio Merino
80*d14afb2aSJulio Merino	# tree: Test three different cases (add, modify, remove) that all
81*d14afb2aSJulio Merino	# match the tree/* glob.
82*d14afb2aSJulio Merino	echo "foo" > $NEW/tree/add
83*d14afb2aSJulio Merino	for i in $OLD $TEST; do
84*d14afb2aSJulio Merino		echo "old" > $i/tree/modify
85*d14afb2aSJulio Merino	done
86*d14afb2aSJulio Merino	echo "new" > $NEW/tree/modify
87*d14afb2aSJulio Merino	for i in $OLD $TEST; do
88*d14afb2aSJulio Merino		echo "old" > $i/tree/remove
89*d14afb2aSJulio Merino	done
90*d14afb2aSJulio Merino
91*d14afb2aSJulio Merino	# rmdir: Remove a whole tree.
92*d14afb2aSJulio Merino	for i in $OLD $TEST; do
93*d14afb2aSJulio Merino		mkdir $i/rmdir
94*d14afb2aSJulio Merino		echo "foo" > $i/rmdir/file
95*d14afb2aSJulio Merino	done
96*d14afb2aSJulio Merino}
97*d14afb2aSJulio Merino
98*d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST
99*d14afb2aSJulio Merinomissing()
100*d14afb2aSJulio Merino{
101*d14afb2aSJulio Merino	if [ -e $TEST/$1 -o -L $TEST/$1 ]; then
102*d14afb2aSJulio Merino		echo "File $1 should be missing"
103*d14afb2aSJulio Merino		FAILED=yes
104*d14afb2aSJulio Merino	fi
105*d14afb2aSJulio Merino}
106*d14afb2aSJulio Merino
107*d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST
108*d14afb2aSJulio Merinopresent()
109*d14afb2aSJulio Merino{
110*d14afb2aSJulio Merino	if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then
111*d14afb2aSJulio Merino		echo "File $1 should be present"
112*d14afb2aSJulio Merino		FAILED=yes
113*d14afb2aSJulio Merino	fi
114*d14afb2aSJulio Merino}
115*d14afb2aSJulio Merino
116*d14afb2aSJulio Merino# $1 - relative path to file that should be a directory in TEST
117*d14afb2aSJulio Merinodir()
118*d14afb2aSJulio Merino{
119*d14afb2aSJulio Merino	if ! [ -d $TEST/$1 ]; then
120*d14afb2aSJulio Merino		echo "File $1 should be a directory"
121*d14afb2aSJulio Merino		FAILED=yes
122*d14afb2aSJulio Merino	fi
123*d14afb2aSJulio Merino}
124*d14afb2aSJulio Merino
125*d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST
126*d14afb2aSJulio Merino# $2 - optional string that should match file contents
127*d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present
128*d14afb2aSJulio Merinofile()
129*d14afb2aSJulio Merino{
130*d14afb2aSJulio Merino	local contents sum
131*d14afb2aSJulio Merino
132*d14afb2aSJulio Merino	if ! [ -f $TEST/$1 ]; then
133*d14afb2aSJulio Merino		echo "File $1 should be a regular file"
134*d14afb2aSJulio Merino		FAILED=yes
135*d14afb2aSJulio Merino	elif [ $# -eq 2 ]; then
136*d14afb2aSJulio Merino		contents=`cat $TEST/$1`
137*d14afb2aSJulio Merino		if [ "$contents" != "$2" ]; then
138*d14afb2aSJulio Merino			echo "File $1 has wrong contents"
139*d14afb2aSJulio Merino			FAILED=yes
140*d14afb2aSJulio Merino		fi
141*d14afb2aSJulio Merino	elif [ $# -eq 3 ]; then
142*d14afb2aSJulio Merino		sum=`md5 -q $TEST/$1`
143*d14afb2aSJulio Merino		if [ "$sum" != "$3" ]; then
144*d14afb2aSJulio Merino			echo "File $1 has wrong contents"
145*d14afb2aSJulio Merino			FAILED=yes
146*d14afb2aSJulio Merino		fi
147*d14afb2aSJulio Merino	fi
148*d14afb2aSJulio Merino}
149*d14afb2aSJulio Merino
150*d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict
151*d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents
152*d14afb2aSJulio Merinoconflict()
153*d14afb2aSJulio Merino{
154*d14afb2aSJulio Merino	local sum
155*d14afb2aSJulio Merino
156*d14afb2aSJulio Merino	if ! [ -f $CONFLICTS/$1 ]; then
157*d14afb2aSJulio Merino		echo "File $1 missing conflict"
158*d14afb2aSJulio Merino		FAILED=yes
159*d14afb2aSJulio Merino	elif [ $# -gt 1 ]; then
160*d14afb2aSJulio Merino		sum=`md5 -q $CONFLICTS/$1`
161*d14afb2aSJulio Merino		if [ "$sum" != "$2" ]; then
162*d14afb2aSJulio Merino			echo "Conflict $1 has wrong contents"
163*d14afb2aSJulio Merino			FAILED=yes
164*d14afb2aSJulio Merino		fi
165*d14afb2aSJulio Merino	fi
166*d14afb2aSJulio Merino}
167*d14afb2aSJulio Merino
168*d14afb2aSJulio Merino# $1 - relative path to a regular file that should not have a conflict
169*d14afb2aSJulio Merinonoconflict()
170*d14afb2aSJulio Merino{
171*d14afb2aSJulio Merino	if [ -f $CONFLICTS/$1 ]; then
172*d14afb2aSJulio Merino		echo "File $1 should not have a conflict"
173*d14afb2aSJulio Merino		FAILED=yes
174*d14afb2aSJulio Merino	fi
175*d14afb2aSJulio Merino}
176*d14afb2aSJulio Merino
177*d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then
178*d14afb2aSJulio Merino	echo "must be root"
179*d14afb2aSJulio Merino	exit 0
180*d14afb2aSJulio Merinofi
181*d14afb2aSJulio Merino
182*d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then
183*d14afb2aSJulio Merino	echo "WARNING: /etc/etcupdate.conf settings may break some tests."
184*d14afb2aSJulio Merinofi
185*d14afb2aSJulio Merino
186*d14afb2aSJulio Merino# First run the test ignoring no patterns.
187*d14afb2aSJulio Merino
188*d14afb2aSJulio Merinobuild_trees
189*d14afb2aSJulio Merino
190*d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
191*d14afb2aSJulio Merino
192*d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
193*d14afb2aSJulio Merino  D /rmdir/file
194*d14afb2aSJulio Merino  D /tree/remove
195*d14afb2aSJulio Merino  D /rmdir
196*d14afb2aSJulio Merino  U /tree/modify
197*d14afb2aSJulio Merino  A /tree/add
198*d14afb2aSJulio MerinoEOF
199*d14afb2aSJulio Merino
200*d14afb2aSJulio Merinoecho "Differences for regular:"
201*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
202*d14afb2aSJulio Merino    || FAILED=yes
203*d14afb2aSJulio Merino
204*d14afb2aSJulio Merinomissing /tree/remove
205*d14afb2aSJulio Merinofile /tree/modify "new"
206*d14afb2aSJulio Merinofile /tree/add "foo"
207*d14afb2aSJulio Merinomissing /rmdir/file
208*d14afb2aSJulio Merinomissing /rmdir
209*d14afb2aSJulio Merino
210*d14afb2aSJulio Merino# Now test with -I '/tree/*'.  This should preserve the /tree files.
211*d14afb2aSJulio Merino
212*d14afb2aSJulio Merinobuild_trees
213*d14afb2aSJulio Merino
214*d14afb2aSJulio Merino$COMMAND -r -I '/tree/*' -d $WORKDIR -D $TEST > $WORKDIR/test1.out
215*d14afb2aSJulio Merino
216*d14afb2aSJulio Merinocat > $WORKDIR/correct1.out <<EOF
217*d14afb2aSJulio Merino  D /rmdir/file
218*d14afb2aSJulio Merino  D /rmdir
219*d14afb2aSJulio MerinoEOF
220*d14afb2aSJulio Merino
221*d14afb2aSJulio Merinoecho "Differences for -I '/tree/*':"
222*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct1.out -L "test" $WORKDIR/test1.out \
223*d14afb2aSJulio Merino    || FAILED=yes
224*d14afb2aSJulio Merino
225*d14afb2aSJulio Merinofile /tree/remove "old"
226*d14afb2aSJulio Merinofile /tree/modify "old"
227*d14afb2aSJulio Merinomissing /tree/add
228*d14afb2aSJulio Merinomissing /rmdir/file
229*d14afb2aSJulio Merinomissing /rmdir
230*d14afb2aSJulio Merino
231*d14afb2aSJulio Merino# Now test with two patterns.  This should preserve everything.
232*d14afb2aSJulio Merino
233*d14afb2aSJulio Merinobuild_trees
234*d14afb2aSJulio Merino
235*d14afb2aSJulio Merino$COMMAND -r -I '/tree/*' -I '/rmdir*' -d $WORKDIR -D $TEST > \
236*d14afb2aSJulio Merino    $WORKDIR/test2.out
237*d14afb2aSJulio Merino
238*d14afb2aSJulio Merinocat > $WORKDIR/correct2.out <<EOF
239*d14afb2aSJulio MerinoEOF
240*d14afb2aSJulio Merino
241*d14afb2aSJulio Merinoecho "Differences for -I '/tree/*' -I '/rmdir*':"
242*d14afb2aSJulio Merino
243*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct2.out -L "test" $WORKDIR/test2.out \
244*d14afb2aSJulio Merino    || FAILED=yes
245*d14afb2aSJulio Merino
246*d14afb2aSJulio Merinofile /tree/remove "old"
247*d14afb2aSJulio Merinofile /tree/modify "old"
248*d14afb2aSJulio Merinomissing /tree/add
249*d14afb2aSJulio Merinofile /rmdir/file "foo"
250*d14afb2aSJulio Merino
251*d14afb2aSJulio Merino# Now test with a pattern that should cause a warning on /rmdir by
252*d14afb2aSJulio Merino# only ignoring the files under that directory.  Note that this also
253*d14afb2aSJulio Merino# tests putting two patterns into a single -I argument.
254*d14afb2aSJulio Merino
255*d14afb2aSJulio Merinobuild_trees
256*d14afb2aSJulio Merino
257*d14afb2aSJulio Merino$COMMAND -r -I '/tree/* /rmdir/*' -d $WORKDIR -D $TEST > \
258*d14afb2aSJulio Merino    $WORKDIR/test3.out
259*d14afb2aSJulio Merino
260*d14afb2aSJulio Merinocat > $WORKDIR/correct3.out <<EOF
261*d14afb2aSJulio MerinoWarnings:
262*d14afb2aSJulio Merino  Non-empty directory remains: /rmdir
263*d14afb2aSJulio MerinoEOF
264*d14afb2aSJulio Merino
265*d14afb2aSJulio Merinoecho "Differences for -I '/tree/* /rmdir/*':"
266*d14afb2aSJulio Merino
267*d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct3.out -L "test" $WORKDIR/test3.out \
268*d14afb2aSJulio Merino    || FAILED=yes
269*d14afb2aSJulio Merino
270*d14afb2aSJulio Merinofile /tree/remove "old"
271*d14afb2aSJulio Merinofile /tree/modify "old"
272*d14afb2aSJulio Merinomissing /tree/add
273*d14afb2aSJulio Merinofile /rmdir/file "foo"
274*d14afb2aSJulio Merinodir /rmdir
275*d14afb2aSJulio Merino
276*d14afb2aSJulio Merino[ "${FAILED}" = no ]
277