about summary refs log tree commit homepage
path: root/t
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-06-27 10:03:40 +0000
committerEric Wong <e@yhbt.net>2020-06-28 22:27:17 +0000
commitbbf4159b7694241d2139be641ced4c485303714a (patch)
treebc5d7352ed28d51d03f5f1dc44d636ae0d9fce97 /t
parentfac2f5b63f0595b67a99784c8a9f9801c1fc9f09 (diff)
downloadpublic-inbox-bbf4159b7694241d2139be641ced4c485303714a.tar.gz
Not all IMAP servers support IDLE, and IDLE may be prohibitively
expensive for some IMAP servers with many inboxes.  So allow
configuring a imap.$IMAP_URL.pollInterval=SECONDS to poll
mailboxes.

We'll also need to poll for NNTP servers in the future.
Diffstat (limited to 't')
-rw-r--r--t/imapd.t39
1 files changed, 36 insertions, 3 deletions
diff --git a/t/imapd.t b/t/imapd.t
index cc87a127..ee3a3b26 100644
--- a/t/imapd.t
+++ b/t/imapd.t
@@ -443,6 +443,7 @@ ok($mic->logout, 'logged out');
 {
         use_ok 'PublicInbox::WatchMaildir';
         use_ok 'PublicInbox::InboxIdle';
+        my $old_env = { HOME => $ENV{HOME} };
         my $home = "$tmpdir/watch_home";
         mkdir $home or BAIL_OUT $!;
         mkdir "$home/.public-inbox" or BAIL_OUT $!;
@@ -464,13 +465,45 @@ ok($mic->logout, 'logged out');
         my $cb = sub { PublicInbox::DS->SetPostLoopCallback(sub {}) };
         my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup';
         $cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
-        open my $err, '+>', undef or BAIL_OUT $!;
-        my $w = start_script(['-watch'], undef, { 2 => $err });
+        my $watcherr = "$tmpdir/watcherr";
+        open my $err_wr, '>', $watcherr or BAIL_OUT $!;
+        open my $err, '<', $watcherr or BAIL_OUT $!;
+        my $w = start_script(['-watch'], undef, { 2 => $err_wr });
+
+        diag 'waiting for initial fetch...';
+        PublicInbox::DS->EventLoop;
+        diag 'inbox unlocked on initial fetch, waiting for IDLE';
+
+        tick until (grep(/I: \S+ idling/, <$err>));
+        open my $fh, '<', 't/iso-2202-jp.eml' or BAIL_OUT $!;
+        $old_env->{ORIGINAL_RECIPIENT} = $addr;
+        ok(run_script([qw(-mda --no-precheck)], $old_env, { 0 => $fh }),
+                'delivered a message for IDLE to kick -watch');
+        diag 'waiting for IMAP IDLE wakeup';
+        PublicInbox::DS->SetPostLoopCallback(undef);
+        PublicInbox::DS->EventLoop;
+        diag 'inbox unlocked on IDLE wakeup';
+
+        # try again with polling
+        xsys(qw(git config), "--file=$home/.public-inbox/config",
+                "imap.imap://$ihost:$iport.PollInterval", 0.11) == 0
+                or BAIL_OUT "git config $?";
+        $w->kill('HUP');
+        diag 'waiting for -watch reload + initial fetch';
+        tick until (grep(/I: will check/, <$err>));
+
+        open $fh, '<', 't/psgi_attach.eml' or BAIL_OUT $!;
+        ok(run_script([qw(-mda --no-precheck)], $old_env, { 0 => $fh }),
+                'delivered a message for -watch PollInterval');
+
+        diag 'waiting for PollInterval wakeup';
+        PublicInbox::DS->SetPostLoopCallback(undef);
         PublicInbox::DS->EventLoop;
-        diag 'inbox unlocked';
+        diag 'inbox unlocked (poll)';
         $w->kill;
         $w->join;
         is($?, 0, 'no error in exited -watch process');
+
         $cfg->each_inbox(sub { shift->unsubscribe_unlock('ident') });
         $ii->close;
         PublicInbox::DS->Reset;