186d7f5d3SJohn Marino#!/bin/sh 286d7f5d3SJohn Marino# Derived from git's t/test-lib.sh, which is Copyright (c) 2005 Junio C Hamano 386d7f5d3SJohn Marino# 486d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use, 586d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions 686d7f5d3SJohn Marino# of the GNU General Public License v.2. 786d7f5d3SJohn Marino# 886d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License 986d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation, 1086d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1186d7f5d3SJohn Marino 1286d7f5d3SJohn Marino# For repeatability, reset the environment to known value. 1386d7f5d3SJohn MarinoLANG=C 1486d7f5d3SJohn MarinoLC_ALL=C 1586d7f5d3SJohn MarinoTZ=UTC 1686d7f5d3SJohn Marinoexport LANG LC_ALL TZ 1786d7f5d3SJohn Marino 1886d7f5d3SJohn Marino. ./init.sh || { echo >&2 you must run make first; exit 1; } 1986d7f5d3SJohn Marino 2086d7f5d3SJohn Marino# Protect ourselves from common misconfiguration to export 2186d7f5d3SJohn Marino# CDPATH into the environment 2286d7f5d3SJohn Marinounset CDPATH 2386d7f5d3SJohn Marino 2486d7f5d3SJohn Marino# Each test should start with something like this, after copyright notices: 2586d7f5d3SJohn Marino# 2686d7f5d3SJohn Marino# test_description='Description of this test... 2786d7f5d3SJohn Marino# This test checks if command xyzzy does the right thing... 2886d7f5d3SJohn Marino# ' 2986d7f5d3SJohn Marino# . ./test-lib.sh 3086d7f5d3SJohn Marino 3186d7f5d3SJohn Marinoerror () { 3286d7f5d3SJohn Marino echo "* error: $*" 3386d7f5d3SJohn Marino exit 1 3486d7f5d3SJohn Marino} 3586d7f5d3SJohn Marino 3686d7f5d3SJohn Marinosay () { 3786d7f5d3SJohn Marino echo "* $*" 3886d7f5d3SJohn Marino} 3986d7f5d3SJohn Marino 4086d7f5d3SJohn Marinothis_test_() { expr "./$0" : '.*/t-\([^/]*\)\.sh$'; } 4186d7f5d3SJohn Marino 4286d7f5d3SJohn Marinotest "${test_description}" != "" || 4386d7f5d3SJohn Marinoerror "Test script did not set test_description." 4486d7f5d3SJohn Marino 4586d7f5d3SJohn Marinoverboselevel=0 4686d7f5d3SJohn Marinowhile test "$#" -ne 0 4786d7f5d3SJohn Marinodo 4886d7f5d3SJohn Marino case "$1" in 4986d7f5d3SJohn Marino -d|--d|--de|--deb|--debu|--debug) 5086d7f5d3SJohn Marino debug=t ;; 5186d7f5d3SJohn Marino -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 5286d7f5d3SJohn Marino immediate=t ;; 5386d7f5d3SJohn Marino -h|--h|--he|--hel|--help) 5486d7f5d3SJohn Marino echo "$test_description" 5586d7f5d3SJohn Marino exit 0 ;; 5686d7f5d3SJohn Marino -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 5786d7f5d3SJohn Marino verbose=t ;; 5886d7f5d3SJohn Marino -vv|-vvv|-vvvv) 5986d7f5d3SJohn Marino verboselevel=${#1} 6086d7f5d3SJohn Marino verboselevel=$(($verboselevel - 1)) 6186d7f5d3SJohn Marino verbose=t ;; 6286d7f5d3SJohn Marino *) 6386d7f5d3SJohn Marino echo "$0: unsupported option $1" 6486d7f5d3SJohn Marino exit 0 ;; 6586d7f5d3SJohn Marino esac 6686d7f5d3SJohn Marino shift 6786d7f5d3SJohn Marinodone 6886d7f5d3SJohn Marino 6986d7f5d3SJohn Marinoexec 5>&1 7086d7f5d3SJohn Marinoif test "$verbose" = "t" 7186d7f5d3SJohn Marinothen 7286d7f5d3SJohn Marino exec 4>&2 3>&1 7386d7f5d3SJohn Marinoelse 7486d7f5d3SJohn Marino exec 4>/dev/null 3>/dev/null 7586d7f5d3SJohn Marinofi 7686d7f5d3SJohn Marino 7786d7f5d3SJohn Marinotest_failure=0 7886d7f5d3SJohn Marinotest_count=0 7986d7f5d3SJohn Marino 8086d7f5d3SJohn Marinotrap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit 8186d7f5d3SJohn Marino 8286d7f5d3SJohn Marino# You are not expected to call test_ok_ and test_failure_ directly, use 8386d7f5d3SJohn Marino# the text_expect_* functions instead. 8486d7f5d3SJohn Marino 8586d7f5d3SJohn Marinotest_ok_ () { 8686d7f5d3SJohn Marino test_count=$(expr "$test_count" + 1) 8786d7f5d3SJohn Marino say " ok $test_count: $@" 8886d7f5d3SJohn Marino} 8986d7f5d3SJohn Marino 9086d7f5d3SJohn Marinotest_failure_ () { 9186d7f5d3SJohn Marino test_count=$(expr "$test_count" + 1) 9286d7f5d3SJohn Marino test_failure=$(expr "$test_failure" + 1); 9386d7f5d3SJohn Marino say "FAIL $test_count: $1" 9486d7f5d3SJohn Marino shift 9586d7f5d3SJohn Marino echo "$@" | sed -e 's/^/ /' 9686d7f5d3SJohn Marino test "$immediate" = "" || exit 1 9786d7f5d3SJohn Marino} 9886d7f5d3SJohn Marino 9986d7f5d3SJohn Marinotest_debug () { 10086d7f5d3SJohn Marino test "$debug" = "" || eval "$1" 10186d7f5d3SJohn Marino} 10286d7f5d3SJohn Marino 10386d7f5d3SJohn Marinotest_run_ () { 10486d7f5d3SJohn Marino eval >&3 2>&4 "$1" 10586d7f5d3SJohn Marino eval_ret="$?" 10686d7f5d3SJohn Marino return 0 10786d7f5d3SJohn Marino} 10886d7f5d3SJohn Marino 10986d7f5d3SJohn Marinotest_skip () { 11086d7f5d3SJohn Marino this_test=$(this_test_) 11186d7f5d3SJohn Marino this_test="$this_test.$(expr "$test_count" + 1)" 11286d7f5d3SJohn Marino to_skip= 11386d7f5d3SJohn Marino for skp in $SKIP_TESTS 11486d7f5d3SJohn Marino do 11586d7f5d3SJohn Marino case "$this_test" in 11686d7f5d3SJohn Marino $skp) 11786d7f5d3SJohn Marino to_skip=t 11886d7f5d3SJohn Marino esac 11986d7f5d3SJohn Marino done 12086d7f5d3SJohn Marino case "$to_skip" in 12186d7f5d3SJohn Marino t) 12286d7f5d3SJohn Marino say >&3 "skipping test: $@" 12386d7f5d3SJohn Marino test_count=$(expr "$test_count" + 1) 12486d7f5d3SJohn Marino say "skip $test_count: $1" 12586d7f5d3SJohn Marino : true 12686d7f5d3SJohn Marino ;; 12786d7f5d3SJohn Marino *) 12886d7f5d3SJohn Marino false 12986d7f5d3SJohn Marino ;; 13086d7f5d3SJohn Marino esac 13186d7f5d3SJohn Marino} 13286d7f5d3SJohn Marino 13386d7f5d3SJohn Marinotest_expect_failure () { 13486d7f5d3SJohn Marino test "$#" = 2 || 13586d7f5d3SJohn Marino error "bug in the test script: not 2 parameters to test-expect-failure" 13686d7f5d3SJohn Marino if ! test_skip "$@" 13786d7f5d3SJohn Marino then 13886d7f5d3SJohn Marino say >&3 "expecting failure: $2" 13986d7f5d3SJohn Marino test_run_ "$2" 14086d7f5d3SJohn Marino if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ] 14186d7f5d3SJohn Marino then 14286d7f5d3SJohn Marino test_ok_ "$1" 14386d7f5d3SJohn Marino else 14486d7f5d3SJohn Marino test_failure_ "$@" 14586d7f5d3SJohn Marino fi 14686d7f5d3SJohn Marino fi 14786d7f5d3SJohn Marino echo >&3 "" 14886d7f5d3SJohn Marino} 14986d7f5d3SJohn Marino 15086d7f5d3SJohn Marinotest_expect_success () { 15186d7f5d3SJohn Marino test "$#" = 2 || 15286d7f5d3SJohn Marino error "bug in the test script: not 2 parameters to test-expect-success" 15386d7f5d3SJohn Marino if ! test_skip "$@" 15486d7f5d3SJohn Marino then 15586d7f5d3SJohn Marino say >&3 "expecting success: $2" 15686d7f5d3SJohn Marino test_run_ "$2" 15786d7f5d3SJohn Marino if [ "$?" = 0 -a "$eval_ret" = 0 ] 15886d7f5d3SJohn Marino then 15986d7f5d3SJohn Marino test_ok_ "$1" 16086d7f5d3SJohn Marino else 16186d7f5d3SJohn Marino test_failure_ "$@" 16286d7f5d3SJohn Marino fi 16386d7f5d3SJohn Marino fi 16486d7f5d3SJohn Marino echo >&3 "" 16586d7f5d3SJohn Marino} 16686d7f5d3SJohn Marino 16786d7f5d3SJohn Marinotest_expect_code () { 16886d7f5d3SJohn Marino test "$#" = 3 || 16986d7f5d3SJohn Marino error "bug in the test script: not 3 parameters to test-expect-code" 17086d7f5d3SJohn Marino if ! test_skip "$@" 17186d7f5d3SJohn Marino then 17286d7f5d3SJohn Marino say >&3 "expecting exit code $1: $3" 17386d7f5d3SJohn Marino test_run_ "$3" 17486d7f5d3SJohn Marino if [ "$?" = 0 -a "$eval_ret" = "$1" ] 17586d7f5d3SJohn Marino then 17686d7f5d3SJohn Marino test_ok_ "$2" 17786d7f5d3SJohn Marino else 17886d7f5d3SJohn Marino test_failure_ "$@" 17986d7f5d3SJohn Marino fi 18086d7f5d3SJohn Marino fi 18186d7f5d3SJohn Marino echo >&3 "" 18286d7f5d3SJohn Marino} 18386d7f5d3SJohn Marino 18486d7f5d3SJohn Marinotest_done () { 18586d7f5d3SJohn Marino case "$test_failure" in 18686d7f5d3SJohn Marino 0) 18786d7f5d3SJohn Marino # We could: 18886d7f5d3SJohn Marino # cd .. && rm -fr trash 18986d7f5d3SJohn Marino # but that means we forbid any tests that use their own 19086d7f5d3SJohn Marino # subdirectory from calling test_done without coming back 19186d7f5d3SJohn Marino # to where they started from. 19286d7f5d3SJohn Marino # The Makefile provided will clean this test area so 19386d7f5d3SJohn Marino # we will leave things as they are. 19486d7f5d3SJohn Marino 19586d7f5d3SJohn Marino say "passed all $test_count test(s)" 19686d7f5d3SJohn Marino exit 0 ;; 19786d7f5d3SJohn Marino 19886d7f5d3SJohn Marino *) 19986d7f5d3SJohn Marino say "failed $test_failure among $test_count test(s)" 20086d7f5d3SJohn Marino exit 1 ;; 20186d7f5d3SJohn Marino 20286d7f5d3SJohn Marino esac 20386d7f5d3SJohn Marino} 20486d7f5d3SJohn Marino 20586d7f5d3SJohn Marinothis_test=$(this_test_) 20686d7f5d3SJohn Marino 20786d7f5d3SJohn Marinoskip_=0 20886d7f5d3SJohn Marino# If $privileges_required_ is nonempty, non-root skips this test. 20986d7f5d3SJohn Marinoif test "$privileges_required_" != ''; then 21086d7f5d3SJohn Marino uid=`id -u` || error 'failed to run "id -u"' 21186d7f5d3SJohn Marino if test "$uid" != 0; then 21286d7f5d3SJohn Marino SKIP_TESTS="$SKIP_TESTS $this_test" 21386d7f5d3SJohn Marino say "you have insufficient privileges for test $this_test" 21486d7f5d3SJohn Marino skip_=1 21586d7f5d3SJohn Marino fi 21686d7f5d3SJohn Marinofi 21786d7f5d3SJohn Marino 21886d7f5d3SJohn Marinopwd_=`pwd` 21986d7f5d3SJohn Marino 22086d7f5d3SJohn Marinotest_dir_=${LVM_TEST_DIR-.} 22186d7f5d3SJohn Marinotest "$test_dir_" = . && test_dir_=$pwd_ 22286d7f5d3SJohn Marino 22386d7f5d3SJohn Marino# This is a stub function that is run upon trap (upon regular exit and 22486d7f5d3SJohn Marino# interrupt). Override it with a per-test function, e.g., to unmount 22586d7f5d3SJohn Marino# a partition, or to undo any other global state changes. 22686d7f5d3SJohn Marinocleanup_() { :; } 22786d7f5d3SJohn Marino 22886d7f5d3SJohn Marinofor skp in $SKIP_TESTS 22986d7f5d3SJohn Marinodo 23086d7f5d3SJohn Marino to_skip= 23186d7f5d3SJohn Marino for skp in $SKIP_TESTS 23286d7f5d3SJohn Marino do 23386d7f5d3SJohn Marino case "$this_test" in 23486d7f5d3SJohn Marino $skp) 23586d7f5d3SJohn Marino to_skip=t 23686d7f5d3SJohn Marino esac 23786d7f5d3SJohn Marino done 23886d7f5d3SJohn Marino case "$to_skip" in 23986d7f5d3SJohn Marino t) 24086d7f5d3SJohn Marino say >&3 "skipping test $this_test altogether" 24186d7f5d3SJohn Marino say "skip all tests in $this_test" 24286d7f5d3SJohn Marino trap - exit 24386d7f5d3SJohn Marino test_done 24486d7f5d3SJohn Marino esac 24586d7f5d3SJohn Marinodone 24686d7f5d3SJohn Marino 24786d7f5d3SJohn Marinotest_dir_rand_=$($abs_srcdir/mkdtemp $test_dir_ lvm-$this_test.XXXXXXXXXX) \ 24886d7f5d3SJohn Marino || error "failed to create temporary directory in $test_dir_" 24986d7f5d3SJohn Marino 25086d7f5d3SJohn Marinotestlib_cleanup_() { 25186d7f5d3SJohn Marino d="$test_dir_rand_"; 25286d7f5d3SJohn Marino cd "$test_dir_" && chmod -R u+rwx "$d" && rm -rf "$d" 25386d7f5d3SJohn Marino} 25486d7f5d3SJohn Marino 25586d7f5d3SJohn Marino# Run each test from within a temporary sub-directory named after the 25686d7f5d3SJohn Marino# test itself, and arrange to remove it upon exception or normal exit. 25786d7f5d3SJohn Marinotrap 'st=$?; cleanup_; testlib_cleanup_; exit $st' 0 25886d7f5d3SJohn Marinotrap '(exit $?); exit $?' 1 2 13 15 25986d7f5d3SJohn Marino 26086d7f5d3SJohn Marinocd $test_dir_rand_ || error "failed to cd to $test_dir_rand_" 26186d7f5d3SJohn Marino 26286d7f5d3SJohn Marinoif test $skip_ = 0; then 26386d7f5d3SJohn Marino . $abs_srcdir/lvm-utils.sh || exit 1 26486d7f5d3SJohn Marinofi 26586d7f5d3SJohn Marino 26686d7f5d3SJohn Marinoif ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then 26786d7f5d3SJohn Marino compare='diff -u' 26886d7f5d3SJohn Marinoelif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then 26986d7f5d3SJohn Marino compare='cmp -s' 27086d7f5d3SJohn Marinoelse 27186d7f5d3SJohn Marino compare=cmp 27286d7f5d3SJohn Marinofi 273