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