From: Eric Wong <e@80x24.org>
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 [thread overview]
Message-ID: <20210206121844.10979-8-e@80x24.org> (raw)
In-Reply-To: <20210206121844.10979-1-e@80x24.org>
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 <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+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: <x@y>
+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: <x@y>
-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}) {
next prev parent reply other threads:[~2021-02-06 12:18 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-06 12:18 [PATCH 00/17] lei: more random updates Eric Wong
2021-02-06 12:18 ` [PATCH 01/17] lei_overview: drop unnecessary autoflush call Eric Wong
2021-02-06 12:18 ` [PATCH 02/17] lei: favor "keywords" over "flags", test --no-kw Eric Wong
2021-02-06 12:18 ` [PATCH 03/17] lei: fix completion of --no-kw / --no-keywords Eric Wong
2021-02-06 12:18 ` [PATCH 04/17] lei: abort lei_import worker on client abort Eric Wong
2021-02-06 12:18 ` [PATCH 05/17] init: lowercase -j for --jobs Eric Wong
2021-02-06 12:18 ` [PATCH 06/17] lei_query: trim curl options Eric Wong
2021-02-06 12:18 ` Eric Wong [this message]
2021-02-06 12:18 ` [PATCH 08/17] t/lei-externals: split out into separate test Eric Wong
2021-02-06 12:18 ` [PATCH 09/17] t/tests: split out setup_public_inboxes sub Eric Wong
2021-02-06 12:18 ` [PATCH 10/17] tests: split out lei-daemon.t from lei.t Eric Wong
2021-02-06 12:18 ` [PATCH 11/17] treewide: replace confess with croak Eric Wong
2021-02-06 12:18 ` [PATCH 12/17] script/lei: avoid waitpid(-1, ...) to keep tests fast Eric Wong
2021-02-06 12:18 ` [PATCH 13/17] lei: add-external --mirror support Eric Wong
2021-02-06 12:18 ` [PATCH 14/17] lei help: split out into separate file Eric Wong
2021-02-06 12:18 ` [PATCH 15/17] lei add-external: reject index and remote opts w/o mirror Eric Wong
2021-02-06 12:18 ` [PATCH 16/17] lei_curl: replace -K/--config with --curl-config Eric Wong
2021-02-06 12:18 ` [PATCH 17/17] lei: remove short switch support for curl(1) options Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://public-inbox.org/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210206121844.10979-8-e@80x24.org \
--to=e@80x24.org \
--cc=meta@public-inbox.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).