t / test-lib.shon commit Merge git://git.kernel.org/pub/scm/gitk/gitk (0f2ca9d)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5
   6# For repeatability, reset the environment to known value.
   7LANG=C
   8LC_ALL=C
   9PAGER=cat
  10TZ=UTC
  11export LANG LC_ALL PAGER TZ
  12EDITOR=:
  13VISUAL=:
  14unset AUTHOR_DATE
  15unset AUTHOR_EMAIL
  16unset AUTHOR_NAME
  17unset COMMIT_AUTHOR_EMAIL
  18unset COMMIT_AUTHOR_NAME
  19unset GIT_ALTERNATE_OBJECT_DIRECTORIES
  20unset GIT_AUTHOR_DATE
  21GIT_AUTHOR_EMAIL=author@example.com
  22GIT_AUTHOR_NAME='A U Thor'
  23unset GIT_COMMITTER_DATE
  24GIT_COMMITTER_EMAIL=committer@example.com
  25GIT_COMMITTER_NAME='C O Mitter'
  26unset GIT_DIFF_OPTS
  27unset GIT_DIR
  28unset GIT_EXTERNAL_DIFF
  29unset GIT_INDEX_FILE
  30unset GIT_OBJECT_DIRECTORY
  31unset GIT_TRACE
  32unset SHA1_FILE_DIRECTORIES
  33unset SHA1_FILE_DIRECTORY
  34export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
  35export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
  36export EDITOR VISUAL
  37
  38# Each test should start with something like this, after copyright notices:
  39#
  40# test_description='Description of this test...
  41# This test checks if command xyzzy does the right thing...
  42# '
  43# . ./test-lib.sh
  44
  45error () {
  46        echo "* error: $*"
  47        trap - exit
  48        exit 1
  49}
  50
  51say () {
  52        echo "* $*"
  53}
  54
  55test "${test_description}" != "" ||
  56error "Test script did not set test_description."
  57
  58while test "$#" -ne 0
  59do
  60        case "$1" in
  61        -d|--d|--de|--deb|--debu|--debug)
  62                debug=t; shift ;;
  63        -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
  64                immediate=t; shift ;;
  65        -h|--h|--he|--hel|--help)
  66                echo "$test_description"
  67                exit 0 ;;
  68        -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
  69                verbose=t; shift ;;
  70        --no-python)
  71                no_python=t; shift ;;
  72        *)
  73                break ;;
  74        esac
  75done
  76
  77exec 5>&1
  78if test "$verbose" = "t"
  79then
  80        exec 4>&2 3>&1
  81else
  82        exec 4>/dev/null 3>/dev/null
  83fi
  84
  85test_failure=0
  86test_count=0
  87
  88trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit
  89
  90
  91# You are not expected to call test_ok_ and test_failure_ directly, use
  92# the text_expect_* functions instead.
  93
  94test_ok_ () {
  95        test_count=$(expr "$test_count" + 1)
  96        say "  ok $test_count: $@"
  97}
  98
  99test_failure_ () {
 100        test_count=$(expr "$test_count" + 1)
 101        test_failure=$(expr "$test_failure" + 1);
 102        say "FAIL $test_count: $1"
 103        shift
 104        echo "$@" | sed -e 's/^/        /'
 105        test "$immediate" = "" || { trap - exit; exit 1; }
 106}
 107
 108
 109test_debug () {
 110        test "$debug" = "" || eval "$1"
 111}
 112
 113test_run_ () {
 114        eval >&3 2>&4 "$1"
 115        eval_ret="$?"
 116        return 0
 117}
 118
 119test_expect_failure () {
 120        test "$#" = 2 ||
 121        error "bug in the test script: not 2 parameters to test-expect-failure"
 122        say >&3 "expecting failure: $2"
 123        test_run_ "$2"
 124        if [ "$?" = 0 -a "$eval_ret" != 0 ]
 125        then
 126                test_ok_ "$1"
 127        else
 128                test_failure_ "$@"
 129        fi
 130}
 131
 132test_expect_success () {
 133        test "$#" = 2 ||
 134        error "bug in the test script: not 2 parameters to test-expect-success"
 135        say >&3 "expecting success: $2"
 136        test_run_ "$2"
 137        if [ "$?" = 0 -a "$eval_ret" = 0 ]
 138        then
 139                test_ok_ "$1"
 140        else
 141                test_failure_ "$@"
 142        fi
 143}
 144
 145test_expect_code () {
 146        test "$#" = 3 ||
 147        error "bug in the test script: not 3 parameters to test-expect-code"
 148        say >&3 "expecting exit code $1: $3"
 149        test_run_ "$3"
 150        if [ "$?" = 0 -a "$eval_ret" = "$1" ]
 151        then
 152                test_ok_ "$2"
 153        else
 154                test_failure_ "$@"
 155        fi
 156}
 157
 158# Most tests can use the created repository, but some amy need to create more.
 159# Usage: test_create_repo <directory>
 160test_create_repo () {
 161        test "$#" = 1 ||
 162        error "bug in the test script: not 1 parameter to test-create-repo"
 163        owd=`pwd`
 164        repo="$1"
 165        mkdir "$repo"
 166        cd "$repo" || error "Cannot setup test environment"
 167        "$GIT_EXEC_PATH/git" init-db --template=$GIT_EXEC_PATH/templates/blt/ 2>/dev/null ||
 168        error "cannot run git init-db -- have you built things yet?"
 169        mv .git/hooks .git/hooks-disabled
 170        cd "$owd"
 171}
 172        
 173test_done () {
 174        trap - exit
 175        case "$test_failure" in
 176        0)
 177                # We could:
 178                # cd .. && rm -fr trash
 179                # but that means we forbid any tests that use their own
 180                # subdirectory from calling test_done without coming back
 181                # to where they started from.
 182                # The Makefile provided will clean this test area so
 183                # we will leave things as they are.
 184
 185                say "passed all $test_count test(s)"
 186                exit 0 ;;
 187
 188        *)
 189                say "failed $test_failure among $test_count test(s)"
 190                exit 1 ;;
 191
 192        esac
 193}
 194
 195# Test the binaries we have just built.  The tests are kept in
 196# t/ subdirectory and are run in trash subdirectory.
 197PATH=$(pwd)/..:$PATH
 198GIT_EXEC_PATH=$(pwd)/..
 199export PATH GIT_EXEC_PATH
 200
 201# Similarly use ../compat/subprocess.py if our python does not
 202# have subprocess.py on its own.
 203PYTHON=`sed -e '1{
 204        s/^#!//
 205        q
 206}' ../git-merge-recursive` || {
 207        error "You haven't built things yet, have you?"
 208}
 209"$PYTHON" -c 'import subprocess' 2>/dev/null || {
 210        PYTHONPATH=$(pwd)/../compat
 211        export PYTHONPATH
 212}
 213test -d ../templates/blt || {
 214        error "You haven't built things yet, have you?"
 215}
 216
 217# Test repository
 218test=trash
 219rm -fr "$test"
 220test_create_repo $test
 221cd "$test"