use strict;
use warnings;
use Test::More;
-foreach my $mod (qw(DBD::SQLite Search::Xapian Danga::Socket)) {
+foreach my $mod (qw(DBD::SQLite)) {
eval "require $mod";
plan skip_all => "$mod missing for nntpd.t" if $@;
}
require PublicInbox::SearchIdx;
require PublicInbox::Msgmap;
-use Cwd;
+require PublicInbox::InboxWritable;
use Email::Simple;
use IO::Socket;
-use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD);
-use Socket qw(SO_KEEPALIVE IPPROTO_TCP TCP_NODELAY);
+use Socket qw(IPPROTO_TCP TCP_NODELAY);
use File::Temp qw/tempdir/;
use Net::NNTP;
use Sys::Hostname;
+require './t/common.perl';
+
+# FIXME: make easier to test both versions
+my $version = $ENV{PI_VERSION} || 2;
+require_git('2.6') if $version == 2;
my $tmpdir = tempdir('pi-nntpd-XXXXXX', TMPDIR => 1, CLEANUP => 1);
my $home = "$tmpdir/pi-home";
my $addr = $group . '@example.com';
my $nntpd = 'blib/script/public-inbox-nntpd';
my $init = 'blib/script/public-inbox-init';
-use_ok 'PublicInbox::Import';
-use_ok 'PublicInbox::Inbox';
-use_ok 'PublicInbox::Git';
-use_ok 'PublicInbox::V2Writable';
+SKIP: {
+ skip "git 2.6+ required for V2Writable", 1 if $version == 1;
+ use_ok 'PublicInbox::V2Writable';
+}
-# XXX FIXME: make it easier to test both versions
-my $version = int($ENV{PI_VERSION} || 1);
my %opts = (
LocalAddr => '127.0.0.1',
ReuseAddr => 1,
name => $group,
version => $version,
-primary_address => $addr,
+ indexlevel => 'basic',
};
$ibx = PublicInbox::Inbox->new($ibx);
{
local $ENV{HOME} = $home;
my @cmd = ($init, $group, $mainrepo, 'http://example.com/', $addr);
- push @cmd, "-V$version";
+ push @cmd, "-V$version", '-Lbasic';
is(system(@cmd), 0, 'init OK');
is(system(qw(git config), "--file=$home/.public-inbox/config",
"publicinbox.$group.newsgroup", $group),
0, 'enabled newsgroup');
my $len;
- my $im;
- if ($version == 2) {
- $im = PublicInbox::V2Writable->new($ibx);
- } elsif ($version == 1) {
- my $git = PublicInbox::Git->new($mainrepo);
- $im = PublicInbox::Import->new($git, 'test', $addr);
- } else {
- die "unsupported version: $version";
- }
+ $ibx = PublicInbox::InboxWritable->new($ibx);
+ my $im = $ibx->importer;
# ensure successful message delivery
{
}
ok($sock, 'sock created');
- $! = 0;
- my $fl = fcntl($sock, F_GETFD, 0);
- ok(! $!, 'no error from fcntl(F_GETFD)');
- is($fl, FD_CLOEXEC, 'cloexec set by default (Perl behavior)');
- $pid = fork;
- if ($pid == 0) {
- use POSIX qw(dup2);
- # pretend to be systemd
- fcntl($sock, F_SETFD, $fl &= ~FD_CLOEXEC);
- dup2(fileno($sock), 3) or die "dup2 failed: $!\n";
- $ENV{LISTEN_PID} = $$;
- $ENV{LISTEN_FDS} = 1;
- exec $nntpd, "--stdout=$out", "--stderr=$err";
- die "FAIL: $!\n";
- }
+ my $cmd = [ $nntpd, "--stdout=$out", "--stderr=$err" ];
+ $pid = spawn_listener(undef, $cmd, [ $sock ]);
ok(defined $pid, 'forked nntpd process successfully');
- $! = 0;
- fcntl($sock, F_SETFD, $fl |= FD_CLOEXEC);
- ok(! $!, 'no error from fcntl(F_SETFD)');
my $host_port = $sock->sockhost . ':' . $sock->sockport;
my $n = Net::NNTP->new($host_port);
my $list = $n->list;
'<nntp@example.com>',
'<reftabsqueezed>',
$len,
- '1' ] }, "XOVER range works");
+ '1',
+ 'Xref: '. hostname . ' test-nntpd:1'] },
+ "XOVER range works");
is_deeply($n->xover('1'), {
'1' => ["Testing for El\xc3\xa9anor",
'<nntp@example.com>',
'<reftabsqueezed>',
$len,
- '1' ] }, "XOVER by article works");
+ '1',
+ 'Xref: '. hostname . ' test-nntpd:1'] },
+ "XOVER by article works");
is_deeply($n->head(1), $n->head('<nntp@example.com>'), 'HEAD OK');
is_deeply($n->body(1), $n->body('<nntp@example.com>'), 'BODY OK');
is($r[1], "0\tTesting for El\xc3\xa9anor\t" .
"El\xc3\xa9anor <me\@example.com>\t" .
"Thu, 01 Jan 1970 06:06:06 +0000\t" .
- "$mid\t<reftabsqueezed>\t$len\t1",
+ "$mid\t<reftabsqueezed>\t$len\t1" .
+ "\tXref: " . hostname . " test-nntpd:0",
'OVER by Message-ID works');
is($r[2], '.', 'correctly terminated response');
}
ok($date <= $t1, 'valid date before stop');
}
+ # pipelined requests:
+ {
+ my $nreq = 90;
+ syswrite($s, "GROUP $group\r\n");
+ my $res = <$s>;
+ my $rdr = fork;
+ if ($rdr == 0) {
+ use POSIX qw(_exit);
+ for (1..$nreq) {
+ <$s> =~ /\A224 / or _exit(1);
+ <$s> =~ /\A1/ or _exit(2);
+ <$s> eq ".\r\n" or _exit(3);
+ }
+ _exit(0);
+ }
+ for (1..$nreq) {
+ syswrite($s, "XOVER 1\r\n");
+ }
+ is($rdr, waitpid($rdr, 0), 'reader done');
+ is($? >> 8, 0, 'no errors');
+ }
+ SKIP: {
+ my @of = `lsof -p $pid 2>/dev/null`;
+ skip('lsof broken', 1) if (!scalar(@of) || $?);
+ my @xap = grep m!Search/Xapian!, @of;
+ is_deeply(\@xap, [], 'Xapian not loaded in nntpd');
+ }
{
setsockopt($s, IPPROTO_TCP, TCP_NODELAY, 1);
syswrite($s, 'HDR List-id 1-');