mirror of
https://github.com/git/git.git
synced 2026-02-19 14:21:50 +00:00
Merge branch 'cb/daemon-test-race-fix' into next
Fix race condition between starting and waiting for git-daemon in the test. Will merge to 'next'. By Clemens Buchacher * cb/daemon-test-race-fix: git-daemon wrapper to wait until daemon is ready
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -178,6 +178,7 @@
|
||||
/test-dump-cache-tree
|
||||
/test-scrap-cache-tree
|
||||
/test-genrandom
|
||||
/test-git-daemon
|
||||
/test-index-version
|
||||
/test-line-buffer
|
||||
/test-match-trees
|
||||
|
||||
1
Makefile
1
Makefile
@@ -483,6 +483,7 @@ TEST_PROGRAMS_NEED_X += test-delta
|
||||
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
|
||||
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
|
||||
TEST_PROGRAMS_NEED_X += test-genrandom
|
||||
TEST_PROGRAMS_NEED_X += test-git-daemon
|
||||
TEST_PROGRAMS_NEED_X += test-index-version
|
||||
TEST_PROGRAMS_NEED_X += test-line-buffer
|
||||
TEST_PROGRAMS_NEED_X += test-match-trees
|
||||
|
||||
@@ -23,27 +23,13 @@ start_git_daemon() {
|
||||
trap 'code=$?; stop_git_daemon; (exit $code); die' EXIT
|
||||
|
||||
say >&3 "Starting git daemon ..."
|
||||
mkfifo git_daemon_output
|
||||
git daemon --listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
|
||||
test-git-daemon --listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
|
||||
--reuseaddr --verbose \
|
||||
--base-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
|
||||
"$@" "$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
|
||||
>&3 2>git_daemon_output &
|
||||
GIT_DAEMON_PID=$!
|
||||
{
|
||||
read line
|
||||
echo >&4 "$line"
|
||||
cat >&4 &
|
||||
|
||||
# Check expected output
|
||||
if test x"$(expr "$line" : "\[[0-9]*\] \(.*\)")" != x"Ready to rumble"
|
||||
then
|
||||
kill "$GIT_DAEMON_PID"
|
||||
wait "$GIT_DAEMON_PID"
|
||||
trap 'die' EXIT
|
||||
error "git daemon failed to start"
|
||||
fi
|
||||
} <git_daemon_output
|
||||
>&3 2>&4 ||
|
||||
error "git daemon failed to start"
|
||||
GIT_DAEMON_PID=$(cat git-daemon.pid)
|
||||
}
|
||||
|
||||
stop_git_daemon() {
|
||||
@@ -57,13 +43,5 @@ stop_git_daemon() {
|
||||
# kill git-daemon child of git
|
||||
say >&3 "Stopping git daemon ..."
|
||||
kill "$GIT_DAEMON_PID"
|
||||
wait "$GIT_DAEMON_PID" >&3 2>&4
|
||||
ret=$?
|
||||
# expect exit with status 143 = 128+15 for signal TERM=15
|
||||
if test $ret -ne 143
|
||||
then
|
||||
error "git daemon exited with status: $ret"
|
||||
fi
|
||||
GIT_DAEMON_PID=
|
||||
rm -f git_daemon_output
|
||||
}
|
||||
|
||||
62
test-git-daemon.c
Normal file
62
test-git-daemon.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#include "git-compat-util.h"
|
||||
#include "run-command.h"
|
||||
#include "exec_cmd.h"
|
||||
#include "strbuf.h"
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
static int parse_daemon_output(char *s)
|
||||
{
|
||||
if (*s++ != '[')
|
||||
return 1;
|
||||
s = strchr(s, ']');
|
||||
if (!s)
|
||||
return 1;
|
||||
if (strcmp(s, "] Ready to rumble\n"))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct strbuf line = STRBUF_INIT;
|
||||
FILE *fp;
|
||||
struct child_process proc, cat;
|
||||
char *cat_argv[] = { "cat", NULL };
|
||||
|
||||
setup_path();
|
||||
|
||||
memset(&proc, 0, sizeof(proc));
|
||||
argv[0] = "git-daemon";
|
||||
proc.argv = (const char **)argv;
|
||||
proc.no_stdin = 1;
|
||||
proc.err = -1;
|
||||
|
||||
if (start_command(&proc) < 0)
|
||||
return 1;
|
||||
|
||||
strbuf_getwholeline_fd(&line, proc.err, '\n');
|
||||
fputs(line.buf, stderr);
|
||||
|
||||
memset(&cat, 0, sizeof(cat));
|
||||
cat.argv = (const char **)cat_argv;
|
||||
cat.in = proc.err;
|
||||
cat.out = 2;
|
||||
|
||||
if (start_command(&cat) < 0)
|
||||
return 1;
|
||||
|
||||
if (parse_daemon_output(line.buf)) {
|
||||
kill(proc.pid, SIGTERM);
|
||||
finish_command(&proc);
|
||||
finish_command(&cat);
|
||||
return 1;
|
||||
}
|
||||
|
||||
fp = fopen("git-daemon.pid", "w");
|
||||
fprintf(fp, "%"PRIuMAX"\n", (uintmax_t)proc.pid);
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user