about summary refs log tree commit homepage
path: root/lib/PublicInbox/TestCommon.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-02-06 12:18:34 +0000
committerEric Wong <e@80x24.org>2021-02-07 03:34:32 +0000
commit4113bc92d0c4aacc4f95676de74bed63a5687bdf (patch)
treec4c183e2e9f4ff83007ae15fe40e654985bc305c /lib/PublicInbox/TestCommon.pm
parent316b81377cfea565de03a5c51d988c1652b85c08 (diff)
downloadpublic-inbox-4113bc92d0c4aacc4f95676de74bed63a5687bdf.tar.gz
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.
Diffstat (limited to 'lib/PublicInbox/TestCommon.pm')
-rw-r--r--lib/PublicInbox/TestCommon.pm93
1 files changed, 87 insertions, 6 deletions
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;