#!/bin/sh
# Copyright (c) 2005 X.Org Foundation L.L.C.
# 
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is furnished to do
# so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
#!/bin/sh
# $Header: /usr4/cvs/vsw5/bin/run_assert,v 8.0 1998/12/23 23:22:42 mar Rel $
#
#		 Copyright (c) Applied Testing and Technology, Inc. 1993, 1994
#		 All Rights Reserved.
#
# Project:	  Common APIs for UNIX(R)-based Operating Systems
#
# File:		  run_assert
#
# Description:
#		 Runs a single test purpose
#
# Modifications:
# $Log: run_assert,v $
# Revision 8.0  1998/12/23 23:22:42  mar
# Branch point for Release 5.0.2
#
# Revision 7.0  1998/10/30 22:40:41  mar
# Branch point for Release 5.0.2b1
#
# Revision 6.0  1998/03/02 05:15:17  tbr
# Branch point for Release 5.0.1
#
# Revision 5.0  1998/01/26 03:11:49  tbr
# Branch point for Release 5.0.1b1
#
# Revision 4.1  1996/05/29 22:13:16  tbr
# change TMPDIR to /tmp instead of /usr/tmp
# /tmp is mandated by UNIX95, /usr/tmp is not
#
# Revision 4.0  1995/12/15  08:37:34  tbr
# Branch point for Release 5.0.0
#
# Revision 3.1  1995/12/15  00:33:19  andy
# Prepare for GA Release
#


PrintMessage() {
	echo "$PROGRAMNAME: $*" >&2
}

PrintWarning() {
	echo "$PROGRAMNAME: WARNING: $*" >&2
}

PrintError() {
	echo "$PROGRAMNAME: ERROR: $*" >&2
}

PrintFatalError() {
	echo "$PROGRAMNAME: FATAL ERROR: $*" >&2
	echo "$PROGRAMNAME: FATAL ERROR: ABORTING" >&2
	Exit 1
}

PrintDebug() {
	if [ $Debug = "true" -o "$DEBUG" = "true" ]
	then
		PrintMessage "$*"
	fi
	return 0
}


StringIsEmpty() {
	[ "$1" = "" ] && return 0
	return 1
}


FileIsNotARegularFile () {
	FileIsARegularFile "$1" && return 1
	return 0
}


FileIsARegularFile () {
	FileIsADirectory "$1" && return 1
	FileIsAPipe "$1" && return 1
	FileIsADevice "$1" && return 1
	return 0
}

StringIsNotEmpty() {
	StringIsEmpty "$1" && return 1
	return 0
}


FileIsNotEmpty() {
	FileIsEmpty "$1" && return 1
	return 0
}


FileExists() {
	[ -s "$1" ] && return 1
return 0
}


FileExists() {
	[ -s "$1" ] && return 0
	# this catches files with 0 length
	[ "`ls -d $1 2>/dev/null`" != "" ] && return 0
	return 1
}


FileDoesNotExist() {
	FileExists "$1" && return 1
	return 0
}


FileIsReadable() {
	FileDoesNotExist "$1" && return 1
	[ -r "$1" ] && return 0
	return 1
}


FileIsNotReadable() {
	FileDoesNotExist "$1" && return 1
	FileIsReadable "$1" && return 1
	return 0
}


FileIsWriteable() {
	FileDoesNotExist "$1" && return 1
	[ -w "$1" ] && return 0
	return 1
}


FileIsNotWriteable() {
	FileDoesNotExist "$1" && return 1
	[ -w "$1" ] && return 1
	return 0
}


FileIsExecutable() {
	FileDoesNotExist "$1" && return 1
	[ -x "$1" ] && return 0
	return 1
}


FileIsNotExecutable() {
	FileDoesNotExist "$1" && return 1
	FileIsExecutable "$1" && return 1
	return 0
}


FileIsADirectory() {
	[ -d "$1" ] && return 0
	return 1
}


FileIsNotADirectory() {
	FileIsADirectory $1 && return 1
	return 0
}


FileIsAPipe() {
[ -p "$1" ] && return 0
return 1
}


FileIsNotAPipe() {
FileIsAPipe "$1" && return 1
return 0
}


FileIsABlockDevice() {
[ -b "$1" ] && return 0
return 1
}


FileIsNotABlockDevice() {
FileIsABlockDevice "$1" && return 1
return 0
}


FileIsACharacterDevice() {
[ -c "$1" ] && return 0
return 1
}


FileIsNotACharacterDevice() {
FileIsACharacterDevice "$1" && return 1
return 0
}


FileIsADevice() {
FileIsABlockDevice "$1" && return 0
FileIsACharacterDevice "$1" && return 0
return 1
}


FileIsNotADevice() {
FileIsADevice "$1" && return 1
return 0
}


RemoveFile() {
	rm -f "$1" 2>/dev/null
	[ -s "$1" ] && return 1
	return 0
}



Exit()
{
StringIsNotEmpty "$TmpDir" && rm -rf $TmpDir/$$*
StringIsNotEmpty "$TMPDIR" && rm -rf $TMPDIR/$$*
StringIsNotEmpty "$TmpDir" && rm -rf $TmpDir/*.$$
StringIsNotEmpty "$TMPDIR" && rm -rf $TMPDIR/*.$$

[ $# -lt 1 ] && exit 0
[ $# -gt 1 ] && exit 1
[ $1 -eq 0 ] && exit 0
exit 1
}



SetAWK()
{
AWK=""
gawk '{ exit }' </etc/passwd >/dev/null 2>&1 &&
	AWK="gawk"
StringIsEmpty "$AWK" &&
	nawk '{ exit }' </etc/passwd >/dev/null 2>&1 &&
	AWK="nawk"
StringIsEmpty "$AWK" &&
	awk '{ exit }' </etc/passwd >/dev/null 2>&1 &&
	AWK="awk"
StringIsEmpty "$AWK" &&
	PrintFatalError "$0: AWK: not found"

PrintDebug "AWK is $AWK"
return 0
}



GetTestCaseVariables()
{
[ $# -ne 1 ] &&
	PrintError "$0: invalid or missing arguments" &&
	return 1
$AWK -v TestCase="$1" <$TetScenarioFile '
BEGIN {
if ( TestCase == "" )
	{ exit; }
TestCase = sprintf("^%s$", TestCase);
}

{
if ( match($0, TestCase) || (match($2, "CASE") && match($3, TestCase)) )
	{
	while (getline > 0)
		{
		if (substr($1, 1, 1) != "/")
			{ continue; }
		NumberOfElements = split($0, Elements, "/");
		printf("TestSection=%s ; TestDirectory=%s ; TestFile=%s",
		Elements[NumberOfElements - 2],
		Elements[NumberOfElements - 1],
		Elements[NumberOfElements]);
		break;
		}
	exit;
	}
}
'
return 0
}

Usage() {
echo "
Usage: $ProgramName [-Truss] [-NoClean] TestCase AssertionNumbers...

This tool runs the specified assertions for a single test case.
"

Exit 1
}



# main()
trap 'Exit 1' 1 2

PROGRAMNAME="`echo $0 | sed 's,^[	 -~]*/,,'`"
ProgramName=$PROGRAMNAME

if [ "$DEBUG" = "true" -o "$Debug" = "true" ]
then
	DEBUG=true ; export DEBUG
	Debug=true ; export Debug
else
	DEBUG=false ; export DEBUG
	Debug=false ; export Debug
fi

[ "$TMPDIR" = "" ] && TMPDIR=/tmp
FileDoesNotExist "$TMPDIR" &&
	PrintFatalError "$TMPDIR does not exist"
FileIsNotADirectory "$TMPDIR" &&
	PrintFatalError "$TMPDIR is not a directory"
FileIsNotReadable "$TMPDIR" &&
	PrintFatalError "$TMPDIR is not readable"
FileIsNotWriteable "$TMPDIR" &&
	PrintFatalError "$TMPDIR is not writeable"
FileIsNotExecutable "$TMPDIR" &&
	PrintFatalError "Can not cd to $TMPDIR"
TmpDir="$TMPDIR"

STARTDIR=`pwd`
StartDir=$STARTDIR

Clean=true ; Truss=false ; TestCase="" ; Assertions=""
while [ $# -gt 0 ]
do
	case $1 in
		-[Cc]le*)
			shift;
			Clean=true
			;;
		-[Nn]o[Cc]le*)
			shift;
			Clean=false
			;;
		-[Tt]r*)
			shift;
			Truss=true
			;;
		-[Dd]ebug)
			shift
			DEBUG=true ; export DEBUG
			;;
		-[Vv]erbose)
			shift
			DEBUG=true ; export DEBUG
			;;
		-[Hh]elp)
			Usage
			;;
		-[Uu]sage)
			Usage
			;;
		-*)
			Usage
			;;
		*)
			if [ "$TestCase" = "" ]
			then
				TestCase="$1"
			else
				if [ "$1" -gt 0 -a "$1" -lt 1000 ]
				then
					Assertions="$Assertions $1"
				else
					Usage
				fi
			fi
			shift
			;;
	esac
done

StringIsEmpty "$TestCase" &&
	PrintError "No test case was specified" &&
	Usage

StringIsEmpty "$Assertions" &&
	PrintError "No Assertion(s) were specified" &&
	Usage

StringIsEmpty "$TET_ROOT" &&
	PrintFatalError "TET_ROOT must be defined in your environment"
FileIsNotADirectory "$TET_ROOT" &&
	PrintFatalError "$TET_ROOT is not a directory"
FileIsReadable $TET_ROOT ||
	PrintFatalError "$TET_ROOT is not readable"
FileIsExecutable $TET_ROOT ||
	PrintFatalError "Can not cd to $TET_ROOT"

VSWHome=$TET_ROOT/vsw5
FileIsNotADirectory "$VSWHome" &&
	PrintFatalError "$VSWHome does not exist"
FileIsNotADirectory "$VSWHome" &&
	PrintFatalError "$VSWHome is not a directory"
FileIsReadable $VSWHome ||
	PrintFatalError "$VSWHome is not readable"
FileIsExecutable $VSWHome ||
	PrintFatalError "Can not cd to $VSWHome"

TetScenarioFile="$VSWHome/tet_scen"
FileDoesNotExist $TetScenarioFile &&
	PrintFatalError "$TetScenarioFile must exist for this tool to run"
FileIsReadable $TetScenarioFile ||
	PrintFatalError "$TetScenarioFile is not readable"

ScenarioPath=$TmpDir/$ProgramName.$$

SetAWK

eval `GetTestCaseVariables $TestCase`
PrintDebug "TestSection($TestSection), TestDirectory($TestDirectory), TestFile($TestFile)"
StringIsEmpty "$TestSection" &&
	PrintFatalError "TestSection not found"
StringIsEmpty "$TestDirectory" &&
	PrintFatalError "TestDirectory not found"
StringIsEmpty "$TestFile" &&
	PrintFatalError "TestFile not found"

trap 'Exit 1' 1 2

# this is an imperfect header, the 1s we use are fillers
# this generates errors when you run a creport on the test journal
# but it would take too much time to generate the proper numbers 
echo "$TestCase" >$ScenarioPath
[ "$QA_TESTING" != "" ] &&
	echo "	\"VSW5TESTSUITE SECTION $TestSection 1 1 1 1\"" >>$ScenarioPath
echo "	\"VSW5TESTSUITE CASE $TestCase 0\"" >>$ScenarioPath

for Assertion in $Assertions
do
	echo "	/tset/$TestSection/$TestDirectory/Test{$Assertion}" >>$ScenarioPath
done
 
tcc -c -s $ScenarioPath vsw5 "$TestCase"

TccArgs=-be
$Clean && TccArgs=-bec
if [ "$Truss" = "true" ]
then
	truss -f -a tcc $TccArgs -s $ScenarioPath vsw5 "$TestCase" 
else
	tcc $TccArgs -s $ScenarioPath vsw5 "$TestCase"
fi

Exit 0

