diff options
author | Eric Wong <e@80x24.org> | 2021-02-06 12:18:34 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-02-07 03:34:32 +0000 |
commit | 4113bc92d0c4aacc4f95676de74bed63a5687bdf (patch) | |
tree | c4c183e2e9f4ff83007ae15fe40e654985bc305c /lib/PublicInbox/TestCommon.pm | |
parent | 316b81377cfea565de03a5c51d988c1652b85c08 (diff) | |
download | public-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.pm | 93 |
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; |