about summary refs log tree commit homepage
path: root/t/config.t
diff options
context:
space:
mode:
Diffstat (limited to 't/config.t')
-rw-r--r--t/config.t193
1 files changed, 132 insertions, 61 deletions
diff --git a/t/config.t b/t/config.t
index 7e753cbe..c41a42d3 100644
--- a/t/config.t
+++ b/t/config.t
@@ -1,13 +1,31 @@
-# Copyright (C) 2014-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
-use strict;
-use v5.10.1;
+use v5.12;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
 use_ok 'PublicInbox';
 ok(defined(eval('$PublicInbox::VERSION')), 'VERSION defined');
 use_ok 'PublicInbox::Config';
 my ($tmpdir, $for_destroy) = tmpdir();
+use autodie qw(open close);
+my $validate_git_behavior = $ENV{TEST_VALIDATE_GIT_BEHAVIOR};
+
+{
+        my $f = "$tmpdir/bool_config";
+        open my $fh, '>', $f;
+        print $fh <<EOM;
+[imap]
+        debug
+        port = 2
+EOM
+        close $fh;
+        my $cfg = PublicInbox::Config->git_config_dump($f);
+        $validate_git_behavior and
+                is(xqx([qw(git config -f), $f, qw(--bool imap.debug)]),
+                        "true\n", 'git handles key-only as truth');
+        ok($cfg->git_bool($cfg->{'imap.debug'}), 'key-only value handled');
+        is($cfg->{'imap.port'}, 2, 'normal k=v read after key-only');
+}
 
 {
         PublicInbox::Import::init_bare($tmpdir);
@@ -64,28 +82,30 @@ my ($tmpdir, $for_destroy) = tmpdir();
 
 
 {
-        my $cfgpfx = "publicinbox.test";
         my @altid = qw(serial:gmane:file=a serial:enamg:file=b);
-        my $config = PublicInbox::Config->new(\<<EOF);
-$cfgpfx.address=test\@example.com
-$cfgpfx.mainrepo=/path/to/non/existent
-$cfgpfx.altid=serial:gmane:file=a
-$cfgpfx.altid=serial:enamg:file=b
+        my $config = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
+        altid=serial:gmane:file=a
+        altid=serial:enamg:file=b
 EOF
         my $ibx = $config->lookup_name('test');
         is_deeply($ibx->{altid}, [ @altid ]);
 
-        $config = PublicInbox::Config->new(\<<EOF);
-$cfgpfx.address=test\@example.com
-$cfgpfx.mainrepo=/path/to/non/existent
+        $config = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
 EOF
         $ibx = $config->lookup_name('test');
         is($ibx->{inboxdir}, '/path/to/non/existent', 'mainrepo still works');
 
-        $config = PublicInbox::Config->new(\<<EOF);
-$cfgpfx.address=test\@example.com
-$cfgpfx.inboxdir=/path/to/non/existent
-$cfgpfx.mainrepo=/path/to/deprecated
+        $config = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
+        mainrepo = /path/to/deprecated
 EOF
         $ibx = $config->lookup_name('test');
         is($ibx->{inboxdir}, '/path/to/non/existent',
@@ -93,28 +113,29 @@ EOF
 }
 
 {
-        my $pfx = "publicinbox.test";
-        my $str = <<EOF;
-$pfx.address=test\@example.com
-$pfx.inboxdir=/path/to/non/existent
-$pfx.newsgroup=inbox.test
-publicinbox.nntpserver=news.example.com
+        my $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
+        newsgroup = inbox.test
+[publicinbox]
+        nntpserver = news.example.com
 EOF
-        my $cfg = PublicInbox::Config->new(\$str);
         my $ibx = $cfg->lookup_name('test');
         is_deeply($ibx->nntp_url({ www => { pi_cfg => $cfg }}),
                 [ 'nntp://news.example.com/inbox.test' ],
                 'nntp_url uses global NNTP server');
 
-        $str = <<EOF;
-$pfx.address=test\@example.com
-$pfx.inboxdir=/path/to/non/existent
-$pfx.newsgroup=inbox.test
-$pfx.nntpserver=news.alt.example.com
-publicinbox.nntpserver=news.example.com
-publicinbox.imapserver=imaps://mail.example.com
+        $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
+        newsgroup = inbox.test
+        nntpserver = news.alt.example.com
+[publicinbox]
+        nntpserver = news.example.com
+        imapserver = imaps://mail.example.com
 EOF
-        $cfg = PublicInbox::Config->new(\$str);
         $ibx = $cfg->lookup_name('test');
         is_deeply($ibx->nntp_url({ www => { pi_cfg => $cfg }}),
                 [ 'nntp://news.alt.example.com/inbox.test' ],
@@ -126,17 +147,18 @@ EOF
 
 # no obfuscate domains
 {
-        my $pfx = "publicinbox.test";
-        my $pfx2 = "publicinbox.foo";
-        my $str = <<EOF;
-$pfx.address=test\@example.com
-$pfx.inboxdir=/path/to/non/existent
-$pfx2.address=foo\@example.com
-$pfx2.inboxdir=/path/to/foo
-publicinbox.noobfuscate=public-inbox.org \@example.com z\@EXAMPLE.com
-$pfx.obfuscate=true
+        my $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "test"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
+[publicinbox "foo"]
+        address = foo\@example.com
+        inboxdir = /path/to/foo
+[publicinbox]
+        noobfuscate = public-inbox.org \@example.com z\@EXAMPLE.com
+[publicinbox "test"]
+        obfuscate = true
 EOF
-        my $cfg = PublicInbox::Config->new(\$str);
         my $ibx = $cfg->lookup_name('test');
         my $re = $ibx->{-no_obfuscate_re};
         like('meta@public-inbox.org', $re,
@@ -208,20 +230,21 @@ for my $s (@valid) {
 }
 
 {
-        my $pfx1 = "publicinbox.test1";
-        my $pfx2 = "publicinbox.test2";
-        my $str = <<EOF;
-$pfx1.address=test\@example.com
-$pfx1.inboxdir=/path/to/non/existent
-$pfx2.address=foo\@example.com
-$pfx2.inboxdir=/path/to/foo
-$pfx1.coderepo=project
-$pfx2.coderepo=project
-coderepo.project.dir=/path/to/project.git
+        my $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "test1"]
+        address = test\@example.com
+        inboxdir = /path/to/non/existent
+        coderepo = project
+[publicinbox "test2"]
+        address = foo\@example.com
+        inboxdir = /path/to/foo
+        coderepo = project
+[coderepo "project"]
+        dir = /path/to/project.git
 EOF
-        my $cfg = PublicInbox::Config->new(\$str);
         my $t1 = $cfg->lookup_name('test1');
         my $t2 = $cfg->lookup_name('test2');
+        ok $cfg->repo_objs($t1)->[0], 'coderepo parsed';
         is($cfg->repo_objs($t1)->[0], $cfg->repo_objs($t2)->[0],
                 'inboxes share ::Git object');
 }
@@ -245,21 +268,69 @@ EOF
 
 SKIP: {
         # XXX wildcard match requires git 2.26+
-        require_git('1.8.5', 2) or
-                skip 'git 1.8.5+ required for --url-match', 2;
-        my $f = "$tmpdir/urlmatch";
-        open my $fh, '>', $f or BAIL_OUT $!;
-        print $fh <<EOF or BAIL_OUT $!;
+        require_git v1.8.5, 2;
+        my $cfg = cfg_new $tmpdir, <<EOF;
 [imap "imap://mail.example.com"]
         pollInterval = 9
 EOF
-        close $fh or BAIL_OUT;
-        local $ENV{PI_CONFIG} = $f;
-        my $cfg = PublicInbox::Config->new;
         my $url = 'imap://mail.example.com/INBOX';
         is($cfg->urlmatch('imap.pollInterval', $url), 9, 'urlmatch hit');
         is($cfg->urlmatch('imap.idleInterval', $url), undef, 'urlmatch miss');
 };
 
+my $glob2re = PublicInbox::Config->can('glob2re');
+is($glob2re->('http://[::1]:1234/foo/'), undef, 'IPv6 URL not globbed');
+is($glob2re->('foo'), undef, 'plain string unchanged');
+is_deeply($glob2re->('[f-o]'), '[f-o]' , 'range accepted');
+is_deeply($glob2re->('*'), '[^/]*?' , 'wildcard accepted');
+is_deeply($glob2re->('{a,b,c}'), '(a|b|c)' , 'braces');
+is_deeply($glob2re->('{,b,c}'), '(|b|c)' , 'brace with empty @ start');
+is_deeply($glob2re->('{a,b,}'), '(a|b|)' , 'brace with empty @ end');
+is_deeply($glob2re->('{a}'), undef, 'ungrouped brace');
+is_deeply($glob2re->('{a'), undef, 'open left brace');
+is_deeply($glob2re->('a}'), undef, 'open right brace');
+is_deeply($glob2re->('*.[ch]'), '[^/]*?\\.[ch]', 'suffix glob');
+is_deeply($glob2re->('{[a-z],9,}'), '([a-z]|9|)' , 'brace with range');
+is_deeply($glob2re->('\\{a,b\\}'), undef, 'escaped brace');
+is_deeply($glob2re->('\\\\{a,b}'), '\\\\\\\\(a|b)', 'fake escape brace');
+is_deeply($glob2re->('**/foo'), '.*/foo', 'double asterisk start');
+is_deeply($glob2re->('foo/**'), 'foo/.*', 'double asterisk end');
+my $re = $glob2re->('a/**/b');
+is_deeply($re, 'a(?:/.*?/|/)b', 'double asterisk middle');
+like($_, qr!$re!, "a/**/b matches $_") for ('a/b', 'a/c/b', 'a/c/a/b');
+unlike($_, qr!$re!, "a/**/b doesn't match $_") for ('a/ab');
+
+{
+        my $w = '';
+        local $SIG{__WARN__} = sub { $w .= "@_"; };
+        my $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "a"]
+        address = a\@example.com
+        inboxdir = $tmpdir/aa
+[publicinbox "b"]
+        address = b\@example.com
+        inboxdir = $tmpdir/aa
+EOF
+        $cfg->fill_all;
+        like $w, qr!`\Q$tmpdir/aa\E' used by both!, 'inboxdir conflict warned';
+}
+
+{
+        my $w = '';
+        local $SIG{__WARN__} = sub { $w .= "@_"; };
+        my $cfg = cfg_new $tmpdir, <<EOF;
+[publicinbox "a"]
+        address = a\@example.com
+        inboxdir = $tmpdir/a
+        newsgroup = inbox.test
+[publicinbox "b"]
+        address = b\@example.com
+        inboxdir = $tmpdir/b
+        newsgroup = inbox.tesT
+EOF
+        $cfg->fill_all;
+        like $w, qr!`inbox\.test' used by both!, 'newsgroup conflict warned';
+        like $w, qr!`inbox\.tesT' lowercased!, 'upcase warned';
+}
 
-done_testing();
+done_testing;