From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-3.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3CBAF1FB07 for ; Sat, 6 Feb 2021 12:18:45 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 07/17] tests: add test_lei wrapper, split out t/lei-import.t Date: Sat, 6 Feb 2021 12:18:34 +0000 Message-Id: <20210206121844.10979-8-e@80x24.org> In-Reply-To: <20210206121844.10979-1-e@80x24.org> References: <20210206121844.10979-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This will make it easier to maintain and test lei going forward, we need to be testing against existing read-only daemons. We'll also save ourselves some boilerplate by exporting all the Test::More methods directly in TestCommon We'll start using this by splitting out the latest "lei import" tests into its own file. --- MANIFEST | 1 + lib/PublicInbox/TestCommon.pm | 93 ++++++++++++++++++++++++++++++++--- t/lei-import.t | 39 +++++++++++++++ t/lei.t | 35 ------------- 4 files changed, 127 insertions(+), 41 deletions(-) create mode 100644 t/lei-import.t diff --git a/MANIFEST b/MANIFEST index a11d4106..3bece258 100644 --- a/MANIFEST +++ b/MANIFEST @@ -351,6 +351,7 @@ t/init.t t/ipc.t t/iso-2202-jp.eml t/kqnotify.t +t/lei-import.t t/lei-oneshot.t t/lei.t t/lei_dedupe.t diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index 40c2dc9e..2b78731b 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -9,14 +9,17 @@ use v5.10.1; 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 require_mods - run_script start_script key2sub xsys xsys_e xqx eml_load tick - have_xapian_compact); +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 + test_lei $lei $lei_out $lei_err $lei_opt); require Test::More; - *BAIL_OUT = \&Test::More::BAIL_OUT; - *plan = \&Test::More::plan; - *skip = \&Test::More::skip; + my @methods = grep(!/\W/, @Test::More::EXPORT); + eval(join('', map { "*$_=\\&Test::More::$_;" } @methods)); + die $@ if $@; + push @EXPORT, @methods; } sub eml_load ($) { @@ -419,6 +422,84 @@ sub have_xapian_compact () { PublicInbox::Spawn::which($ENV{XAPIAN_COMPACT} || 'xapian-compact'); } +our ($err_skip, $lei_opt, $lei_out, $lei_err); +our $lei = sub { + my ($cmd, $env, $xopt) = @_; + $lei_out = $lei_err = ''; + if (!ref($cmd)) { + ($env, $xopt) = grep { (!defined) || ref } @_; + $cmd = [ grep { defined && !ref } @_ ]; + } + my $res = run_script(['lei', @$cmd], $env, $xopt // $lei_opt); + $err_skip and + $lei_err = join('', grep(!/$err_skip/, split(/^/m, $lei_err))); + $res; +}; + +sub json_utf8 () { + state $x = ref(PublicInbox::Config->json)->new->utf8->canonical; +} + +sub test_lei { +SKIP: { + my ($cb) = pop @_; + my $test_opt = shift // {}; + require_git(2.6) or skip('git 2.6+ required for lei test', 2); + require_mods(qw(json DBD::SQLite Search::Xapian), 2); + require PublicInbox::Config; + delete local $ENV{XDG_DATA_HOME}; + delete local $ENV{XDG_CONFIG_HOME}; + local $ENV{GIT_COMMITTER_EMAIL} = 'lei@example.com'; + local $ENV{GIT_COMMITTER_NAME} = 'lei user'; + my (undef, $fn, $lineno) = caller(0); + my $t = "$fn:$lineno"; + require PublicInbox::Spawn; + state $lei_daemon = PublicInbox::Spawn->can('send_cmd4') || + eval { require Socket::MsgHdr; 1 }; + $lei_opt = { 1 => \$lei_out, 2 => \$lei_err }; + my $daemon_pid; + my ($tmpdir, $for_destroy) = tmpdir(); + SKIP: { + skip <<'EOM', 1 unless $lei_daemon; +Socket::MsgHdr missing or Inline::C is unconfigured/missing +EOM + my $home = "$tmpdir/lei-daemon"; + mkdir($home, 0700) or BAIL_OUT "mkdir: $!"; + local $ENV{HOME} = $home; + my $xrd = "$home/xdg_run"; + mkdir($xrd, 0700) or BAIL_OUT "mkdir: $!"; + local $ENV{XDG_RUNTIME_DIR} = $xrd; + $cb->(); + ok($lei->(qw(daemon-pid)), "daemon-pid after $t"); + chomp($daemon_pid = $lei_out); + if ($daemon_pid) { + ok(kill(0, $daemon_pid), "daemon running after $t"); + ok($lei->(qw(daemon-kill)), "daemon-kill after $t"); + } else { + fail("daemon not running after $t"); + } + }; # SKIP for lei_daemon + unless ($test_opt->{daemon_only}) { + require_ok 'PublicInbox::LEI'; + my $home = "$tmpdir/lei-oneshot"; + mkdir($home, 0700) or BAIL_OUT "mkdir: $!"; + local $ENV{HOME} = $home; + # force sun_path[108] overflow: + my $xrd = "$home/1shot-test".('.sun_path' x 108); + local $err_skip = qr!\Q$xrd!; # for $lei->() filtering + local $ENV{XDG_RUNTIME_DIR} = $xrd; + $cb->(); + } + if ($daemon_pid) { + for (0..10) { + kill(0, $daemon_pid) or last; + tick; + } + ok(!kill(0, $daemon_pid), "$t daemon stopped after oneshot"); + } +}; # SKIP if missing git 2.6+ || Xapian || SQLite || json +} + package PublicInboxTestProcess; use strict; diff --git a/t/lei-import.t b/t/lei-import.t new file mode 100644 index 00000000..709d89fa --- /dev/null +++ b/t/lei-import.t @@ -0,0 +1,39 @@ +#!perl -w +# Copyright (C) 2020-2021 all contributors +# License: AGPL-3.0+ +use strict; use v5.10.1; use PublicInbox::TestCommon; +test_lei(sub { + +ok($lei->(qw(q s:boolean)), 'search miss before import'); +unlike($lei_out, qr/boolean/i, 'no results, yet'); +open my $fh, '<', 't/data/0001.patch' or BAIL_OUT $!; +ok($lei->([qw(import -f eml -)], undef, { %$lei_opt, 0 => $fh }), + 'import single file from stdin'); +close $fh; +ok($lei->(qw(q s:boolean)), 'search hit after import'); +ok($lei->(qw(import -f eml), 't/data/message_embed.eml'), + 'import single file by path'); + +my $str = <<''; +From: a@b +Message-ID: +Status: RO + +my $opt = { %$lei_opt, 0 => \$str }; +ok($lei->([qw(import -f eml -)], undef, $opt), + 'import single file with keywords from stdin'); +$lei->(qw(q m:x@y)); +my $res = json_utf8->decode($lei_out); +is($res->[1], undef, 'only one result'); +is_deeply($res->[0]->{kw}, ['seen'], "message `seen' keyword set"); + +$str =~ tr/x/v/; # v@y +ok($lei->([qw(import --no-kw -f eml -)], undef, $opt), + 'import single file with --no-kw from stdin'); +$lei->(qw(q m:v@y)); +$res = json_utf8->decode($lei_out); +is($res->[1], undef, 'only one result'); +is_deeply($res->[0]->{kw}, [], 'no keywords set'); + +}); +done_testing; diff --git a/t/lei.t b/t/lei.t index df333957..9f92d895 100644 --- a/t/lei.t +++ b/t/lei.t @@ -41,7 +41,6 @@ local $ENV{GIT_COMMITTER_EMAIL} = 'lei@example.com'; local $ENV{GIT_COMMITTER_NAME} = 'lei user'; local $ENV{XDG_RUNTIME_DIR} = "$home/xdg_run"; local $ENV{HOME} = $home; -local $ENV{FOO} = 'BAR'; mkdir "$home/xdg_run", 0700 or BAIL_OUT "mkdir: $!"; my $home_trash = [ "$home/.local", "$home/.config", "$home/junk" ]; my $cleanup = sub { rmtree([@$home_trash, @_]) }; @@ -395,39 +394,6 @@ SKIP: { }; # /SKIP }; -my $test_import = sub { - $cleanup->(); - ok($lei->(qw(q s:boolean)), 'search miss before import'); - unlike($out, qr/boolean/i, 'no results, yet'); - open my $fh, '<', 't/data/0001.patch' or BAIL_OUT $!; - ok($lei->([qw(import -f eml -)], undef, { %$opt, 0 => $fh }), - 'import single file from stdin'); - close $fh; - ok($lei->(qw(q s:boolean)), 'search hit after import'); - ok($lei->(qw(import -f eml), 't/data/message_embed.eml'), - 'import single file by path'); - - my $str = <<''; -From: a@b -Message-ID: -Status: RO - - ok($lei->([qw(import -f eml -)], undef, { %$opt, 0 => \$str }), - 'import single file with keywords from stdin'); - $lei->(qw(q m:x@y)); - my $res = $json->decode($out); - is($res->[1], undef, 'only one result'); - is_deeply($res->[0]->{kw}, ['seen'], "message `seen' keyword set"); - - $str =~ tr/x/v/; # v@y - ok($lei->([qw(import --no-kw -f eml -)], undef, { %$opt, 0 => \$str }), - 'import single file with --no-kw from stdin'); - $lei->(qw(q m:v@y)); - $res = $json->decode($out); - is($res->[1], undef, 'only one result'); - is_deeply($res->[0]->{kw}, [], 'no keywords set'); -}; - my $test_lei_common = sub { $test_help->(); $test_config->(); @@ -435,7 +401,6 @@ my $test_lei_common = sub { $test_external->(); $test_completion->(); $test_fail->(); - $test_import->(); }; if ($ENV{TEST_LEI_ONESHOT}) {