1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
# Copyright (C) 2015-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use warnings;
use Test::More;
use PublicInbox::TestCommon;
use PublicInbox::Eml;
require_mods(qw(DBD::SQLite Data::Dumper));
use_ok 'PublicInbox::NNTP';
use_ok 'PublicInbox::Inbox';
use PublicInbox::Config;
{
sub quote_str {
my (undef, $s) = split(/ = /, Data::Dumper::Dumper($_[0]), 2);
$s =~ s/;\n//;
$s;
}
sub wm_prepare {
my ($wm) = @_;
my $orig = qq{'$wm'};
PublicInbox::NNTP::wildmat2re($_[0]);
my $new = quote_str($_[0]);
($orig, $new);
}
sub wildmat_like {
my ($str, $wm) = @_;
my ($orig, $new) = wm_prepare($wm);
like($str, $wm, "$orig matches '$str' using $new");
}
sub wildmat_unlike {
my ($str, $wm, $check_ex) = @_;
if ($check_ex) {
use re 'eval';
my $re = qr/$wm/;
like($str, $re, "normal re with $wm matches, but ...");
}
my ($orig, $new) = wm_prepare($wm);
unlike($str, $wm, "$orig does not match '$str' using $new");
}
wildmat_like('[foo]', '[\[foo\]]');
wildmat_like('any', '*');
wildmat_unlike('bar.foo.bar', 'foo.*');
# no code execution
wildmat_unlike('HI', '(?{"HI"})', 1);
wildmat_unlike('HI', '[(?{"HI"})]', 1);
}
{
sub ngpat_like {
my ($str, $pat) = @_;
my $orig = $pat;
PublicInbox::NNTP::ngpat2re($pat);
like($str, $pat, "'$orig' matches '$str' using $pat");
}
ngpat_like('any', '*');
ngpat_like('a.s.r', 'a.t,a.s.r');
ngpat_like('a.s.r', 'a.t,a.s.*');
}
{
use POSIX qw(strftime);
sub time_roundtrip {
my ($date, $time, $gmt) = @_;
my $m = join(' ', @_);
my $ts = PublicInbox::NNTP::parse_time(@_);
my @t = $gmt ? gmtime($ts) : localtime($ts);
my ($d, $t) = split(' ', strftime('%Y%m%d %H%M%S', @t));
if (length($date) != 8) { # Net::NNTP uses YYMMDD :<
$d =~ s/^[0-9]{2}//;
}
is_deeply([$d, $t], [$date, $time], "roundtripped: $m");
$ts;
}
my $x1 = time_roundtrip(qw(20141109 060606 GMT));
my $x2 = time_roundtrip(qw(141109 060606 GMT));
my $x3 = time_roundtrip(qw(930724 060606 GMT));
my $x5 = time_roundtrip(qw(710101 000000));
my $x6 = time_roundtrip(qw(720101 000000));
SKIP: {
skip('YYMMDD test needs updating', 6) if (time > 0x7fffffff);
# our world probably ends in 2038, but if not we'll try to
# remember to update the test then
is($x1, $x2, 'YYYYMMDD and YYMMDD parse identically');
is(strftime('%Y', gmtime($x3)), '1993', '930724 was in 1993');
my $epoch = time_roundtrip(qw(700101 000000 GMT));
is($epoch, 0, 'epoch parsed correctly');
ok($x6 > $x5, '1972 > 1971');
ok($x5 > $epoch, '1971 > Unix epoch');
}
}
{ # test setting NNTP headers in HEAD and ARTICLE requests
my $u = 'https://example.com/a/';
my $ibx = PublicInbox::Inbox->new({ name => 'test',
inboxdir => 'test.git',
address => 'a@example.com',
-primary_address => 'a@example.com',
newsgroup => 'test',
domain => 'example.com',
url => [ '//example.com/a' ]});
is($ibx->base_url, $u, 'URL expanded');
my $mid = 'a@b';
my $mime = PublicInbox::Eml->new("Message-ID: <$mid>\r\n\r\n");
my $hdr = $mime->header_obj;
my $mock_self = {
nntpd => {
servername => 'example.com',
pi_cfg => bless {}, 'PublicInbox::Config',
},
ibx => $ibx,
};
my $smsg = { num => 1, mid => $mid, nntp => $mock_self, -ibx => $ibx };
PublicInbox::NNTP::set_nntp_headers($hdr, $smsg);
is_deeply([ $mime->header('Message-ID') ], [ "<$mid>" ],
'Message-ID unchanged');
is_deeply([ $mime->header('Newsgroups') ], [ 'test' ],
'Newsgroups: set');
is_deeply([ $mime->header('Xref') ], [ 'example.com test:1' ],
'Xref: set');
$smsg->{num} = 2;
PublicInbox::NNTP::set_nntp_headers($hdr, $smsg);
is_deeply([ $mime->header('Message-ID') ], [ "<$mid>" ],
'Message-ID unchanged');
is_deeply([ $mime->header('Xref') ], [ 'example.com test:2' ],
'Old Xref: clobbered');
}
done_testing();
|