From 97c6b564fd79e47ae6fca8de273c2aeaf2f5bea5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 5 Jan 2019 10:41:15 +0000 Subject: filter/rubylang: fix SQLite DB lifetime problems Clearly the AltId stuff was never tested for v2. Ensure this tricky filter (which reuses Msgmap to avoid introducing new serial numbers) doesn't trigger deadlocks SQLite due to opening a DB for writing multiple times. I went through several iterations of this change before going with this one, which is the least intrusive I could fine. --- t/mda_filter_rubylang.t | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 t/mda_filter_rubylang.t (limited to 't/mda_filter_rubylang.t') diff --git a/t/mda_filter_rubylang.t b/t/mda_filter_rubylang.t new file mode 100644 index 00000000..cb6da4bb --- /dev/null +++ b/t/mda_filter_rubylang.t @@ -0,0 +1,69 @@ +# Copyright (C) 2019 all contributors +# License: AGPL-3.0+ +use strict; +use warnings; +use Test::More; +use File::Temp qw/tempdir/; +use PublicInbox::MIME; +use PublicInbox::Config; +my @mods = qw(DBD::SQLite Search::Xapian IPC::Run); +foreach my $mod (@mods) { + eval "require $mod"; + plan skip_all => "$mod missing for mda_filter_rubylang.t" if $@; +} + +use_ok 'PublicInbox::V2Writable'; +my $tmpdir = tempdir('mda-XXXXXX', TMPDIR => 1, CLEANUP => 1); +my $pi_config = "$tmpdir/pi_config"; +local $ENV{PI_CONFIG} = $pi_config; +my $mda = 'blib/script/public-inbox-mda'; +my @cfg = ('git', 'config', "--file=$pi_config"); +is(system(@cfg, 'publicinboxmda.spamcheck', 'none'), 0); + +for my $v (qw(V1 V2)) { + my @warn; + $SIG{__WARN__} = sub { push @warn, @_ }; + my $cfgpfx = "publicinbox.$v"; + my $mainrepo = "$tmpdir/$v"; + my $addr = "test-$v\@example.com"; + my @cmd = ('blib/script/public-inbox-init', "-$v", $v, $mainrepo, + "http://example.com/$v", $addr); + is(system(@cmd), 0, 'public-inbox init OK'); + if ($v eq 'V1') { + is(system('blib/script/public-inbox-index', $mainrepo), 0); + } + is(system(@cfg, "$cfgpfx.filter", 'PublicInbox::Filter::RubyLang'), 0); + is(system(@cfg, "$cfgpfx.altid", + 'serial:alerts:file=msgmap.sqlite3'), 0); + + for my $i (1..2) { + local $ENV{ORIGINAL_RECIPIENT} = $addr; + my $msg = < +Date: Sat, 05 Jan 2019 04:19:17 +0000 + +something +EOF + ok(IPC::Run::run([$mda], \"$msg"), 'message delivered'); + } + my $config = PublicInbox::Config->new; + my $ibx = $config->lookup_name($v); + + # make sure all serials are searchable: + my ($tot, $msgs); + for my $i (1..2) { + ($tot, $msgs) = $ibx->search->query("alerts:$i"); + is($tot, 1, "got one result for alerts:$i"); + is($msgs->[0]->{mid}, "a.$i\@b.com", "got expected MID for $i"); + } + is_deeply([], \@warn, 'no warnings'); + + # TODO: public-inbox-learn doesn't know about filters + # (but -watch does) +} + +done_testing(); -- cgit v1.2.3-24-ge0c7