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