2013-11-25 21:03:06 +00:00
|
|
|
# Shell library to run git-daemon in tests. Ends the test early if
|
|
|
|
# GIT_TEST_GIT_DAEMON is not set.
|
|
|
|
#
|
|
|
|
# Usage:
|
|
|
|
#
|
|
|
|
# . ./test-lib.sh
|
|
|
|
# . "$TEST_DIRECTORY"/lib-git-daemon.sh
|
|
|
|
# start_git_daemon
|
|
|
|
#
|
|
|
|
# test_expect_success '...' '
|
|
|
|
# ...
|
|
|
|
# '
|
|
|
|
#
|
|
|
|
# test_expect_success ...
|
|
|
|
#
|
|
|
|
# test_done
|
2012-01-07 11:42:45 +00:00
|
|
|
|
tests: add 'test_bool_env' to catch non-bool GIT_TEST_* values
Since 3b072c577b (tests: replace test_tristate with "git env--helper",
2019-06-21) we get the normalized bool values of various GIT_TEST_*
environment variables via 'git env--helper'. Now, while the 'git
env--helper' command itself does catch invalid values in the
environment variable or in the given --default and exits with error
(exit code 128 or 129, respectively), it's invoked in conditions like
'if ! git env--helper ...', which means that all invalid bool values
are interpreted the same as the ordinary 'false' (exit code 1). This
has led to inadvertently skipped httpd tests in our CI builds for a
couple of weeks, see 3960290675 (ci: restore running httpd tests,
2019-09-06).
Let's be more careful about what the test suite accepts as bool values
in GIT_TEST_* environment variables, and error out loud and clear on
invalid values instead of simply skipping tests. Add the
'test_bool_env' helper function to encapsulate the invocation of 'git
env--helper' and the verification of its exit code, and replace all
invocations of that command in our test framework and test suite with
a call to this new helper (except in 't0017-env-helper.sh', of
course).
$ GIT_TEST_GIT_DAEMON=YesPlease ./t5570-git-daemon.sh
fatal: bad numeric config value 'YesPlease' for 'GIT_TEST_GIT_DAEMON': invalid unit
error: test_bool_env requires bool values both for $GIT_TEST_GIT_DAEMON and for the default fallback
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-11-22 13:14:36 +00:00
|
|
|
if ! test_bool_env GIT_TEST_GIT_DAEMON true
|
2012-01-07 11:42:45 +00:00
|
|
|
then
|
tests: turn on network daemon tests by default
We do not run the httpd nor git-daemon tests by default, as
they are rather heavyweight and require network access
(albeit over localhost). However, it would be nice if more
pepole ran them, for two reasons:
1. We would get more test coverage on more systems.
2. The point of the test suite is to find regressions. It
is very easy to change some of the underlying code and
break the httpd code without realizing you are even
affecting it. Running the httpd tests helps find these
problems sooner (ideally before the patches even hit
the list).
We still want to leave an "out", though, for people who really do
not want to run them. For that reason, the GIT_TEST_HTTPD and
GIT_TEST_GIT_DAEMON variables are now tri-state booleans
(true/false/auto), so you can say GIT_TEST_HTTPD=false to turn the
tests back off. To support those who want a stable single way to
disable these tests across versions of Git before and after this
change, an empty string explicitly set to these variables is also
taken as "false", so the behaviour changes only for those who:
a. did not express any preference by leaving these variables
unset. They did not test these features before, but now they
do; or
b. did express that they want to test these features by setting
GIT_TEST_FEATURE=false (or any equivalent other ways to tell
"false" to Git, e.g. "0"), which has been a valid but funny way
to say that they do want to test the feature only because we
used to interpret any non-empty string to mean "yes please
test". They no longer test that feature.
In addition, we are forgiving of common setup failures (e.g., you do
not have apache installed, or have an old version) when the
tri-state is "auto" (or unset), but report an error when it is
"true". This makes "auto" a sane default, as we should not cause
failures on setups where the tests cannot run. But it allows people
who use "true" to catch regressions in their system (e.g., they
uninstalled apache, but were expecting their automated test runs to
test git-httpd, and would want to be notified).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-02-10 21:29:37 +00:00
|
|
|
skip_all="git-daemon testing disabled (unset GIT_TEST_GIT_DAEMON to enable)"
|
2012-01-07 11:42:45 +00:00
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2016-01-27 16:19:48 +00:00
|
|
|
if test_have_prereq !PIPE
|
|
|
|
then
|
2019-06-21 10:18:11 +00:00
|
|
|
test_skip_or_die GIT_TEST_GIT_DAEMON "file system does not support FIFOs"
|
2016-01-27 16:19:48 +00:00
|
|
|
fi
|
|
|
|
|
test-lib-functions: introduce the 'test_set_port' helper function
Several test scripts run daemons like 'git-daemon' or Apache, and
communicate with them through TCP sockets. To have unique ports where
these daemons are accessible, the ports are usually the number of the
corresponding test scripts, unless the user overrides them via
environment variables, and thus all those tests and test libs contain
more or less the same bit of one-liner boilerplate code to find out
the port. The last patch in this series will make this a bit more
complicated.
Factor out finding the port for a daemon into the common helper
function 'test_set_port' to avoid repeating ourselves.
Take special care of test scripts with "low" numbers:
- Test numbers below 1024 would result in a port that's only usable
as root, so set their port to '10000 + test-nr' to make sure it
doesn't interfere with other tests in the test suite. This makes
the hardcoded port number in 't0410-partial-clone.sh' unnecessary,
remove it.
- The shell's arithmetic evaluation interprets numbers with leading
zeros as octal values, which means that test number below 1000 and
containing the digits 8 or 9 will trigger an error. Remove all
leading zeros from the test numbers to prevent this.
Note that the 'git p4' tests are unlike the other tests involving
daemons in that:
- 'lib-git-p4.sh' doesn't use the test's number for unique port as
is, but does a bit of additional arithmetic on top [1].
- The port is not overridable via an environment variable.
With this patch even 'git p4' tests will use the test's number as
default port, and it will be overridable via the P4DPORT environment
variable.
[1] Commit fc00233071 (git-p4 tests: refactor and cleanup, 2011-08-22)
introduced that "unusual" unique port computation without
explaining why it was necessary (as opposed to simply using the
test number as is). It seems to be just unnecessary complication,
and in any case that commit came way before the "test nr as unique
port" got "standardized" for other daemons in commits c44132fcf3
(tests: auto-set git-daemon port, 2014-02-10), 3bb486e439 (tests:
auto-set LIB_HTTPD_PORT from test name, 2014-02-10), and
bf9d7df950 (t/lib-git-svn.sh: improve svnserve tests with parallel
make test, 2017-12-01).
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-01-05 01:08:58 +00:00
|
|
|
test_set_port LIB_GIT_DAEMON_PORT
|
2012-01-07 11:42:45 +00:00
|
|
|
|
|
|
|
GIT_DAEMON_PID=
|
t/lib-git-daemon: make sure to kill the 'git-daemon' process
After 'start_git_daemon' starts 'git daemon' (note the space in the
middle) in the background, it saves the background process' PID, so
the daemon can be stopped at the end of the test script. However,
'git-daemon' is not a builtin but a dashed external command, which
means that the dashless 'git daemon' executes the dashed 'git-daemon'
command, and, consequently, the PID recorded is not the PID of the
"real" daemon process, but that of the main 'git' wrapper. Now, if a
test script involving 'git daemon' is interrupted by ctrl-C, then only
the main 'git' process is stopped, but the real daemon process tends
to survive somehow, and keeps on running in the background
indefinitely, keeping the daemon's port to itself, and thus preventing
subsequent runs of the same test script.
Work this around by running 'git daemon' with the '--pidfile=...'
option to save the PID of the real daemon process, and kill that
process in 'stop_git_daemon' as well.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 12:24:10 +00:00
|
|
|
GIT_DAEMON_PIDFILE="$PWD"/daemon.pid
|
2012-01-07 11:42:45 +00:00
|
|
|
GIT_DAEMON_DOCUMENT_ROOT_PATH="$PWD"/repo
|
t/lib-git-daemon: add network-protocol helpers
All of our git-protocol tests rely on invoking the client
and having it make a request of a server. That gives a nice
real-world test of how the two behave together, but it
doesn't leave any room for testing how a server might react
to _other_ clients.
Let's add a few test helper functions which can be used to
manually conduct a git-protocol conversation with a remote
git-daemon:
1. To connect to a remote git-daemon, we need something
like "netcat". But not everybody will have netcat. And
even if they do, the behavior with respect to
half-duplex shutdowns is not portable (openbsd netcat
has "-N", with others you must rely on "-q 1", which is
racy).
Here we provide a "fake_nc" that is capable of doing
a client-side netcat, with sane half-duplex semantics.
It relies on perl's IO::Socket::INET. That's been in
the base distribution since 5.6.0, so it's probably
available everywhere. But just to be on the safe side,
we'll add a prereq.
2. To help tests speak and read pktline, this patch adds
packetize() and depacketize() functions.
I've put fake_nc() into lib-git-daemon.sh, since that's
really the only server where we'd need to use a network
socket. Whereas the pktline helpers may be of more general
use, so I've added them to test-lib-functions.sh. Programs
like upload-pack speak pktline, but can talk directly over
stdio without a network socket.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-01-25 00:58:19 +00:00
|
|
|
GIT_DAEMON_HOST_PORT=127.0.0.1:$LIB_GIT_DAEMON_PORT
|
|
|
|
GIT_DAEMON_URL=git://$GIT_DAEMON_HOST_PORT
|
2012-01-07 11:42:45 +00:00
|
|
|
|
2019-03-13 12:24:12 +00:00
|
|
|
registered_stop_git_daemon_atexit_handler=
|
2012-01-07 11:42:45 +00:00
|
|
|
start_git_daemon() {
|
|
|
|
if test -n "$GIT_DAEMON_PID"
|
|
|
|
then
|
|
|
|
error "start_git_daemon already called"
|
|
|
|
fi
|
|
|
|
|
|
|
|
mkdir -p "$GIT_DAEMON_DOCUMENT_ROOT_PATH"
|
|
|
|
|
2019-03-13 12:24:12 +00:00
|
|
|
# One of the test scripts stops and then re-starts 'git daemon'.
|
|
|
|
# Don't register and then run the same atexit handlers several times.
|
|
|
|
if test -z "$registered_stop_git_daemon_atexit_handler"
|
|
|
|
then
|
|
|
|
test_atexit 'stop_git_daemon'
|
|
|
|
registered_stop_git_daemon_atexit_handler=AlreadyDone
|
|
|
|
fi
|
2012-01-07 11:42:45 +00:00
|
|
|
|
|
|
|
say >&3 "Starting git daemon ..."
|
2012-01-07 11:42:47 +00:00
|
|
|
mkfifo git_daemon_output
|
2017-02-25 09:37:30 +00:00
|
|
|
${LIB_GIT_DAEMON_COMMAND:-git daemon} \
|
|
|
|
--listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
|
t/lib-git-daemon: make sure to kill the 'git-daemon' process
After 'start_git_daemon' starts 'git daemon' (note the space in the
middle) in the background, it saves the background process' PID, so
the daemon can be stopped at the end of the test script. However,
'git-daemon' is not a builtin but a dashed external command, which
means that the dashless 'git daemon' executes the dashed 'git-daemon'
command, and, consequently, the PID recorded is not the PID of the
"real" daemon process, but that of the main 'git' wrapper. Now, if a
test script involving 'git daemon' is interrupted by ctrl-C, then only
the main 'git' process is stopped, but the real daemon process tends
to survive somehow, and keeps on running in the background
indefinitely, keeping the daemon's port to itself, and thus preventing
subsequent runs of the same test script.
Work this around by running 'git daemon' with the '--pidfile=...'
option to save the PID of the real daemon process, and kill that
process in 'stop_git_daemon' as well.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 12:24:10 +00:00
|
|
|
--reuseaddr --verbose --pid-file="$GIT_DAEMON_PIDFILE" \
|
2012-01-07 11:42:45 +00:00
|
|
|
--base-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
|
|
|
|
"$@" "$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
|
2012-01-07 11:42:47 +00:00
|
|
|
>&3 2>git_daemon_output &
|
2012-01-07 11:42:45 +00:00
|
|
|
GIT_DAEMON_PID=$!
|
2012-01-07 11:42:47 +00:00
|
|
|
{
|
2018-01-25 19:16:41 +00:00
|
|
|
read -r line <&7
|
2019-01-06 17:53:10 +00:00
|
|
|
printf "%s\n" "$line" >&4
|
|
|
|
cat <&7 >&4 &
|
|
|
|
} 7<git_daemon_output &&
|
2012-01-07 11:42:47 +00:00
|
|
|
|
2012-04-26 21:00:39 +00:00
|
|
|
# Check expected output
|
|
|
|
if test x"$(expr "$line" : "\[[0-9]*\] \(.*\)")" != x"Ready to rumble"
|
|
|
|
then
|
|
|
|
kill "$GIT_DAEMON_PID"
|
|
|
|
wait "$GIT_DAEMON_PID"
|
2019-03-13 12:24:12 +00:00
|
|
|
unset GIT_DAEMON_PID
|
2019-06-21 10:18:11 +00:00
|
|
|
test_skip_or_die GIT_TEST_GIT_DAEMON \
|
tests: turn on network daemon tests by default
We do not run the httpd nor git-daemon tests by default, as
they are rather heavyweight and require network access
(albeit over localhost). However, it would be nice if more
pepole ran them, for two reasons:
1. We would get more test coverage on more systems.
2. The point of the test suite is to find regressions. It
is very easy to change some of the underlying code and
break the httpd code without realizing you are even
affecting it. Running the httpd tests helps find these
problems sooner (ideally before the patches even hit
the list).
We still want to leave an "out", though, for people who really do
not want to run them. For that reason, the GIT_TEST_HTTPD and
GIT_TEST_GIT_DAEMON variables are now tri-state booleans
(true/false/auto), so you can say GIT_TEST_HTTPD=false to turn the
tests back off. To support those who want a stable single way to
disable these tests across versions of Git before and after this
change, an empty string explicitly set to these variables is also
taken as "false", so the behaviour changes only for those who:
a. did not express any preference by leaving these variables
unset. They did not test these features before, but now they
do; or
b. did express that they want to test these features by setting
GIT_TEST_FEATURE=false (or any equivalent other ways to tell
"false" to Git, e.g. "0"), which has been a valid but funny way
to say that they do want to test the feature only because we
used to interpret any non-empty string to mean "yes please
test". They no longer test that feature.
In addition, we are forgiving of common setup failures (e.g., you do
not have apache installed, or have an old version) when the
tri-state is "auto" (or unset), but report an error when it is
"true". This makes "auto" a sane default, as we should not cause
failures on setups where the tests cannot run. But it allows people
who use "true" to catch regressions in their system (e.g., they
uninstalled apache, but were expecting their automated test runs to
test git-httpd, and would want to be notified).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-02-10 21:29:37 +00:00
|
|
|
"git daemon failed to start"
|
2012-04-26 21:00:39 +00:00
|
|
|
fi
|
2012-01-07 11:42:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
stop_git_daemon() {
|
|
|
|
if test -z "$GIT_DAEMON_PID"
|
|
|
|
then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
# kill git-daemon child of git
|
|
|
|
say >&3 "Stopping git daemon ..."
|
|
|
|
kill "$GIT_DAEMON_PID"
|
|
|
|
wait "$GIT_DAEMON_PID" >&3 2>&4
|
|
|
|
ret=$?
|
t/lib-git-daemon: fix signal checking
Test scripts checking 'git daemon' stop the daemon with a TERM signal,
and the 'stop_git_daemon' helper checks the daemon's exit status to
make sure that it indeed died because of that signal.
This check is bogus since 03c39b3458 (t/lib-git-daemon: use
test_match_signal, 2016-06-24), for two reasons:
- Right after killing 'git daemon', 'stop_git_daemon' saves its exit
status in a variable, but since 03c39b3458 the condition checking
the exit status looks at '$?', which at this point is not the exit
status of 'git daemon', but that of the variable assignment, i.e.
it's always 0.
- The unexpected exit status should abort the whole test script with
'error', but it doesn't, because 03c39b3458 forgot to negate
'test_match_signal's exit status in the condition.
This patch fixes both issues.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-26 20:03:37 +00:00
|
|
|
if ! test_match_signal 15 $ret
|
2012-01-07 11:42:45 +00:00
|
|
|
then
|
|
|
|
error "git daemon exited with status: $ret"
|
|
|
|
fi
|
t/lib-git-daemon: make sure to kill the 'git-daemon' process
After 'start_git_daemon' starts 'git daemon' (note the space in the
middle) in the background, it saves the background process' PID, so
the daemon can be stopped at the end of the test script. However,
'git-daemon' is not a builtin but a dashed external command, which
means that the dashless 'git daemon' executes the dashed 'git-daemon'
command, and, consequently, the PID recorded is not the PID of the
"real" daemon process, but that of the main 'git' wrapper. Now, if a
test script involving 'git daemon' is interrupted by ctrl-C, then only
the main 'git' process is stopped, but the real daemon process tends
to survive somehow, and keeps on running in the background
indefinitely, keeping the daemon's port to itself, and thus preventing
subsequent runs of the same test script.
Work this around by running 'git daemon' with the '--pidfile=...'
option to save the PID of the real daemon process, and kill that
process in 'stop_git_daemon' as well.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 12:24:10 +00:00
|
|
|
kill "$(cat "$GIT_DAEMON_PIDFILE")" 2>/dev/null
|
2012-01-07 11:42:45 +00:00
|
|
|
GIT_DAEMON_PID=
|
t/lib-git-daemon: make sure to kill the 'git-daemon' process
After 'start_git_daemon' starts 'git daemon' (note the space in the
middle) in the background, it saves the background process' PID, so
the daemon can be stopped at the end of the test script. However,
'git-daemon' is not a builtin but a dashed external command, which
means that the dashless 'git daemon' executes the dashed 'git-daemon'
command, and, consequently, the PID recorded is not the PID of the
"real" daemon process, but that of the main 'git' wrapper. Now, if a
test script involving 'git daemon' is interrupted by ctrl-C, then only
the main 'git' process is stopped, but the real daemon process tends
to survive somehow, and keeps on running in the background
indefinitely, keeping the daemon's port to itself, and thus preventing
subsequent runs of the same test script.
Work this around by running 'git daemon' with the '--pidfile=...'
option to save the PID of the real daemon process, and kill that
process in 'stop_git_daemon' as well.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-03-13 12:24:10 +00:00
|
|
|
rm -f git_daemon_output "$GIT_DAEMON_PIDFILE"
|
2012-01-07 11:42:45 +00:00
|
|
|
}
|
t/lib-git-daemon: add network-protocol helpers
All of our git-protocol tests rely on invoking the client
and having it make a request of a server. That gives a nice
real-world test of how the two behave together, but it
doesn't leave any room for testing how a server might react
to _other_ clients.
Let's add a few test helper functions which can be used to
manually conduct a git-protocol conversation with a remote
git-daemon:
1. To connect to a remote git-daemon, we need something
like "netcat". But not everybody will have netcat. And
even if they do, the behavior with respect to
half-duplex shutdowns is not portable (openbsd netcat
has "-N", with others you must rely on "-q 1", which is
racy).
Here we provide a "fake_nc" that is capable of doing
a client-side netcat, with sane half-duplex semantics.
It relies on perl's IO::Socket::INET. That's been in
the base distribution since 5.6.0, so it's probably
available everywhere. But just to be on the safe side,
we'll add a prereq.
2. To help tests speak and read pktline, this patch adds
packetize() and depacketize() functions.
I've put fake_nc() into lib-git-daemon.sh, since that's
really the only server where we'd need to use a network
socket. Whereas the pktline helpers may be of more general
use, so I've added them to test-lib-functions.sh. Programs
like upload-pack speak pktline, but can talk directly over
stdio without a network socket.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-01-25 00:58:19 +00:00
|
|
|
|
|
|
|
# A stripped-down version of a netcat client, that connects to a "host:port"
|
|
|
|
# given in $1, sends its stdin followed by EOF, then dumps the response (until
|
|
|
|
# EOF) to stdout.
|
|
|
|
fake_nc() {
|
|
|
|
if ! test_declared_prereq FAKENC
|
|
|
|
then
|
|
|
|
echo >&4 "fake_nc: need to declare FAKENC prerequisite"
|
|
|
|
return 127
|
|
|
|
fi
|
|
|
|
perl -Mstrict -MIO::Socket::INET -e '
|
|
|
|
my $s = IO::Socket::INET->new(shift)
|
|
|
|
or die "unable to open socket: $!";
|
|
|
|
print $s <STDIN>;
|
|
|
|
$s->shutdown(1);
|
|
|
|
print <$s>;
|
|
|
|
' "$@"
|
|
|
|
}
|
|
|
|
|
|
|
|
test_lazy_prereq FAKENC '
|
|
|
|
perl -MIO::Socket::INET -e "exit 0"
|
|
|
|
'
|