X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Flei-externals.t;h=f148fa3c2b81a1859ac9bba5523f5aa8d24cf0c0;hb=0b15dfc58ceaecdcb1c9285c3ad55813006c8338;hp=233f609228f0aff842b8805afa76ce2399391a25;hpb=2ee341027929f716636aa7f03057a961d3a02d1c;p=public-inbox.git diff --git a/t/lei-externals.t b/t/lei-externals.t index 233f6092..f148fa3c 100644 --- a/t/lei-externals.t +++ b/t/lei-externals.t @@ -5,28 +5,68 @@ use strict; use v5.10.1; use PublicInbox::TestCommon; use Fcntl qw(SEEK_SET); use PublicInbox::Spawn qw(which); require_git 2.6; -require_mods(qw(DBD::SQLite Search::Xapian)); +require_mods(qw(json DBD::SQLite Search::Xapian)); +use POSIX qw(WTERMSIG WIFSIGNALED SIGPIPE); -my @onions = qw(http://hjrcffqmbrq6wope.onion/meta/ - http://czquwvybam4bgbro.onion/meta/ - http://ou63pmih66umazou.onion/meta/); +my @onions = map { "http://$_.onion/meta/" } qw( + 4uok3hntl7oi7b4uf4rtfwefqeexfzil2w6kgk2jn5z2f764irre7byd + ie5yzdi7fg72h7s4sdcztq5evakq23rdt33mfyfcddc5u3ndnw24ogqd + 7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd); my $test_external_remote = sub { my ($url, $k) = @_; SKIP: { - my $nr = 5; - skip "$k unset", $nr if !$url; - which('curl') or skip 'no curl', $nr; - which('torsocks') or skip 'no torsocks', $nr if $url =~ m!\.onion/!; + skip "$k unset", 1 if !$url; + state $curl = which('curl'); + $curl or skip 'no curl', 1; + which('torsocks') or skip 'no torsocks', 1 if $url =~ m!\.onion/!; my $mid = '20140421094015.GA8962@dcvr.yhbt.net'; my @cmd = ('q', '--only', $url, '-q', "m:$mid"); lei_ok(@cmd, \"query $url"); is($lei_err, '', "no errors on $url"); my $res = json_utf8->decode($lei_out); - is($res->[0]->{'m'}, "<$mid>", "got expected mid from $url"); + is($res->[0]->{'m'}, $mid, "got expected mid from $url") or + skip 'further remote tests', 1; lei_ok(@cmd, 'd:..20101002', \'no results, no error'); is($lei_err, '', 'no output on 404, matching local FS behavior'); is($lei_out, "[null]\n", 'got null results'); + my ($pid_before, $pid_after); + if (-d $ENV{XDG_RUNTIME_DIR} && -w _) { + lei_ok 'daemon-pid'; + chomp($pid_before = $lei_out); + ok($pid_before, 'daemon is live'); + } + for my $out ([], [qw(-f mboxcl2)]) { + pipe(my ($r, $w)) or BAIL_OUT $!; + open my $err, '+>', undef or BAIL_OUT $!; + my $opt = { run_mode => 0, 1 => $w, 2 => $err }; + my $cmd = [qw(lei q -qt), @$out, 'z:1..']; + my $tp = start_script($cmd, undef, $opt); + close $w; + sysread($r, my $buf, 1); + close $r; # trigger SIGPIPE + $tp->join; + ok(WIFSIGNALED($?), "signaled @$out"); + is(WTERMSIG($?), SIGPIPE, "got SIGPIPE @$out"); + seek($err, 0, 0); + my @err = <$err>; + is_deeply(\@err, [], "no errors @$out"); + } + if (-d $ENV{XDG_RUNTIME_DIR} && -w _) { + lei_ok 'daemon-pid'; + chomp(my $pid_after = $lei_out); + is($pid_after, $pid_before, 'pid unchanged') or + skip 'daemon died', 1; + skip 'not killing persistent lei-daemon', 2 if + $ENV{TEST_LEI_DAEMON_PERSIST_DIR}; + lei_ok 'daemon-kill'; + my $alive = 1; + for (1..100) { + $alive = kill(0, $pid_after) or last; + tick(); + } + ok(!$alive, 'daemon-kill worked'); + } } # /SKIP }; # /sub @@ -40,8 +80,12 @@ test_lei(sub { ok(!-e $config_file && !-e $store_dir, 'nothing created by ls-external'); - ok(!lei('add-external', "$home/nonexistent", - "fails on non-existent dir")); + ok(!lei('add-external', "$home/nonexistent"), + "fails on non-existent dir"); + like($lei_err, qr/not a directory/, 'noted non-existence'); + mkdir "$home/new\nline" or BAIL_OUT "mkdir: $!"; + ok(!lei('add-external', "$home/new\nline"), "fails on newline"); + like($lei_err, qr/`\\n' not allowed/, 'newline noted in error'); lei_ok('ls-external', \'ls-external works after add failure'); is($lei_out.$lei_err, '', 'ls-external still has no output'); my $cfg = PublicInbox::Config->new($cfg_path); @@ -51,8 +95,7 @@ test_lei(sub { \'added external'); is($lei_out.$lei_err, '', 'no output'); }); - ok(-s $config_file && -e $store_dir, - 'add-external created config + store'); + ok(-s $config_file, 'add-external created config'); my $lcfg = PublicInbox::Config->new($config_file); $cfg->each_inbox(sub { my ($ibx) = @_; @@ -85,8 +128,10 @@ test_lei(sub { lei_ok qw(_complete lei forget-external), \'complete for externals'; my %comp = map { $_ => 1 } split(/\s+/, $lei_out); ok($comp{'https://example.com/ibx/'}, 'forget external completion'); + my @dirs; $cfg->each_inbox(sub { my ($ibx) = @_; + push @dirs, $ibx->{inboxdir}; ok($comp{$ibx->{inboxdir}}, "local $ibx->{name} completion"); }); for my $u (qw(h http https https: https:/ https:// https://e @@ -115,7 +160,8 @@ test_lei(sub { lei_ok('ls-external'); unlike($lei_out, qr!https://example\.com/ibx/!s, 'removed canonical URL'); -SKIP: { + + # do some queries ok(!lei(qw(q s:prefix -o maildir:/dev/null)), 'bad maildir'); like($lei_err, qr!/dev/null exists and is not a directory!, 'error shown'); @@ -191,7 +237,8 @@ SKIP: { is(scalar(@s), 2, "2 results in mbox$sfx"); lei_ok('q', '-a', '-o', "mboxcl2:$f", 's:nonexistent'); - is(grep(!/^#/, $lei_err), 0, "no errors on no results ($sfx)"); + is(grep(!/^#/, $lei_err), 0, "no errors on no results ($sfx)") + or diag $lei_err; my @s2 = grep(/^Subject:/, $cat->()); is_deeply(\@s2, \@s, @@ -206,6 +253,34 @@ SKIP: { ok(!lei(qw(q --no-local s:see)), '--no-local'); is($? >> 8, 1, 'proper exit code'); like($lei_err, qr/no local or remote.+? to search/, 'no inbox'); + + for my $no (['--no-local'], ['--no-external'], + [qw(--no-local --no-external)]) { + lei_ok(qw(q mid:testmessage@example.com), @$no, + '-I', $dirs[0], \"-I and @$no combine"); + $res = json_utf8->decode($lei_out); + is($res->[0]->{'m'}, 'testmessage@example.com', + "-I \$DIR got results regardless of @$no"); + } + + { + skip 'TEST_LEI_DAEMON_PERSIST_DIR in use', 1 if + $ENV{TEST_LEI_DAEMON_PERSIST_DIR}; + my @q = qw(q -o mboxcl2:rel.mboxcl2 bye); + lei_ok('-C', $home, @q); + is(unlink("$home/rel.mboxcl2"), 1, '-C works before q'); + + # we are more flexible than git, here: + lei_ok(@q, '-C', $home); + is(unlink("$home/rel.mboxcl2"), 1, '-C works after q'); + mkdir "$home/deep" or BAIL_OUT $!; + lei_ok('-C', $home, @q, '-C', 'deep'); + is(unlink("$home/deep/rel.mboxcl2"), 1, 'multiple -C works'); + + lei_ok('-C', '', '-C', $home, @q, '-C', 'deep', '-C', ''); + is(unlink("$home/deep/rel.mboxcl2"), 1, "-C '' accepted"); + ok(!-f "$home/rel.mboxcl2", 'wrong path not created'); + } my %e = ( TEST_LEI_EXTERNAL_HTTPS => 'https://public-inbox.org/meta/', TEST_LEI_EXTERNAL_ONION => $onions[int(rand(scalar(@onions)))], @@ -215,6 +290,5 @@ SKIP: { $url = $e{$k} if $url eq '1'; $test_external_remote->($url, $k); } - }; # /SKIP }); # test_lei done_testing;