We'll rely on defined(wantarray) to implicitly skip subtests,
and memoize these to reduce syscalls, since tests should
be short-lived enough to not be affected by new installations or
removals of git/xapian-compact/curl/etc...
15 files changed:
}
sub require_cmd ($;$) {
}
sub require_cmd ($;$) {
- my ($cmd, $maybe) = @_;
require PublicInbox::Spawn;
require PublicInbox::Spawn;
- my $bin = PublicInbox::Spawn::which($cmd);
+ state %CACHE;
+ my $bin = $CACHE{$cmd} //= PublicInbox::Spawn::which($cmd);
- $maybe ? 0 : plan(skip_all => "$cmd missing from PATH for $0");
+ return plan(skip_all => "$cmd missing from PATH for $0") if !$nr;
+ defined(wantarray) ? undef : skip("$cmd missing, skipping $nr tests")
-sub have_xapian_compact () {
- require_cmd($ENV{XAPIAN_COMPACT} || 'xapian-compact', 1);
+sub have_xapian_compact (;$) {
+ require_cmd($ENV{XAPIAN_COMPACT} || 'xapian-compact', @_ ? $_[0] : ());
}
sub require_git ($;$) {
}
sub require_git ($;$) {
- my ($req, $maybe) = @_;
- my ($req_maj, $req_min, $req_sub) = split(/\./, $req);
- my ($cur_maj, $cur_min, $cur_sub) = (xqx([qw(git --version)])
- =~ /version (\d+)\.(\d+)(?:\.(\d+))?/);
+ my ($req, $nr) = @_;
+ state ($cur_int, $cur_ver);
+ $cur_int //= do {
+ chomp($cur_ver = xqx([qw(git --version)]));
+ my @v = ($cur_ver =~ /version (\d+)\.(\d+)(?:\.(\d+))?/);
+ ($v[0] << 24) | ($v[1] << 16) | ($v[2] // 0);
+ };
+ my ($req_maj, $req_min, $req_sub) = split(/\./, $req);
my $req_int = ($req_maj << 24) | ($req_min << 16) | ($req_sub // 0);
my $req_int = ($req_maj << 24) | ($req_min << 16) | ($req_sub // 0);
- my $cur_int = ($cur_maj << 24) | ($cur_min << 16) | ($cur_sub // 0);
- if ($cur_int < $req_int) {
- return 0 if $maybe;
- plan skip_all =>
- "git $req+ required, have $cur_maj.$cur_min.$cur_sub";
- }
- 1;
+
+ return 1 if $cur_int >= $req_int;
+ return plan skip_all => "git $req+ required, have $cur_ver" if !$nr;
+ defined(wantarray) ? undef :
+ skip("git $req+ required (have $cur_ver), skipping $nr tests")
my $test_opt = shift // {};
local $lei_cwdfh;
opendir $lei_cwdfh, '.' or xbail "opendir .: $!";
my $test_opt = shift // {};
local $lei_cwdfh;
opendir $lei_cwdfh, '.' or xbail "opendir .: $!";
- require_git(2.6, 1) or skip('git 2.6+ required for lei test', 2);
my $mods = $test_opt->{mods} // [ 'lei' ];
require_mods(@$mods, 2);
my $mods = $test_opt->{mods} // [ 'lei' ];
require_mods(@$mods, 2);
-# Copyright (C) 2019-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;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
my $v2ibx;
SKIP: {
require_mods(qw(DBD::SQLite), 5);
my $v2ibx;
SKIP: {
require_mods(qw(DBD::SQLite), 5);
- require_git(2.6, 1) or skip 5, 'git too old';
$v2ibx = create_inbox 'v2', indexlevel => 'basic', version => 2,
-no_gc => 1, sub {
my ($v2w, $ibx) = @_;
$v2ibx = create_inbox 'v2', indexlevel => 'basic', version => 2,
-no_gc => 1, sub {
my ($v2w, $ibx) = @_;
-# 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;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
SKIP: {
# XXX wildcard match requires git 2.26+
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;
+ require_git('1.8.5', 2);
my $f = "$tmpdir/urlmatch";
open my $fh, '>', $f or BAIL_OUT $!;
print $fh <<EOF or BAIL_OUT $!;
my $f = "$tmpdir/urlmatch";
open my $fh, '>', $f or BAIL_OUT $!;
print $fh <<EOF or BAIL_OUT $!;
-# Copyright (C) 2018-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;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
use PublicInbox::Import;
require_git(2.6);
require_mods(qw(DBD::SQLite Search::Xapian));
use PublicInbox::Import;
require_git(2.6);
require_mods(qw(DBD::SQLite Search::Xapian));
-have_xapian_compact or
- plan skip_all => 'xapian-compact missing for '.__FILE__;
my ($tmpdir, $for_destroy) = tmpdir();
my $ibx = create_inbox 'v1', indexlevel => 'medium', tmpdir => "$tmpdir/v1",
pre_cb => sub {
my ($tmpdir, $for_destroy) = tmpdir();
my $ibx = create_inbox 'v1', indexlevel => 'medium', tmpdir => "$tmpdir/v1",
pre_cb => sub {
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use PublicInbox::TestCommon;
my ($dir, $for_destroy) = tmpdir();
use PublicInbox::Import;
use PublicInbox::TestCommon;
my ($dir, $for_destroy) = tmpdir();
use PublicInbox::Import;
- require_git(2.6, 7) or skip('need git 2.6+ for --batch-all-objects', 7);
my ($alt, $alt_obj) = tmpdir();
my $hash_obj = [ 'git', "--git-dir=$alt", qw(hash-object -w --stdin) ];
PublicInbox::Import::init_bare($alt);
my ($alt, $alt_obj) = tmpdir();
my $hash_obj = [ 'git', "--git-dir=$alt", qw(hash-object -w --stdin) ];
PublicInbox::Import::init_bare($alt);
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# end-to-end IMAP tests, see unit tests in t/imap.t, too
use strict;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# end-to-end IMAP tests, see unit tests in t/imap.t, too
use strict;
use Time::HiRes ();
use PublicInbox::TestCommon;
use PublicInbox::Config;
use Time::HiRes ();
use PublicInbox::TestCommon;
use PublicInbox::Config;
SKIP: {
use_ok 'PublicInbox::InboxIdle';
SKIP: {
use_ok 'PublicInbox::InboxIdle';
- require_git('1.8.5', 1) or
- skip('git 1.8.5+ needed for --urlmatch', 4);
+ require_git '1.8.5', 4;
my $old_env = { HOME => $ENV{HOME} };
my $home = "$tmpdir/watch_home";
mkdir $home or BAIL_OUT $!;
my $old_env = { HOME => $ENV{HOME} };
my $home = "$tmpdir/watch_home";
mkdir $home or BAIL_OUT $!;
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
-use warnings;
-use Test::More;
use PublicInbox::Eml;
use PublicInbox::Smsg;
use PublicInbox::Git;
use PublicInbox::Eml;
use PublicInbox::Smsg;
use PublicInbox::Git;
EOF
my $v2 = require_git(2.6, 1);
EOF
my $v2 = require_git(2.6, 1);
-my $smsg = bless {}, 'PublicInbox::Smsg' if $v2;
+my $smsg = $v2 ? bless({}, 'PublicInbox::Smsg') : undef;
like($im->add($mime, undef, $smsg), qr/\A:[0-9]+\z/, 'added one message');
like($im->add($mime, undef, $smsg), qr/\A:[0-9]+\z/, 'added one message');
+SKIP: {
+ skip 'git 2.6+ required', 3 if !$v2;
like($smsg->{blob}, qr/\A[a-f0-9]{40,64}\z/, 'got last object_id');
my @cmd = ('git', "--git-dir=$git->{git_dir}", qw(hash-object --stdin));
open my $in, '+<', undef or BAIL_OUT "open(+<): $!";
like($smsg->{blob}, qr/\A[a-f0-9]{40,64}\z/, 'got last object_id');
my @cmd = ('git', "--git-dir=$git->{git_dir}", qw(hash-object --stdin));
open my $in, '+<', undef or BAIL_OUT "open(+<): $!";
-# Copyright (C) 2020-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;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
use PublicInbox::TestCommon;
use PublicInbox::Config;
use PublicInbox::Admin;
use PublicInbox::TestCommon;
use PublicInbox::Config;
use PublicInbox::Admin;
is($res->[0]->{ds}, $smsg->{ds}, 'Xapian search on datestamp');
}
SKIP: {
is($res->[0]->{ds}, $smsg->{ds}, 'Xapian search on datestamp');
}
SKIP: {
- require_git(2.6, 1) or skip('git 2.6+ required for v2', 10);
my $v2dir = "$tmpdir/v2";
run_script(['-convert', $v1dir, $v2dir]) or die 'v2 conversion failed';
my $v2dir = "$tmpdir/v2";
run_script(['-convert', $v1dir, $v2dir]) or die 'v2 conversion failed';
-# Copyright (C) 2014-2021 all contributors <meta@public-inbox.org>
+#!perl -w
+# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
-use warnings;
-use Test::More;
use PublicInbox::Config;
use PublicInbox::TestCommon;
use PublicInbox::Admin;
use PublicInbox::Config;
use PublicInbox::TestCommon;
use PublicInbox::Admin;
SKIP: {
require_mods(qw(DBD::SQLite Search::Xapian), 2);
SKIP: {
require_mods(qw(DBD::SQLite Search::Xapian), 2);
- require_git(2.6, 1) or skip "git 2.6+ required", 2;
use_ok 'PublicInbox::Msgmap';
local $ENV{PI_DIR} = "$tmpdir/.public-inbox/";
local $ENV{PI_EMERGENCY} = "$tmpdir/.public-inbox/emergency";
use_ok 'PublicInbox::Msgmap';
local $ENV{PI_DIR} = "$tmpdir/.public-inbox/";
local $ENV{PI_EMERGENCY} = "$tmpdir/.public-inbox/emergency";
use_ok 'PublicInbox::Watch';
use_ok 'PublicInbox::InboxIdle';
use_ok 'PublicInbox::Config';
use_ok 'PublicInbox::Watch';
use_ok 'PublicInbox::InboxIdle';
use_ok 'PublicInbox::Config';
- require_git('1.8.5', 1) or skip('git 1.8.5+ needed for --urlmatch', 4);
+ require_git('1.8.5', 4);
my $old_env = { HOME => $ENV{HOME} };
my $home = "$tmpdir/watch_home";
mkdir $home or BAIL_OUT $!;
my $old_env = { HOME => $ENV{HOME} };
my $home = "$tmpdir/watch_home";
mkdir $home or BAIL_OUT $!;
-# Copyright (C) 2018-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;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
require_mods('Email::MIME', 1); # for legacy revision
# using plackup to test old PublicInbox::WWW since -httpd from
# back then relied on some packages we no longer depend on
require_mods('Email::MIME', 1); # for legacy revision
# using plackup to test old PublicInbox::WWW since -httpd from
# back then relied on some packages we no longer depend on
- my $plackup = which('plackup') or skip('no plackup in path', 1);
+ my $plackup = require_cmd('plackup', 1) or skip('no plackup in path', 1);
require PublicInbox::Lock;
chomp $oldrev;
my ($base) = ($0 =~ m!\b([^/]+)\.[^\.]+\z!);
require PublicInbox::Lock;
chomp $oldrev;
my ($base) = ($0 =~ m!\b([^/]+)\.[^\.]+\z!);
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# Ensure buffering behavior in -httpd doesn't cause runaway memory use
# or data corruption
use strict;
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# Ensure buffering behavior in -httpd doesn't cause runaway memory use
# or data corruption
use strict;
-use warnings;
-use Test::More;
use POSIX qw(setsid);
use PublicInbox::TestCommon;
use POSIX qw(setsid);
use PublicInbox::TestCommon;
-use PublicInbox::Spawn qw(which);
my $git_dir = $ENV{GIANT_GIT_DIR};
plan 'skip_all' => 'GIANT_GIT_DIR not defined' unless $git_dir;
my $git_dir = $ENV{GIANT_GIT_DIR};
plan 'skip_all' => 'GIANT_GIT_DIR not defined' unless $git_dir;
my $nr = 6;
skip 'no description', $nr unless -f "$git_dir/description";
my $mtime = (stat(_))[9];
my $nr = 6;
skip 'no description', $nr unless -f "$git_dir/description";
my $mtime = (stat(_))[9];
- my $curl = which('curl');
- skip 'curl(1) not found', $nr unless $curl;
+ my $curl = require_cmd('curl', 1) or skip 'curl(1) not found', $nr;
my $url = "http://$host:$port/description";
my $dst = "$tmpdir/desc";
is(xsys($curl, qw(-RsSf), '-o', $dst, $url), 0, 'curl -R');
my $url = "http://$host:$port/description";
my $dst = "$tmpdir/desc";
is(xsys($curl, qw(-RsSf), '-o', $dst, $url), 0, 'curl -R');
-# Copyright (C) 2020-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>
# Expensive test to validate compression and TLS.
use strict;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# Expensive test to validate compression and TLS.
use strict;
use PublicInbox::TestCommon;
use PublicInbox::DS qw(now);
use PublicInbox::TestCommon;
use PublicInbox::DS qw(now);
-use PublicInbox::Spawn qw(which popen_rd);
+use PublicInbox::Spawn qw(popen_rd);
use Digest::MD5;
use POSIX qw(_exit);
my $inboxdir = $ENV{GIANT_INBOX_DIR};
plan skip_all => "GIANT_INBOX_DIR not defined for $0" unless $inboxdir;
use Digest::MD5;
use POSIX qw(_exit);
my $inboxdir = $ENV{GIANT_INBOX_DIR};
plan skip_all => "GIANT_INBOX_DIR not defined for $0" unless $inboxdir;
-my $curl = which('curl') or plan skip_all => "curl(1) missing for $0";
+my $curl = require_cmd('curl');
my ($tmpdir, $for_destroy) = tmpdir();
require_mods(qw(DBD::SQLite));
my $JOBS = $ENV{TEST_JOBS} // 4;
my ($tmpdir, $for_destroy) = tmpdir();
require_mods(qw(DBD::SQLite));
my $JOBS = $ENV{TEST_JOBS} // 4;
-# Copyright (C) 2020-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>
# ensure mbsync and offlineimap compatibility
use strict;
use v5.10.1;
use File::Path qw(mkpath);
use PublicInbox::TestCommon;
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# ensure mbsync and offlineimap compatibility
use strict;
use v5.10.1;
use File::Path qw(mkpath);
use PublicInbox::TestCommon;
-use PublicInbox::Spawn qw(which spawn);
+use PublicInbox::Spawn qw(spawn);
require_mods(qw(-imapd));
my $inboxdir = $ENV{GIANT_INBOX_DIR};
(defined($inboxdir) && -d $inboxdir) or
require_mods(qw(-imapd));
my $inboxdir = $ENV{GIANT_INBOX_DIR};
(defined($inboxdir) && -d $inboxdir) or
SKIP: {
mkpath([map { "$tmpdir/oimapdir/$_" } qw(cur new tmp)]);
SKIP: {
mkpath([map { "$tmpdir/oimapdir/$_" } qw(cur new tmp)]);
- my $oimap = which('offlineimap') or skip 'no offlineimap(1)', 1;
+ my $oimap = require_cmd('offlineimap', 1) or
+ skip 'no offlineimap(1)', 1;
open my $fh, '>', "$tmpdir/.offlineimaprc" or BAIL_OUT "open: $!";
print $fh <<EOF or BAIL_OUT "print: $!";
[general]
open my $fh, '>', "$tmpdir/.offlineimaprc" or BAIL_OUT "open: $!";
print $fh <<EOF or BAIL_OUT "print: $!";
[general]
SKIP: {
mkpath([map { "$tmpdir/mbsyncdir/test/$_" } qw(cur new tmp)]);
SKIP: {
mkpath([map { "$tmpdir/mbsyncdir/test/$_" } qw(cur new tmp)]);
- my $mbsync = which('mbsync') or skip 'no mbsync(1)', 1;
+ my $mbsync = require_cmd('mbsync', 1) or skip 'no mbsync(1)', 1;
open my $fh, '>', "$tmpdir/.mbsyncrc" or BAIL_OUT "open: $!";
print $fh <<EOF or BAIL_OUT "print: $!";
Create Slave
open my $fh, '>', "$tmpdir/.mbsyncrc" or BAIL_OUT "open: $!";
print $fh <<EOF or BAIL_OUT "print: $!";
Create Slave
use v5.12;
use File::Path qw(make_path);
use PublicInbox::TestCommon;
use v5.12;
use File::Path qw(make_path);
use PublicInbox::TestCommon;
-use PublicInbox::Spawn qw(which spawn);
+use PublicInbox::Spawn qw(spawn);
my $inboxdir = $ENV{GIANT_INBOX_DIR};
(defined($inboxdir) && -d $inboxdir) or
plan skip_all => "GIANT_INBOX_DIR not defined for $0";
plan skip_all => "bad characters in $inboxdir" if $inboxdir =~ m![^\w\.\-/]!;
my $inboxdir = $ENV{GIANT_INBOX_DIR};
(defined($inboxdir) && -d $inboxdir) or
plan skip_all => "GIANT_INBOX_DIR not defined for $0";
plan skip_all => "bad characters in $inboxdir" if $inboxdir =~ m![^\w\.\-/]!;
-my $uuidgen = which('uuidgen') or plan skip_all => 'uuidgen(1) missing';
+my $uuidgen = require_cmd('uuidgen');
+my $mpop = require_cmd('mpop');
require_mods(qw(DBD::SQLite));
require_git('2.6'); # for v2
require_mods(qw(File::FcntlLock)) if $^O !~ /\A(?:linux|freebsd)\z/;
require_mods(qw(DBD::SQLite));
require_git('2.6'); # for v2
require_mods(qw(File::FcntlLock)) if $^O !~ /\A(?:linux|freebsd)\z/;
make_path("$tmpdir/home/.config/mpop",
map { "$tmpdir/md/$_" } qw(new cur tmp));
make_path("$tmpdir/home/.config/mpop",
map { "$tmpdir/md/$_" } qw(new cur tmp));
-SKIP: {
- my $mpop = which('mpop') or skip('mpop(1) missing', 1);
open my $fh, '>', "$tmpdir/home/.config/mpop/config"
or xbail "open $!";
chmod 0600, $fh;
open my $fh, '>', "$tmpdir/home/.config/mpop/config"
or xbail "open $!";
chmod 0600, $fh;