xref: /freebsd/usr.sbin/etcupdate/tests/tzsetup_test.sh (revision 179fa75e6e218d71a85a6b17ccc231036a148543)
1d14afb2aSJulio Merino#!/bin/sh
2d14afb2aSJulio Merino#
3*179fa75eSJohn Baldwin# Copyright (c) 2013 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 for the tzsetup handling in the 'update' command.
31d14afb2aSJulio Merino
32d14afb2aSJulio MerinoFAILED=no
33d14afb2aSJulio MerinoWORKDIR=work
34d14afb2aSJulio Merino
35d14afb2aSJulio Merinousage()
36d14afb2aSJulio Merino{
37d14afb2aSJulio Merino	echo "Usage: tzsetup.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 Merinobuild_trees()
68d14afb2aSJulio Merino{
69d14afb2aSJulio Merino
70d14afb2aSJulio Merino	# Build the base tree, but not /etc/localtime itself
71d14afb2aSJulio Merino	local i j k
72d14afb2aSJulio Merino
73d14afb2aSJulio Merino	rm -rf $OLD $NEW $TEST $CONFLICTS
74d14afb2aSJulio Merino	mkdir -p $OLD $NEW $TEST
75d14afb2aSJulio Merino	mkdir -p $TEST/etc
76d14afb2aSJulio Merino	mkdir -p $TEST/var/db
77d14afb2aSJulio Merino	mkdir -p $TEST/usr/share/zoneinfo
78d14afb2aSJulio Merino
79d14afb2aSJulio Merino	# Create a dummy timezone file
80d14afb2aSJulio Merino	echo "foo" > $TEST/usr/share/zoneinfo/foo
81d14afb2aSJulio Merino
82d14afb2aSJulio Merino}
83d14afb2aSJulio Merino
84d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST
85d14afb2aSJulio Merinomissing()
86d14afb2aSJulio Merino{
87d14afb2aSJulio Merino	if [ -e $TEST/$1 -o -L $TEST/$1 ]; then
88d14afb2aSJulio Merino		echo "File $1 should be missing"
89d14afb2aSJulio Merino		FAILED=yes
90d14afb2aSJulio Merino	fi
91d14afb2aSJulio Merino}
92d14afb2aSJulio Merino
93d14afb2aSJulio Merino# $1 - relative path to file that should be a symlink in TEST
94d14afb2aSJulio Merino# $2 - optional value of the link
95d14afb2aSJulio Merinolink()
96d14afb2aSJulio Merino{
97d14afb2aSJulio Merino	local val
98d14afb2aSJulio Merino
99d14afb2aSJulio Merino	if ! [ -L $TEST/$1 ]; then
100d14afb2aSJulio Merino		echo "File $1 should be a link"
101d14afb2aSJulio Merino		FAILED=yes
102d14afb2aSJulio Merino	elif [ $# -gt 1 ]; then
103d14afb2aSJulio Merino		val=`readlink $TEST/$1`
104d14afb2aSJulio Merino		if [ "$val" != "$2" ]; then
105d14afb2aSJulio Merino			echo "Link $1 should link to \"$2\""
106d14afb2aSJulio Merino			FAILED=yes
107d14afb2aSJulio Merino		fi
108d14afb2aSJulio Merino	fi
109d14afb2aSJulio Merino}
110d14afb2aSJulio Merino
111d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST
112d14afb2aSJulio Merino# $2 - optional string that should match file contents
113d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present
114d14afb2aSJulio Merinofile()
115d14afb2aSJulio Merino{
116d14afb2aSJulio Merino	local contents sum
117d14afb2aSJulio Merino
118d14afb2aSJulio Merino	if ! [ -f $TEST/$1 ]; then
119d14afb2aSJulio Merino		echo "File $1 should be a regular file"
120d14afb2aSJulio Merino		FAILED=yes
121d14afb2aSJulio Merino	elif [ $# -eq 2 ]; then
122d14afb2aSJulio Merino		contents=`cat $TEST/$1`
123d14afb2aSJulio Merino		if [ "$contents" != "$2" ]; then
124d14afb2aSJulio Merino			echo "File $1 has wrong contents"
125d14afb2aSJulio Merino			FAILED=yes
126d14afb2aSJulio Merino		fi
127d14afb2aSJulio Merino	elif [ $# -eq 3 ]; then
128d14afb2aSJulio Merino		sum=`md5 -q $TEST/$1`
129d14afb2aSJulio Merino		if [ "$sum" != "$3" ]; then
130d14afb2aSJulio Merino			echo "File $1 has wrong contents"
131d14afb2aSJulio Merino			FAILED=yes
132d14afb2aSJulio Merino		fi
133d14afb2aSJulio Merino	fi
134d14afb2aSJulio Merino}
135d14afb2aSJulio Merino
136d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then
137d14afb2aSJulio Merino	echo "must be root"
138d14afb2aSJulio Merino	exit 0
139d14afb2aSJulio Merinofi
140d14afb2aSJulio Merino
141d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then
142d14afb2aSJulio Merino	echo "WARNING: /etc/etcupdate.conf settings may break some tests."
143d14afb2aSJulio Merinofi
144d14afb2aSJulio Merino
145d14afb2aSJulio Merino# First, test for /etc/localtime not existing
146d14afb2aSJulio Merino
147d14afb2aSJulio Merinobuild_trees
148d14afb2aSJulio Merino
149d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out
150d14afb2aSJulio Merino
151d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
152d14afb2aSJulio MerinoEOF
153d14afb2aSJulio Merino
154d14afb2aSJulio Merinoecho "Differences for no /etc/localtime with -n:"
155d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \
156d14afb2aSJulio Merino    || FAILED=yes
157d14afb2aSJulio Merino
158d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
159d14afb2aSJulio Merino
160d14afb2aSJulio Merinoecho "Differences for no /etc/localtime:"
161d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
162d14afb2aSJulio Merino    || FAILED=yes
163d14afb2aSJulio Merino
164d14afb2aSJulio Merinomissing /etc/localtime
165d14afb2aSJulio Merinomissing /var/db/zoneinfo
166d14afb2aSJulio Merino
167d14afb2aSJulio Merino# Second, test for /etc/localtime being a symlink
168d14afb2aSJulio Merino
169d14afb2aSJulio Merinobuild_trees
170d14afb2aSJulio Merinoln -s /dev/null $TEST/etc/localtime
171d14afb2aSJulio Merino
172d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out
173d14afb2aSJulio Merino
174d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
175d14afb2aSJulio MerinoEOF
176d14afb2aSJulio Merino
177d14afb2aSJulio Merinoecho "Differences for symlinked /etc/localtime with -n:"
178d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \
179d14afb2aSJulio Merino    || FAILED=yes
180d14afb2aSJulio Merino
181d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
182d14afb2aSJulio Merino
183d14afb2aSJulio Merinoecho "Differences for symlinked /etc/localtime:"
184d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
185d14afb2aSJulio Merino    || FAILED=yes
186d14afb2aSJulio Merino
187d14afb2aSJulio Merinolink /etc/localtime "/dev/null"
188d14afb2aSJulio Merinomissing /var/db/zoneinfo
189d14afb2aSJulio Merino
190d14afb2aSJulio Merino# Third, test for /etc/localtime as a file and a missing /var/db/zoneinfo
191d14afb2aSJulio Merino
192d14afb2aSJulio Merinobuild_trees
193d14afb2aSJulio Merinoecho "bar" > $TEST/etc/localtime
194d14afb2aSJulio Merino
195d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out
196d14afb2aSJulio Merino
197d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
198d14afb2aSJulio MerinoWarnings:
199d14afb2aSJulio Merino  Needs update: /etc/localtime (required manual update via tzsetup(1))
200d14afb2aSJulio MerinoEOF
201d14afb2aSJulio Merino
202d14afb2aSJulio Merinoecho "Differences for missing /var/db/zoneinfo with -n:"
203d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \
204d14afb2aSJulio Merino    || FAILED=yes
205d14afb2aSJulio Merino
206d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
207d14afb2aSJulio Merino
208d14afb2aSJulio Merinoecho "Differences for missing /var/db/zoneinfo:"
209d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
210d14afb2aSJulio Merino    || FAILED=yes
211d14afb2aSJulio Merino
212d14afb2aSJulio Merinofile /etc/localtime "bar"
213d14afb2aSJulio Merinomissing /var/db/zoneinfo
214d14afb2aSJulio Merino
215d14afb2aSJulio Merino# Finally, test the case where it should update /etc/localtime
216d14afb2aSJulio Merino
217d14afb2aSJulio Merinobuild_trees
218d14afb2aSJulio Merinoecho "bar" > $TEST/etc/localtime
219d14afb2aSJulio Merinoecho "foo" > $TEST/var/db/zoneinfo
220d14afb2aSJulio Merino
221d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out
222d14afb2aSJulio Merino
223d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
224d14afb2aSJulio MerinoEOF
225d14afb2aSJulio Merino
226d14afb2aSJulio Merinoecho "Differences for real update with -n:"
227d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \
228d14afb2aSJulio Merino    || FAILED=yes
229d14afb2aSJulio Merino
230d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out
231d14afb2aSJulio Merino
232d14afb2aSJulio Merinoecho "Differences for real update:"
233d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
234d14afb2aSJulio Merino    || FAILED=yes
235d14afb2aSJulio Merino
236d14afb2aSJulio Merinofile /etc/localtime "foo"
237d14afb2aSJulio Merinofile /var/db/zoneinfo "foo"
238d14afb2aSJulio Merino
239d14afb2aSJulio Merino[ "${FAILED}" = no ]
240