#!perl -w
# Copyright (C) all contributors
# License: AGPL-3.0+
use v5.12;
use PublicInbox::TestCommon;
require_mods(qw(DBD::SQLite Net::POP3 :fcntl_lock));
use autodie;
my ($tmpdir, $for_destroy) = tmpdir();
mkdir("$tmpdir/p3state");
use PublicInbox::Eml;
my $group = 'test.pop3d.limit';
my $addr = 'pop3d-limit@example.com';
my $add_msg = sub {
my ($im, $n) = @_;
$im->add(PublicInbox::Eml->new(<
Date: Sat, 02 Oct 2010 00:00:00 +0000
body $n
EOM
};
my $ibx = create_inbox 'pop3d-limit', -primary_address => $addr,
indexlevel => 'basic', tmpdir => "$tmpdir/ibx", sub {
my ($im, $ibx) = @_;
$add_msg->($im, $_) for (1..3);
$im->done;
diag 'done';
}; # /create_inbox
my $pi_config = "$tmpdir/pi_config";
{
open my $fh, '>', $pi_config;
print $fh <{inboxdir}
address = $addr
indexlevel = basic
newsgroup = $group
EOF
close $fh;
}
my $plain = tcp_server();
my $plain_addr = tcp_host_port($plain);
my $env = { PI_CONFIG => $pi_config };
my $p3d = start_script([qw(-pop3d -W0),
"--stdout=$tmpdir/out.log", "--stderr=$tmpdir/err.log" ],
$env, { 3 => $plain });
my @np3args = ($plain->sockhost, Port => $plain->sockport);
my $fetch_delete = sub {
my ($np3) = @_;
map {
my $msg = $np3->get($_);
$np3->delete($_);
PublicInbox::Eml->new(join('', @$msg));
} sort { $a <=> $b } keys %{$np3->list};
};
my $login_a = ('a'x32)."\@$group?initial_limit=2&limit=1";
my $login_a0 = ('a'x32)."\@$group.0?initial_limit=2&limit=1";
my $login_b = ('b'x32)."\@$group?limit=1";
my $login_b0 = ('b'x32)."\@$group.0?limit=1";
my $login_c = ('c'x32)."\@$group?limit=10";
my $login_c0 = ('c'x32)."\@$group.0?limit=10";
my $login_d = ('d'x32)."\@$group?limit=100000";
my $login_d0 = ('d'x32)."\@$group.0?limit=100000";
for my $login ($login_a, $login_a0) {
my $np3 = Net::POP3->new(@np3args) or xbail "Net::POP3 $!";
$np3->login($login, 'anonymous') or xbail "login $login ($!)";
my @msg = $fetch_delete->($np3);
$np3->quit;
is_deeply([ map { $_->header('Message-ID') } @msg ],
[ qw( ) ],
"initial_limit ($login)") or diag explain(\@msg);
}
for my $login ($login_b, $login_b0) {
my $np3 = Net::POP3->new(@np3args);
$np3->login($login, 'anonymous') or xbail "login $login ($!)";
my @msg = $fetch_delete->($np3);
$np3->quit;
is_deeply([ map { $_->header('Message-ID') } @msg ],
[ qw() ],
"limit-only ($login)") or diag explain(\@msg);
}
for my $login ($login_c, $login_c0, $login_d, $login_d0) {
my $np3 = Net::POP3->new(@np3args);
$np3->login($login, 'anonymous') or xbail "login $login ($!)";
my @msg = $fetch_delete->($np3);
$np3->quit;
is_deeply([ map { $_->header('Message-ID') } @msg ],
[ qw(
) ],
"excessive limit ($login)") or diag explain(\@msg);
}
{ # add some new messages
my $im = $ibx->importer(0);
$add_msg->($im, $_) for (4..5);
$im->done;
}
for my $login ($login_a, $login_a0) {
my $np3 = Net::POP3->new(@np3args);
$np3->login($login, 'anonymous') or xbail "login $login ($!)";
my @msg = $fetch_delete->($np3);
$np3->quit;
is_deeply([ map { $_->header('Message-ID') } @msg ],
[ qw() ],
"limit used (initial_limit ignored, $login)") or
diag explain(\@msg);
}
for my $login ($login_b, $login_b0) {
my $np3 = Net::POP3->new(@np3args);
$np3->login($login, 'anonymous') or xbail "login $login ($!)";
my @msg = $fetch_delete->($np3);
$np3->quit;
is_deeply([ map { $_->header('Message-ID') } @msg ],
[ qw() ],
"limit-only after new messages ($login)") or
diag explain(\@msg);
}
for my $login ($login_c, $login_c0, $login_d, $login_d0) {
my $np3 = Net::POP3->new(@np3args);
$np3->login($login, 'anonymous') or xbail "login $login ($!)";
my @msg = $fetch_delete->($np3);
$np3->quit;
is_deeply([ map { $_->header('Message-ID') } @msg ],
[ qw( ) ],
"excessive limit ($login)") or diag explain(\@msg);
}
done_testing;