2009-11-05 09:16:38 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='test git-http-backend'
|
2020-11-19 07:44:34 +08:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 07:44:19 +08:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2009-11-05 09:16:38 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
. "$TEST_DIRECTORY"/lib-httpd.sh
|
2018-04-03 22:01:57 +08:00
|
|
|
|
|
|
|
if ! test_have_prereq CURL; then
|
|
|
|
skip_all='skipping raw http-backend tests, curl not available'
|
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2009-11-05 09:16:38 +08:00
|
|
|
start_httpd
|
|
|
|
|
|
|
|
GET() {
|
2018-04-03 22:01:41 +08:00
|
|
|
curl --include "$HTTPD_URL/$SMART/repo.git/$1" >out &&
|
2009-11-05 09:16:38 +08:00
|
|
|
tr '\015' Q <out |
|
|
|
|
sed '
|
|
|
|
s/Q$//
|
|
|
|
1q
|
|
|
|
' >act &&
|
|
|
|
echo "HTTP/1.1 $2" >exp &&
|
|
|
|
test_cmp exp act
|
|
|
|
}
|
|
|
|
|
|
|
|
POST() {
|
|
|
|
curl --include --data "$2" \
|
|
|
|
--header "Content-Type: application/x-$1-request" \
|
2018-04-03 22:01:41 +08:00
|
|
|
"$HTTPD_URL/smart/repo.git/$1" >out &&
|
2009-11-05 09:16:38 +08:00
|
|
|
tr '\015' Q <out |
|
|
|
|
sed '
|
|
|
|
s/Q$//
|
|
|
|
1q
|
|
|
|
' >act &&
|
|
|
|
echo "HTTP/1.1 $3" >exp &&
|
|
|
|
test_cmp exp act
|
|
|
|
}
|
|
|
|
|
2010-01-03 05:38:06 +08:00
|
|
|
. "$TEST_DIRECTORY"/t556x_common
|
2009-11-10 03:26:43 +08:00
|
|
|
|
2015-09-25 02:12:22 +08:00
|
|
|
grep '^[^#]' >exp <<EOF
|
2009-11-05 09:16:38 +08:00
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
### refs/heads/main
|
2009-11-05 09:16:38 +08:00
|
|
|
###
|
2020-11-19 07:44:34 +08:00
|
|
|
GET /smart/repo.git/refs/heads/main HTTP/1.1 404 -
|
2009-11-05 09:16:38 +08:00
|
|
|
|
|
|
|
### getanyfile default
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/HEAD HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/info/refs HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/objects/info/packs HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/objects/info/alternates HTTP/1.1 200 -
|
|
|
|
GET /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -
|
|
|
|
GET /smart/repo.git/$LOOSE_URL HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/$PACK_URL HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/$IDX_URL HTTP/1.1 200
|
|
|
|
|
2009-12-29 05:49:00 +08:00
|
|
|
### no git-daemon-export-ok
|
|
|
|
###
|
|
|
|
GET /smart_noexport/repo.git/HEAD HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/info/refs HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/objects/info/packs HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/objects/info/alternates HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/objects/info/http-alternates HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/$LOOSE_URL HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/$PACK_URL HTTP/1.1 404 -
|
|
|
|
GET /smart_noexport/repo.git/$IDX_URL HTTP/1.1 404 -
|
|
|
|
|
|
|
|
### git-daemon-export-ok
|
|
|
|
###
|
|
|
|
GET /smart_noexport/repo.git/HEAD HTTP/1.1 200
|
|
|
|
GET /smart_noexport/repo.git/info/refs HTTP/1.1 200
|
|
|
|
GET /smart_noexport/repo.git/objects/info/packs HTTP/1.1 200
|
|
|
|
GET /smart_noexport/repo.git/objects/info/alternates HTTP/1.1 200 -
|
|
|
|
GET /smart_noexport/repo.git/objects/info/http-alternates HTTP/1.1 200 -
|
|
|
|
GET /smart_noexport/repo.git/$LOOSE_URL HTTP/1.1 200
|
|
|
|
GET /smart_noexport/repo.git/$PACK_URL HTTP/1.1 200
|
|
|
|
GET /smart_noexport/repo.git/$IDX_URL HTTP/1.1 200
|
|
|
|
|
2009-11-05 09:16:38 +08:00
|
|
|
### getanyfile true
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/HEAD HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/info/refs HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/objects/info/packs HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/objects/info/alternates HTTP/1.1 200 -
|
|
|
|
GET /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -
|
|
|
|
GET /smart/repo.git/$LOOSE_URL HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/$PACK_URL HTTP/1.1 200
|
|
|
|
GET /smart/repo.git/$IDX_URL HTTP/1.1 200
|
|
|
|
|
|
|
|
### getanyfile false
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/HEAD HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/info/refs HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/objects/info/packs HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/objects/info/alternates HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/objects/info/http-alternates HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/$LOOSE_URL HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/$PACK_URL HTTP/1.1 403 -
|
|
|
|
GET /smart/repo.git/$IDX_URL HTTP/1.1 403 -
|
|
|
|
|
|
|
|
### uploadpack default
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
|
|
|
|
POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -
|
|
|
|
|
|
|
|
### uploadpack true
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
|
|
|
|
POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -
|
|
|
|
|
|
|
|
### uploadpack false
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 403 -
|
|
|
|
POST /smart/repo.git/git-upload-pack HTTP/1.1 403 -
|
|
|
|
|
|
|
|
### receivepack default
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -
|
|
|
|
POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -
|
|
|
|
|
|
|
|
### receivepack true
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
|
|
|
|
POST /smart/repo.git/git-receive-pack HTTP/1.1 200 -
|
|
|
|
|
|
|
|
### receivepack false
|
|
|
|
###
|
|
|
|
GET /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -
|
|
|
|
POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -
|
|
|
|
EOF
|
|
|
|
test_expect_success 'server request log matches test results' '
|
t/lib-httpd: avoid occasional failures when checking access.log
The last test of 't5561-http-backend.sh', 'server request log matches
test results' may fail occasionally, because the order of entries in
Apache's access log doesn't match the order of requests sent in the
previous tests, although all the right requests are there. I saw it
fail on Travis CI five times in the span of about half a year, when
the order of two subsequent requests was flipped, and could trigger
the failure with a modified Git. However, I was unable to trigger it
with stock Git on my machine. Three tests in
't5541-http-push-smart.sh' and 't5551-http-fetch-smart.sh' check
requests in the log the same way, so they might be prone to a similar
occasional failure as well.
When a test sends a HTTP request, it can continue execution after
'git-http-backend' fulfilled that request, but Apache writes the
corresponding access log entry only after 'git-http-backend' exited.
Some time inevitably passes between fulfilling the request and writing
the log entry, and, under unfavourable circumstances, enough time
might pass for the subsequent request to be sent and fulfilled by a
different Apache thread or process, and then Apache writes access log
entries racily.
This effect can be exacerbated by adding a bit of variable delay after
the request is fulfilled but before 'git-http-backend' exits, e.g.
like this:
diff --git a/http-backend.c b/http-backend.c
index f3dc218b2..bbf4c125b 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -709,5 +709,7 @@ int cmd_main(int argc, const char **argv)
max_request_buffer);
cmd->imp(&hdr, cmd_arg);
+ if (getpid() % 2)
+ sleep(1);
return 0;
}
This delay considerably increases the chances of log entries being
written out of order, and in turn makes t5561's last test fail almost
every time. Alas, it doesn't seem to be enough to trigger a similar
failure in t5541 and t5551.
So, since we can't just rely on the order of access log entries always
corresponding the order of requests, make checking the access log more
deterministic by sorting (simply lexicographically) both the stripped
access log entries and the expected entries before the comparison with
'test_cmp'. This way the order of log entries won't matter and
occasional out-of-order entries won't trigger a test failure, but the
comparison will still notice any unexpected or missing log entries.
OTOH, this sorting will make it harder to identify from which test an
unexpected log entry came from or which test's request went missing.
Therefore, in case of an error include the comparison of the unsorted
log enries in the test output as well.
And since all this should be performed in four tests in three test
scripts, put this into a new helper function 'check_access_log' in
't/lib-httpd.sh'.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-07-12 20:22:16 +08:00
|
|
|
check_access_log exp
|
2009-11-05 09:16:38 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_done
|