1*86d7f5d3SJohn Marino#!/bin/sh 2*86d7f5d3SJohn Marino# Derived from git's t/test-lib.sh, which is Copyright (c) 2005 Junio C Hamano 3*86d7f5d3SJohn Marino# 4*86d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use, 5*86d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions 6*86d7f5d3SJohn Marino# of the GNU General Public License v.2. 7*86d7f5d3SJohn Marino# 8*86d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License 9*86d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation, 10*86d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 11*86d7f5d3SJohn Marino 12*86d7f5d3SJohn Marino# For repeatability, reset the environment to known value. 13*86d7f5d3SJohn MarinoLANG=C 14*86d7f5d3SJohn MarinoLC_ALL=C 15*86d7f5d3SJohn MarinoTZ=UTC 16*86d7f5d3SJohn Marinoexport LANG LC_ALL TZ 17*86d7f5d3SJohn Marino 18*86d7f5d3SJohn Marino. ./init.sh || { echo >&2 you must run make first; exit 1; } 19*86d7f5d3SJohn Marino 20*86d7f5d3SJohn Marino# Protect ourselves from common misconfiguration to export 21*86d7f5d3SJohn Marino# CDPATH into the environment 22*86d7f5d3SJohn Marinounset CDPATH 23*86d7f5d3SJohn Marino 24*86d7f5d3SJohn Marino# Each test should start with something like this, after copyright notices: 25*86d7f5d3SJohn Marino# 26*86d7f5d3SJohn Marino# test_description='Description of this test... 27*86d7f5d3SJohn Marino# This test checks if command xyzzy does the right thing... 28*86d7f5d3SJohn Marino# ' 29*86d7f5d3SJohn Marino# . ./test-lib.sh 30*86d7f5d3SJohn Marino 31*86d7f5d3SJohn Marinoerror () { 32*86d7f5d3SJohn Marino echo "* error: $*" 33*86d7f5d3SJohn Marino exit 1 34*86d7f5d3SJohn Marino} 35*86d7f5d3SJohn Marino 36*86d7f5d3SJohn Marinosay () { 37*86d7f5d3SJohn Marino echo "* $*" 38*86d7f5d3SJohn Marino} 39*86d7f5d3SJohn Marino 40*86d7f5d3SJohn Marinothis_test_() { expr "./$0" : '.*/t-\([^/]*\)\.sh$'; } 41*86d7f5d3SJohn Marino 42*86d7f5d3SJohn Marinotest "${test_description}" != "" || 43*86d7f5d3SJohn Marinoerror "Test script did not set test_description." 44*86d7f5d3SJohn Marino 45*86d7f5d3SJohn Marinoverboselevel=0 46*86d7f5d3SJohn Marinowhile test "$#" -ne 0 47*86d7f5d3SJohn Marinodo 48*86d7f5d3SJohn Marino case "$1" in 49*86d7f5d3SJohn Marino -d|--d|--de|--deb|--debu|--debug) 50*86d7f5d3SJohn Marino debug=t ;; 51*86d7f5d3SJohn Marino -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 52*86d7f5d3SJohn Marino immediate=t ;; 53*86d7f5d3SJohn Marino -h|--h|--he|--hel|--help) 54*86d7f5d3SJohn Marino echo "$test_description" 55*86d7f5d3SJohn Marino exit 0 ;; 56*86d7f5d3SJohn Marino -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 57*86d7f5d3SJohn Marino verbose=t ;; 58*86d7f5d3SJohn Marino -vv|-vvv|-vvvv) 59*86d7f5d3SJohn Marino verboselevel=${#1} 60*86d7f5d3SJohn Marino verboselevel=$(($verboselevel - 1)) 61*86d7f5d3SJohn Marino verbose=t ;; 62*86d7f5d3SJohn Marino *) 63*86d7f5d3SJohn Marino echo "$0: unsupported option $1" 64*86d7f5d3SJohn Marino exit 0 ;; 65*86d7f5d3SJohn Marino esac 66*86d7f5d3SJohn Marino shift 67*86d7f5d3SJohn Marinodone 68*86d7f5d3SJohn Marino 69*86d7f5d3SJohn Marinoexec 5>&1 70*86d7f5d3SJohn Marinoif test "$verbose" = "t" 71*86d7f5d3SJohn Marinothen 72*86d7f5d3SJohn Marino exec 4>&2 3>&1 73*86d7f5d3SJohn Marinoelse 74*86d7f5d3SJohn Marino exec 4>/dev/null 3>/dev/null 75*86d7f5d3SJohn Marinofi 76*86d7f5d3SJohn Marino 77*86d7f5d3SJohn Marinotest_failure=0 78*86d7f5d3SJohn Marinotest_count=0 79*86d7f5d3SJohn Marino 80*86d7f5d3SJohn Marinotrap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit 81*86d7f5d3SJohn Marino 82*86d7f5d3SJohn Marino# You are not expected to call test_ok_ and test_failure_ directly, use 83*86d7f5d3SJohn Marino# the text_expect_* functions instead. 84*86d7f5d3SJohn Marino 85*86d7f5d3SJohn Marinotest_ok_ () { 86*86d7f5d3SJohn Marino test_count=$(expr "$test_count" + 1) 87*86d7f5d3SJohn Marino say " ok $test_count: $@" 88*86d7f5d3SJohn Marino} 89*86d7f5d3SJohn Marino 90*86d7f5d3SJohn Marinotest_failure_ () { 91*86d7f5d3SJohn Marino test_count=$(expr "$test_count" + 1) 92*86d7f5d3SJohn Marino test_failure=$(expr "$test_failure" + 1); 93*86d7f5d3SJohn Marino say "FAIL $test_count: $1" 94*86d7f5d3SJohn Marino shift 95*86d7f5d3SJohn Marino echo "$@" | sed -e 's/^/ /' 96*86d7f5d3SJohn Marino test "$immediate" = "" || exit 1 97*86d7f5d3SJohn Marino} 98*86d7f5d3SJohn Marino 99*86d7f5d3SJohn Marinotest_debug () { 100*86d7f5d3SJohn Marino test "$debug" = "" || eval "$1" 101*86d7f5d3SJohn Marino} 102*86d7f5d3SJohn Marino 103*86d7f5d3SJohn Marinotest_run_ () { 104*86d7f5d3SJohn Marino eval >&3 2>&4 "$1" 105*86d7f5d3SJohn Marino eval_ret="$?" 106*86d7f5d3SJohn Marino return 0 107*86d7f5d3SJohn Marino} 108*86d7f5d3SJohn Marino 109*86d7f5d3SJohn Marinotest_skip () { 110*86d7f5d3SJohn Marino this_test=$(this_test_) 111*86d7f5d3SJohn Marino this_test="$this_test.$(expr "$test_count" + 1)" 112*86d7f5d3SJohn Marino to_skip= 113*86d7f5d3SJohn Marino for skp in $SKIP_TESTS 114*86d7f5d3SJohn Marino do 115*86d7f5d3SJohn Marino case "$this_test" in 116*86d7f5d3SJohn Marino $skp) 117*86d7f5d3SJohn Marino to_skip=t 118*86d7f5d3SJohn Marino esac 119*86d7f5d3SJohn Marino done 120*86d7f5d3SJohn Marino case "$to_skip" in 121*86d7f5d3SJohn Marino t) 122*86d7f5d3SJohn Marino say >&3 "skipping test: $@" 123*86d7f5d3SJohn Marino test_count=$(expr "$test_count" + 1) 124*86d7f5d3SJohn Marino say "skip $test_count: $1" 125*86d7f5d3SJohn Marino : true 126*86d7f5d3SJohn Marino ;; 127*86d7f5d3SJohn Marino *) 128*86d7f5d3SJohn Marino false 129*86d7f5d3SJohn Marino ;; 130*86d7f5d3SJohn Marino esac 131*86d7f5d3SJohn Marino} 132*86d7f5d3SJohn Marino 133*86d7f5d3SJohn Marinotest_expect_failure () { 134*86d7f5d3SJohn Marino test "$#" = 2 || 135*86d7f5d3SJohn Marino error "bug in the test script: not 2 parameters to test-expect-failure" 136*86d7f5d3SJohn Marino if ! test_skip "$@" 137*86d7f5d3SJohn Marino then 138*86d7f5d3SJohn Marino say >&3 "expecting failure: $2" 139*86d7f5d3SJohn Marino test_run_ "$2" 140*86d7f5d3SJohn Marino if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ] 141*86d7f5d3SJohn Marino then 142*86d7f5d3SJohn Marino test_ok_ "$1" 143*86d7f5d3SJohn Marino else 144*86d7f5d3SJohn Marino test_failure_ "$@" 145*86d7f5d3SJohn Marino fi 146*86d7f5d3SJohn Marino fi 147*86d7f5d3SJohn Marino echo >&3 "" 148*86d7f5d3SJohn Marino} 149*86d7f5d3SJohn Marino 150*86d7f5d3SJohn Marinotest_expect_success () { 151*86d7f5d3SJohn Marino test "$#" = 2 || 152*86d7f5d3SJohn Marino error "bug in the test script: not 2 parameters to test-expect-success" 153*86d7f5d3SJohn Marino if ! test_skip "$@" 154*86d7f5d3SJohn Marino then 155*86d7f5d3SJohn Marino say >&3 "expecting success: $2" 156*86d7f5d3SJohn Marino test_run_ "$2" 157*86d7f5d3SJohn Marino if [ "$?" = 0 -a "$eval_ret" = 0 ] 158*86d7f5d3SJohn Marino then 159*86d7f5d3SJohn Marino test_ok_ "$1" 160*86d7f5d3SJohn Marino else 161*86d7f5d3SJohn Marino test_failure_ "$@" 162*86d7f5d3SJohn Marino fi 163*86d7f5d3SJohn Marino fi 164*86d7f5d3SJohn Marino echo >&3 "" 165*86d7f5d3SJohn Marino} 166*86d7f5d3SJohn Marino 167*86d7f5d3SJohn Marinotest_expect_code () { 168*86d7f5d3SJohn Marino test "$#" = 3 || 169*86d7f5d3SJohn Marino error "bug in the test script: not 3 parameters to test-expect-code" 170*86d7f5d3SJohn Marino if ! test_skip "$@" 171*86d7f5d3SJohn Marino then 172*86d7f5d3SJohn Marino say >&3 "expecting exit code $1: $3" 173*86d7f5d3SJohn Marino test_run_ "$3" 174*86d7f5d3SJohn Marino if [ "$?" = 0 -a "$eval_ret" = "$1" ] 175*86d7f5d3SJohn Marino then 176*86d7f5d3SJohn Marino test_ok_ "$2" 177*86d7f5d3SJohn Marino else 178*86d7f5d3SJohn Marino test_failure_ "$@" 179*86d7f5d3SJohn Marino fi 180*86d7f5d3SJohn Marino fi 181*86d7f5d3SJohn Marino echo >&3 "" 182*86d7f5d3SJohn Marino} 183*86d7f5d3SJohn Marino 184*86d7f5d3SJohn Marinotest_done () { 185*86d7f5d3SJohn Marino case "$test_failure" in 186*86d7f5d3SJohn Marino 0) 187*86d7f5d3SJohn Marino # We could: 188*86d7f5d3SJohn Marino # cd .. && rm -fr trash 189*86d7f5d3SJohn Marino # but that means we forbid any tests that use their own 190*86d7f5d3SJohn Marino # subdirectory from calling test_done without coming back 191*86d7f5d3SJohn Marino # to where they started from. 192*86d7f5d3SJohn Marino # The Makefile provided will clean this test area so 193*86d7f5d3SJohn Marino # we will leave things as they are. 194*86d7f5d3SJohn Marino 195*86d7f5d3SJohn Marino say "passed all $test_count test(s)" 196*86d7f5d3SJohn Marino exit 0 ;; 197*86d7f5d3SJohn Marino 198*86d7f5d3SJohn Marino *) 199*86d7f5d3SJohn Marino say "failed $test_failure among $test_count test(s)" 200*86d7f5d3SJohn Marino exit 1 ;; 201*86d7f5d3SJohn Marino 202*86d7f5d3SJohn Marino esac 203*86d7f5d3SJohn Marino} 204*86d7f5d3SJohn Marino 205*86d7f5d3SJohn Marinothis_test=$(this_test_) 206*86d7f5d3SJohn Marino 207*86d7f5d3SJohn Marinoskip_=0 208*86d7f5d3SJohn Marino# If $privileges_required_ is nonempty, non-root skips this test. 209*86d7f5d3SJohn Marinoif test "$privileges_required_" != ''; then 210*86d7f5d3SJohn Marino uid=`id -u` || error 'failed to run "id -u"' 211*86d7f5d3SJohn Marino if test "$uid" != 0; then 212*86d7f5d3SJohn Marino SKIP_TESTS="$SKIP_TESTS $this_test" 213*86d7f5d3SJohn Marino say "you have insufficient privileges for test $this_test" 214*86d7f5d3SJohn Marino skip_=1 215*86d7f5d3SJohn Marino fi 216*86d7f5d3SJohn Marinofi 217*86d7f5d3SJohn Marino 218*86d7f5d3SJohn Marinopwd_=`pwd` 219*86d7f5d3SJohn Marino 220*86d7f5d3SJohn Marinotest_dir_=${LVM_TEST_DIR-.} 221*86d7f5d3SJohn Marinotest "$test_dir_" = . && test_dir_=$pwd_ 222*86d7f5d3SJohn Marino 223*86d7f5d3SJohn Marino# This is a stub function that is run upon trap (upon regular exit and 224*86d7f5d3SJohn Marino# interrupt). Override it with a per-test function, e.g., to unmount 225*86d7f5d3SJohn Marino# a partition, or to undo any other global state changes. 226*86d7f5d3SJohn Marinocleanup_() { :; } 227*86d7f5d3SJohn Marino 228*86d7f5d3SJohn Marinofor skp in $SKIP_TESTS 229*86d7f5d3SJohn Marinodo 230*86d7f5d3SJohn Marino to_skip= 231*86d7f5d3SJohn Marino for skp in $SKIP_TESTS 232*86d7f5d3SJohn Marino do 233*86d7f5d3SJohn Marino case "$this_test" in 234*86d7f5d3SJohn Marino $skp) 235*86d7f5d3SJohn Marino to_skip=t 236*86d7f5d3SJohn Marino esac 237*86d7f5d3SJohn Marino done 238*86d7f5d3SJohn Marino case "$to_skip" in 239*86d7f5d3SJohn Marino t) 240*86d7f5d3SJohn Marino say >&3 "skipping test $this_test altogether" 241*86d7f5d3SJohn Marino say "skip all tests in $this_test" 242*86d7f5d3SJohn Marino trap - exit 243*86d7f5d3SJohn Marino test_done 244*86d7f5d3SJohn Marino esac 245*86d7f5d3SJohn Marinodone 246*86d7f5d3SJohn Marino 247*86d7f5d3SJohn Marinotest_dir_rand_=$($abs_srcdir/mkdtemp $test_dir_ lvm-$this_test.XXXXXXXXXX) \ 248*86d7f5d3SJohn Marino || error "failed to create temporary directory in $test_dir_" 249*86d7f5d3SJohn Marino 250*86d7f5d3SJohn Marinotestlib_cleanup_() { 251*86d7f5d3SJohn Marino d="$test_dir_rand_"; 252*86d7f5d3SJohn Marino cd "$test_dir_" && chmod -R u+rwx "$d" && rm -rf "$d" 253*86d7f5d3SJohn Marino} 254*86d7f5d3SJohn Marino 255*86d7f5d3SJohn Marino# Run each test from within a temporary sub-directory named after the 256*86d7f5d3SJohn Marino# test itself, and arrange to remove it upon exception or normal exit. 257*86d7f5d3SJohn Marinotrap 'st=$?; cleanup_; testlib_cleanup_; exit $st' 0 258*86d7f5d3SJohn Marinotrap '(exit $?); exit $?' 1 2 13 15 259*86d7f5d3SJohn Marino 260*86d7f5d3SJohn Marinocd $test_dir_rand_ || error "failed to cd to $test_dir_rand_" 261*86d7f5d3SJohn Marino 262*86d7f5d3SJohn Marinoif test $skip_ = 0; then 263*86d7f5d3SJohn Marino . $abs_srcdir/lvm-utils.sh || exit 1 264*86d7f5d3SJohn Marinofi 265*86d7f5d3SJohn Marino 266*86d7f5d3SJohn Marinoif ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then 267*86d7f5d3SJohn Marino compare='diff -u' 268*86d7f5d3SJohn Marinoelif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then 269*86d7f5d3SJohn Marino compare='cmp -s' 270*86d7f5d3SJohn Marinoelse 271*86d7f5d3SJohn Marino compare=cmp 272*86d7f5d3SJohn Marinofi 273