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