diff options
Diffstat (limited to 'tools/regression/usr.sbin/etcupdate/fbsdid.sh')
-rwxr-xr-x | tools/regression/usr.sbin/etcupdate/fbsdid.sh | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/tools/regression/usr.sbin/etcupdate/fbsdid.sh b/tools/regression/usr.sbin/etcupdate/fbsdid.sh new file mode 100755 index 000000000000..3a90a1e280c0 --- /dev/null +++ b/tools/regression/usr.sbin/etcupdate/fbsdid.sh @@ -0,0 +1,327 @@ +#!/bin/sh +# +# Copyright (c) 2010 Advanced Computing Technologies LLC +# Written by: John H. Baldwin <jhb@FreeBSD.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# Various regression tests to test the -F flag to the 'update' command. + +WORKDIR=work + +usage() +{ + echo "Usage: fbsdid.sh [-w workdir]" + exit 1 +} + +# Allow the user to specify an alternate work directory. +while getopts "w:" option; do + case $option in + w) + WORKDIR=$OPTARG + ;; + *) + echo + usage + ;; + esac +done +shift $((OPTIND - 1)) +if [ $# -ne 0 ]; then + usage +fi + +CONFLICTS=$WORKDIR/conflicts +OLD=$WORKDIR/old +NEW=$WORKDIR/current +TEST=$WORKDIR/test + +# Store a FreeBSD ID string in a specified file. The first argument +# is the file, the remaining arguments are the comment to use. +store_id() +{ + local file + + file=$1 + shift + + echo -n '# $FreeBSD' >> $file + echo -n "$@" >> $file + echo '$' >> $file +} + +# These tests deal with FreeBSD ID string conflicts. We run the test +# twice, once without -F and once with -F. +build_trees() +{ + local i + + rm -rf $OLD $NEW $TEST $CONFLICTS + mkdir -p $OLD $NEW $TEST + + # remove: Remove a file where the only local difference is a + # change in the FreeBSD ID string. + store_id $OLD/remove + store_id $TEST/remove ": head/remove 12345 jhb " + + # old: Modify a file where the only local difference between + # the old and test files is a change in the FreeBSD ID string. + store_id $OLD/old ": src/old,v 1.1 jhb Exp " + store_id $NEW/old ": head/old 12345 jhb " + store_id $TEST/old ": head/old 12000 jhb " + for i in $OLD $TEST; do + cat >> $i/old <<EOF + +an old file +EOF + done + cat >> $NEW/old <<EOF + +a new file +EOF + + # already: Modify a file where the local file already matches + # the new file except for a change in the FreeBSD ID string. + store_id $OLD/already ": src/already,v 1.1 jhb Exp " + store_id $NEW/already ": head/already 12345 jhb " + store_id $TEST/already ": src/already,v 1.2 jhb Exp " + cat >> $OLD/already <<EOF + +another old file +EOF + for i in $NEW $TEST; do + cat >> $i/already <<EOF + +another new file +EOF + done + + # add: Add a file that already exists where the only local + # difference is a change in the FreeBSD ID string. + store_id $NEW/add ": head/add 12345 jhb " + store_id $TEST/add "" + + # conflict: Modify a file where the local file has a different + # FreeBSD ID string. This should still generate a conflict + # even in the -F case. + store_id $OLD/conflict ": head/conflict 12000 jhb " + store_id $NEW/conflict ": head/conflict 12345 jhb " + store_id $TEST/conflict "" + cat >> $OLD/conflict <<EOF + +this is the old file +EOF + cat >> $NEW/conflict <<EOF + +this is the new file +EOF + cat >> $TEST/conflict <<EOF + +this is the local file +EOF + + # local: A file with local modifications has a different + # FreeBSD ID string and the only differences between the old + # and new versions are a change in the FreeBSD ID string. + # This will just update the FreeBSD ID string in the -F case. + for i in $OLD $NEW $TEST; do + cat >> $i/local <<EOF +# Some leading text +# +EOF + done + + store_id $OLD/local ": head/local 12000 jhb " + store_id $NEW/local ": head/local 12345 jhb " + store_id $TEST/local ": src/local,v 1.5 jhb Exp " + + for i in $OLD $NEW $TEST; do + cat >> $i/local <<EOF + +this is a file +EOF + done + + cat >> $TEST/local <<EOF + +these are some local mods to the file +EOF + + # local-already: A file with local modifications has the same + # FreeBSD ID string as the new version of the file and the + # only differences between the old and new versions are a + # change in the FreeBSD ID string. Nothing should happen in + # the -F case. + store_id $OLD/local-already ": head/local 12000 jhb " + for i in $NEW $TEST; do + store_id $i/local-already ": head/local 12345 jhb " + done + + for i in $OLD $NEW $TEST; do + cat >> $i/local-already <<EOF + +this is a file +EOF + done + + cat >> $TEST/local-already <<EOF + +these are some local mods to the file +EOF +} + +# $1 - relative path to file that should be missing from TEST +missing() +{ + if [ -e $TEST/$1 -o -L $TEST/$1 ]; then + echo "File $1 should be missing" + fi +} + +# $1 - relative path to file that should be present in TEST +present() +{ + if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then + echo "File $1 should be present" + fi +} + +# $1 - relative path to regular file that should be present in TEST +# $2 - optional string that should match file contents +# $3 - optional MD5 of the flie contents, overrides $2 if present +file() +{ + local contents sum + + if ! [ -f $TEST/$1 ]; then + echo "File $1 should be a regular file" + elif [ $# -eq 2 ]; then + contents=`cat $TEST/$1` + if [ "$contents" != "$2" ]; then + echo "File $1 has wrong contents" + fi + elif [ $# -eq 3 ]; then + sum=`md5 -q $TEST/$1` + if [ "$sum" != "$3" ]; then + echo "File $1 has wrong contents" + fi + fi +} + +# $1 - relative path to a regular file that should have a conflict +# $2 - optional MD5 of the conflict file contents +conflict() +{ + local sum + + if ! [ -f $CONFLICTS/$1 ]; then + echo "File $1 missing conflict" + elif [ $# -gt 1 ]; then + sum=`md5 -q $CONFLICTS/$1` + if [ "$sum" != "$2" ]; then + echo "Conflict $1 has wrong contents" + fi + fi +} + +# $1 - relative path to a regular file that should not have a conflict +noconflict() +{ + if [ -f $CONFLICTS/$1 ]; then + echo "File $1 should not have a conflict" + fi +} + +if [ `id -u` -ne 0 ]; then + echo "must be root" +fi + +if [ -r /etc/etcupdate.conf ]; then + echo "WARNING: /etc/etcupdate.conf settings may break some tests." +fi + +# First run the test without -F. + +build_trees + +etcupdate -r -d $WORKDIR -D $TEST > $WORKDIR/test.out + +cat > $WORKDIR/correct.out <<EOF + C /already + C /conflict + C /local + M /local-already + C /old + C /add +Warnings: + Modified regular file remains: /remove +EOF + +echo "Differences for regular:" +diff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out + +file /remove "" 1bb4776213af107077be78fead8a351c +file /old "" 2f799a7addc4132563ef9b44adc66157 +conflict /old 8441be64a1540f2ff584015279682425 +file /already "" aa53bd506f65d01d766e7ba028585e1d +conflict /already f44105abb1fa3293e95c5d77e428d418 +file /add "" 1dc8c617e541d1fd1b4c70212f71d8ae +conflict /add f99081e0da9a07f3cfebb430c0414941 +file /conflict "" dc27978df125b0daeb7d9b93265f03fd +conflict /conflict 868452f666fea1c60ffb918ad9ad9607 +file /local "" aa33e614b5e749449f230e2a2b0072eb +conflict /local 3df93e64043c8e348fc625b93ea220f4 +file /local-already "" 0298b958a603049f45ae6a109c4f7fea + +# Now test with -F. + +build_trees + +etcupdate -rF -d $WORKDIR -D $TEST > $WORKDIR/testF.out + +cat > $WORKDIR/correctF.out <<EOF + D /remove + U /already + C /conflict + M /local + U /old + U /add +EOF + +echo "Differences for -F:" +diff -u -L "correct" $WORKDIR/correctF.out -L "test" $WORKDIR/testF.out + +missing /remove +file /old "" 6a9f34f109d94406a4de3bc5d72de259 +noconflict /old +file /already "" 21f4eca3aacc702c49878c8da7afd3d0 +noconflict /already +file /add "" 0208bd647111fedf6318511712ab9e97 +noconflict /add +file /conflict "" dc27978df125b0daeb7d9b93265f03fd +conflict /conflict 868452f666fea1c60ffb918ad9ad9607 +file /local "" 3ed5a35e380c8a93fb5f599d4c052713 +file /local-already "" 0298b958a603049f45ae6a109c4f7fea |