t / lib-git-daemon.shon commit Merge branch 'jh/trace2-sid-fix' (5b2d1c0)
   1# Shell library to run git-daemon in tests.  Ends the test early if
   2# GIT_TEST_GIT_DAEMON is not set.
   3#
   4# Usage:
   5#
   6#       . ./test-lib.sh
   7#       . "$TEST_DIRECTORY"/lib-git-daemon.sh
   8#       start_git_daemon
   9#
  10#       test_expect_success '...' '
  11#               ...
  12#       '
  13#
  14#       test_expect_success ...
  15#
  16#       test_done
  17
  18test_tristate GIT_TEST_GIT_DAEMON
  19if test "$GIT_TEST_GIT_DAEMON" = false
  20then
  21        skip_all="git-daemon testing disabled (unset GIT_TEST_GIT_DAEMON to enable)"
  22        test_done
  23fi
  24
  25if test_have_prereq !PIPE
  26then
  27        test_skip_or_die $GIT_TEST_GIT_DAEMON "file system does not support FIFOs"
  28fi
  29
  30test_set_port LIB_GIT_DAEMON_PORT
  31
  32GIT_DAEMON_PID=
  33GIT_DAEMON_PIDFILE="$PWD"/daemon.pid
  34GIT_DAEMON_DOCUMENT_ROOT_PATH="$PWD"/repo
  35GIT_DAEMON_HOST_PORT=127.0.0.1:$LIB_GIT_DAEMON_PORT
  36GIT_DAEMON_URL=git://$GIT_DAEMON_HOST_PORT
  37
  38registered_stop_git_daemon_atexit_handler=
  39start_git_daemon() {
  40        if test -n "$GIT_DAEMON_PID"
  41        then
  42                error "start_git_daemon already called"
  43        fi
  44
  45        mkdir -p "$GIT_DAEMON_DOCUMENT_ROOT_PATH"
  46
  47        # One of the test scripts stops and then re-starts 'git daemon'.
  48        # Don't register and then run the same atexit handlers several times.
  49        if test -z "$registered_stop_git_daemon_atexit_handler"
  50        then
  51                test_atexit 'stop_git_daemon'
  52                registered_stop_git_daemon_atexit_handler=AlreadyDone
  53        fi
  54
  55        say >&3 "Starting git daemon ..."
  56        mkfifo git_daemon_output
  57        ${LIB_GIT_DAEMON_COMMAND:-git daemon} \
  58                --listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
  59                --reuseaddr --verbose --pid-file="$GIT_DAEMON_PIDFILE" \
  60                --base-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
  61                "$@" "$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
  62                >&3 2>git_daemon_output &
  63        GIT_DAEMON_PID=$!
  64        {
  65                read -r line <&7
  66                printf "%s\n" "$line" >&4
  67                cat <&7 >&4 &
  68        } 7<git_daemon_output &&
  69
  70        # Check expected output
  71        if test x"$(expr "$line" : "\[[0-9]*\] \(.*\)")" != x"Ready to rumble"
  72        then
  73                kill "$GIT_DAEMON_PID"
  74                wait "$GIT_DAEMON_PID"
  75                unset GIT_DAEMON_PID
  76                test_skip_or_die $GIT_TEST_GIT_DAEMON \
  77                        "git daemon failed to start"
  78        fi
  79}
  80
  81stop_git_daemon() {
  82        if test -z "$GIT_DAEMON_PID"
  83        then
  84                return
  85        fi
  86
  87        # kill git-daemon child of git
  88        say >&3 "Stopping git daemon ..."
  89        kill "$GIT_DAEMON_PID"
  90        wait "$GIT_DAEMON_PID" >&3 2>&4
  91        ret=$?
  92        if ! test_match_signal 15 $ret
  93        then
  94                error "git daemon exited with status: $ret"
  95        fi
  96        kill "$(cat "$GIT_DAEMON_PIDFILE")" 2>/dev/null
  97        GIT_DAEMON_PID=
  98        rm -f git_daemon_output "$GIT_DAEMON_PIDFILE"
  99}
 100
 101# A stripped-down version of a netcat client, that connects to a "host:port"
 102# given in $1, sends its stdin followed by EOF, then dumps the response (until
 103# EOF) to stdout.
 104fake_nc() {
 105        if ! test_declared_prereq FAKENC
 106        then
 107                echo >&4 "fake_nc: need to declare FAKENC prerequisite"
 108                return 127
 109        fi
 110        perl -Mstrict -MIO::Socket::INET -e '
 111                my $s = IO::Socket::INET->new(shift)
 112                        or die "unable to open socket: $!";
 113                print $s <STDIN>;
 114                $s->shutdown(1);
 115                print <$s>;
 116        ' "$@"
 117}
 118
 119test_lazy_prereq FAKENC '
 120        perl -MIO::Socket::INET -e "exit 0"
 121'