X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fv2mirror.t;h=665a4d594f93e445f07cd96fa9a73595e2763ca2;hb=1ed1a566c7d300ab8afb604b2e7c939299318005;hp=b0075fcc88702b14c954bb606252a6bcd186a7f9;hpb=3937f58b74e4b764e76ade523fec8497aa1b0611;p=public-inbox.git diff --git a/t/v2mirror.t b/t/v2mirror.t index b0075fcc..665a4d59 100644 --- a/t/v2mirror.t +++ b/t/v2mirror.t @@ -1,19 +1,17 @@ # Copyright (C) 2018-2021 all contributors # License: AGPL-3.0+ use strict; -use warnings; -use Test::More; +use v5.10.1; use PublicInbox::TestCommon; -use File::Path qw(remove_tree); +use File::Path qw(remove_tree make_path); use Cwd qw(abs_path); require_git(2.6); +require_cmd('curl'); local $ENV{HOME} = abs_path('t'); # Integration tests for HTTP cloning + mirroring require_mods(qw(Plack::Util Plack::Builder HTTP::Date HTTP::Status Search::Xapian DBD::SQLite)); -use IO::Socket; -use POSIX qw(dup2); use_ok 'PublicInbox::V2Writable'; use PublicInbox::InboxWritable; use PublicInbox::Eml; @@ -99,13 +97,10 @@ $ibx->cleanup; my @new_epochs; my $fetch_each_epoch = sub { - my $mf = "$tmpdir/m/manifest.js.gz"; - if (my @st = stat($mf)) { - utime($st[8], $st[9] - 1, $mf) or xbail "utime $mf: $!"; - } my %before = map { $_ => 1 } glob("$tmpdir/m/git/*"); - run_script([qw(-fetch -q)], undef, {-C => "$tmpdir/m"}) or + run_script([qw(-fetch --exit-code -q)], undef, {-C => "$tmpdir/m"}) or xbail '-fetch fail'; + is($?, 0, '--exit-code 0 after fetch updated'); my @after = grep { !$before{$_} } glob("$tmpdir/m/git/*"); push @new_epochs, @after; }; @@ -234,10 +229,41 @@ EOF is(scalar($mset->items), 0, 'large message not re-indexed'); } ok(scalar(@new_epochs), 'new epochs were created and fetched'); +for my $d (@new_epochs) { + is(xqx(['git', "--git-dir=$d", 'config', qw(include.path)]), + "../../all.git/config\n", + 'include.path set'); +} + +if ('test read-only epoch dirs') { + my @git = ('git', "--git-dir=$new_epochs[0]"); + my $get_objs = [@git, + qw(cat-file --buffer --batch-check --batch-all-objects)]; + my $before = [sort xqx($get_objs)]; + + remove_tree(map { "$new_epochs[0]/$_" } qw(objects refs/heads)); + chmod(0555, $new_epochs[0]) or xbail "chmod: $!"; + + # force a refetch + unlink("$tmpdir/m/manifest.js.gz") or xbail "unlink: $!"; + + run_script([qw(-fetch -q)], undef, {-C => "$tmpdir/m"}) or + xbail '-fetch failed'; + + ok(!-d "$new_epochs[0]/objects", 'no objects after fetch to R/O dir'); + + chmod(0755, $new_epochs[0]) or xbail "chmod: $!"; + mkdir("$new_epochs[0]/objects") or xbail "mkdir: $!"; + mkdir("$new_epochs[0]/refs/heads") or xbail "mkdir: $!"; + + my $err = ''; + run_script([qw(-fetch -q)], undef, {-C => "$tmpdir/m", 2 => \$err}) or + xbail '-fetch failed '.$err; + is_deeply([ sort xqx($get_objs) ], $before, + 'fetch restored objects once GIT_DIR became writable'); +} ok($td->kill, 'killed httpd'); $td->join; -done_testing(); - -1; +done_testing;