about summary refs log tree commit homepage
path: root/t/watch_maildir.t
diff options
context:
space:
mode:
Diffstat (limited to 't/watch_maildir.t')
-rw-r--r--t/watch_maildir.t85
1 files changed, 56 insertions, 29 deletions
diff --git a/t/watch_maildir.t b/t/watch_maildir.t
index e0719f54..a12ceefd 100644
--- a/t/watch_maildir.t
+++ b/t/watch_maildir.t
@@ -1,23 +1,21 @@
-# Copyright (C) 2016-2021 all contributors <meta@public-inbox.org>
+#!perl -w
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
-use strict;
-use Test::More;
+use v5.12;
 use PublicInbox::Eml;
 use Cwd;
-use PublicInbox::Config;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
+use PublicInbox::IO qw(write_file);
 my ($tmpdir, $for_destroy) = tmpdir();
 my $git_dir = "$tmpdir/test.git";
 my $maildir = "$tmpdir/md";
 my $spamdir = "$tmpdir/spam";
 use_ok 'PublicInbox::Watch';
 use_ok 'PublicInbox::Emergency';
-my $cfgpfx = "publicinbox.test";
 my $addr = 'test-public@example.com';
 my $default_branch = PublicInbox::Import::default_branch;
 PublicInbox::Import::init_bare($git_dir);
-
 my $msg = <<EOF;
 From: user\@example.com
 To: $addr
@@ -27,6 +25,9 @@ Date: Sat, 18 Jun 2016 00:00:00 +0000
 
 something
 EOF
+
+my $ibx_ro = create_inbox 'ro', sub { $_[0]->add(PublicInbox::Eml->new($msg)) };
+
 PublicInbox::Emergency->new($maildir)->prepare(\$msg);
 ok(POSIX::mkfifo("$maildir/cur/fifo", 0777),
         'create FIFO to ensure we do not get stuck on it :P');
@@ -35,22 +36,21 @@ my $sem = PublicInbox::Emergency->new($spamdir); # create dirs
 {
         my @w;
         local $SIG{__WARN__} = sub { push @w, @_ };
-        my $cfg = PublicInbox::Config->new(\<<EOF);
-$cfgpfx.address=$addr
-$cfgpfx.inboxdir=$git_dir
-$cfgpfx.watch=maildir:$spamdir
-publicinboxlearn.watchspam=maildir:$spamdir
+        my $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = $addr
+        inboxdir = $git_dir
+        watch = maildir:$spamdir
+[publicinboxlearn]
+        watchspam = maildir:$spamdir
 EOF
         my $wm = PublicInbox::Watch->new($cfg);
         is(scalar grep(/is a spam folder/, @w), 1, 'got warning about spam');
-        is_deeply($wm->{mdmap}, { "$spamdir/cur" => 'watchspam' },
+        is_deeply($wm->{d_map}, { "$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 <<EOF or BAIL_OUT $!;
+my $cfg = cfg_new $tmpdir, <<EOF;
 [publicinbox "test"]
         address = $addr
         inboxdir = $git_dir
@@ -58,11 +58,12 @@ my $cfg_path = "$tmpdir/config";
         filter = PublicInbox::Filter::Vger
 [publicinboxlearn]
         watchspam = maildir:$spamdir
+[publicinbox "test-ro"]
+        watch = false
+        inboxdir = $ibx_ro->{inboxdir}
+        address = ro-test\@example.com
 EOF
-        close $fh or BAIL_OUT $!;
-}
-
-my $cfg = PublicInbox::Config->new($cfg_path);
+my $cfg_path = $cfg->{-f};
 PublicInbox::Watch->new($cfg)->scan('full');
 my $git = PublicInbox::Git->new($git_dir);
 my @list = $git->qx('rev-list', $default_branch);
@@ -87,6 +88,10 @@ is(scalar @list, 2, 'two revisions in rev-list');
 is(scalar @list, 0, 'tree is empty');
 is(unlink(glob("$spamdir/cur/*")), 1, 'unlinked trained spam');
 
+@list = $ibx_ro->git->qx(qw(ls-tree -r --name-only), $default_branch);
+undef $ibx_ro;
+is scalar(@list), 1, 'read-only inbox is unchanged';
+
 # check with scrubbing
 {
         $msg .= qq(--
@@ -97,6 +102,7 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         PublicInbox::Watch->new($cfg)->scan('full');
         @list = $git->qx('ls-tree', '-r', '--name-only', $default_branch);
         is(scalar @list, 1, 'tree has one file');
+        chomp(@list);
         my $mref = $git->cat_file('HEAD:'.$list[0]);
         like($$mref, qr/something\n\z/s, 'message scrubbed on import');
 
@@ -137,10 +143,7 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         PublicInbox::Watch->new($cfg)->scan('full');
         @list = $git->qx('ls-tree', '-r', '--name-only', $default_branch);
         is(scalar @list, 1, 'tree has one file after spamc checked');
-
-        # XXX: workaround some weird caching/memoization in cat-file,
-        # shouldn't be an issue in real-world use, though...
-        $git = PublicInbox::Git->new($git_dir);
+        chomp(@list);
 
         my $mref = $git->cat_file($default_branch.':'.$list[0]);
         like($$mref, qr/something\n\z/s, 'message scrubbed on import');
@@ -151,8 +154,13 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         my $env = { PI_CONFIG => $cfg_path };
         $git->cleanup;
 
+        write_file '>>', $cfg_path, <<EOM;
+[publicinboxImport]
+        dropUniqueUnsubscribe
+EOM
         # n.b. --no-scan is only intended for testing atm
         my $wm = start_script([qw(-watch --no-scan)], $env);
+        no_pollerfd($wm->{pid});
         my $eml = eml_load('t/data/0001.patch');
         $eml->header_set('Cc', $addr);
         my $em = PublicInbox::Emergency->new($maildir);
@@ -170,11 +178,11 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         my $ii = PublicInbox::InboxIdle->new($cfg);
         my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup';
         $cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
-        PublicInbox::DS->SetPostLoopCallback(sub { $delivered == 0 });
+        local @PublicInbox::DS::post_loop_do = (sub { $delivered == 0 });
 
         # wait for -watch to setup inotify watches
         my $sleep = 1;
-        if (eval { require Linux::Inotify2 } && -d "/proc/$wm->{pid}/fd") {
+        if (eval { require PublicInbox::Inotify } && -d "/proc/$wm->{pid}/fd") {
                 my $end = time + 2;
                 my (@ino, @ino_info);
                 do {
@@ -201,13 +209,32 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         $em->commit; # wake -watch up
         diag 'waiting for -watch to import new message';
         PublicInbox::DS::event_loop();
+
+        my $head = $git->qx(qw(cat-file commit HEAD));
+        my $subj = $eml->header('Subject');
+        like($head, qr/^\Q$subj\E/sm, 'new commit made');
+
+        # try dropUniqueUnsubscribe
+        $delivered = 0;
+        $eml->header_set('Message-ID', '<unsubscribe@example>');
+        $eml->header_set('List-Unsubscribe',
+                        '<https://example.com/some-UUID-here/test');
+        $eml->header_set('List-Unsubscribe-Post', 'List-Unsubscribe=One-Click');
+        $em = PublicInbox::Emergency->new($maildir);
+        $em->prepare(\($eml->as_string));
+        $em->commit; # wake -watch up
+        diag 'waiting for -watch to import dropUniqueUnsubscribe message';
+        PublicInbox::DS::event_loop();
+        my $cur = $git->qx(qw(diff HEAD~1..HEAD));
+        like $cur, qr/Message-ID: <unsubscribe\@example>/,
+                'unsubscribe@example imported';
+        unlike $cur, qr/List-Unsubscribe\b/,
+                'List-Unsubscribe-* headers gone w/ dropUniqueUnsubscribe';
+
         $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 {