X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FTestCommon.pm;h=0d15514e2cb6f2859ab2296515fa82d9e05d2574;hb=be940983157a1f8bd353cb1891f6971645c73e5d;hp=af1b2e4f63ef0d964bdb9d268eae3422cbb6931f;hpb=d3934150d6fef1ce90ac44298e58474913028d32;p=public-inbox.git diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index af1b2e4f..0d15514e 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -14,9 +14,9 @@ our @EXPORT; BEGIN { @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods run_script start_script key2sub xsys xsys_e xqx eml_load tick - have_xapian_compact json_utf8 setup_public_inboxes - tcp_host_port test_lei lei lei_ok - $lei_out $lei_err $lei_opt); + have_xapian_compact json_utf8 setup_public_inboxes create_inbox + tcp_host_port test_lei lei lei_ok $lei_out $lei_err $lei_opt + test_httpd); require Test::More; my @methods = grep(!/\W/, @Test::More::EXPORT); eval(join('', map { "*$_=\\&Test::More::$_;" } @methods)); @@ -559,8 +559,8 @@ sub setup_public_inboxes () { local $ENV{PI_CONFIG} = $pi_config; for my $V (1, 2) { - run_script([qw(-init), "-V$V", "t$V", - '--newsgroup', "t.v$V", + run_script([qw(-init --skip-docdata), "-V$V", + '--newsgroup', "t.v$V", "t$V", "$test_home/t$V", "http://example.com/t$V", "t$V\@example.com" ]) or BAIL_OUT "init v$V"; } @@ -570,6 +570,7 @@ sub setup_public_inboxes () { my $seen = 0; $cfg->each_inbox(sub { my ($ibx) = @_; + $ibx->{-no_fsync} = 1; my $im = PublicInbox::InboxWritable->new($ibx)->importer(0); my $V = $ibx->version; my @eml = (glob('t/*.eml'), 't/data/0001.patch'); @@ -579,16 +580,88 @@ sub setup_public_inboxes () { $seen++; } $im->done; - if ($V == 1) { - run_script(['-index', $ibx->{inboxdir}]) or - BAIL_OUT 'index v1'; - } }); $seen or BAIL_OUT 'no imports'; open my $fh, '>', $stamp or BAIL_OUT "open $stamp: $!"; @ret; +} + +sub create_inbox ($$;@) { + my $ident = shift; + my $cb = pop; + my %opt = @_; + require PublicInbox::Lock; + require PublicInbox::InboxWritable; + my ($base) = ($0 =~ m!\b([^/]+)\.[^\.]+\z!); + my $dir = "t/data-gen/$base.$ident"; + my $new = !-d $dir; + if ($new) { + mkdir $dir; # may race + -d $dir or BAIL_OUT "$dir could not be created: $!"; + } + my $lk = bless { lock_path => "$dir/creat.lock" }, 'PublicInbox::Lock'; + $opt{inboxdir} = File::Spec->rel2abs($dir); + $opt{name} //= $ident; + my $scope = $lk->lock_for_scope; + my $pre_cb = delete $opt{pre_cb}; + $pre_cb->($dir) if $pre_cb && $new; + $opt{-no_fsync} = 1; + my $no_gc = delete $opt{-no_gc}; + my $tmpdir = delete $opt{tmpdir}; + my $addr = $opt{address} // []; + $opt{-primary_address} //= $addr->[0] // "$ident\@example.com"; + my $parallel = delete($opt{importer_parallel}) // 0; + my $creat_opt = { nproc => delete($opt{nproc}) // 1 }; + my $ibx = PublicInbox::InboxWritable->new({ %opt }, $creat_opt); + if (!-f "$dir/creat.stamp") { + my $im = $ibx->importer($parallel); + $cb->($im, $ibx); + $im->done if $im; + unless ($no_gc) { + my @to_gc = $ibx->version == 1 ? ($ibx->{inboxdir}) : + glob("$ibx->{inboxdir}/git/*.git"); + for my $dir (@to_gc) { + xsys_e([ qw(git gc -q) ], { GIT_DIR => $dir }); + } + } + open my $s, '>', "$dir/creat.stamp" or + BAIL_OUT "error creating $dir/creat.stamp: $!"; + } + if ($tmpdir) { + undef $ibx; + xsys([qw(/bin/cp -Rp), $dir, $tmpdir]) == 0 or + BAIL_OUT "cp $dir $tmpdir"; + $opt{inboxdir} = $tmpdir; + $ibx = PublicInbox::InboxWritable->new(\%opt); + } + $ibx; +} + +sub test_httpd ($$;$) { + my ($env, $client, $skip) = @_; + for (qw(PI_CONFIG TMPDIR)) { + $env->{$_} or BAIL_OUT "$_ unset"; + } + SKIP: { + require_mods(qw(Plack::Test::ExternalServer), $skip // 1); + my $sock = tcp_server() or die; + my ($out, $err) = map { "$env->{TMPDIR}/std$_.log" } qw(out err); + my $cmd = [ qw(-httpd -W0), "--stdout=$out", "--stderr=$err" ]; + my $td = start_script($cmd, $env, { 3 => $sock }); + my ($h, $p) = tcp_host_port($sock); + local $ENV{PLACK_TEST_EXTERNALSERVER_URI} = "http://$h:$p"; + Plack::Test::ExternalServer::test_psgi(client => $client); + $td->join('TERM'); + open my $fh, '<', $err or BAIL_OUT $!; + my $e = do { local $/; <$fh> }; + if ($e =~ s/^Plack::Middleware::ReverseProxy missing,\n//gms) { + $e =~ s/^URL generation for redirects .*\n//gms; + } + is($e, '', 'no errors'); + } }; + package PublicInboxTestProcess; use strict;