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