Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/3d/3d.tst
1808 views
: 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)
}