#!/bin/sh

test_description='git cat-file --batch-command with remote-object-info command'

. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-cat-file.sh

hello_content="Hello World"
hello_size=$(strlen "$hello_content")
hello_oid=$(echo_without_newline "$hello_content" | git hash-object --stdin)
hello_short_oid=$(git rev-parse --short "$hello_oid")

unstored_content="Hello Git"
unstored_oid=$(echo_without_newline "$unstored_content" | git hash-object --stdin)

# This is how we get 13:
# 13 = <file mode> + <a_space> + <file name> + <a_null>, where
# file mode is 100644, which is 6 characters;
# file name is hello, which is 5 characters
# a space is 1 character and a null is 1 character
tree_size=$(($(test_oid rawsz) + 13))

commit_message="Initial commit"

# This is how we get 137:
# 137 = <tree header> + <a_space> + <a newline> +
# <Author line> + <a newline> +
# <Committer line> + <a newline> +
# <a newline> +
# <commit message length>
# An easier way to calculate is: 1. use `git cat-file commit <commit hash> | wc -c`,
# to get 177, 2. then deduct 40 hex characters to get 137
commit_size=$(($(test_oid hexsz) + 137))

tag_header_without_oid="type blob
tag hellotag
tagger $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
tag_header_without_timestamp="object $hello_oid
$tag_header_without_oid"
tag_description="This is a tag"
tag_content="$tag_header_without_timestamp 0 +0000

$tag_description"

tag_oid=$(echo_without_newline "$tag_content" | git hash-object -t tag --stdin -w)
tag_size=$(strlen "$tag_content")

set_transport_variables () {
	hello_oid=$(echo_without_newline "$hello_content" | git hash-object --stdin)
	tree_oid=$(git -C "$1" write-tree)
	commit_oid=$(echo_without_newline "$commit_message" | git -C "$1" commit-tree $tree_oid)
	tag_oid=$(echo_without_newline "$tag_content" | git -C "$1" hash-object -t tag --stdin -w)
	tag_size=$(strlen "$tag_content")
}

# This section tests --batch-command with remote-object-info command
# Since "%(objecttype)" is currently not supported by the command remote-object-info ,
# the filters are set to "%(objectname) %(objectsize)" in some test cases.

# Test --batch-command remote-object-info with 'git://' transport with
# transfer.advertiseobjectinfo set to true, i.e. server has object-info capability
. "$TEST_DIRECTORY"/lib-git-daemon.sh
start_git_daemon --export-all
daemon_parent=$GIT_DAEMON_DOCUMENT_ROOT_PATH/parent

test_expect_success 'create repo to be served by git-daemon' '
	git init "$daemon_parent" &&
	echo_without_newline "$hello_content" > $daemon_parent/hello &&
	git -C "$daemon_parent" update-index --add hello &&
	git -C "$daemon_parent" config transfer.advertiseobjectinfo true &&
	git clone "$GIT_DAEMON_URL/parent" -n "$daemon_parent/daemon_client_empty"
'

test_expect_success 'batch-command remote-object-info git://' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
		remote-object-info "$GIT_DAEMON_URL/parent" $tree_oid
		remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid
		remote-object-info "$GIT_DAEMON_URL/parent" $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command remote-object-info git:// multiple sha1 per line' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid $commit_oid $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command remote-object-info git:// default filter' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		git cat-file --batch-command >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid
		remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'remote-object-info does not change the default format of info' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		local_content="local object" &&
		local_oid=$(echo_without_newline "$local_content" | git hash-object -w --stdin) &&
		local_size=$(strlen "$local_content") &&

		echo "$local_oid blob $local_size" >expect &&
		echo "$hello_oid $hello_size" >>expect &&
		echo "$local_oid blob $local_size" >>expect &&

		git cat-file --batch-command >actual <<-EOF &&
		info $local_oid
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
		info $local_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command --buffer remote-object-info git://' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid $tree_oid
		remote-object-info "$GIT_DAEMON_URL/parent" $commit_oid $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		flush
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command -Z remote-object-info git:// default filter' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		printf "%s\0" "$hello_oid $hello_size" >expect &&
		printf "%s\0" "$tree_oid $tree_size" >>expect &&
		printf "%s\0" "$commit_oid $commit_size" >>expect &&
		printf "%s\0" "$tag_oid $tag_size" >>expect &&

		printf "%s\0" "$hello_oid missing" >>expect &&
		printf "%s\0" "$tree_oid missing" >>expect &&
		printf "%s\0" "$commit_oid missing" >>expect &&
		printf "%s\0" "$tag_oid missing" >>expect &&

		batch_input="remote-object-info $GIT_DAEMON_URL/parent $hello_oid $tree_oid
remote-object-info $GIT_DAEMON_URL/parent $commit_oid $tag_oid
info $hello_oid
info $tree_oid
info $commit_oid
info $tag_oid
" &&
		echo_without_newline_nul "$batch_input" >commands_null_delimited &&

		git cat-file --batch-command -Z < commands_null_delimited >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'remote-object-info does not support short oids' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		test_must_fail git cat-file --batch-command 2>err <<-EOF &&
		remote-object-info $GIT_DAEMON_URL/parent $hello_short_oid
		EOF
		test_grep "does not support short oids" err
	)
'

test_expect_success 'remote-object-info does not die on missing oid like info' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		git cat-file --batch-command >local <<-EOF &&
		info $unstored_oid
		EOF
		git cat-file --batch-command >remote <<-EOF &&
		remote-object-info $GIT_DAEMON_URL/parent $unstored_oid
		EOF
		test_cmp local remote
	)
'

# This tests depends on %(objecttype) not being supported yet, once supported
# it needs to be updated.
test_expect_success 'unsupported placeholder on remote returns empty string' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		echo "" >expect &&
		git cat-file --batch-command="%(objecttype)" >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'requesting only objectname echoes back' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		echo $hello_oid >expect &&
		git cat-file --batch-command="%(objectname)" >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $hello_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'objectname goes through existence check' '
	(
		set_transport_variables "$daemon_parent" &&
		cd "$daemon_parent/daemon_client_empty" &&

		echo "$unstored_oid missing" >expect &&

		git cat-file --batch-command="%(objectname)" >actual <<-EOF &&
		remote-object-info "$GIT_DAEMON_URL/parent" $unstored_oid
		EOF

		test_cmp expect actual
	)
'

# Test --batch-command remote-object-info with 'git://' and
# transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability
test_expect_success 'batch-command remote-object-info git:// fails when transfer.advertiseobjectinfo=false' '
	(
		git -C "$daemon_parent" config transfer.advertiseobjectinfo false &&
		set_transport_variables "$daemon_parent" &&

		test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
		remote-object-info $GIT_DAEMON_URL/parent $hello_oid $tree_oid $commit_oid $tag_oid
		EOF
		test_grep "object-info capability is not enabled on the server" err &&

		# revert server state back
		git -C "$daemon_parent" config transfer.advertiseobjectinfo true

	)
'

stop_git_daemon

# Test --batch-command remote-object-info with 'file://' transport with
# transfer.advertiseobjectinfo set to true, i.e. server has object-info capability
# shellcheck disable=SC2016
test_expect_success 'create repo to be served by file:// transport' '
	git init server &&
	git -C server config protocol.version 2 &&
	git -C server config transfer.advertiseobjectinfo true &&
	echo_without_newline "$hello_content" > server/hello &&
	git -C server update-index --add hello &&
	git clone -n "file://$(pwd)/server" file_client_empty
'

test_expect_success 'batch-command remote-object-info file://' '
	(
		set_transport_variables "server" &&
		server_path="$(pwd)/server" &&
		cd file_client_empty &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
		remote-object-info "file://${server_path}" $hello_oid
		remote-object-info "file://${server_path}" $tree_oid
		remote-object-info "file://${server_path}" $commit_oid
		remote-object-info "file://${server_path}" $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command remote-object-info file:// multiple sha1 per line' '
	(
		set_transport_variables "server" &&
		server_path="$(pwd)/server" &&
		cd file_client_empty &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&


		git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
		remote-object-info "file://${server_path}" $hello_oid $tree_oid $commit_oid $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command --buffer remote-object-info file://' '
	(
		set_transport_variables "server" &&
		server_path="$(pwd)/server" &&
		cd file_client_empty &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF &&
		remote-object-info "file://${server_path}" $hello_oid $tree_oid
		remote-object-info "file://${server_path}" $commit_oid $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		flush
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command remote-object-info file:// default filter' '
	(
		set_transport_variables "server" &&
		server_path="$(pwd)/server" &&
		cd file_client_empty &&

		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		git cat-file --batch-command >actual <<-EOF &&
		remote-object-info "file://${server_path}" $hello_oid $tree_oid
		remote-object-info "file://${server_path}" $commit_oid $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command -Z remote-object-info file:// default filter' '
	(
		set_transport_variables "server" &&
		server_path="$(pwd)/server" &&
		cd file_client_empty &&

		printf "%s\0" "$hello_oid $hello_size" >expect &&
		printf "%s\0" "$tree_oid $tree_size" >>expect &&
		printf "%s\0" "$commit_oid $commit_size" >>expect &&
		printf "%s\0" "$tag_oid $tag_size" >>expect &&

		printf "%s\0" "$hello_oid missing" >>expect &&
		printf "%s\0" "$tree_oid missing" >>expect &&
		printf "%s\0" "$commit_oid missing" >>expect &&
		printf "%s\0" "$tag_oid missing" >>expect &&

		batch_input="remote-object-info \"file://${server_path}\" $hello_oid $tree_oid
remote-object-info \"file://${server_path}\" $commit_oid $tag_oid
info $hello_oid
info $tree_oid
info $commit_oid
info $tag_oid
" &&
		echo_without_newline_nul "$batch_input" >commands_null_delimited &&

		git cat-file --batch-command -Z < commands_null_delimited >actual &&
		test_cmp expect actual
	)
'

# Test --batch-command remote-object-info with 'file://' and
# transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability
test_expect_success 'batch-command remote-object-info file:// fails when transfer.advertiseobjectinfo=false' '
	(
		set_transport_variables "server" &&
		server_path="$(pwd)/server" &&
		git -C "${server_path}" config transfer.advertiseobjectinfo false &&

		test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
		remote-object-info "file://${server_path}" $hello_oid $tree_oid $commit_oid $tag_oid
		EOF
		test_grep "object-info capability is not enabled on the server" err &&

		# revert server state back
		git -C "${server_path}" config transfer.advertiseobjectinfo true
	)
'

# Test --batch-command remote-object-info with 'http://' transport with
# transfer.advertiseobjectinfo set to true, i.e. server has object-info capability

. "$TEST_DIRECTORY"/lib-httpd.sh
start_httpd

test_expect_success 'create repo to be served by http:// transport' '
	git init "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
	git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config http.receivepack true &&
	git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo true &&
	echo_without_newline "$hello_content" > $HTTPD_DOCUMENT_ROOT_PATH/http_parent/hello &&
	git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" update-index --add hello &&
	git clone "$HTTPD_URL/smart/http_parent" -n "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty"
'

test_expect_success 'batch-command remote-object-info http://' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
		remote-object-info "$HTTPD_URL/smart/http_parent" $tree_oid
		remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid
		remote-object-info "$HTTPD_URL/smart/http_parent" $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command remote-object-info http:// one line' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" >actual <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid $commit_oid $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command --buffer remote-object-info http://' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&

		# These results prove remote-object-info can get object info from the remote
		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		# These results prove remote-object-info did not download objects from the remote
		echo "$hello_oid missing" >>expect &&
		echo "$tree_oid missing" >>expect &&
		echo "$commit_oid missing" >>expect &&
		echo "$tag_oid missing" >>expect &&

		git cat-file --batch-command="%(objectname) %(objectsize)" --buffer >actual <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid
		remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid $tag_oid
		info $hello_oid
		info $tree_oid
		info $commit_oid
		info $tag_oid
		flush
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command remote-object-info http:// default filter' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&

		echo "$hello_oid $hello_size" >expect &&
		echo "$tree_oid $tree_size" >>expect &&
		echo "$commit_oid $commit_size" >>expect &&
		echo "$tag_oid $tag_size" >>expect &&

		git cat-file --batch-command >actual <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid
		remote-object-info "$HTTPD_URL/smart/http_parent" $commit_oid $tag_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'batch-command -Z remote-object-info http:// default filter' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_client_empty" &&

		printf "%s\0" "$hello_oid $hello_size" >expect &&
		printf "%s\0" "$tree_oid $tree_size" >>expect &&
		printf "%s\0" "$commit_oid $commit_size" >>expect &&
		printf "%s\0" "$tag_oid $tag_size" >>expect &&

		batch_input="remote-object-info $HTTPD_URL/smart/http_parent $hello_oid $tree_oid
remote-object-info $HTTPD_URL/smart/http_parent $commit_oid $tag_oid
" &&
		echo_without_newline_nul "$batch_input" >commands_null_delimited &&

		git cat-file --batch-command -Z < commands_null_delimited >actual &&
		test_cmp expect actual
	)
'

test_expect_success 'remote-object-info fails on unsupported filter option (objectsize:disk)' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&

		echo "$hello_oid " >expect &&

		git cat-file --batch-command="%(objectname) %(objectsize:disk)" >actual <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'remote-object-info fails on unsupported filter option (deltabase)' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&

		echo "" >expect &&

		git cat-file --batch-command="%(deltabase)" >actual <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
		EOF
		test_cmp expect actual
	)
'

test_expect_success 'remote-object-info fails on server with legacy protocol' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&

		test_must_fail git -c protocol.version=0 cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
		EOF
		test_grep "object-info requires protocol v2" err
	)
'

test_expect_success 'remote-object-info fails on server with legacy protocol with default filter' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&

		test_must_fail git -c protocol.version=0 cat-file --batch-command 2>err <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid
		EOF
		test_grep "object-info requires protocol v2" err
	)
'

test_expect_success 'remote-object-info fails on malformed OID' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		malformed_object_id="this_id_is_not_valid" &&

		test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $malformed_object_id
		EOF
		test_grep "not a valid object name '$malformed_object_id'" err
	)
'

test_expect_success 'remote-object-info fails on malformed OID with default filter' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		malformed_object_id="this_id_is_not_valid" &&

		test_must_fail git cat-file --batch-command 2>err <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $malformed_object_id
		EOF
		test_grep "not a valid object name '$malformed_object_id'" err
	)
'

test_expect_success 'remote-object-info fails on not providing OID' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		cd "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&

		test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent"
		EOF
		test_grep "remote-object-info requires objects" err
	)
'


# Test --batch-command remote-object-info with 'http://' transport and
# transfer.advertiseobjectinfo set to false, i.e. server does not have object-info capability
test_expect_success 'batch-command remote-object-info http:// fails when transfer.advertiseobjectinfo=false ' '
	(
		set_transport_variables "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" &&
		git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo false &&

		test_must_fail git cat-file --batch-command="%(objectname) %(objectsize)" 2>err <<-EOF &&
		remote-object-info "$HTTPD_URL/smart/http_parent" $hello_oid $tree_oid $commit_oid $tag_oid
		EOF
		test_grep "object-info capability is not enabled on the server" err &&

		# revert server state back
		git -C "$HTTPD_DOCUMENT_ROOT_PATH/http_parent" config transfer.advertiseobjectinfo true
	)
'

# DO NOT add non-httpd-specific tests here, because the last part of this
# test script is only executed when httpd is available and enabled.

test_done
