diff options
Diffstat (limited to 'tools/regression/usr.bin/make/common.sh')
-rw-r--r-- | tools/regression/usr.bin/make/common.sh | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/tools/regression/usr.bin/make/common.sh b/tools/regression/usr.bin/make/common.sh new file mode 100644 index 0000000..4bd9f7f --- /dev/null +++ b/tools/regression/usr.bin/make/common.sh @@ -0,0 +1,276 @@ +#!/bin/sh +# +# Common code used run regression tests for usr.bin/make. +# +# $FreeBSD$ + +# +# Output usage messsage. +# +print_usage() +{ + echo "Usage: $0 command" + echo " clean - remove temp files (get initial state)" + echo " compare - compare result of test to expected" + echo " desc - print description of test" + echo " diff - print diffs between results and expected" + echo " harness - produce output suiteable for Test::Harness" + echo " run - run the {test, compare, clean}" + echo " test - run test case" + echo " update - update the expected with current results" +} + +# +# Check if the test result is the same as the expected result. +# +# $1 Input file +# +hack_cmp() +{ + local EXPECTED RESULT + EXPECTED="expected.$1" + RESULT=${WORK_DIR}/$1 + + if [ -f $EXPECTED ]; then + diff -q $EXPECTED $RESULT 1> /dev/null 2> /dev/null + return $? + else + return 1 # FAIL + fi +} + +# +# Check if the test result is the same as the expected result. +# +# $1 Input file +# +hack_diff() +{ + local EXPECTED RESULT + EXPECTED="expected.$1" + RESULT=${WORK_DIR}/$1 + + echo diff -u $EXPECTED $RESULT + if [ -f $EXPECTED ]; then + diff -u $EXPECTED $RESULT + return $? + else + return 1 # FAIL + fi +} + +# +# Default setup_test() function. +# +# The default function just does nothing. +# +# Both the variables SRC_BASE WORK_BASE are available. +# +setup_test() +{ +} + +# +# Default run_test() function. It can be replace by the +# user specified regression test. +# +# Both the variables SRC_BASE WORK_BASE are available. +# +# Note: this function executes from a subshell. +# +run_test() +{ + cd ${WORK_DIR} + $MAKE_PROG 1> stdout 2> stderr + echo $? > status +} + +# +# Default clean routine +# +clean_test() +{ +} + +# +# Clean working directory +# +eval_clean() +{ + rm -f ${WORK_DIR}/stdout + rm -f ${WORK_DIR}/stderr + rm -f ${WORK_DIR}/status + clean_test +} + +# +# Compare results with expected results +# +eval_compare() +{ + hack_cmp stdout || FAIL="stdout $FAIL" + hack_cmp stderr || FAIL="stderr $FAIL" + hack_cmp status || FAIL="status $FAIL" + + if [ ! -z "$FAIL" ]; then + FAIL=`echo $FAIL` + echo "$SUBDIR: Test failed {$FAIL}" + fi +} + +# +# Compare results with expected results for prove(1) +# +eval_hcompare() +{ + FAIL= + hack_cmp stdout || FAIL="stdout $FAIL" + hack_cmp stderr || FAIL="stderr $FAIL" + hack_cmp status || FAIL="status $FAIL" + + if [ ! -z "$FAIL" ]; then + FAIL=`echo $FAIL` + echo "not ok 1 $SUBDIR # reason: {$FAIL}" + else + echo "ok 1 $SUBDIR" + fi +} + +# +# Print description +# +eval_desc() +{ + echo -n "$SUBDIR: " + desc_test +} + +# +# Prepare and run the test +# +eval_test() +{ + [ -d ${WORK_DIR} ] || mkdir -p ${WORK_DIR} + if [ -f Makefile ] ; then + cp Makefile ${WORK_DIR} + fi + setup_test + ( run_test ) +} + +# +# Diff current and expected results +# +eval_diff() +{ + eval_test + echo "------------------------" + echo "- $SUBDIR" + echo "------------------------" + hack_diff stdout + hack_diff stderr + hack_diff status +} + +# +# Run the test for prove(1) +# +eval_harness() +{ + echo 1..1 + eval_test + eval_hcompare + eval_clean +} + +# +# Run the test +# +eval_run() +{ + eval_test + eval_compare + eval_clean +} + +# +# Update expected results +# +eval_update() +{ + eval_test + cat ${WORK_DIR}/stdout > expected.stdout + cat ${WORK_DIR}/stderr > expected.stderr + cat ${WORK_DIR}/status > expected.status +} + +# +# Note: Uses global variable $DIR which might be assigned by +# the script which sourced this file. +# +eval_cmd() +{ + if [ $# -eq 0 ] ; then + set -- harness + fi + + case $1 in + clean|compare|hcompare|desc|diff|harness|run|test|update) + eval eval_$1 + ;; + *) + print_usage + ;; + esac +} + +# +# Parse command line arguments. +# +args=`getopt m:w:v $*` +if [ $? != 0 ]; then + echo 'Usage: ...' + exit 2 +fi +set -- $args +for i; do + case "$i" in + -m) + MAKE_PROG="$2" + shift + shift + ;; + -w) + WORK_BASE="$2" + shift + shift + ;; + -v) + VERBOSE=1 + shift + ;; + --) + shift + break + ;; + esac +done + +# +# Determine our sub-directory. Argh. +# +SRC_DIR=`pwd` +SRC_BASE=`while [ ! -f common.sh ] ; do cd .. ; done ; pwd` +SUBDIR=`echo ${SRC_DIR} | sed "s@${SRC_BASE}/@@"` + +WORK_BASE=${WORK_BASE:-"/tmp/$USER.make.test"} +WORK_DIR=${WORK_BASE}/${SUBDIR} +MAKE_PROG=${MAKE_PROG:-/usr/bin/make} + +export MAKE_PROG +export VERBOSE +export SRC_BASE +export WORK_BASE +export SUBDIR +export SRC_DIR +export WORK_DIR |