From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 4615A1FBC8 for ; Wed, 10 Jun 2020 07:05:21 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 11/82] t/imapd: support FakeInotify and KQNotify Date: Wed, 10 Jun 2020 07:04:08 +0000 Message-Id: <20200610070519.18252-12-e@yhbt.net> In-Reply-To: <20200610070519.18252-1-e@yhbt.net> References: <20200610070519.18252-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We can fill in some missing pieces from the emulation APIs to enable IMAP IDLE tests on non-Linux platforms. --- lib/PublicInbox/FakeInotify.pm | 22 +++++++++++++++++++++- lib/PublicInbox/KQNotify.pm | 6 ++++++ t/imapd.t | 3 ++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/FakeInotify.pm b/lib/PublicInbox/FakeInotify.pm index bd610463181..b077d63a4b4 100644 --- a/lib/PublicInbox/FakeInotify.pm +++ b/lib/PublicInbox/FakeInotify.pm @@ -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; diff --git a/lib/PublicInbox/KQNotify.pm b/lib/PublicInbox/KQNotify.pm index 3cf9c0f5a0c..1b5c578ef3d 100644 --- a/lib/PublicInbox/KQNotify.pm +++ b/lib/PublicInbox/KQNotify.pm @@ -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; diff --git a/t/imapd.t b/t/imapd.t index a377c02ab43..c31ac12f941 100644 --- 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);