X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=t%2Ftest-lib.sh;h=05f6e79560ff7e3d92c47221b3ee7adec098e676;hb=1a9366c0d48dbac3f728a1c6ff0da0fb7fd95353;hp=d3f71d1932310197219155b426687d155bf63c5b;hpb=98e031f0bb6e857c684e6db24d03d22cfc1a532a;p=git.git diff --git a/t/test-lib.sh b/t/test-lib.sh index d3f71d19..05f6e795 100755 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -5,8 +5,10 @@ # For repeatability, reset the environment to known value. LANG=C +LC_ALL=C +PAGER=cat TZ=UTC -export LANG TZ +export LANG LC_ALL PAGER TZ unset AUTHOR_DATE unset AUTHOR_EMAIL unset AUTHOR_NAME @@ -14,10 +16,11 @@ unset COMMIT_AUTHOR_EMAIL unset COMMIT_AUTHOR_NAME unset GIT_ALTERNATE_OBJECT_DIRECTORIES unset GIT_AUTHOR_DATE -unset GIT_AUTHOR_EMAIL -unset GIT_AUTHOR_NAME -unset GIT_COMMITTER_EMAIL -unset GIT_COMMITTER_NAME +GIT_AUTHOR_EMAIL=author@example.com +GIT_AUTHOR_NAME='A U Thor' +unset GIT_COMMITTER_DATE +GIT_COMMITTER_EMAIL=committer@example.com +GIT_COMMITTER_NAME='C O Mitter' unset GIT_DIFF_OPTS unset GIT_DIR unset GIT_EXTERNAL_DIFF @@ -25,6 +28,8 @@ unset GIT_INDEX_FILE unset GIT_OBJECT_DIRECTORY unset SHA1_FILE_DIRECTORIES unset SHA1_FILE_DIRECTORY +export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME +export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME # Each test should start with something like this, after copyright notices: # @@ -35,6 +40,7 @@ unset SHA1_FILE_DIRECTORY error () { echo "* error: $*" + trap - exit exit 1 } @@ -57,11 +63,14 @@ do exit 0 ;; -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) verbose=t; shift ;; + --no-python) + no_python=t; shift ;; *) break ;; esac done +exec 5>&1 if test "$verbose" = "t" then exec 4>&2 3>&1 @@ -72,6 +81,8 @@ fi test_failure=0 test_count=0 +trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit + # You are not expected to call test_ok_ and test_failure_ directly, use # the text_expect_* functions instead. @@ -84,32 +95,42 @@ test_ok_ () { test_failure_ () { test_count=$(expr "$test_count" + 1) test_failure=$(expr "$test_failure" + 1); - say "FAIL $test_count: $@" - test "$immediate" == "" || exit 1 + say "FAIL $test_count: $1" + shift + echo "$@" | sed -e 's/^/ /' + test "$immediate" = "" || { trap - exit; exit 1; } } test_debug () { - test "$debug" == "" || eval "$1" + test "$debug" = "" || eval "$1" +} + +test_run_ () { + eval >&3 2>&4 "$1" + eval_ret="$?" + return 0 } test_expect_failure () { - test "$#" == 2 || + test "$#" = 2 || error "bug in the test script: not 2 parameters to test-expect-failure" say >&3 "expecting failure: $2" - if eval >&3 2>&4 "$2" + test_run_ "$2" + if [ "$?" = 0 -a "$eval_ret" != 0 ] then - test_failure_ "$@" - else test_ok_ "$1" + else + test_failure_ "$@" fi } test_expect_success () { - test "$#" == 2 || + test "$#" = 2 || error "bug in the test script: not 2 parameters to test-expect-success" say >&3 "expecting success: $2" - if eval >&3 2>&4 "$2" + test_run_ "$2" + if [ "$?" = 0 -a "$eval_ret" = 0 ] then test_ok_ "$1" else @@ -117,9 +138,38 @@ test_expect_success () { fi } +test_expect_code () { + test "$#" = 3 || + error "bug in the test script: not 3 parameters to test-expect-code" + say >&3 "expecting exit code $1: $3" + test_run_ "$3" + if [ "$?" = 0 -a "$eval_ret" = "$1" ] + then + test_ok_ "$2" + else + test_failure_ "$@" + fi +} + +# Most tests can use the created repository, but some amy need to create more. +# Usage: test_create_repo +test_create_repo () { + test "$#" = 1 || + error "bug in the test script: not 1 parameter to test-create-repo" + owd=`pwd` + repo="$1" + mkdir "$repo" + cd "$repo" || error "Cannot setup test environment" + "$GIT_EXEC_PATH/git" init-db --template=$GIT_EXEC_PATH/templates/blt/ 2>/dev/null || + error "cannot run git init-db -- have you built things yet?" + mv .git/hooks .git/hooks-disabled + cd "$owd" +} + test_done () { + trap - exit case "$test_failure" in - 0) + 0) # We could: # cd .. && rm -fr trash # but that means we forbid any tests that use their own @@ -141,10 +191,27 @@ test_done () { # Test the binaries we have just built. The tests are kept in # t/ subdirectory and are run in trash subdirectory. PATH=$(pwd)/..:$PATH +GIT_EXEC_PATH=$(pwd)/.. +export PATH GIT_EXEC_PATH + +# Similarly use ../compat/subprocess.py if our python does not +# have subprocess.py on its own. +PYTHON=`sed -e '1{ + s/^#!// + q +}' ../git-merge-recursive` || { + error "You haven't built things yet, have you?" +} +"$PYTHON" -c 'import subprocess' 2>/dev/null || { + PYTHONPATH=$(pwd)/../compat + export PYTHONPATH +} +test -d ../templates/blt || { + error "You haven't built things yet, have you?" +} # Test repository test=trash rm -fr "$test" -mkdir "$test" +test_create_repo $test cd "$test" -git-init-db 2>/dev/null || error "cannot run git-init-db"