about summary refs log tree commit homepage
path: root/t/nntpd.t
diff options
context:
space:
mode:
Diffstat (limited to 't/nntpd.t')
-rw-r--r--t/nntpd.t65
1 files changed, 36 insertions, 29 deletions
diff --git a/t/nntpd.t b/t/nntpd.t
index 3c171a3b..7052cb6a 100644
--- a/t/nntpd.t
+++ b/t/nntpd.t
@@ -1,21 +1,20 @@
 #!perl -w
-# Copyright (C) 2015-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) 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;
-require_mods(qw(DBD::SQLite));
+require_mods(qw(DBD::SQLite Net::NNTP));
 use PublicInbox::Eml;
 use Socket qw(IPPROTO_TCP TCP_NODELAY);
-use Net::NNTP;
 use Sys::Hostname;
 use POSIX qw(_exit);
-use Digest::SHA;
+use PublicInbox::SHA;
+use PublicInbox::DS;
 
 # t/nntpd-v2.t wraps this for v2
 my $version = $ENV{PI_TEST_VERSION} || 1;
 require_git('2.6') if $version == 2;
 use_ok 'PublicInbox::Msgmap';
-my $lsof = require_cmd('lsof', 1);
-my $fast_idle = eval { require Linux::Inotify2; 1 } //
+my $fast_idle = eval { require PublicInbox::Inotify; 1 } //
                 eval { require IO::KQueue; 1 };
 
 my ($tmpdir, $for_destroy) = tmpdir();
@@ -94,6 +93,13 @@ close $cfgfh or BAIL_OUT;
         is_deeply([$n->group($group)], [ qw(0 1 1), $group ], 'GROUP works');
         is_deeply($n->listgroup($group), [1], 'listgroup OK');
         # TODO: Net::NNTP::listgroup does not support range at the moment
+        my $s = tcp_connect($sock);
+        sysread($s, my $buf, 4096);
+        is($buf, "201 " . hostname . " ready - post via email\r\n",
+                'got greeting');
+        syswrite($s, "LISTGROUP $group 1-1\r\n");
+        $buf = read_til_dot($s);
+        like($buf, qr/\r\n1\r\n/s, 'LISTGROUP with range works');
 
         {
                 my $expect = [ qw(Subject: From: Date: Message-ID:
@@ -121,8 +127,8 @@ close $cfgfh or BAIL_OUT;
                 'references' => '<reftabsqueezed>',
         );
 
-        my $s = tcp_connect($sock);
-        sysread($s, my $buf, 4096);
+        $s = tcp_connect($sock);
+        sysread($s, $buf, 4096);
         is($buf, "201 " . hostname . " ready - post via email\r\n",
                 'got greeting');
 
@@ -298,7 +304,7 @@ Date: Fri, 02 Oct 1993 00:00:00 +0000
                         my %sums;
                         for (1..$nart) {
                                 <$s> =~ /\A220 / or _exit(4);
-                                my $dig = Digest::SHA->new(1);
+                                my $dig = PublicInbox::SHA->new(1);
                                 while (my $l = <$s>) {
                                         last if $l eq ".\r\n";
                                         $dig->add($l);
@@ -321,19 +327,19 @@ Date: Fri, 02 Oct 1993 00:00:00 +0000
         }
         my $noerr = { 2 => \(my $null) };
         SKIP: {
-                if ($INC{'Search/Xapian.pm'} && ($ENV{TEST_RUN_MODE}//2)) {
-                        skip 'Search/Xapian.pm pre-loaded (by t/run.perl?)', 1;
+                if ($INC{'Search/Xapian.pm'} || $INC{'Xapian.pm'} &&
+                                ($ENV{TEST_RUN_MODE} // 2)) {
+                        skip 'Xapian.pm pre-loaded (by xt/check-run.t?)', 1;
                 }
-                $lsof or skip 'lsof missing', 1;
-                my @of = xqx([$lsof, '-p', $td->{pid}], undef, $noerr);
-                skip('lsof broken', 1) if (!scalar(@of) || $?);
-                my @xap = grep m!Search/Xapian!, @of;
-                is_deeply(\@xap, [], 'Xapian not loaded in nntpd');
+                my @of = lsof_pid $td->{pid}, $noerr;
+                my @xap = grep m!\bXapian\b!, @of;
+                is_deeply(\@xap, [], 'Xapian not loaded in nntpd') or
+                        diag explain(\@of);
         }
         # -compact requires Xapian
         SKIP: {
-                require_mods('Search::Xapian', 2);
-                have_xapian_compact or skip 'xapian-compact missing', 2;
+                require_mods('Xapian', 1);
+                have_xapian_compact 1;
                 is(xsys(qw(git config), "--file=$home/.public-inbox/config",
                                 "publicinbox.$group.indexlevel", 'medium'),
                         0, 'upgraded indexlevel');
@@ -352,23 +358,24 @@ Date: Fri, 02 Oct 1993 00:00:00 +0000
                 }
                 ok(run_script([qw(-index -c -j0 --reindex), $ibx->{inboxdir}],
                                 undef, $noerr), '-compacted');
-                select(undef, undef, undef, $fast_idle ? 0.1 : 2.1);
+                tick($fast_idle ? 0.1 : 2.1);
                 $art = $n->article($ex->header('Message-ID'));
                 ok($art, 'new article retrieved after compact');
-                $lsof or skip 'lsof missing', 1;
-                ($^O =~ /\A(?:linux)\z/) or
+                $^O eq 'linux' or
                         skip "lsof /(deleted)/ check untested on $^O", 1;
-                my @lsof = xqx([$lsof, '-p', $td->{pid}], undef, $noerr);
-                my $d = [ grep(/\(deleted\)/, @lsof) ];
-                is_deeply($d, [], 'no deleted files') or diag explain($d);
+                my $fd = "/proc/$td->{pid}/fd";
+                -d $fd or skip '/proc/PID/fd missing', 1;
+                my @of = map readlink, glob "$fd/*";
+                my @d = grep /\(deleted\)/, grep !/batch-command\.err/, @of;
+                is_deeply(\@d, [], 'no deleted files') or diag explain(\@d);
         };
         SKIP: { test_watch($tmpdir, $host_port, $group) };
         {
                 setsockopt($s, IPPROTO_TCP, TCP_NODELAY, 1);
                 syswrite($s, 'HDR List-id 1-');
-                select(undef, undef, undef, 0.15);
+                tick(0.15);
                 ok($td->kill, 'killed nntpd');
-                select(undef, undef, undef, 0.15);
+                tick(0.15);
                 syswrite($s, "\r\n");
                 $buf = '';
                 do {
@@ -407,7 +414,7 @@ sub test_watch {
         use_ok 'PublicInbox::Watch';
         use_ok 'PublicInbox::InboxIdle';
         use_ok 'PublicInbox::Config';
-        require_git('1.8.5', 1) or skip('git 1.8.5+ needed for --urlmatch', 4);
+        require_git('1.8.5', 4);
         my $old_env = { HOME => $ENV{HOME} };
         my $home = "$tmpdir/watch_home";
         mkdir $home or BAIL_OUT $!;
@@ -430,7 +437,7 @@ sub test_watch {
         my $cfg = PublicInbox::Config->new;
         PublicInbox::DS->Reset;
         my $ii = PublicInbox::InboxIdle->new($cfg);
-        my $cb = sub { PublicInbox::DS->SetPostLoopCallback(sub {}) };
+        my $cb = sub { @PublicInbox::DS::post_loop_do = (sub {}) };
         my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup';
         $cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
         my $watcherr = "$tmpdir/watcherr";
@@ -439,7 +446,7 @@ sub test_watch {
         my $w = start_script(['-watch'], undef, { 2 => $err_wr });
 
         diag 'waiting for initial fetch...';
-        PublicInbox::DS->EventLoop;
+        PublicInbox::DS::event_loop();
         diag 'inbox unlocked on initial fetch';
         $w->kill;
         $w->join;