]> Sergey Matveev's repositories - public-inbox.git/blob - t/v1reindex.t
v1: allow upgrading indexlevel=basic to 'medium' or 'full'
[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         indexlevel => 'full',
24 };
25 my $ibx = PublicInbox::Inbox->new($ibx_config);
26 my $mime = PublicInbox::MIME->create(
27         header => [
28                 From => 'a@example.com',
29                 To => 'test@example.com',
30                 Subject => 'this is a subject',
31                 Date => 'Fri, 02 Oct 1993 00:00:00 +0000',
32         ],
33         body => "hello world\n",
34 );
35 my $im = PublicInbox::Import->new($ibx->git, undef, undef, $ibx);
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 $rw = PublicInbox::SearchIdx->new($ibx, 1);
51 eval { $rw->index_sync() };
52 is($@, '', 'no error from indexing');
53
54 my $minmax = [ $ibx->mm->minmax ];
55 ok(defined $minmax->[0] && defined $minmax->[1], 'minmax defined');
56 is_deeply($minmax, [ 1, 10 ], 'minmax as expected');
57
58 $rw = PublicInbox::SearchIdx->new($ibx, 1);
59 eval { $rw->index_sync({reindex => 1}) };
60 is($@, '', 'no error from reindexing');
61 $im->done;
62
63 my $xap = "$mainrepo/public-inbox/xapian".PublicInbox::Search::SCHEMA_VERSION();
64 remove_tree($xap);
65 ok(!-d $xap, 'Xapian directories removed');
66 $rw = PublicInbox::SearchIdx->new($ibx, 1);
67
68 eval { $rw->index_sync({reindex => 1}) };
69 is($@, '', 'no error from reindexing');
70 $im->done;
71 ok(-d $xap, 'Xapian directories recreated');
72
73 delete $ibx->{mm};
74 is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
75
76 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
77 remove_tree($xap);
78 ok(!-d $xap, 'Xapian directories removed again');
79
80 $rw = PublicInbox::SearchIdx->new($ibx, 1);
81 {
82         my @warn;
83         local $SIG{__WARN__} = sub { push @warn, @_ };
84         eval { $rw->index_sync({reindex => 1}) };
85         is($@, '', 'no error from reindexing without msgmap');
86         is(scalar(@warn), 0, 'no warnings from reindexing');
87         $im->done;
88         ok(-d $xap, 'Xapian directories recreated');
89         delete $ibx->{mm};
90         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
91 }
92
93 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
94 remove_tree($xap);
95 ok(!-d $xap, 'Xapian directories removed again');
96
97 $rw = PublicInbox::SearchIdx->new($ibx, 1);
98 {
99         my @warn;
100         local $SIG{__WARN__} = sub { push @warn, @_ };
101         eval { $rw->index_sync({reindex => 1}) };
102         is($@, '', 'no error from reindexing without msgmap');
103         is_deeply(\@warn, [], 'no warnings');
104         $im->done;
105         ok(-d $xap, 'Xapian directories recreated');
106         delete $ibx->{mm};
107         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
108 }
109
110 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
111 remove_tree($xap);
112 ok(!-d $xap, 'Xapian directories removed again');
113
114 $ibx_config->{indexlevel} = 'medium';
115 $ibx = PublicInbox::Inbox->new($ibx_config);
116 $rw = PublicInbox::SearchIdx->new($ibx, 1);
117 {
118         my @warn;
119         local $SIG{__WARN__} = sub { push @warn, @_ };
120         eval { $rw->index_sync({reindex => 1}) };
121         is($@, '', 'no error from reindexing without msgmap');
122         is_deeply(\@warn, [], 'no warnings');
123         $im->done;
124         ok(-d $xap, 'Xapian directories recreated');
125         delete $ibx->{mm};
126         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
127         my $mset = $ibx->search->query('hello world', {mset=>1});
128         isnt(0, $mset->size, 'got Xapian search results');
129 }
130
131 ok(unlink "$mainrepo/public-inbox/msgmap.sqlite3", 'remove msgmap');
132 remove_tree($xap);
133 ok(!-d $xap, 'Xapian directories removed again');
134
135 $ibx_config->{indexlevel} = 'basic';
136 $ibx = PublicInbox::Inbox->new($ibx_config);
137 $rw = PublicInbox::SearchIdx->new($ibx, 1);
138 {
139         my @warn;
140         local $SIG{__WARN__} = sub { push @warn, @_ };
141         eval { $rw->index_sync({reindex => 1}) };
142         is($@, '', 'no error from reindexing without msgmap');
143         is_deeply(\@warn, [], 'no warnings');
144         $im->done;
145         ok(-d $xap, 'Xapian directories recreated');
146         delete $ibx->{mm};
147         is_deeply([ $ibx->mm->minmax ], $minmax, 'minmax unchanged');
148         my $mset = $ibx->search->reopen->query('hello world', {mset=>1});
149         is(0, $mset->size, "no Xapian search results");
150 }
151
152 # upgrade existing basic to medium
153 # note: changing indexlevels is not yet supported in v2,
154 # and may not be without more effort
155 $ibx_config->{indexlevel} = 'medium';
156 $ibx = PublicInbox::Inbox->new($ibx_config);
157 $rw = PublicInbox::SearchIdx->new($ibx, 1);
158 # no removals
159 {
160         my @warn;
161         local $SIG{__WARN__} = sub { push @warn, @_ };
162         eval { $rw->index_sync };
163         is($@, '', 'no error from indexing');
164         is_deeply(\@warn, [], 'no warnings');
165         my $mset = $ibx->search->reopen->query('hello world', {mset=>1});
166         isnt(0, $mset->size, 'search OK after basic -> medium');
167 }
168
169 done_testing();