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:
Junio C Hamano
2012-04-24 15:03:30 -07:00
4 changed files with 68 additions and 26 deletions

1
.gitignore vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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;
}