Signed-off-by: Christian Couder <[email protected]>
---
t/t0480-read-object-have-http-e-odb.sh | 123 +++++++++++++++++++++++++++++++++
t/t0480/read-object-plain-have | 116 +++++++++++++++++++++++++++++++
2 files changed, 239 insertions(+)
create mode 100755 t/t0480-read-object-have-http-e-odb.sh
create mode 100755 t/t0480/read-object-plain-have
diff --git a/t/t0480-read-object-have-http-e-odb.sh
b/t/t0480-read-object-have-http-e-odb.sh
new file mode 100755
index 0000000000..52fb4d46c9
--- /dev/null
+++ b/t/t0480-read-object-have-http-e-odb.sh
@@ -0,0 +1,123 @@
+#!/bin/sh
+
+test_description='tests for read-object process with "have" cap and plain
objects'
+
+. ./test-lib.sh
+
+# If we don't specify a port, the current test number will be used
+# which will not work as it is less than 1024, so it can only be used by root.
+LIB_HTTPD_PORT=$(expr ${this_test#t} + 12000)
+
+. "$TEST_DIRECTORY"/lib-httpd.sh
+
+start_httpd apache-e-odb.conf
+
+PATH="$PATH:$TEST_DIRECTORY/t0480"
+
+# odb helper script must see this
+export HTTPD_URL
+
+HELPER="read-object-plain-have"
+
+test_expect_success 'setup repo with a root commit' '
+ test_commit zero
+'
+
+test_expect_success 'setup another repo from the first one' '
+ git init other-repo &&
+ (cd other-repo &&
+ git remote add origin .. &&
+ git pull origin master &&
+ git checkout master &&
+ git log)
+'
+
+test_expect_success 'setup the helper in the root repo' '
+ git config odb.magic.command "$HELPER" &&
+ git config odb.magic.fetchKind "plainObject"
+'
+
+UPLOADFILENAME="hello_apache_upload.txt"
+
+UPLOAD_URL="$HTTPD_URL/upload/?sha1=$UPLOADFILENAME&size=123&type=blob"
+
+test_expect_success 'can upload a file' '
+ echo "Hello Apache World!" >hello_to_send.txt &&
+ echo "How are you?" >>hello_to_send.txt &&
+ curl --data-binary @hello_to_send.txt --include "$UPLOAD_URL"
>out_upload
+'
+
+LIST_URL="$HTTPD_URL/list/"
+
+test_expect_success 'can list uploaded files' '
+ curl --include "$LIST_URL" >out_list &&
+ grep "$UPLOADFILENAME" out_list
+'
+
+test_expect_success 'can delete uploaded files' '
+ curl --data "delete" --include "$UPLOAD_URL&delete=1" >out_delete &&
+ curl --include "$LIST_URL" >out_list2 &&
+ ! grep "$UPLOADFILENAME" out_list2
+'
+
+FILES_DIR="httpd/www/files"
+
+test_expect_success 'new blobs are transfered to the http server' '
+ test_commit one &&
+ hash1=$(git ls-tree HEAD | grep one.t | cut -f1 | cut -d\ -f3) &&
+ echo "$hash1-4-blob" >expected &&
+ ls "$FILES_DIR" >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'blobs can be retrieved from the http server' '
+ git cat-file blob "$hash1" &&
+ git log -p >expected
+'
+
+test_expect_success 'update other repo from the first one' '
+ (cd other-repo &&
+ git fetch origin "refs/odbs/magic/*:refs/odbs/magic/*" &&
+ test_must_fail git cat-file blob "$hash1" &&
+ git config odb.magic.command "$HELPER" &&
+ git config odb.magic.fetchKind "plainObject" &&
+ git cat-file blob "$hash1" &&
+ git pull origin master)
+'
+
+test_expect_success 'local clone from the first repo' '
+ mkdir my-clone &&
+ (cd my-clone &&
+ git clone .. . &&
+ git cat-file blob "$hash1")
+'
+
+test_expect_success 'no-local clone from the first repo fails' '
+ mkdir my-other-clone &&
+ (cd my-other-clone &&
+ test_must_fail git clone --no-local .. .) &&
+ rm -rf my-other-clone
+'
+
+test_expect_success 'no-local clone from the first repo with helper succeeds' '
+ mkdir my-other-clone &&
+ (cd my-other-clone &&
+ git clone -c odb.magic.command="$HELPER" \
+ -c odb.magic.plainObjects="true" \
+ --no-local .. .) &&
+ rm -rf my-other-clone
+'
+
+test_expect_success 'no-local initial-refspec clone succeeds' '
+ mkdir my-other-clone &&
+ (cd my-other-clone &&
+ git config odb.magic.command "$HELPER" &&
+ git config odb.magic.fetchKind "plainObject" &&
+ git -c odb.magic.command="$HELPER" \
+ -c odb.magic.plainObjects="true" \
+ clone --no-local --initial-refspec
"refs/odbs/magic/*:refs/odbs/magic/*" .. .)
+'
+
+stop_httpd
+
+test_done
diff --git a/t/t0480/read-object-plain-have b/t/t0480/read-object-plain-have
new file mode 100755
index 0000000000..dbed8eaefb
--- /dev/null
+++ b/t/t0480/read-object-plain-have
@@ -0,0 +1,116 @@
+#!/usr/bin/perl
+#
+
+use 5.008;
+use lib (split(/:/, $ENV{GITPERLLIB}));
+use strict;
+use warnings;
+use Git::Packet;
+use LWP::UserAgent;
+use HTTP::Request::Common;
+
+print STDERR "read-object-plain-have: starting\n";
+
+packet_initialize("git-read-object", 1);
+
+print STDERR "read-object-plain-have: after init\n";
+
+packet_read_and_check_capabilities("get", "put", "have");
+packet_write_capabilities("get", "put", "have");
+
+print STDERR "read-object-plain-have: after reading and writing get and have
capabilities\n";
+
+my $http_url = $ENV{HTTPD_URL};
+
+while (1) {
+ my ($command) = packet_txt_read() =~ /^command=([^=]+)$/;
+
+ print STDERR "read-object-plain-have: command: '$command'\n";
+
+ if ( $command eq "have" ) {
+ # read the flush after the command
+ packet_bin_read();
+
+ my $have_url = $http_url . "/list/";
+ print STDERR "read-object-plain-have: have_url: '$have_url'\n";
+
+ my $userAgent = LWP::UserAgent->new();
+ my $response = $userAgent->get( $have_url );
+
+ if ($response->is_error) {
+ print STDERR $response->error_as_HTML . "\n";
+ packet_bin_write("");
+ packet_flush();
+ packet_txt_write("status=failure");
+ } else {
+ print STDERR "content: \n";
+ print STDERR $response->content;
+ packet_bin_write($response->content);
+ packet_flush();
+ packet_txt_write("status=success");
+ }
+ packet_flush();
+ } elsif ( $command eq "get" ) {
+ my ($sha1) = packet_txt_read() =~ /^sha1=([0-9a-f]{40})$/;
+ packet_bin_read();
+
+ my $get_url = $http_url . "/list/?sha1=" . $sha1;
+ print STDERR "read-object-plain-have: get_url: '$get_url'\n";
+
+ my $userAgent = LWP::UserAgent->new();
+
+ my $response = $userAgent->get( $get_url );
+
+ if ($response->is_error) {
+ print STDERR $response->error_as_HTML . "\n";
+ packet_txt_write("size=0");
+ packet_txt_write("kind=none");
+ packet_txt_write("status=notfound");
+ } else {
+ print STDERR "content: \n";
+ print STDERR $response->content;
+ packet_txt_write("size=" . length($response->content));
+ packet_txt_write("kind=blob");
+ packet_bin_write($response->content);
+ packet_flush();
+ packet_txt_write("status=success");
+ }
+
+ packet_flush();
+ } elsif ( $command eq "put" ) {
+ my ($sha1) = packet_txt_read() =~ /^sha1=([0-9a-f]{40})$/;
+ print STDERR "read-object-plain-have: put sha1: '$sha1'\n";
+
+ my ($size) = packet_txt_read() =~ /^size=([0-9]+)$/;
+ print STDERR "read-object-plain-have: put size: '$size'\n";
+
+ my ($kind) = packet_txt_read() =~ /^kind=(\w+)$/;
+ print STDERR "read-object-plain-have: put kind: '$kind'\n";
+
+ packet_bin_read();
+
+ # We must read the content we are sent and send it to the right
url
+ my ($res, $buf) = packet_bin_read();
+ die "bad packet_bin_read res ($res)" unless ($res eq 0);
+ ( packet_bin_read() eq ( 1, "" ) ) || die "bad send end";
+
+ my $upload_url = $http_url . "/upload/?sha1=" . $sha1 .
"&size=" . $size . "&type=blob";
+ print STDERR "read-object-plain-have: upload_url:
'$upload_url'\n";
+ print STDERR "read-object-plain-have: upload buffer: '$buf'\n";
+
+ my $userAgent = LWP::UserAgent->new();
+ my $request = POST $upload_url, Content_Type =>
'multipart/form-data', Content => $buf;
+
+ my $response = $userAgent->request($request);
+
+ if ($response->is_error) {
+ print STDERR $response->error_as_HTML . "\n";
+ packet_txt_write("status=failure");
+ } else {
+ packet_txt_write("status=success");
+ }
+ packet_flush();
+ } else {
+ die "bad command '$command'";
+ }
+}
--
2.13.1.565.gbfcd7a9048