]> Sergey Matveev's repositories - public-inbox.git/commitdiff
t/imapd: support FakeInotify and KQNotify
authorEric Wong <e@yhbt.net>
Wed, 10 Jun 2020 07:04:08 +0000 (07:04 +0000)
committerEric Wong <e@yhbt.net>
Sat, 13 Jun 2020 07:55:45 +0000 (07:55 +0000)
We can fill in some missing pieces from the emulation APIs
to enable IMAP IDLE tests on non-Linux platforms.

lib/PublicInbox/FakeInotify.pm
lib/PublicInbox/KQNotify.pm
t/imapd.t

index bd610463181d49561b1cacb2045e79eec80bc3e1..b077d63a4b4f365b316541913856772879d1b783 100644 (file)
@@ -8,13 +8,30 @@ use strict;
 use Time::HiRes qw(stat);
 my $IN_CLOSE = 0x08 | 0x10; # match Linux inotify
 
-sub new { bless { watch => {} }, __PACKAGE__ }
+my $poll_intvl = 2; # same as Filesys::Notify::Simple
+my $for_cancel = bless \(my $x), 'PublicInbox::FakeInotify::Watch';
+
+sub poll_once {
+       my ($self) = @_;
+       sub {
+               eval { $self->poll };
+               warn "E: FakeInotify->poll: $@\n" if $@;
+               PublicInbox::DS::add_timer($poll_intvl, poll_once($self));
+       };
+}
+
+sub new {
+       my $self = bless { watch => {} }, __PACKAGE__;
+       PublicInbox::DS::add_timer($poll_intvl, poll_once($self));
+       $self;
+}
 
 # behaves like Linux::Inotify2->watch
 sub watch {
        my ($self, $path, $mask, $cb) = @_;
        my @st = stat($path) or return;
        $self->{watch}->{"$path\0$mask"} = [ @st, $cb ];
+       $for_cancel;
 }
 
 # behaves like non-blocking Linux::Inotify2->poll
@@ -36,4 +53,7 @@ sub poll {
        }
 }
 
+package PublicInbox::FakeInotify::Watch;
+sub cancel {} # noop
+
 1;
index 3cf9c0f5a0c64c304ff43e5522afc9e20cbee46c..1b5c578ef3df8aef15a9adefab55c00c11ded432 100644 (file)
@@ -31,6 +31,7 @@ sub watch {
        } else {
                die "TODO Not implemented: $mask";
        }
+       bless \$fh, 'PublicInbox::KQNotify::Watch';
 }
 
 # emulate Linux::Inotify::fileno
@@ -57,4 +58,9 @@ sub poll {
        }
 }
 
+package PublicInbox::KQNotify::Watch;
+use strict;
+
+sub cancel { close ${$_[0]} or die "close: $!" }
+
 1;
index a377c02ab43f76e07e8c0c23e793c0188402a794..c31ac12f941f5b4dcc72fc5098fa1d19103658d5 100644 (file)
--- a/t/imapd.t
+++ b/t/imapd.t
@@ -7,7 +7,8 @@ use Time::HiRes ();
 use PublicInbox::TestCommon;
 use PublicInbox::Config;
 use PublicInbox::Spawn qw(which);
-require_mods(qw(DBD::SQLite Mail::IMAPClient Linux::Inotify2));
+require_mods(qw(DBD::SQLite Mail::IMAPClient));
+
 my $level = '-Lbasic';
 SKIP: {
        require_mods('Search::Xapian', 1);