diff options
Diffstat (limited to 't/pop3d-limit.t')
-rw-r--r-- | t/pop3d-limit.t | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/t/pop3d-limit.t b/t/pop3d-limit.t new file mode 100644 index 00000000..f52c8802 --- /dev/null +++ b/t/pop3d-limit.t @@ -0,0 +1,144 @@ +#!perl -w +# Copyright (C) all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> +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(<<EOM)) or die 'add dup'; +From: $n\@example.com +Subject: msg $n +To: $addr +Message-ID: <mid-$n\@example.com> +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 <<EOF; +[publicinbox] + pop3state = $tmpdir/p3state +[publicinbox "pop3"] + inboxdir = $ibx->{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(<mid-2@example.com> <mid-3@example.com>) ], + "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(<mid-3@example.com>) ], + "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(<mid-1@example.com> <mid-2@example.com> + <mid-3@example.com>) ], + "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(<mid-5@example.com>) ], + "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(<mid-5@example.com>) ], + "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(<mid-4@example.com> <mid-5@example.com>) ], + "excessive limit ($login)") or diag explain(\@msg); +} + +done_testing; |