}
require_ok 'PublicInbox::IMAP';
-my $first_range = '1-'.PublicInbox::IMAP::UID_BLOCK();
+my $first_range = '0';
-my $level = '-Lbasic';
+my $level = 'basic';
SKIP: {
require_mods('Search::Xapian', 1);
- $level = '-Lmedium';
+ $level = 'medium';
};
my @V = (1);
my $url = "http://example.com/i$V";
my $inboxdir = "$tmpdir/$name";
my $folder = "inbox.i$V";
- my $cmd = ['-init', "-V$V", $level, $name, $inboxdir, $url, $addr];
+ my $cmd = ['-init', "-V$V", "-L$level", $name, $inboxdir, $url, $addr];
run_script($cmd) or BAIL_OUT("init $name");
xsys(qw(git config), "--file=$ENV{HOME}/.public-inbox/config",
"publicinbox.$name.newsgroup", $folder) == 0 or
like($raw[1], qr/\A\S+ OK /, 'finished status response');
my @orig_list = @raw = $mic->list;
-like($raw[0], qr/^\* LIST \(.*?\) "\." inbox/,
+like($raw[0], qr/^\* LIST \(.*?\) "\." INBOX/,
'got an inbox');
like($raw[-1], qr/^\S+ OK /, 'response ended with OK');
is(scalar(@raw), scalar(@V) + 4, 'default LIST response');
@raw = $mic->list('', 'inbox.i1');
is(scalar(@raw), 2, 'limited LIST response');
-like($raw[0], qr/^\* LIST \(.*?\) "\." inbox/,
+like($raw[0], qr/^\* LIST \(.*?\) "\." INBOX/,
'got an inbox.i1');
like($raw[-1], qr/^\S+ OK /, 'response ended with OK');
$ret = $mic->search('uid 1:*') or BAIL_OUT "SEARCH FAIL $@";
is_deeply($ret, [ 1 ], 'search UID 1:* works');
+SKIP: {
+ skip 'Xapian missing', 6 if $level eq 'basic';
+ my $x = $mic->search(qw(smaller 99999));
+ is_deeply($x, [1], 'SMALLER works with Xapian (hit)');
+ $x = $mic->search(qw(smaller 9));
+ is_deeply($x, [], 'SMALLER works with Xapian (miss)');
+
+ $x = $mic->search(qw(larger 99999));
+ is_deeply($x, [], 'LARGER works with Xapian (miss)');
+ $x = $mic->search(qw(larger 9));
+ is_deeply($x, [1], 'LARGER works with Xapian (hit)');
+
+ $x = $mic->search(qw(HEADER Message-ID testmessage@example.com));
+ is_deeply($x, [1], 'HEADER Message-ID works');
+ $x = $mic->search(qw(HEADER Message-ID miss));
+ is_deeply($x, [], 'HEADER Message-ID can miss');
+}
+
is_deeply(scalar $mic->flags('1'), [], '->flags works');
{
# RFC 3501 section 6.4.8 states:
Content-Disposition: attachment; filename="embed2x\.eml"\r
\r
EOF
+
+ my @hits = $mic->search('SENTON' => '18-Apr-2020');
+ is_deeply(\@hits, [ $uidnext ], 'search with date condition works');
+ ok($mic->examine($ng), 'EXAMINE on dummy');
+ @hits = $mic->search('SENTSINCE' => '18-Apr-2020');
+ is_deeply(\@hits, [], 'search on dummy with condition works');
}); # each_inbox
# message sequence numbers :<
is(scalar keys %$ret, 3, 'got all 3 messages with comma-separated sequence');
$ret = $mic->fetch_hash('1:*', 'RFC822') or BAIL_OUT "FETCH $@";
is(scalar keys %$ret, 3, 'got all 3 messages');
-{
- my $rdr = { 0 => \($ret->{1}->{RFC822}) };
- my $env = { HOME => $ENV{HOME} };
- my @cmd = qw(-learn rm --all);
- run_script(\@cmd, $env, $rdr) or BAIL_OUT('-learn rm');
-}
-my $r2 = $mic->fetch_hash('1:*', 'BODY.PEEK[]') or BAIL_OUT "FETCH $@";
-is(scalar keys %$r2, 3, 'still got all 3 messages');
-like($r2->{1}->{'BODY[]'}, qr/dummy message #1/, 'got dummy message 1');
-is($r2->{2}->{'BODY[]'}, $ret->{2}->{RFC822}, 'message 2 unchanged');
-is($r2->{3}->{'BODY[]'}, $ret->{3}->{RFC822}, 'message 3 unchanged');
-$r2 = $mic->fetch_hash(2, 'BODY.PEEK[HEADER.FIELDS (message-id)]')
- or BAIL_OUT "FETCH $@";
-is($r2->{2}->{'BODY[HEADER.FIELDS (MESSAGE-ID)]'},
- 'Message-ID: <20200418222508.GA13918@dcvr>'."\r\n\r\n",
- 'BODY.PEEK[HEADER.FIELDS ...] drops .PEEK');
{
my @new_list = $mic->list;
pop @new_list;
pop @orig_list;
# TODO: not sure if sort order matters, imapd_refresh_finalize
- # sorts, for now, but maybe clients don't care...
+ # doesn't sort, hopefully clients don't care...
+ @new_list = sort @new_list;
+ @orig_list = sort @orig_list;
is_deeply(\@new_list, \@orig_list, 'LIST identical');
}
ok($mic->close, 'CLOSE works');
ok(!$mic->close, 'CLOSE not idempotent');
ok($mic->logout, 'logged out');
+{
+ my $c = tcp_connect($sock);
+ $c->autoflush(1);
+ like(<$c>, qr/\* OK/, 'got a greeting');
+ print $c "\r\n";
+ like(<$c>, qr/\A\* BAD Error in IMAP command/, 'empty line');
+ print $c "tagonly\r\n";
+ like(<$c>, qr/\Atagonly BAD Error in IMAP command/, 'tag-only line');
+}
+
$td->kill;
$td->join;
is($?, 0, 'no error in exited process');
open my $fh, '<', $err or BAIL_OUT("open $err failed: $!");
my $eout = do { local $/; <$fh> };
unlike($eout, qr/wide/i, 'no Wide character warnings');
+unlike($eout, qr/uninitialized/i, 'no uninitialized warnings');
done_testing;