X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fwatch_maildir.t;h=a2c09b0351b9ed4df55e0b56d73f209378554e1c;hb=b2b1006759730507731fcd3fc3e0de68239e3b92;hp=9ed04cab14138ca258e9b6bb325ef0e810f94a44;hpb=d55abcc42bde846d9047491125dd2b32645dafd8;p=public-inbox.git diff --git a/t/watch_maildir.t b/t/watch_maildir.t index 9ed04cab..a2c09b03 100644 --- a/t/watch_maildir.t +++ b/t/watch_maildir.t @@ -2,12 +2,11 @@ # License: AGPL-3.0+ use strict; use Test::More; -use Email::MIME; +use PublicInbox::Eml; use Cwd; use PublicInbox::Config; use PublicInbox::TestCommon; use PublicInbox::Import; -require_mods(qw(Filesys::Notify::Simple)); my ($tmpdir, $for_destroy) = tmpdir(); my $git_dir = "$tmpdir/test.git"; my $maildir = "$tmpdir/md"; @@ -32,14 +31,37 @@ ok(POSIX::mkfifo("$maildir/cur/fifo", 0777), 'create FIFO to ensure we do not get stuck on it :P'); my $sem = PublicInbox::Emergency->new($spamdir); # create dirs -my $config = PublicInbox::Config->new(\<new(\<new($config); + is(scalar grep(/is a spam folder/, @w), 1, 'got warning about spam'); + is_deeply($wm->{mdmap}, { "$spamdir/cur" => 'watchspam' }, + 'only got the spam folder to watch'); +} + +my $cfg_path = "$tmpdir/config"; +{ + open my $fh, '>', $cfg_path or BAIL_OUT $!; + print $fh <new($cfg_path); PublicInbox::WatchMaildir->new($config)->scan('full'); my $git = PublicInbox::Git->new($git_dir); my @list = $git->qx(qw(rev-list refs/heads/master)); @@ -121,6 +143,70 @@ More majordomo info at http://vger.kernel.org/majordomo-info.html\n); like($$mref, qr/something\n\z/s, 'message scrubbed on import'); } +# end-to-end test which actually uses inotify/kevent +{ + my $env = { PI_CONFIG => $cfg_path }; + $git->cleanup; + + # n.b. --no-scan is only intended for testing atm + my $wm = start_script([qw(-watch --no-scan)], $env); + my $eml = eml_load('t/data/0001.patch'); + $eml->header_set('Cc', $addr); + my $em = PublicInbox::Emergency->new($maildir); + $em->prepare(\($eml->as_string)); + + use_ok 'PublicInbox::InboxIdle'; + use_ok 'PublicInbox::DS'; + my $delivered = 0; + my $cb = sub { + my ($ibx) = @_; + diag "message delivered to `$ibx->{name}'"; + $delivered++; + }; + PublicInbox::DS->Reset; + my $ii = PublicInbox::InboxIdle->new($config); + my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup'; + $config->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) }); + PublicInbox::DS->SetPostLoopCallback(sub { $delivered == 0 }); + + # wait for -watch to setup inotify watches + my $sleep = 1; + if (eval { require Linux::Inotify2 } && -d "/proc/$wm->{pid}/fd") { + my $end = time + 2; + my (@ino, @ino_info); + do { + @ino = grep { + (readlink($_)//'') =~ /\binotify\b/ + } glob("/proc/$wm->{pid}/fd/*"); + } until (@ino || time > $end || !tick); + if (scalar(@ino) == 1) { + my $ino_fd = (split('/', $ino[0]))[-1]; + my $ino_fdinfo = "/proc/$wm->{pid}/fdinfo/$ino_fd"; + while (time < $end && open(my $fh, '<', $ino_fdinfo)) { + @ino_info = grep(/^inotify wd:/, <$fh>); + last if @ino_info >= 4; + tick; + } + $sleep = undef if @ino_info >= 4; + } + } + if ($sleep) { + diag "waiting ${sleep}s for -watch to start up"; + sleep $sleep; + } + + $em->commit; # wake -watch up + diag 'waiting for -watch to import new message'; + PublicInbox::DS->EventLoop; + $wm->kill; + $wm->join; + $ii->close; + PublicInbox::DS->Reset; + my $head = $git->qx(qw(cat-file commit HEAD)); + my $subj = $eml->header('Subject'); + like($head, qr/^\Q$subj\E/sm, 'new commit made'); +} + sub is_maildir { my ($dir) = @_; PublicInbox::WatchMaildir::is_maildir($dir);