]> Sergey Matveev's repositories - public-inbox.git/blob - t/v1reindex.t
SearchIdx: Decrement regen_down even for added messages that are later deleted.
[public-inbox.git] / t / v1reindex.t
1 # Copyright (C) 2018 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3 use strict;
4 use warnings;
5 use Test::More;
6 use PublicInbox::MIME;
7 use PublicInbox::ContentId qw(content_digest);
8 use File::Temp qw/tempdir/;
9 use File::Path qw(remove_tree);
10
11 foreach my $mod (qw(DBD::SQLite Search::Xapian)) {
12         eval "require $mod";
13         plan skip_all => "$mod missing for v1reindex.t" if $@;
14 }
15 use_ok 'PublicInbox::SearchIdx';
16 use_ok 'PublicInbox::Import';
17 my $mainrepo = tempdir('pi-v1reindex-XXXXXX', TMPDIR => 1, CLEANUP => 1);
18 is(system(qw(git init -q --bare), $mainrepo), 0);
19 my $ibx_config = {
20         mainrepo => $mainrepo,
21         name => 'test-v1reindex',
22         -primary_address => 'test@example.com',
23 };
24 my $ibx = PublicInbox::Inbox->new($ibx_config);
25 my $mime = PublicInbox::MIME->create(
26         header => [
27                 From => 'a@example.com',
28                 To => 'test@example.com',
29                 Subject => 'this is a subject',
30                 Date => 'Fri, 02 Oct 1993 00:00:00 +0000',
31         ],
32         body => "hello world\n",
33 );
34 my $im = PublicInbox::Import->new($ibx->git, undef, undef, $ibx);
35 foreach my $i (1..10) {
36         $mime->header_set('Message-Id', "<$i\@example.com>");
37         ok($im->add($mime), "message $i added");
38         if ($i == 4) {
39                 $im->remove($mime);
40         }
41 }
42
43 if ('test remove later') {
44         $mime->header_set('Message-Id', "<5\@example.com>");
45         $im->remove($mime);
46 }
47
48 $im->done;
49 my $rw = PublicInbox::SearchIdx->new($ibx, 1);
50 eval { $rw->index_sync() };
51 is($@, '', 'no error from indexing');
52
53 my $minmax = [ $ibx->mm->minmax ];
54 ok(defined $minmax->[0] && defined $minmax->[1], 'minmax defined');
55 is_deeply($minmax, [ 1, 10 ], 'minmax as expected');
56
57 $rw = PublicInbox::SearchIdx->new($ibx, 1);
58 eval { $rw->index_sync({reindex => 1}) };
59 is($@, '', 'no error from reindexing');
60 $im->done;
61
62 my $xap = "$mainrepo/public-inbox/xapian".PublicInbox::Search::SCHEMA_VERSION();
63 remove_tree($xap);
64 ok(!-d $xap, 'Xapian directories removed');
65 $rw = PublicInbox::SearchIdx->new($ibx, 1);
66
67 eval { $rw->index_sync({reindex => 1}) };
68 is($@, '', 'no error from reindexing');
69 $im->done;
70 ok(-d $xap, 'Xapian directories recreated');
71
72 delete $ibx->{mm};
73 is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
74
75 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
76 remove_tree($xap);
77 $rw = PublicInbox::SearchIdx->new($ibx, 1);
78
79 ok(!-d $xap, 'Xapian directories removed again');
80 {
81         my @warn;
82         local $SIG{__WARN__} = sub { push @warn, @_ };
83         eval { $rw->index_sync({reindex => 1}) };
84         is($@, '', 'no error from reindexing without msgmap');
85         is(scalar(@warn), 0, 'no warnings from reindexing');
86         $im->done;
87         ok(-d $xap, 'Xapian directories recreated');
88         delete $ibx->{mm};
89         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
90 }
91
92 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
93 remove_tree($xap);
94 $rw = PublicInbox::SearchIdx->new($ibx, 1);
95
96 ok(!-d $xap, 'Xapian directories removed again');
97 {
98         my @warn;
99         local $SIG{__WARN__} = sub { push @warn, @_ };
100         eval { $rw->index_sync({reindex => 1}) };
101         is($@, '', 'no error from reindexing without msgmap');
102         is_deeply(\@warn, [], 'no warnings');
103         $im->done;
104         ok(-d $xap, 'Xapian directories recreated');
105         delete $ibx->{mm};
106         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
107 }
108
109 done_testing();