about summary refs log tree commit homepage
path: root/t/cindex-join.t
diff options
context:
space:
mode:
Diffstat (limited to 't/cindex-join.t')
-rw-r--r--t/cindex-join.t88
1 files changed, 88 insertions, 0 deletions
diff --git a/t/cindex-join.t b/t/cindex-join.t
new file mode 100644
index 00000000..22c67107
--- /dev/null
+++ b/t/cindex-join.t
@@ -0,0 +1,88 @@
+#!perl -w
+# Copyright (C) all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+# cindex --join functionality against mwrap, a small projects
+# started as C+Ruby and got forked to C+Perl/XS w/ public inboxes for each
+use v5.12;
+use PublicInbox::TestCommon;
+use PublicInbox::IO qw(write_file);
+use PublicInbox::Import;
+use PublicInbox::Config;
+use autodie;
+use File::Spec;
+$ENV{TEST_REMOTE_JOIN} or plan skip_all => 'TEST_REMOTE_JOIN unset';
+require_cmd 'join';
+local $ENV{TAIL_ALL} = $ENV{TAIL_ALL} // 1; # while features are unstable
+require_mods(qw(json Xapian DBD::SQLite +SCM_RIGHTS));
+my @code = qw(https://80x24.org/mwrap-perl.git
+                https://80x24.org/mwrap.git);
+my @inboxes = qw(https://80x24.org/mwrap-public 2 inbox.comp.lang.ruby.mwrap
+        https://80x24.org/mwrap-perl 2 inbox.comp.lang.perl.mwrap);
+my (%code, %inboxes);
+my $topdir = File::Spec->rel2abs('.');
+my $tmpdir = tmpdir;
+while (my $url = shift @code) {
+        my ($key) = ($url =~ m!/([^/]+\.git)\z!);
+        $code{$key} = create_coderepo $key, sub {
+                PublicInbox::Import::init_bare '.';
+                write_file '>>', 'config', <<EOM;
+[remote "origin"]
+        url = $url
+        fetch = +refs/*:refs/*
+        mirror = true
+EOM
+                if (my $d = $code{'mwrap-perl.git'}) {
+                        $d = File::Spec->abs2rel("$topdir/$d", 'objects');
+                        write_file '>','objects/info/alternates',"$d/objects\n"
+                }
+                diag "mirroring coderepo: $url ...";
+                xsys_e qw(git fetch -q origin);
+        };
+}
+
+while (my ($url, $v, $ng) = splice(@inboxes, 0, 3)) {
+        my ($key) = ($url =~ m!/([^/]+)\z!);
+        my @opt = (version => $v, tmpdir => "$tmpdir/$key", -no_gc => 1);
+        $inboxes{$key} = create_inbox $key, @opt, sub {
+                my ($im, $ibx) = @_;
+                $im->done;
+                diag "cloning public-inbox $url ...";
+                run_script([qw(-clone -q), $url, $ibx->{inboxdir}]) or
+                        xbail "clone: $?";
+                diag "indexing $ibx->{inboxdir} ...";
+                run_script([qw(-index -v -L medium --dangerous),
+                                $ibx->{inboxdir}]) or xbail "index: $?";
+        };
+        $inboxes{$key}->{newsgroup} = $ng;
+};
+my $env = {};
+open my $fh, '>', $env->{PI_CONFIG} = "$tmpdir/pi_config";
+for (sort keys %inboxes) {
+        print $fh <<EOM;
+[publicinbox "$_"]
+        inboxdir = $inboxes{$_}->{inboxdir}
+        address = $_\@80x24.org
+        newsgroup = $inboxes{$_}->{newsgroup}
+EOM
+}
+close $fh;
+my $cidxdir = "$tmpdir/cidx";
+# this should be fast since mwrap* are small
+my $rdr = { 1 => \my $cout, 2 => \my $cerr };
+ok run_script([qw(-cindex -v --all --show=join_data),
+                '--join=aggressive,dt:..2022-12-01',
+                '-d', $cidxdir, map { ('-g', $_) } values %code ],
+                $env, $rdr), 'initial join inboxes w/ coderepos';
+my $out = PublicInbox::Config->json->decode($cout);
+is($out->{join_data}->{dt}->[0], '19700101'.'000000',
+        'dt:..$END_DATE starts from epoch');
+
+ok run_script([qw(-cindex -v --all -u --join --show),
+                '-d', $cidxdir], $env, $rdr), 'incremental --join';
+
+ok run_script([qw(-cindex -v --no-scan --show),
+                '-d', $cidxdir], $env, $rdr), 'show';
+$out = PublicInbox::Config->json->decode($cout);
+is ref($out->{join_data}), 'HASH', 'got hash join data';
+is $cerr, '', 'no warnings or errors in stderr w/ --show';
+done_testing;