Files
git-mirror/t/t5562-http-backend-content-length.sh
Patrick Steinhardt 23e21a58d5 t: introduce PERL_TEST_HELPERS prerequisite
In the early days of Git, Perl was used quite prominently throughout the
project. This has changed significantly as almost all of the executables
we ship nowadays have eventually been rewritten in C. Only a handful of
subsystems remain that require Perl:

  - gitweb, a read-only web interface.

  - A couple of scripts that allow importing repositories from GNU Arch,
    CVS and Subversion.

  - git-send-email(1), which can be used to send mails.

  - git-request-pull(1), which is used to request somebody to pull from
    a URL by sending an email.

  - git-filter-branch(1), which uses Perl with the `--state-branch`
    option. This command is typically recommended against nowadays in
    favor of git-filter-repo(1).

  - Our Perl bindings for Git.

  - The netrc Git credential helper.

None of these subsystems can really be considered to be part of the
"core" of Git, and an installation without them is fully functional.
It is more likely than not that an end user wouldn't even notice that
any features are missing if those tools weren't installed. But while
Perl nowadays very much is an optional dependency of Git, there is a
significant limitation when Perl isn't available: developers cannot run
our test suite.

Preceding commits have started to lift this restriction by removing the
strict dependency on Perl in many central parts of the test library. But
there are still many tests that rely on small Perl helpers to do various
different things.

Introduce a new PERL_TEST_HELPERS prerequisite that guards all tests
that require Perl. This prerequisite is explicitly different than the
preexisting PERL prerequisite:

  - PERL records whether or not features depending on the Perl
    interpreter are built.

  - PERL_TEST_HELPERS records whether or not a Perl interpreter is
    available for our tests.

By having these two separate prerequisites we can thus distinguish
between tests that inherently depend on Perl because the underlying
feature does, and those tests that depend on Perl because the test
itself is using Perl.

Adapt all tests to set the PERL_TEST_HELPERS prerequisite as needed.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-04-07 14:47:37 -07:00

181 lines
4.9 KiB
Bash
Executable File

#!/bin/sh
test_description='test git-http-backend respects CONTENT_LENGTH'
. ./test-lib.sh
if ! test_have_prereq PERL_TEST_HELPERS
then
skip_all='skipping http backend content tests; Perl not available'
test_done
fi
test_lazy_prereq GZIP 'gzip --version'
verify_http_result() {
# some fatal errors still produce status 200
# so check if there is the error message
if grep 'fatal:' act.err.$test_count
then
return 1
fi
if ! grep "Status" act.out.$test_count >act
then
printf "Status: 200 OK\r\n" >act
fi
printf "Status: $1\r\n" >exp &&
test_cmp exp act
}
test_http_env() {
handler_type="$1"
request_body="$2"
shift
env \
CONTENT_TYPE="application/x-git-$handler_type-pack-request" \
QUERY_STRING="/repo.git/git-$handler_type-pack" \
PATH_TRANSLATED="$PWD/.git/git-$handler_type-pack" \
GIT_HTTP_EXPORT_ALL=TRUE \
REQUEST_METHOD=POST \
"$PERL_PATH" \
"$TEST_DIRECTORY"/t5562/invoke-with-content-length.pl \
"$request_body" git http-backend >act.out.$test_count 2>act.err.$test_count
}
ssize_b100dots() {
# hardcoded ((size_t) SSIZE_MAX) + 1
case "$(build_option sizeof-size_t)" in
8) echo 9223372036854775808;;
4) echo 2147483648;;
*) die "Unexpected ssize_t size: $(build_option sizeof-size_t)";;
esac
}
test_expect_success 'setup' '
HTTP_CONTENT_ENCODING="identity" &&
export HTTP_CONTENT_ENCODING &&
git config http.receivepack true &&
test_commit c0 &&
test_commit c1 &&
hash_head=$(git rev-parse HEAD) &&
hash_prev=$(git rev-parse HEAD~1) &&
{
packetize "want $hash_head" &&
printf 0000 &&
packetize "have $hash_prev" &&
packetize "done"
} >fetch_body &&
test_copy_bytes 10 <fetch_body >fetch_body.trunc &&
hash_next=$(git commit-tree -p HEAD -m next HEAD^{tree}) &&
{
printf "%s %s refs/heads/newbranch\\0report-status object-format=%s\\n" \
"$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize_raw &&
printf 0000 &&
echo "$hash_next" | git pack-objects --stdout
} >push_body &&
test_copy_bytes 10 <push_body >push_body.trunc &&
: >empty_body
'
test_expect_success GZIP 'setup, compression related' '
gzip -c fetch_body >fetch_body.gz &&
test_copy_bytes 10 <fetch_body.gz >fetch_body.gz.trunc &&
gzip -c push_body >push_body.gz &&
test_copy_bytes 10 <push_body.gz >push_body.gz.trunc
'
test_expect_success 'fetch plain' '
test_http_env upload fetch_body &&
verify_http_result "200 OK"
'
test_expect_success 'fetch plain truncated' '
test_http_env upload fetch_body.trunc &&
! verify_http_result "200 OK"
'
test_expect_success 'fetch plain empty' '
test_http_env upload empty_body &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'fetch gzipped' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env upload fetch_body.gz &&
verify_http_result "200 OK"
'
test_expect_success GZIP 'fetch gzipped truncated' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env upload fetch_body.gz.trunc &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'fetch gzipped empty' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env upload empty_body &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'push plain' '
test_when_finished "git branch -D newbranch" &&
test_http_env receive push_body &&
verify_http_result "200 OK" &&
git rev-parse newbranch >act.head &&
echo "$hash_next" >exp.head &&
test_cmp act.head exp.head
'
test_expect_success 'push plain truncated' '
test_http_env receive push_body.trunc &&
! verify_http_result "200 OK"
'
test_expect_success 'push plain empty' '
test_http_env receive empty_body &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'push gzipped' '
test_when_finished "git branch -D newbranch" &&
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env receive push_body.gz &&
verify_http_result "200 OK" &&
git rev-parse newbranch >act.head &&
echo "$hash_next" >exp.head &&
test_cmp act.head exp.head
'
test_expect_success GZIP 'push gzipped truncated' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env receive push_body.gz.trunc &&
! verify_http_result "200 OK"
'
test_expect_success GZIP 'push gzipped empty' '
test_env HTTP_CONTENT_ENCODING="gzip" test_http_env receive empty_body &&
! verify_http_result "200 OK"
'
test_expect_success 'CONTENT_LENGTH overflow ssite_t' '
NOT_FIT_IN_SSIZE=$(ssize_b100dots) &&
env \
CONTENT_TYPE=application/x-git-upload-pack-request \
QUERY_STRING=/repo.git/git-upload-pack \
PATH_TRANSLATED="$PWD"/.git/git-upload-pack \
GIT_HTTP_EXPORT_ALL=TRUE \
REQUEST_METHOD=POST \
CONTENT_LENGTH="$NOT_FIT_IN_SSIZE" \
git http-backend </dev/null >/dev/null 2>err &&
grep "fatal:.*CONTENT_LENGTH" err
'
test_expect_success 'empty CONTENT_LENGTH' '
env \
QUERY_STRING="service=git-receive-pack" \
PATH_TRANSLATED="$PWD"/.git/info/refs \
GIT_HTTP_EXPORT_ALL=TRUE \
REQUEST_METHOD=GET \
CONTENT_LENGTH="" \
git http-backend <empty_body >act.out.$test_count 2>act.err.$test_count &&
verify_http_result "200 OK"
'
test_done