: 3d regression tests
#
# 3d.tst (AT&T Research) 2004-07-01
#
# the first section defines the test harness
# the next section defines individual test functions
# the tests are in the last section
#
( vpath ) >/dev/null 2>&1 || {
print -u2 $0: must be run from 3d shell
exit 1
}
export LC_ALL=C
integer seconds=0
COMMAND=3d
FILE=
FORMAT="%K"
GROUP=
INIT=
NEW="new-and-improved"
NUKE=
OLD="original"
pwd=$PWD
PREFIX=
STAMP="2005-07-17+04:05:06"
VIRTUAL=
TWD
function ACTIVE
{
DO return 0
}
function TEST
{
case $INIT in
"") INIT=1
mkdir -p $TWD/bottom || exit 1
cd $TWD
INTRO
;;
esac
cd $TWD
case $NUKE in
?*) rm -rf $NUKE; NUKE= ;;
esac
PREFIX=
GROUP=$1
ACTIVE || return 1
vpath - -
shift
print "$GROUP $*"
}
function FAIL # file message
{
print -u2 " FAIL $@"
rm -rf $1
(( ERRORS++ ))
return 0
}
function VERIFY # command ...
{
(( TESTS++ ))
"$@" || FAIL "$@"
}
function PREFIX
{
PREFIX=$1
case $1 in
/*) NUKE="$NUKE $1" ;;
*) NUKE="$NUKE $PWD/$1" ;;
esac
}
function VIRTUAL
{
case $VIRTUAL in
?*) pwd=$PWD
cd $TWD
rm -rf $TWD/$VIRTUAL
cd $pwd
;;
esac
VIRTUAL=$1
}
function CD
{
VERIFY cd $TWD/$1
}
function VPATH
{
VERIFY vpath "$@"
}
function CP
{
VERIFY cp "$@"
shift $#-1
NUKE="$NUKE $1"
}
function LN
{
VERIFY ln "$@"
shift $#-1
NUKE="$NUKE $1"
}
function MV
{
VERIFY mv "$@"
shift $#-1
NUKE="$NUKE $1"
}
function MKDIR
{
VERIFY mkdir -p $*
for i
do case $i in
/*) NUKE="$NUKE $i" ;;
*) NUKE="$NUKE $i" ;;
esac
done
}
function DATA
{
VIRTUAL $VIRTUAL
case $1 in
-) remove=1; shift ;;
*) remove=0 ;;
esac
case $# in
0) return 0 ;;
1) ;;
*) return 1 ;;
esac
path=$1
case $PREFIX in
"") FILE=$path ;;
*) FILE=$PREFIX/$path ;;
esac
file=bottom/$path
if [[ ! -f $TWD/$file ]]
then case $remove in
0) if [[ $path == */* && ! -d $TWD/${file%/*} ]]
then mkdir -p $TWD/${file%/*} || FAIL $TWD/${file%/*} DATA mkdir
fi
print $OLD > $TWD/$file
mode=${file%???}
mode=${file#$mode}
chmod $mode $TWD/$file || FAIL $TWD/$file DATA chmod
;;
esac
else case $remove in
1) rm -f $TWD/$file ;;
esac
fi
(( TESTS++ ))
return 0
}
#
# the remaining functions implement individiual parameterized tests
#
function APPEND
{
DATA $*
print "$NEW" >> $FILE || FAIL $FILE write error
if [[ $(<$FILE) != "$OLD"$'\n'"$NEW" ]]
then FAIL $FILE unchanged by $0
elif [[ -f $FILE/... && $(<$FILE/...) != "$OLD" ]]
then FAIL $FILE/... changed by $0
fi
}
function MODE
{
DATA $*
chmod 000 $FILE || FAIL $FILE chmod error
if [[ -f $FILE/... && ! -r $FILE/... ]]
then FAIL $FILE/... changed by $0
elif [[ -r $FILE ]]
then FAIL $FILE unchanged by $0
fi
}
function REMOVE
{
DATA $*
rm $FILE || FAIL $FILE rm error
if [[ ! -f $FILE/... ]]
then FAIL $FILE/... changed by $0
fi
print "$NEW" > $FILE || FAIL $FILE write error
rm $FILE || FAIL $FILE rm error
if [[ $(<$FILE) != "$OLD" ]]
then FAIL $FILE unchanged by $0
elif [[ $(<$FILE/...) != "$OLD" ]]
then FAIL $FILE/... changed by $0
fi
}
function TOUCH
{
DATA $*
touch -t "#$((seconds++))" $FILE/... || FAIL $FILE/... touch error
touch -t "#$((seconds++))" $TWD/reference || FAIL $TWD/reference touch error
touch -t "#$((seconds++))" $FILE || FAIL $FILE touch error
if [[ $FILE/... -nt $TWD/reference ]]
then FAIL $FILE/... changed by $0
elif [[ ! $FILE -nt $TWD/reference ]]
then FAIL $FILE unchanged by $0
fi
touch -t $STAMP $FILE
if [[ $(date -m -f $FORMAT $FILE) != "$STAMP" ]]
then FAIL $FILE modfiy time does not match $STAMP
fi
}
function UPDATE
{
DATA $*
print "$NEW" 1<> $FILE || FAIL $FILE write error
if [[ $(<$FILE) != "$NEW" ]]
then FAIL $FILE unchanged by $0
elif [[ -f $FILE/... && $(<$FILE/...) != "$OLD" ]]
then FAIL $FILE/... changed by $0
fi
}
function WRITE
{
DATA $*
print "$NEW" > $FILE || FAIL $FILE write error
if [[ $(<$FILE) != "$NEW" ]]
then FAIL $FILE unchanged by $0
elif [[ -f $FILE/... && $(<$FILE/...) != "$OLD" ]]
then FAIL $FILE/... changed by $0
fi
}
function RUN
{
[[ $1 == 3d ]] || return
DATA
WRITE w666
WRITE w600
TOUCH t777
MODE m444
WRITE dir/w666
WRITE dir/w600
TOUCH dir/t777
MODE dir/m444
UPDATE u644
UPDATE u640
APPEND a644
APPEND a640
UPDATE dir/u644
UPDATE dir/u640
APPEND dir/a644
APPEND dir/a640
VIRTUAL
REMOVE r644
WRITE r644
REMOVE r644
}
#
# finally the tests
#
TEST 01 PWD==top top exists &&
{
VPATH top bottom
MKDIR top
CD top
RUN 3d
}
TEST 02 PWD!=top top exists &&
{
VPATH top bottom
MKDIR top
MKDIR junk
CD junk
PREFIX ../top
RUN 3d
}
TEST 03 PWD==top top virtual &&
{
VIRTUAL top
VPATH top bottom
CD top
RUN 3d
}
TEST 04 PWD!=top top virtual &&
{
VIRTUAL top
VPATH top bottom
MKDIR junk
CD junk
PREFIX ../top
RUN 3d
}
TEST 05 top symlink &&
{
if LN -s text link
then [[ -L link ]] || FAIL lstat does stat
fi
}
TEST 06 symlink spaghetti &&
{
MKDIR usr/bin sbin
echo : > sbin/cmd && chmod +x sbin/cmd
LN -s usr/bin bin
LN -s ../../sbin/cmd usr/bin/cmd
CD bin
PATH=:$PATH cmd
}
TEST 07 PWD==top top exists, bot virtual &&
{
VPATH top bot
MKDIR top
CD top
echo foo > foo && echo bar > bar
CP foo ...
MV bar ...
CP foo ...
[[ -d ... ]] && FAIL ... is a directory && return
[[ $(cat foo 2>/dev/null) != foo ]] && FAIL top garbled -- $(cat foo 2>&1)
}