From 014f0e14a3c6a044d99a67c8f4e1c4065452479e Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Sun, 23 May 2010 00:05:04 +0200 Subject: Imported Upstream version 4.0-20090301 --- test/tcm.sh | 571 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 571 insertions(+) create mode 100755 test/tcm.sh (limited to 'test/tcm.sh') diff --git a/test/tcm.sh b/test/tcm.sh new file mode 100755 index 0000000..d8d98cb --- /dev/null +++ b/test/tcm.sh @@ -0,0 +1,571 @@ +# +# SCCS: @(#)tcm.sh 1.17 (03/03/31) +# +# UniSoft Ltd., London, England +# +# (C) Copyright 1996 X/Open Company Limited +# +# All rights reserved. No part of this source code may be reproduced, +# stored in a retrieval system, or transmitted, in any form or by any +# means, electronic, mechanical, photocopying, recording or otherwise, +# except as stated in the end-user licence agreement, without the prior +# permission of the copyright owners. +# A copy of the end-user licence agreement is contained in the file +# Licence which accompanies this distribution. +# +# X/Open and the 'X' symbol are trademarks of X/Open Company Limited in +# the UK and other countries. +# +# ************************************************************************ + +# Copyright 1990 Open Software Foundation (OSF) +# Copyright 1990 Unix International (UI) +# Copyright 1990 X/Open Company Limited (X/Open) +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, provided +# that the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of OSF, UI or X/Open not be used in +# advertising or publicity pertaining to distribution of the software +# without specific, written prior permission. OSF, UI and X/Open make +# no representations about the suitability of this software for any purpose. +# It is provided "as is" without express or implied warranty. +# +# OSF, UI and X/Open DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL OSF, UI or X/Open BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# *********************************************************************** +# +# SCCS: @(#)tcm.sh 1.17 03/31/03 +# NAME: Shell Test Case Manager +# PRODUCT: TET (Test Environment Toolkit) +# as supplied with TETware release 3.7 +# AUTHOR: Andrew Dingwall, UniSoft Ltd. +# DATE CREATED: 1 November 1990 +# +# DESCRIPTION: +# This file contains the support routines for the sequencing and control +# of invocable components and test purposes. +# It should be sourced (by means of the shell . command) into a shell +# script containing definitions of the invocable components and test +# purposes that may be executed, after those definitions have been made. +# Test purposes may be written as shell functions or executable +# shell scripts. +# +# This file sources tetapi.sh which contains the shell API functions. +# Test purposes written as separate shell scripts must also source +# tetapi.sh in order to use those functions. +# +# The user-supplied shell variable iclist should contain a list of all +# the invocable components in the testset; +# these are named ic1, ic2 ... etc. +# For each invocable component thus specified, the user should define +# a variable whose name is the same as that of the component. +# Each such variable should contain the names of the test purposes +# associated with each invocable component; for example: +# iclist="ic1 ic2" +# ic1="test1-1 test1-2 test1-3" +# ic2="test2-1 test2-2" +# +# The NUMBERS of the invocable components to be executed are specified +# on the command line. +# In addition, the user may define the variables tet_startup and +# tet_cleanup; if defined, the related functions (or shell scripts) +# are executed at the start and end of processing, respectively. +# +# The TCM makes the NAME of the currently executing test purpose +# available in the environment variable tet_thistest. +# +# The TCM reads configuration variables from the file specified by the +# TET_CONFIG environment variable; these are placed in the environment +# and marked as readonly. +# +# MODIFICATIONS: +# +# Geoff Clare, 11 Oct 1991 +# Replace signal lists with markers to be edited by make INSTALL. +# Remove local TET_VERSION to avoid conflict with env. variable. +# +# Geoff Clare, 29 Jan 1992 +# Implement TET_TRAP_FUNCTION in place of tet_setsigs(), and +# TET_DEFAULT_SIGS in place of tet_defaultsigs(). +# +# Andrew Dingwall, 18 Jan 1993 +# Reset block and sequence number to 1 before each +# test purpose is executed. +# +# Geoff Clare, UniSoft Ltd., August 1996 +# Make TP number unique over test case, not just IC. +# Get default TET_NSIG from makefile. +# +# Geoff Clare, UniSoft Ltd., 3 Sept 1996 +# Only give non-existent IC message for requested IC +# numbers (not for ICs executed via an "all" in the IC list). +# +# Andrew Dingwall, UniSoft Ltd., October 1996 +# Port to NT +# +# *********************************************************************** + +# +# TCM signal definitions +# The XXX_SIGNAL_LIST markers are replaced with proper lists by make INSTALL +# + +# standard signals - may not be specified in TET_SIG_IGN and TET_SIG_LEAVE +TET_STD_SIGNALS="1 2 3 4 6 8 13 14 15 10 12 20 18 21 22" + +# signals that are always unhandled +TET_SPEC_SIGNALS="9 17 19 11" + +# +# TCM global variables +# + +tet_thistest=""; export tet_thistest + +# +# "private" TCM variables +# + +TET_CWD=`pwd` +TET_OSNAME=`uname -s`; readonly TET_OSNAME; export TET_OSNAME +TET_DELETES=$TET_CWD/tet_deletes; readonly TET_DELETES; export TET_DELETES +TET_RESFILE=$TET_CWD/tet_xres; readonly TET_RESFILE; export TET_RESFILE +TET_STDERR=$TET_CWD/tet_stderr; readonly TET_STDERR; export TET_STDERR +TET_TESTS=$TET_CWD/tet_tests; readonly TET_TESTS +TET_TMPFILES=$TET_CWD/tet_tmpfiles; readonly TET_TMPFILES +TET_TMPRES=$TET_CWD/tet_tmpres; readonly TET_TMPRES; export TET_TMPRES + +TET_BLOCK=0; export TET_BLOCK +TET_CONTEXT=0; export TET_CONTEXT +TET_EXITVAL=0 +TET_SEQUENCE=0; export TET_SEQUENCE +TET_TPCOUNT=0; export TET_TPCOUNT +TET_TPNUMBER=0; export TET_TPNUMBER + +TET_TMP1=$TET_CWD/tet1.$$ +TET_TMP2=$TET_CWD/tet2.$$ + +# *********************************************************************** + +# +# "private" TCM function definitions +# these interfaces may go away one day +# + +# tet_ismember - return 0 if $1 is in the set $2 ... +# otherwise return 1 +tet_ismember(){ + TET_X=${1:?} + shift + for TET_Y in $* + do + if test 0$TET_X -eq $TET_Y + then + return 0 + fi + done + return 1 +} + + +# tet_abandon - signal handler used during startup and cleanup +tet_abandon(){ + TET_CAUGHTSIG=$1 + if test 15 -eq ${TET_CAUGHTSIG:?} + then + tet_sigterm $TET_CAUGHTSIG + else + tet_error "Abandoning testset: caught unexpected signal $TET_CAUGHTSIG" + fi + TET_EXITVAL=$TET_CAUGHTSIG exit +} + +# tet_sigterm - signal handler for SIGTERM +tet_sigterm(){ + TET_CAUGHTSIG=$1 + tet_error "Abandoning test case: received signal ${TET_CAUGHTSIG:?}" + tet_docleanup + TET_EXITVAL=$TET_CAUGHTSIG exit +} + +# tet_sigskip - signal handler used during test execution +tet_sigskip(){ + TET_CAUGHTSIG=$1 + tet_infoline "unexpected signal ${TET_CAUGHTSIG:?} received" + tet_result UNRESOLVED + if test 15 -eq ${TET_CAUGHTSIG:?} + then + tet_sigterm $TET_CAUGHTSIG + else + continue + fi +} + +# tet_tpend - report on a test purpose +tet_tpend(){ + TET_TPARG1=${1:?} + TET_RESULT= + eval `( + while read TET_NEXTRES + do + if test -z "$TET_RESULT" + then + TET_RESULT="$TET_NEXTRES" + continue + fi + case "$TET_NEXTRES" in + PASS) + ;; + FAIL) + TET_RESULT="$TET_NEXTRES" + ;; + UNRESOLVED|UNINITIATED) + if test FAIL != "$TET_RESULT" + then + TET_RESULT="$TET_NEXTRES" + fi + ;; + NORESULT) + if test FAIL != "$TET_RESULT" -a \ + UNRESOLVED != "$TET_RESULT" -a \ + UNINITIATED != "$TET_RESULT" + then + TET_RESULT="$TET_NEXTRES" + fi + ;; + UNSUPPORTED|NOTINUSE|UNTESTED) + if test PASS = "$TET_RESULT" + then + TET_RESULT="$TET_NEXTRES" + fi + ;; + *) + if test PASS = "$TET_RESULT" -o \ + UNSUPPORTED = "$TET_RESULT" -o \ + NOTINUSE = "$TET_RESULT" -o \ + UNTESTED = "$TET_RESULT" + then + TET_RESULT="$TET_NEXTRES" + fi + ;; + esac + done + echo TET_RESULT=\"$TET_RESULT\" + ) < $TET_TMPRES` + + > $TET_TMPRES + + TET_ABORT=NO + if test -z "$TET_RESULT" + then + TET_RESULT=NORESULT + TET_RESNUM=7 + elif tet_getcode "$TET_RESULT" # sets TET_RESNUM, TET_ABORT + then + : ok + else + TET_RESULT="NO RESULT NAME" + TET_RESNUM=-1 + fi + + tet_output 220 "$TET_TPARG1 $TET_RESNUM `date +%H:%M:%S`" "$TET_RESULT" + + if test YES = "$TET_ABORT" + then + TET_TRAP_FUNCTION=tet_abandon + tet_output 510 "" \ + "ABORT on result code $TET_RESNUM \"$TET_RESULT\"" + if test -n "$tet_cleanup" + then + tet_docleanup + fi + TET_EXITVAL=1 exit + fi +} + +# tet_docleanup - execute the tet_cleanup function +tet_docleanup(){ + tet_thistest= + TET_TPCOUNT=0 + TET_BLOCK=0 + tet_setblock + eval $tet_cleanup +} + +# *********************************************************************** + +# read in API functions +. ./tetapi.sh + + +# *********************************************************************** + + +# +# TCM main flow +# + +# capture command line args before they disappear +TET_TCM_ARGC=$# +TET_TCM_ARGS="$*" +TET_PNAME="$0"; readonly TET_PNAME; export TET_PNAME + +# arrange to clean up on exit +rm -f $TET_TMPFILES +> $TET_TMPFILES +trap 'rm -f `cat $TET_TMPFILES` $TET_TMPFILES; exit $TET_EXITVAL' 0 +trap exit 1 2 3 15 + +# open execution results file +(umask 0; rm -f $TET_RESFILE; > $TET_RESFILE) || TET_EXITVAL=1 exit + +# open other local files +for TET_A in $TET_DELETES $TET_STDERR $TET_TESTS \ + $TET_TMP1 $TET_TMPRES +do + rm -f $TET_A + echo $TET_A >> $TET_TMPFILES + > $TET_A +done + +# read in configuration variables and make them readonly +# strip comments and other non-variable assignments +# protect embedded spaces and single quotes in the value part +if test -n "$TET_CONFIG" +then + if test ! -r "$TET_CONFIG" + then + tet_error "can't read config file" $TET_CONFIG + else + sed "/^#/d; /^[ ]*\$/d; /^[^ ][^ ]*=/!d; + s/'/'\\\\''/g; s/\([^=]*\)=\(.*\)/\1='\2'/; p; + s/\([^=]*\)=.*/readonly \1/" $TET_CONFIG > $TET_TMP1 + . $TET_TMP1 + fi +fi + +# set current context to process ID +tet_setcontext + +# set up default results code file if so required +if test ! -r ${TET_CODE:=tet_code} +then + if test tet_code != "$TET_CODE" + then + tet_error "could not open results code file" \"$TET_CODE\" + fi + echo $TET_TMP2 >> $TET_TMPFILES + echo " +0 PASS Continue +1 FAIL Continue +2 UNRESOLVED Continue +3 NOTINUSE Continue +4 UNSUPPORTED Continue +5 UNTESTED Continue +6 UNINITIATED Continue +7 NORESULT Continue" > $TET_TMP2 + TET_CODE=$TET_TMP2 +fi + +# determine the full path name of the results code file +case $TET_OSNAME in +Windows_*) + case $TET_CODE in + [A-Za-z]:/*) + ;; + *) + TET_CODE=`pwd`/$TET_CODE + ;; + esac + ;; +*) + case $TET_CODE in + /*) + ;; + *) + TET_CODE=`pwd`/$TET_CODE + ;; + esac + ;; +esac + +readonly TET_CODE; export TET_CODE + +# process command-line args +if test 1 -gt $TET_TCM_ARGC +then + TET_TCM_ARGS=all +fi +TET_ICLAST=-1 +TET_ICLIST="`echo $iclist | tr -cd ' 0123456789'`" +: ${TET_ICLIST:=0} +TET_ICFIRST_DEF=`echo $TET_ICLIST | sed 's/ .*//'` +for TET_A in `echo $TET_TCM_ARGS | tr , ' '` +do + case $TET_A in + all*) + if test 0 -ge $TET_ICLAST + then + TET_ICFIRST=$TET_ICFIRST_DEF + for TET_B in $TET_ICLIST + do + if test $TET_B -le $TET_ICFIRST + then + TET_ICFIRST=$TET_B + fi + done + else + TET_ICFIRST=`expr $TET_ICLAST + 1` + fi + TET_ICLAST=$TET_ICFIRST + for TET_B in $TET_ICLIST + do + if test $TET_B -gt $TET_ICLAST + then + TET_ICLAST=$TET_B + fi + done + if test $TET_ICLAST -gt ${TET_B:=0} + then + TET_ICLAST=$TET_B + fi + ;; + *) + eval `echo $TET_A | sed 'h; s/^\([0-9]*\).*/TET_ICFIRST=\1/; + p; g; s/^[^\-]*-*//; s/^\([0-9]*\).*/TET_ICLAST=\1/'` + ;; + esac + TET_ICNO=${TET_ICFIRST:-$TET_ICFIRST_DEF} + while test $TET_ICNO -le ${TET_ICLAST:=$TET_ICNO} + do + if tet_ismember $TET_ICNO $TET_ICLIST + then + test -n "`eval echo \\${ic$TET_ICNO}`" && \ + echo ic$TET_ICNO + else + # only report if the IC was requested + case $TET_A in + all*) ;; + *) tet_error "IC $TET_ICNO is not defined" \ + "for this test case" + esac + fi + TET_ICNO=`expr $TET_ICNO + 1` + done >> $TET_TESTS +done +TET_ICCOUNT=`wc -l < $TET_TESTS | tr -cd 0123456789` + +# print startup message to execution results file +tet_output 15 "3.7 $TET_ICCOUNT" "TCM Start" + +# do initial signal list processing +for TET_A in TET_SIG_LEAVE TET_SIG_IGN +do + echo ${TET_A}2=\" + eval echo \$$TET_A | tr , '\012' | while read TET_B TET_JUNK + do + if test -z "$TET_B" + then + continue + elif tet_ismember $TET_B $TET_STD_SIGNALS $TET_SPEC_SIGNALS + then + tet_error "warning: illegal entry $TET_B" \ + "in $TET_A ignored" + else + echo $TET_B + fi + done + echo \" +done > $TET_TMP1 +. $TET_TMP1 +TET_SIG_LEAVE2="$TET_SIG_LEAVE2 $TET_SPEC_SIGNALS" +TET_A=1 +# The NSIG marker is edited by the makefile, but allow TET_NSIG to +# be overridden from the config file (or environment). +if test -z "$TET_NSIG" +then + TET_NSIG="32" +fi +TET_TRAP_FUNCTION=tet_abandon +TET_DEFAULT_SIGS= +while test $TET_A -lt $TET_NSIG +do + if tet_ismember $TET_A $TET_SIG_LEAVE2 + then + : + elif tet_ismember $TET_A $TET_SIG_IGN2 + then + trap "" $TET_A + else + trap "trap \"\" $TET_A; \$TET_TRAP_FUNCTION $TET_A" $TET_A + TET_DEFAULT_SIGS="$TET_DEFAULT_SIGS $TET_A" + fi + TET_A=`expr $TET_A + 1` +done + +# calculate starting TP number for each IC +TET_A= +for TET_B in $TET_ICLIST +do + # TET_A holds concatenation of TP lists for all previous ICs + set -- $TET_A + eval TET_TP_ADDNUM_$TET_B=$# + eval TET_A=\"\$TET_A \$ic$TET_B\" +done + +# do startup processing +eval $tet_startup + +# do main loop processing +for TET_ICNAME in `cat $TET_TESTS` +do + eval TET_TPLIST=\"\$$TET_ICNAME\" + TET_ICNUMBER=`echo $TET_ICNAME | tr -cd '0123456789'` + TET_TPCOUNT=`(set -- $TET_TPLIST; echo $#)` + tet_output 400 "$TET_ICNUMBER $TET_TPCOUNT `date +%H:%M:%S`" "IC Start" + TET_TPCOUNT=0 + for tet_thistest in $TET_TPLIST + do + TET_BLOCK=1 + TET_SEQUENCE=1 + TET_TPCOUNT=`expr $TET_TPCOUNT + 1` + eval TET_TPNUMBER=\`expr \$TET_TP_ADDNUM_$TET_ICNUMBER + $TET_TPCOUNT\` + tet_output 200 "$TET_TPNUMBER `date +%H:%M:%S`" "TP Start" + > $TET_TMPRES + TET_REASON="`tet_reason $tet_thistest`" + if test $? -eq 0 + then + tet_infoline "$TET_REASON" + tet_result UNINITIATED + else + TET_TRAP_FUNCTION=tet_sigskip + ( + trap $TET_DEFAULT_SIGS + unset TET_DEFAULT_SIGS + "$tet_thistest" + ) + fi + tet_tpend $TET_TPNUMBER + done + TET_TPNUMBER=0 + tet_output 410 "$TET_ICNUMBER $TET_TPCOUNT `date +%H:%M:%S`" "IC End" +done + +# do cleanup processing +TET_TRAP_FUNCTION=tet_abandon +if test -n "$tet_cleanup" +then + tet_docleanup +fi + +# successful exit +TET_EXITVAL=0 exit + -- cgit v1.2.3