]> Sergey Matveev's repositories - public-inbox.git/blob - t/v2reindex.t
tests: fixup indexlevel setting in tests
[public-inbox.git] / t / v2reindex.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 v2reindex.t" if $@;
14 }
15 use_ok 'PublicInbox::V2Writable';
16 my $mainrepo = tempdir('pi-v2reindex-XXXXXX', TMPDIR => 1, CLEANUP => 1);
17 my $ibx_config = {
18         mainrepo => $mainrepo,
19         name => 'test-v2writable',
20         version => 2,
21         -primary_address => 'test@example.com',
22         indexlevel => 'full',
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 local $ENV{NPROC} = 2;
35 my $im = PublicInbox::V2Writable->new($ibx, 1);
36 foreach my $i (1..10) {
37         $mime->header_set('Message-Id', "<$i\@example.com>");
38         ok($im->add($mime), "message $i added");
39         if ($i == 4) {
40                 $im->remove($mime);
41         }
42 }
43
44 if ('test remove later') {
45         $mime->header_set('Message-Id', "<5\@example.com>");
46         $im->remove($mime);
47 }
48
49 $im->done;
50 my $minmax = [ $ibx->mm->minmax ];
51 ok(defined $minmax->[0] && defined $minmax->[1], 'minmax defined');
52 is_deeply($minmax, [ 1, 10 ], 'minmax as expected');
53
54 eval { $im->index_sync({reindex => 1}) };
55 is($@, '', 'no error from reindexing');
56 $im->done;
57
58 my $xap = "$mainrepo/xap".PublicInbox::Search::SCHEMA_VERSION();
59 remove_tree($xap);
60 ok(!-d $xap, 'Xapian directories removed');
61 eval { $im->index_sync({reindex => 1}) };
62 is($@, '', 'no error from reindexing');
63 $im->done;
64 ok(-d $xap, 'Xapian directories recreated');
65
66 delete $ibx->{mm};
67 is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
68
69 ok(unlink "$mainrepo/msgmap.sqlite3", 'remove msgmap');
70 remove_tree($xap);
71 ok(!-d $xap, 'Xapian directories removed again');
72 {
73         my @warn;
74         local $SIG{__WARN__} = sub { push @warn, @_ };
75         eval { $im->index_sync({reindex => 1}) };
76         is($@, '', 'no error from reindexing without msgmap');
77         is(scalar(@warn), 0, 'no warnings from reindexing');
78         $im->done;
79         ok(-d $xap, 'Xapian directories recreated');
80         delete $ibx->{mm};
81         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
82 }
83
84 my %sizes;
85 ok(unlink "$mainrepo/msgmap.sqlite3", 'remove msgmap');
86 remove_tree($xap);
87 ok(!-d $xap, 'Xapian directories removed again');
88 {
89         my @warn;
90         local $SIG{__WARN__} = sub { push @warn, @_ };
91         eval { $im->index_sync({reindex => 1}) };
92         is($@, '', 'no error from reindexing without msgmap');
93         is_deeply(\@warn, [], 'no warnings');
94         $im->done;
95         ok(-d $xap, 'Xapian directories recreated');
96         delete $ibx->{mm};
97         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
98         my $mset = $ibx->search->query('"hello world"', {mset=>1});
99         isnt(0, $mset->size, "phrase search succeeds on indexlevel=full");
100         for (<"$xap/*/*">) { $sizes{$ibx->{indexlevel}} += -s _ if -f $_ }
101 }
102
103 ok(unlink "$mainrepo/msgmap.sqlite3", 'remove msgmap');
104 remove_tree($xap);
105 ok(!-d $xap, 'Xapian directories removed again');
106
107 $ibx_config->{indexlevel} = 'medium';
108 $ibx = PublicInbox::Inbox->new($ibx_config);
109 $im = PublicInbox::V2Writable->new($ibx);
110 {
111         my @warn;
112         local $SIG{__WARN__} = sub { push @warn, @_ };
113         eval { $im->index_sync({reindex => 1}) };
114         is($@, '', 'no error from reindexing without msgmap');
115         is_deeply(\@warn, [], 'no warnings');
116         $im->done;
117         ok(-d $xap, 'Xapian directories recreated');
118         delete $ibx->{mm};
119         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
120
121         if (0) {
122                 # not sure why, but Xapian seems to fallback to terms and
123                 # phrase searches still work
124                 delete $ibx->{search};
125                 my $mset = $ibx->search->query('"hello world"', {mset=>1});
126                 is(0, $mset->size, 'phrase search does not work on medium');
127         }
128
129         my $mset = $ibx->search->query('hello world', {mset=>1});
130         isnt(0, $mset->size, "normal search works on indexlevel=medium");
131         for (<"$xap/*/*">) { $sizes{$ibx->{indexlevel}} += -s _ if -f $_ }
132         ok($sizes{full} > $sizes{medium}, 'medium is smaller than full');
133 }
134
135 ok(unlink "$mainrepo/msgmap.sqlite3", 'remove msgmap');
136 remove_tree($xap);
137 ok(!-d $xap, 'Xapian directories removed again');
138
139 $ibx_config->{indexlevel} = 'basic';
140 $ibx = PublicInbox::Inbox->new($ibx_config);
141 $im = PublicInbox::V2Writable->new($ibx);
142 {
143         my @warn;
144         local $SIG{__WARN__} = sub { push @warn, @_ };
145         eval { $im->index_sync({reindex => 1}) };
146         is($@, '', 'no error from reindexing without msgmap');
147         is_deeply(\@warn, [], 'no warnings');
148         $im->done;
149         ok(-d $xap, 'Xapian directories recreated');
150         delete $ibx->{mm};
151         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
152         my $mset = $ibx->search->query('hello', {mset=>1});
153         is(0, $mset->size, "search fails on indexlevel='basic'");
154         for (<"$xap/*/*">) { $sizes{$ibx->{indexlevel}} += -s _ if -f $_ }
155         ok($sizes{medium} > $sizes{basic}, 'basic is smaller than medium');
156 }
157
158 done_testing();