use strict;
use warnings;
use Test::More;
-foreach my $mod (qw(DBD::SQLite Search::Xapian)) {
+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 Socket qw(IPPROTO_TCP TCP_NODELAY);
require './t/common.perl';
# FIXME: make easier to test both versions
-my $version = $ENV{PI_VERSION} || 2;
+my $version = $ENV{PI_TEST_VERSION} || 2;
require_git('2.6') if $version == 2;
my $tmpdir = tempdir('pi-nntpd-XXXXXX', TMPDIR => 1, CLEANUP => 1);
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';
SKIP: {
skip "git 2.6+ required for V2Writable", 1 if $version == 1;
use_ok 'PublicInbox::V2Writable';
}
-my %opts = (
- LocalAddr => '127.0.0.1',
- ReuseAddr => 1,
- Proto => 'tcp',
- Type => SOCK_STREAM,
- Listen => 1024,
-);
-my $sock = IO::Socket::INET->new(%opts);
+my %opts;
+my $sock = tcp_server();
my $pid;
my $len;
END { kill 'TERM', $pid if defined $pid };
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
{
$im->add($mime);
$im->done;
if ($version == 1) {
- my $s = PublicInbox::SearchIdx->new($mainrepo, 1);
+ my $s = PublicInbox::SearchIdx->new($ibx, 1);
$s->index_sync;
}
}
is_deeply([$n->group($group)], [ qw(0 1 1), $group ], 'GROUP works');
is_deeply($n->listgroup($group), [1], 'listgroup OK');
+ SKIP: {
+ $n->can('starttls') or
+ skip('Net::NNTP too old to support STARTTLS', 2);
+ ok(!$n->starttls, 'STARTTLS fails when unconfigured');
+ is($n->code, 580, 'got 580 code on server w/o TLS');
+ };
+
%opts = (
PeerAddr => $host_port,
Proto => 'tcp',
'got greeting');
$s->autoflush(1);
+ syswrite($s, "CAPABILITIES\r\n");
+ $buf = read_til_dot($s);
+ like($buf, qr/\r\nVERSION 2\r\n/s, 'CAPABILITIES works');
+ unlike($buf, qr/STARTTLS/s, 'STARTTLS not advertised');
+
syswrite($s, "NEWGROUPS 19990424 000000 GMT\r\n");
$buf = read_til_dot($s);
like($buf, qr/\A231 list of /, 'newgroups OK');
ok($date >= $t0, 'valid date after start');
ok($date <= $t1, 'valid date before stop');
}
+ if ('leafnode interop') {
+ my $for_leafnode = PublicInbox::MIME->new(<<"");
+From: longheader\@example.com
+To: $addr
+Subject: none
+Date: Fri, 02 Oct 1993 00:00:00 +0000
+
+ my $long_hdr = 'for-leafnode-'.('y'x200).'@example.com';
+ $for_leafnode->header_set('Message-ID', "<$long_hdr>");
+ $im->add($for_leafnode);
+ $im->done;
+ if ($version == 1) {
+ my $s = PublicInbox::SearchIdx->new($ibx, 1);
+ $s->index_sync;
+ }
+ my $hdr = $n->head("<$long_hdr>");
+ my $expect = qr/\AMessage-ID: /i . qr/\Q<$long_hdr>\E/;
+ ok(scalar(grep(/$expect/, @$hdr)), 'Message-ID not folded');
+ ok(scalar(grep(/^Path:/, @$hdr)), 'Path: header found');
+
+ # it's possible for v2 messages to have 2+ Message-IDs,
+ # but leafnode can't handle it
+ if ($version != 1) {
+ my @mids = ("<$long_hdr>", '<2mid@wtf>');
+ $for_leafnode->header_set('Message-ID', @mids);
+ $for_leafnode->body_set('not-a-dupe');
+ my $warn = '';
+ $SIG{__WARN__} = sub { $warn .= join('', @_) };
+ $im->add($for_leafnode);
+ $im->done;
+ like($warn, qr/reused/, 'warned for reused MID');
+ $hdr = $n->head('<2mid@wtf>');
+ my @hmids = grep(/\AMessage-ID: /i, @$hdr);
+ is(scalar(@hmids), 1, 'Single Message-ID in header');
+ like($hmids[0], qr/: <2mid\@wtf>/, 'got expected mid');
+ }
+ }
# pipelined requests:
{
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-');