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=-4.0 required=3.0 tests=ALL_TRUSTED,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 677EB1FA1A for ; Fri, 18 Dec 2020 12:09:51 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 07/26] t/lei-oneshot: standalone oneshot (non-socket) test Date: Fri, 18 Dec 2020 12:09:31 +0000 Message-Id: <20201218120950.23272-8-e@80x24.org> In-Reply-To: <20201218120950.23272-1-e@80x24.org> References: <20201218120950.23272-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We can use the same "local $ENV{FOO}" hack we do with t/nntpd-v2.t to test the oneshot code path without imposing an extra script in the users' $PATH. --- MANIFEST | 1 + lib/PublicInbox/TestCommon.pm | 2 +- t/lei-oneshot.t | 25 +++++++++++++++++++++++++ t/lei.t | 32 ++++++++++++++++++++------------ 4 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 t/lei-oneshot.t diff --git a/MANIFEST b/MANIFEST index 9eb97d14..898766e7 100644 --- a/MANIFEST +++ b/MANIFEST @@ -320,6 +320,7 @@ t/indexlevels-mirror.t t/init.t t/iso-2202-jp.eml t/kqnotify.t +t/lei-oneshot.t t/lei.t t/lei_store.t t/linkify.t diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index 2116575b..c236c589 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -168,7 +168,7 @@ sub run_script_exit { die RUN_SCRIPT_EXIT; } -my %cached_scripts; +our %cached_scripts; sub key2sub ($) { my ($key) = @_; $cached_scripts{$key} //= do { diff --git a/t/lei-oneshot.t b/t/lei-oneshot.t new file mode 100644 index 00000000..848682ee --- /dev/null +++ b/t/lei-oneshot.t @@ -0,0 +1,25 @@ +#!perl -w +# Copyright (C) 2020 all contributors +# License: AGPL-3.0+ +use strict; +use v5.10.1; +use PublicInbox::TestCommon; +$PublicInbox::TestCommon::cached_scripts{'lei-oneshot'} //= do { + eval <<'EOF'; +package LeiOneshot; +use strict; +use subs qw(exit); +*exit = \&PublicInbox::TestCommon::run_script_exit; +sub main { +# the below "line" directive is a magic comment, see perlsyn(1) manpage +# line 1 "lei-oneshot" + require PublicInbox::LeiDaemon; + PublicInbox::LeiDaemon::oneshot(__PACKAGE__); + 0; +} +1; +EOF + LeiOneshot->can('main'); +}; +local $ENV{TEST_LEI_ONESHOT} = '1'; +require './t/lei.t'; diff --git a/t/lei.t b/t/lei.t index 9fb0ce00..507c7164 100644 --- a/t/lei.t +++ b/t/lei.t @@ -8,6 +8,12 @@ use PublicInbox::TestCommon; use PublicInbox::Config; use File::Path qw(rmtree); require_mods(qw(json DBD::SQLite Search::Xapian)); +my $LEI = 'lei'; +my $lei = sub { + my ($cmd, $env, $opt) = @_; + run_script([$LEI, @$cmd], $env, $opt); +}; + my ($home, $for_destroy) = tmpdir(); my $opt = { 1 => \(my $out = ''), 2 => \(my $err = '') }; delete local $ENV{XDG_DATA_HOME}; @@ -17,21 +23,21 @@ local $ENV{HOME} = $home; mkdir "$home/xdg_run", 0700 or BAIL_OUT "mkdir: $!"; my $test_lei_common = sub { - ok(!run_script([qw(lei)], undef, $opt), 'no args fails'); + ok(!$lei->([], undef, $opt), 'no args fails'); is($? >> 8, 1, '$? is 1'); is($out, '', 'nothing in stdout'); like($err, qr/^usage:/sm, 'usage in stderr'); for my $arg (['-h'], ['--help'], ['help'], [qw(daemon-pid --help)]) { $out = $err = ''; - ok(run_script(['lei', @$arg], undef, $opt), "lei @$arg"); + ok($lei->($arg, undef, $opt), "lei @$arg"); like($out, qr/^usage:/sm, "usage in stdout (@$arg)"); is($err, '', "nothing in stderr (@$arg)"); } for my $arg ([''], ['--halp'], ['halp'], [qw(daemon-pid --halp)]) { $out = $err = ''; - ok(!run_script(['lei', @$arg], undef, $opt), "lei @$arg"); + ok(!$lei->($arg, undef, $opt), "lei @$arg"); is($? >> 8, 1, '$? set correctly'); isnt($err, '', 'something in stderr'); is($out, '', 'nothing in stdout'); @@ -47,29 +53,27 @@ my $test_lei_common = sub { }; my $home_trash = [ "$home/.local", "$home/.config" ]; rmtree($home_trash); - ok(run_script([qw(lei init)], undef, $opt), 'init w/o args'); + ok($lei->(['init'], undef, $opt), 'init w/o args'); $ok_err_info->('after init w/o args'); - ok(run_script([qw(lei init)], undef, $opt), 'idempotent init w/o args'); + ok($lei->(['init'], undef, $opt), 'idempotent init w/o args'); $ok_err_info->('after idempotent init w/o args'); - ok(!run_script([qw(lei init), "$home/x"], undef, $opt), + ok(!$lei->(['init', "$home/x"], undef, $opt), 'init conflict'); is(grep(/^E:/, split(/^/, $err)), 1, 'got error on conflict'); ok(!-e "$home/x", 'nothing created on conflict'); rmtree($home_trash); $err = ''; - ok(run_script([qw(lei init), "$home/x"], undef, $opt), - 'init conflict resolved'); + ok($lei->(['init', "$home/x"], undef, $opt), 'init conflict resolved'); $ok_err_info->('init w/ arg'); - ok(run_script([qw(lei init), "$home/x"], undef, $opt), - 'init idempotent with path'); + ok($lei->(['init', "$home/x"], undef, $opt), 'init idempotent w/ path'); $ok_err_info->('init idempotent w/ arg'); ok(-d "$home/x", 'created dir'); rmtree([ "$home/x", @$home_trash ]); $err = ''; - ok(!run_script([qw(lei init), "$home/x", "$home/2" ], undef, $opt), + ok(!$lei->(['init', "$home/x", "$home/2" ], undef, $opt), 'too many args fails'); like($err, qr/too many/, 'noted excessive'); ok(!-e "$home/x", 'x not created on excessive'); @@ -80,7 +84,9 @@ my $test_lei_common = sub { is($out, '', 'nothing in stdout'); }; +my $test_lei_oneshot = $ENV{TEST_LEI_ONESHOT}; SKIP: { + last SKIP if $test_lei_oneshot; require_mods('IO::FDPass', 16); my $sock = "$ENV{XDG_RUNTIME_DIR}/lei/sock"; @@ -118,10 +124,12 @@ SKIP: { tick(); } ok(!kill(0, $new_pid), 'daemon exits after unlink'); - $test_lei_common = undef; # success over socket, can't test without + # success over socket, can't test without + $test_lei_common = undef; }; require_ok 'PublicInbox::LeiDaemon'; +$LEI = 'lei-oneshot' if $test_lei_oneshot; $test_lei_common->() if $test_lei_common; done_testing;