viewvcs: handle exceptions in on_destroy cb
[public-inbox.git] / t / watch_v1_v2_mix_no_modify.t
blob759fd0bbcaf86f0437e195b5a7ae70b655ee6bfa
1 #!perl -w
2 # Copyright (C) all contributors <meta@public-inbox.org>
3 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
4 use v5.12;
5 use autodie;
6 use PublicInbox::TestCommon;
7 require_mods 'v2';
8 use PublicInbox::InboxIdle;
9 use PublicInbox::DS qw(now);
10 use PublicInbox::IO qw(write_file);
11 use PublicInbox::Eml;
12 my $tmpdir = tmpdir;
13 local $ENV{HOME} = "$tmpdir";
14 local $ENV{PI_CONFIG} = "$tmpdir/.public-inbox/config";
15 my $msg = <<'EOM';
16 From: a@example.com
17 To: v1@example.com, v2@example.com
18 Subject: test
19 Message-ID: <a@example>
22 EOM
24 for my $v (2, 1) {
25         run_script(['-init', "-V$v", "v$v", '-Lbasic', "$tmpdir/v$v",
26                 "https://example.com/v$v", "v$v\@example.com" ]) or
27                         xbail "init -V$v";
28         write_file '>>', $ENV{PI_CONFIG}, "watch = maildir:$tmpdir/md$v";
29         mkdir "$tmpdir/md$v/$_" for ('', qw(cur tmp new));
31 my $orig = "$tmpdir/md2/cur/initial:2,S";
32 write_file '>', $orig, $msg;
34 my $delivered = 0;
35 my $cb = sub {
36         my ($ibx) = @_;
37         diag "message delivered to `$ibx->{name}'";
38         $delivered++;
40 my $ii = PublicInbox::InboxIdle->new(my $cfg = PublicInbox::Config->new);
41 my $obj = bless \$cb, 'PublicInbox::TestCommon::InboxWakeup';
42 $cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) });
43 my $exp = now + 10;
44 local @PublicInbox::DS::post_loop_do = (sub { $delivered < 1 || now > $exp});
46 my $rdr;
47 open $rdr->{2}, '>>', undef;
48 my $w = start_script(['-watch'], undef, $rdr);
49 diag 'waiting for -watch to import 2 existing messages..';
50 PublicInbox::DS::add_timer 10, \&PublicInbox::Config::noop;
51 PublicInbox::DS::event_loop;
52 is $delivered, 1, 'delivered initial message';
54 $exp = now + 10;
55 PublicInbox::DS::add_timer 10, \&PublicInbox::Config::noop;
56 local @PublicInbox::DS::post_loop_do = (sub { $delivered < 3 || now > $exp });
57 my $tmpmsg = "$tmpdir/md2/tmp/conflict:2,S";
58 write_file '>', $tmpmsg, $msg, "hi\n";
59 link $tmpmsg, "$tmpdir/md1/cur/conflict:2,S";
60 rename $tmpmsg, "$tmpdir/md2/cur/conflict:2,S";
61 PublicInbox::DS::event_loop;
62 is $delivered, 3, 'delivered new conflicting message to v2 and new to v1';
64 my $v1ibx = $cfg->lookup('v1@example.com');
65 my $v1msgs = $v1ibx->over->recent;
66 is scalar(@$v1msgs), 1, 'only one message in v1';
67 my $v1eml = PublicInbox::Eml->new($v1ibx->git->cat_file($v1msgs->[0]->{blob}));
68 my @mid = $v1eml->header_raw('Message-ID');
69 is_deeply \@mid, [ qw[<a@example>] ], 'only one Message-ID in v1 message';
71 my $v2msgs = $cfg->lookup('v2@example.com')->over->recent;
72 is scalar(@$v2msgs), 2, 'both messages in v2';
74 done_testing;