git-commit-vandalism/t/lib-bundle-uri-protocol.sh
Derrick Stolee 738dc7d4a5 bundle-uri: serve bundle.* keys from config
Implement the "bundle-uri" protocol v2 capability by populating the
key=value packet lines from the local Git config. The list of bundles is
provided from the keys beginning with "bundle.".

In the future, we may want to filter this list to be more specific to
the exact known keys that the server intends to share, but for
flexibility at the moment we will assume that the config values are
well-formed.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-12-25 16:24:24 +09:00

200 lines
5.4 KiB
Bash

# Set up and run tests of the 'bundle-uri' command in protocol v2
#
# The test that includes this script should set BUNDLE_URI_PROTOCOL
# to one of "file", "git", or "http".
BUNDLE_URI_TEST_PARENT=
BUNDLE_URI_TEST_URI=
BUNDLE_URI_TEST_BUNDLE_URI=
case "$BUNDLE_URI_PROTOCOL" in
file)
BUNDLE_URI_PARENT=file_parent
BUNDLE_URI_REPO_URI="file://$PWD/file_parent"
BUNDLE_URI_BUNDLE_URI="$BUNDLE_URI_REPO_URI/fake.bdl"
test_set_prereq BUNDLE_URI_FILE
;;
git)
. "$TEST_DIRECTORY"/lib-git-daemon.sh
start_git_daemon --export-all --enable=receive-pack
BUNDLE_URI_PARENT="$GIT_DAEMON_DOCUMENT_ROOT_PATH/parent"
BUNDLE_URI_REPO_URI="$GIT_DAEMON_URL/parent"
BUNDLE_URI_BUNDLE_URI="https://example.com/fake.bdl"
test_set_prereq BUNDLE_URI_GIT
;;
http)
. "$TEST_DIRECTORY"/lib-httpd.sh
start_httpd
BUNDLE_URI_PARENT="$HTTPD_DOCUMENT_ROOT_PATH/http_parent"
BUNDLE_URI_REPO_URI="$HTTPD_URL/smart/http_parent"
BUNDLE_URI_BUNDLE_URI="https://example.com/fake.bdl"
test_set_prereq BUNDLE_URI_HTTP
;;
*)
BUG "Need to pass valid BUNDLE_URI_PROTOCOL (was \"$BUNDLE_URI_PROTOCOL\")"
;;
esac
test_expect_success "setup protocol v2 $BUNDLE_URI_PROTOCOL:// tests" '
git init "$BUNDLE_URI_PARENT" &&
test_commit -C "$BUNDLE_URI_PARENT" one &&
git -C "$BUNDLE_URI_PARENT" config uploadpack.advertiseBundleURIs true
'
case "$BUNDLE_URI_PROTOCOL" in
http)
test_expect_success "setup config for $BUNDLE_URI_PROTOCOL:// tests" '
git -C "$BUNDLE_URI_PARENT" config http.receivepack true
'
;;
*)
;;
esac
BUNDLE_URI_BUNDLE_URI_ESCAPED=$(echo "$BUNDLE_URI_BUNDLE_URI" | test_uri_escape)
test_expect_success "connect with $BUNDLE_URI_PROTOCOL:// using protocol v2: no bundle-uri" '
test_when_finished "rm -f log" &&
test_when_finished "git -C \"$BUNDLE_URI_PARENT\" config uploadpack.advertiseBundleURIs true" &&
git -C "$BUNDLE_URI_PARENT" config uploadpack.advertiseBundleURIs false &&
GIT_TRACE_PACKET="$PWD/log" \
git \
-c protocol.version=2 \
ls-remote --symref "$BUNDLE_URI_REPO_URI" \
>actual 2>err &&
# Server responded using protocol v2
grep "< version 2" log &&
! grep bundle-uri log
'
test_expect_success "connect with $BUNDLE_URI_PROTOCOL:// using protocol v2: have bundle-uri" '
test_when_finished "rm -f log" &&
GIT_TRACE_PACKET="$PWD/log" \
git \
-c protocol.version=2 \
ls-remote --symref "$BUNDLE_URI_REPO_URI" \
>actual 2>err &&
# Server responded using protocol v2
grep "< version 2" log &&
# Server advertised bundle-uri capability
grep "< bundle-uri" log
'
test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: request bundle-uris" '
test_when_finished "rm -rf log cloned cloned2" &&
GIT_TRACE_PACKET="$PWD/log" \
git \
-c transfer.bundleURI=false \
-c protocol.version=2 \
clone "$BUNDLE_URI_REPO_URI" cloned \
>actual 2>err &&
# Server responded using protocol v2
grep "< version 2" log &&
# Server advertised bundle-uri capability
grep "< bundle-uri" log &&
# Client did not issue bundle-uri command
! grep "> command=bundle-uri" log &&
GIT_TRACE_PACKET="$PWD/log" \
git \
-c transfer.bundleURI=true \
-c protocol.version=2 \
clone "$BUNDLE_URI_REPO_URI" cloned2 \
>actual 2>err &&
# Server responded using protocol v2
grep "< version 2" log &&
# Server advertised bundle-uri capability
grep "< bundle-uri" log &&
# Client issued bundle-uri command
grep "> command=bundle-uri" log
'
# The remaining tests will all assume transfer.bundleURI=true
#
# This test can be removed when transfer.bundleURI is enabled by default.
test_expect_success 'enable transfer.bundleURI for remaining tests' '
git config --global transfer.bundleURI true
'
test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol v2" '
test_config -C "$BUNDLE_URI_PARENT" \
bundle.only.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED" &&
# All data about bundle URIs
cat >expect <<-EOF &&
[bundle]
version = 1
mode = all
[bundle "only"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED
EOF
test-tool bundle-uri \
ls-remote \
"$BUNDLE_URI_REPO_URI" \
>actual &&
test_cmp_config_output expect actual
'
test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol v2 and extra data" '
test_config -C "$BUNDLE_URI_PARENT" \
bundle.only.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED" &&
# Extra data should be ignored
test_config -C "$BUNDLE_URI_PARENT" bundle.only.extra bogus &&
# All data about bundle URIs
cat >expect <<-EOF &&
[bundle]
version = 1
mode = all
[bundle "only"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED
EOF
test-tool bundle-uri \
ls-remote \
"$BUNDLE_URI_REPO_URI" \
>actual &&
test_cmp_config_output expect actual
'
test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol v2 with list" '
test_config -C "$BUNDLE_URI_PARENT" \
bundle.bundle1.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-1.bdl" &&
test_config -C "$BUNDLE_URI_PARENT" \
bundle.bundle2.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-2.bdl" &&
test_config -C "$BUNDLE_URI_PARENT" \
bundle.bundle3.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-3.bdl" &&
# All data about bundle URIs
cat >expect <<-EOF &&
[bundle]
version = 1
mode = all
[bundle "bundle1"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-1.bdl
[bundle "bundle2"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-2.bdl
[bundle "bundle3"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-3.bdl
EOF
test-tool bundle-uri \
ls-remote \
"$BUNDLE_URI_REPO_URI" \
>actual &&
test_cmp_config_output expect actual
'