Signed-off-by: Christian Couder <chrisc...@tuxfamily.org>
---
 t/t0480-read-object-have-http-e-odb.sh | 109 +++++++++++++++++++++++++++++++++
 t/t0480/read-object-plain-have         | 103 +++++++++++++++++++++++++++++++
 2 files changed, 212 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..056a40f2bb
--- /dev/null
+++ b/t/t0480-read-object-have-http-e-odb.sh
@@ -0,0 +1,109 @@
+#!/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.subprocessCommand "$HELPER"
+'
+
+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.subprocessCommand "$HELPER" &&
+        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.subprocessCommand="$HELPER" --no-local .. .) &&
+       rm -rf my-other-clone
+'
+
+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..d63e327f33
--- /dev/null
+++ b/t/t0480/read-object-plain-have
@@ -0,0 +1,103 @@
+#!/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;
+
+packet_initialize("git-read-object", 1);
+
+packet_read_and_check_capabilities("get_raw_obj", "put_raw_obj", "have");
+packet_write_capabilities("get_raw_obj", "put_raw_obj", "have");
+
+my $http_url = $ENV{HTTPD_URL};
+
+while (1) {
+       my ($res, $command) = packet_txt_read();
+
+       if ( $res == -1 ) {
+               exit 0;
+       }
+
+       $command =~ s/^command=//;
+
+       if ( $command eq "init" ) {
+               packet_bin_read();
+
+               packet_txt_write("status=success");
+               packet_flush();
+       } elsif ( $command eq "have" ) {
+               # read the flush after the command
+               packet_bin_read();
+
+               my $have_url = $http_url . "/list/";
+
+               my $userAgent = LWP::UserAgent->new();
+               my $response = $userAgent->get( $have_url );
+
+               if ($response->is_error) {
+                       packet_bin_write("");
+                       packet_flush();
+                       packet_txt_write("status=failure");
+               } else {
+                       packet_bin_write($response->content);
+                       packet_flush();
+                       packet_txt_write("status=success");
+               }
+               packet_flush();
+       } elsif ( $command eq "get_raw_obj" ) {
+               my ($sha1) = packet_txt_read() =~ /^sha1=([0-9a-f]{40})$/;
+               packet_bin_read();
+
+               my $get_url = $http_url . "/list/?sha1=" . $sha1;
+
+               my $userAgent = LWP::UserAgent->new();
+
+               my $response = $userAgent->get( $get_url );
+
+               if ($response->is_error) {
+                       packet_txt_write("size=0");
+                       packet_txt_write("kind=none");      
+                       packet_txt_write("status=notfound");
+               } else {
+                       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_raw_obj" ) {
+               my ($sha1) = packet_txt_read() =~ /^sha1=([0-9a-f]{40})$/;
+               my ($size) = packet_txt_read() =~ /^size=([0-9]+)$/;
+               my ($kind) = packet_txt_read() =~ /^kind=(\w+)$/;
+
+               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";
+
+               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) {
+                       packet_txt_write("status=failure");
+               } else {
+                       packet_txt_write("status=success");
+               }
+               packet_flush();
+       } else {
+               die "bad command '$command'";
+       }
+}
-- 
2.14.0.rc1.52.gf02fb0ddac.dirty

Reply via email to