X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FTestCommon.pm;h=6e3e9d8c8f506a92b195f15c4cd558a60b8ef31a;hb=cffc7d4fc1c36169654f8447b23b3c5c43830eed;hp=372cafa60d3e38b6eedc22325b2b64423185f007;hpb=3f7c0003047a81375d5a6f8c0633a43893d75cc1;p=public-inbox.git
diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm
index 372cafa6..6e3e9d8c 100644
--- a/lib/PublicInbox/TestCommon.pm
+++ b/lib/PublicInbox/TestCommon.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2015-2019 all contributors
+# Copyright (C) 2015-2020 all contributors
# License: AGPL-3.0+
# internal APIs used only for tests
@@ -8,7 +8,7 @@ use parent qw(Exporter);
use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD :seek);
use POSIX qw(dup2);
use IO::Socket::INET;
-our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git
+our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods
run_script start_script key2sub);
sub tmpdir (;$) {
@@ -59,6 +59,32 @@ sub require_git ($;$) {
1;
}
+sub require_mods {
+ my @mods = @_;
+ my $maybe = pop @mods if $mods[-1] =~ /\A[0-9]+\z/;
+ my @need;
+ for my $mod (@mods) {
+ if ($mod eq 'Search::Xapian') {
+ if (eval { require PublicInbox::Search } &&
+ PublicInbox::Search::load_xapian()) {
+ next;
+ }
+ } elsif ($mod eq 'Search::Xapian::WritableDatabase') {
+ if (eval { require PublicInbox::SearchIdx } &&
+ PublicInbox::SearchIdx::load_xapian_writable()){
+ next;
+ }
+ } else {
+ eval "require $mod";
+ }
+ push @need, $mod if $@;
+ }
+ return unless @need;
+ my $m = join(', ', @need)." missing for $0";
+ Test::More::skip($m, $maybe) if $maybe;
+ Test::More::plan(skip_all => $m)
+}
+
sub key2script ($) {
my ($key) = @_;
return $key if (index($key, '/') >= 0);
@@ -93,11 +119,11 @@ sub _undo_redirects ($) {
}
}
-# $opt->{run_mode} (or $ENV{TEST_RUN_MODE}) allows chosing between
+# $opt->{run_mode} (or $ENV{TEST_RUN_MODE}) allows choosing between
# three ways to spawn our own short-lived Perl scripts for testing:
#
# 0 - (fork|vfork) + execve, the most realistic but slowest
-# 1 - preloading and running in a forked subprocess (fast)
+# 1 - (not currently implemented)
# 2 - preloading and running in current process (slightly faster than 1)
#
# 2 is not compatible with scripts which use "exit" (which we'll try to
@@ -169,21 +195,26 @@ sub run_script ($;$$) {
my $spawn_opt = {};
for my $fd (0..2) {
my $redir = $opt->{$fd};
- next unless ref($redir);
- open my $fh, '+>', undef or die "open: $!";
- $fhref->[$fd] = $fh;
- $spawn_opt->{$fd} = fileno($fh);
- next if $fd > 0;
- $fh->autoflush(1);
- print $fh $$redir or die "print: $!";
- seek($fh, 0, SEEK_SET) or die "seek: $!";
+ my $ref = ref($redir);
+ if ($ref eq 'SCALAR') {
+ open my $fh, '+>', undef or die "open: $!";
+ $fhref->[$fd] = $fh;
+ $spawn_opt->{$fd} = $fh;
+ next if $fd > 0;
+ $fh->autoflush(1);
+ print $fh $$redir or die "print: $!";
+ seek($fh, 0, SEEK_SET) or die "seek: $!";
+ } elsif ($ref eq 'GLOB') {
+ $spawn_opt->{$fd} = $fhref->[$fd] = $redir;
+ } elsif ($ref) {
+ die "unable to deal with $ref $redir";
+ }
}
if ($run_mode == 0) {
# spawn an independent new process, like real-world use cases:
require PublicInbox::Spawn;
my $cmd = [ key2script($key), @argv ];
my $pid = PublicInbox::Spawn::spawn($cmd, $env, $spawn_opt);
- defined($pid) or die "spawn: $!";
if (defined $pid) {
my $r = waitpid($pid, 0);
defined($r) or die "waitpid: $!";
@@ -216,7 +247,7 @@ sub wait_for_tail () { sleep(2) }
sub start_script {
my ($cmd, $env, $opt) = @_;
my ($key, @argv) = @$cmd;
- my $run_mode = $ENV{TEST_RUN_MODE} // $opt->{run_mode} // 1;
+ my $run_mode = $ENV{TEST_RUN_MODE} // $opt->{run_mode} // 2;
my $sub = $run_mode == 0 ? undef : key2sub($key);
my $tail_pid;
if (my $tail_cmd = $ENV{TAIL}) {