From: Eric Wong Date: Mon, 16 Sep 2024 21:03:00 +0000 (+0000) Subject: test_common: improve psgi test setup + loading X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0eedc9268d6cfe4f32bab19851ef3e89ae6f81f;p=thirdparty%2Fpublic-inbox.git test_common: improve psgi test setup + loading Since we have many PSGI tests nowadays, put in a `psgi' shortcut like we do for many other components for `require_mods' to make it easier to load a consistent set of modules. We'll also cut down on `require_ok' and `use_ok' tests since they should be limited to code maintained in our source tree, not 3rd-party dependencies. --- diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index 195dc3eba..913aa7e9b 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -196,10 +196,11 @@ sub need_accept_filter ($) { skip "$af not loaded: kldload $af", 1; } -sub require_mods { +sub require_mods (@) { my @mods = @_; my $maybe = pop @mods if $mods[-1] =~ /\A[0-9]+\z/; - my @need; + my (@need, @use); + while (my $mod = shift(@mods)) { if ($mod eq 'lei') { require_git(2.6, $maybe ? $maybe : ()); @@ -212,6 +213,12 @@ sub require_mods { push @mods, qw(Plack::Builder Plack::Util HTTP::Date HTTP::Status); next; + } elsif ($mod eq 'psgi') { + my @m = qw(Plack::Test HTTP::Request::Common + Plack::Builder); + push @use, @m; + push @mods, qw(Plack::Util), @m; + next; } elsif ($mod eq '-imapd') { push @mods, qw(Parse::RecDescent DBD::SQLite); next; @@ -263,7 +270,14 @@ sub require_mods { $ENV{TEST_IPV4_ONLY} = 1 if !eval { $mod->VERSION($v) }; } } - return unless @need; + unless (@need) { + for my $mod (@use) { + my ($pkg) = caller(0); + eval "package $pkg; $mod->import"; + xbail "$mod->import: $@" if $@; + } + return; + } my $m = join(', ', @need)." missing for $0"; $m =~ s/\bEmail::MIME\b/Email::MIME (development purposes only)/; skip($m, $maybe) if $maybe; @@ -941,8 +955,8 @@ sub test_httpd ($$;$$) { }; for (qw(PI_CONFIG)) { $env->{$_} or BAIL_OUT "$_ unset" } SKIP: { - require_mods(qw(Plack::Test::ExternalServer LWP::UserAgent), - $skip // 1); + require_mods qw(Plack::Test::ExternalServer LWP::UserAgent + -httpd), $skip // 1; my $sock = tcp_server() or die; my ($out, $err) = map { "$env->{TMPDIR}/std$_.log" } qw(out err); my $cmd = [ qw(-httpd -W0), "--stdout=$out", "--stderr=$err" ]; diff --git a/t/clone-coderepo.t b/t/clone-coderepo.t index c6180fc43..8986351ee 100644 --- a/t/clone-coderepo.t +++ b/t/clone-coderepo.t @@ -8,9 +8,9 @@ use File::Temp; use File::Path qw(remove_tree); use PublicInbox::SHA qw(sha1_hex); use PublicInbox::IO; -require_mods(qw(json Plack::Builder HTTP::Date HTTP::Status)); +require_mods qw(json psgi -httpd); require_git_http_backend; -require_git '1.8.5'; +require_git v1.8.5; require_cmd 'curl'; require_ok 'PublicInbox::LeiMirror'; my ($tmpdir, $for_destroy) = tmpdir(); @@ -201,7 +201,6 @@ ok(-e "$tmpdir/dst/objstore", 'objstore created'); xsys_e([qw(git clone -q), "${url}c.git", "$tmpdir/dst/c.git"]); SKIP: { require_mods(qw(Plack::Test::ExternalServer LWP::UserAgent), 1); - use_ok($_) for qw(HTTP::Request::Common); chop(my $uri = $url) eq '/' or xbail "BUG: no /"; local $ENV{PLACK_TEST_EXTERNALSERVER_URI} = $uri; my %opt = (ua => LWP::UserAgent->new); diff --git a/t/extindex-psgi.t b/t/extindex-psgi.t index 896c46ffc..5fa0b99d1 100644 --- a/t/extindex-psgi.t +++ b/t/extindex-psgi.t @@ -8,9 +8,7 @@ use PublicInbox::Config; use File::Copy qw(cp); use IO::Handle (); require_git(2.6); -require_mods(qw(json DBD::SQLite Xapian - HTTP::Request::Common Plack::Test URI::Escape Plack::Builder)); -use_ok($_) for (qw(HTTP::Request::Common Plack::Test)); +require_mods qw(json DBD::SQLite Xapian psgi); use IO::Uncompress::Gunzip qw(gunzip); require PublicInbox::WWW; my ($ro_home, $cfg_path) = setup_public_inboxes; diff --git a/t/httpd-corner.t b/t/httpd-corner.t index 7539573c9..125610d60 100644 --- a/t/httpd-corner.t +++ b/t/httpd-corner.t @@ -7,7 +7,7 @@ use v5.12; use PublicInbox::TestCommon; use Time::HiRes qw(gettimeofday tv_interval); use autodie qw(getsockopt setsockopt); use PublicInbox::Spawn qw(spawn popen_rd); -require_mods(qw(Plack::Util Plack::Builder HTTP::Date HTTP::Status)); +require_mods '-httpd'; use PublicInbox::SHA qw(sha1_hex); use IO::Handle (); use IO::Socket::UNIX; @@ -658,9 +658,7 @@ SKIP: { # ensure compatibility with other PSGI servers SKIP: { - require_mods(@zmods, qw(Plack::Test HTTP::Request::Common), 3); - use_ok 'HTTP::Request::Common'; - use_ok 'Plack::Test'; + require_mods @zmods, 'psgi', 3; STDERR->flush; open my $olderr, '>&', \*STDERR or die "dup stderr: $!"; open my $tmperr, '+>', undef or die; diff --git a/t/httpd-https.t b/t/httpd-https.t index bf0861238..142a7a56d 100644 --- a/t/httpd-https.t +++ b/t/httpd-https.t @@ -6,7 +6,7 @@ use Socket qw(SOCK_STREAM IPPROTO_TCP SOL_SOCKET); use PublicInbox::TestCommon; use File::Copy qw(cp); # IO::Poll is part of the standard library, but distros may split them off... -require_mods(qw(IO::Socket::SSL IO::Poll Plack::Util)); +require_mods qw(IO::Socket::SSL IO::Poll -httpd); my @certs = qw(certs/server-cert.pem certs/server-key.pem certs/server2-cert.pem certs/server2-key.pem); if (scalar(grep { -r $_ } @certs) != scalar(@certs)) { diff --git a/t/httpd-unix.t b/t/httpd-unix.t index 0b620bd6e..d4d50528e 100644 --- a/t/httpd-unix.t +++ b/t/httpd-unix.t @@ -8,7 +8,7 @@ use Errno qw(EADDRINUSE); use Cwd qw(abs_path); use Carp qw(croak); use autodie qw(close); -require_mods(qw(Plack::Util Plack::Builder HTTP::Date HTTP::Status)); +require_mods qw(-httpd); use IO::Socket::UNIX; use POSIX qw(mkfifo); require PublicInbox::Sigfd; diff --git a/t/httpd.t b/t/httpd.t index c0fbaa22b..39382b85f 100644 --- a/t/httpd.t +++ b/t/httpd.t @@ -1,12 +1,12 @@ #!perl -w -# Copyright (C) 2016-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ use strict; use v5.10.1; use PublicInbox::TestCommon; use PublicInbox::Eml; use Socket qw(IPPROTO_TCP SOL_SOCKET); -require_mods(qw(Plack::Util Plack::Builder HTTP::Date HTTP::Status)); +require_mods '-httpd'; require_git_http_backend; # FIXME: too much setup diff --git a/t/plack.t b/t/plack.t index 07cab12a3..131ce4324 100644 --- a/t/plack.t +++ b/t/plack.t @@ -5,9 +5,7 @@ use strict; use v5.10.1; use PublicInbox::TestCommon; my $psgi = "./examples/public-inbox.psgi"; -my @mods = qw(HTTP::Request::Common Plack::Test URI::Escape); -require_mods(@mods); -foreach my $mod (@mods) { use_ok $mod; } +require_mods 'psgi'; ok(-f $psgi, "psgi example file found"); my ($tmpdir, $for_destroy) = tmpdir(); my $pfx = 'http://example.com/test'; diff --git a/t/psgi_attach.t b/t/psgi_attach.t index db551696d..6c769d85f 100644 --- a/t/psgi_attach.t +++ b/t/psgi_attach.t @@ -4,9 +4,7 @@ use strict; use v5.10.1; use PublicInbox::TestCommon; -my @mods = qw(HTTP::Request::Common Plack::Builder Plack::Test URI::Escape); -require_mods(@mods); -use_ok $_ foreach @mods; +require_mods 'psgi'; use_ok 'PublicInbox::WWW'; use PublicInbox::Config; use PublicInbox::Eml; diff --git a/t/psgi_bad_mids.t b/t/psgi_bad_mids.t index ac0eb3c3d..56381a354 100644 --- a/t/psgi_bad_mids.t +++ b/t/psgi_bad_mids.t @@ -4,11 +4,8 @@ use v5.12; use PublicInbox::TestCommon; use PublicInbox::Eml; -my @mods = qw(DBD::SQLite HTTP::Request::Common Plack::Test - URI::Escape Plack::Builder); -require_git 2.6; -require_mods(@mods); -use_ok($_) for @mods; +require_git v2.6; +require_mods qw(DBD::SQLite psgi); use_ok 'PublicInbox::WWW'; my $msgs = <<''; F1V5OR6NMF.3M649JTLO9IXD@tux.localdomain/hehe1"' $v1dir, sub { my ($im, $ibx) = @_; diff --git a/t/psgi_multipart_not.t b/t/psgi_multipart_not.t index e7c43abf2..4b3b93fac 100644 --- a/t/psgi_multipart_not.t +++ b/t/psgi_multipart_not.t @@ -5,10 +5,7 @@ use v5.12; use PublicInbox::TestCommon; use PublicInbox::Eml; require_git 2.6; -my @mods = qw(DBD::SQLite Xapian HTTP::Request::Common - Plack::Test URI::Escape Plack::Builder Plack::Test); -require_mods(@mods); -use_ok($_) for (qw(HTTP::Request::Common Plack::Test)); +require_mods qw(DBD::SQLite Xapian psgi); use_ok 'PublicInbox::WWW'; my $ibx = create_inbox 'v2', version => 2, sub { my ($im) = @_; diff --git a/t/psgi_scan_all.t b/t/psgi_scan_all.t index 4c28b553d..7c6978540 100644 --- a/t/psgi_scan_all.t +++ b/t/psgi_scan_all.t @@ -4,11 +4,10 @@ use v5.12; use PublicInbox::TestCommon; use PublicInbox::Eml; -my @use = qw(HTTP::Request::Common Plack::Test); my @req = qw(URI::Escape DBD::SQLite); require_git v2.6; -require_mods(@use, @req, qw(PublicInbox::WWW)); -$_->import for @use; +require_mods qw(DBD::SQLite psgi); +use_ok 'PublicInbox::WWW'; my $cfgtxt = ''; foreach my $i (1..2) { my $ibx = create_inbox "test-$i", version => 2, indexlevel => 'basic', diff --git a/t/psgi_search.t b/t/psgi_search.t index 759dab781..8d47356e7 100644 --- a/t/psgi_search.t +++ b/t/psgi_search.t @@ -6,10 +6,7 @@ use PublicInbox::TestCommon; use IO::Uncompress::Gunzip qw(gunzip); use PublicInbox::Eml; use PublicInbox::Inbox; -my @mods = qw(DBD::SQLite Xapian HTTP::Request::Common Plack::Test - URI::Escape Plack::Builder); -require_mods(@mods); -use_ok($_) for (qw(HTTP::Request::Common Plack::Test)); +require_mods qw(DBD::SQLite Xapian psgi); use_ok 'PublicInbox::WWW'; use_ok 'PublicInbox::SearchIdx'; my ($tmpdir, $for_destroy) = tmpdir(); diff --git a/t/psgi_text.t b/t/psgi_text.t index b8b1bc48a..deb41f9f6 100644 --- a/t/psgi_text.t +++ b/t/psgi_text.t @@ -8,8 +8,7 @@ my ($tmpdir, $for_destroy) = tmpdir(); my $maindir = "$tmpdir/main.git"; my $addr = 'test-public@example.com'; my $cfgpfx = "publicinbox.test"; -my @mods = qw(HTTP::Request::Common Plack::Test URI::Escape Plack::Builder); -use_ok $_ foreach @mods; +require_mods qw(psgi); use PublicInbox::Import; use_ok 'PublicInbox::WWW'; use_ok 'PublicInbox::WwwText'; diff --git a/t/psgi_v2.t b/t/psgi_v2.t index 2b678fd8e..2027037dc 100644 --- a/t/psgi_v2.t +++ b/t/psgi_v2.t @@ -10,9 +10,7 @@ use PublicInbox::Eml; use PublicInbox::Config; use PublicInbox::MID qw(mids); use autodie qw(kill rename); -require_mods(qw(DBD::SQLite Xapian HTTP::Request::Common Plack::Test - URI::Escape Plack::Builder HTTP::Date)); -use_ok($_) for (qw(HTTP::Request::Common Plack::Test)); +require_mods qw(DBD::SQLite Xapian psgi); use_ok 'PublicInbox::WWW'; my ($tmpdir, $for_destroy) = tmpdir(); my $enc_dup = 'ref-20150309094050.GO3427@x1.example'; diff --git a/t/solver_git.t b/t/solver_git.t index db6729040..694e2671f 100644 --- a/t/solver_git.t +++ b/t/solver_git.t @@ -7,7 +7,7 @@ use Cwd qw(abs_path); require_git v2.6; use PublicInbox::ContentHash qw(git_sha); use PublicInbox::Spawn qw(run_qx); -require_mods(qw(DBD::SQLite Xapian URI::Escape)); +require_mods(qw(DBD::SQLite Xapian)); require PublicInbox::SolverGit; my $rdr = { 2 => \(my $null) }; my $git_dir = xqx([qw(git rev-parse --git-common-dir)], undef, $rdr); @@ -208,10 +208,8 @@ my $hinted = $res; shift @$res; shift @$hinted; is_deeply($res, $hinted, 'hints work (or did not hurt :P'); -my @psgi = qw(HTTP::Request::Common Plack::Test Plack::Builder); SKIP: { - require_mods(@psgi, 7 + scalar(@psgi)); - use_ok($_) for @psgi; + require_mods qw(psgi 1); require PublicInbox::WWW; my $binfoo = "$ibx->{inboxdir}/binfoo.git"; my $l = "$ibx->{inboxdir}/inbox.lock"; diff --git a/t/v2mirror.t b/t/v2mirror.t index b88241826..dd4d9a6ca 100644 --- a/t/v2mirror.t +++ b/t/v2mirror.t @@ -13,8 +13,7 @@ local $ENV{HOME} = abs_path('t'); use IO::Uncompress::Gunzip qw(gunzip $GunzipError); # Integration tests for HTTP cloning + mirroring -require_mods(qw(Plack::Util Plack::Builder - HTTP::Date HTTP::Status Xapian DBD::SQLite)); +require_mods qw(psgi -httpd Xapian DBD::SQLite); use_ok 'PublicInbox::V2Writable'; use PublicInbox::InboxWritable; use PublicInbox::Eml; diff --git a/t/www_altid.t b/t/www_altid.t index 6f0f0c61a..c06e34d95 100644 --- a/t/www_altid.t +++ b/t/www_altid.t @@ -5,12 +5,12 @@ use strict; use v5.10.1; use PublicInbox::TestCommon; use PublicInbox::Config; use PublicInbox::Spawn qw(spawn); require_cmd('sqlite3'); -require_mods(qw(DBD::SQLite HTTP::Request::Common Plack::Test URI::Escape - Plack::Builder IO::Uncompress::Gunzip Xapian)); +require_mods qw(DBD::SQLite psgi Xapian); use_ok($_) for qw(Plack::Test HTTP::Request::Common); require_ok 'PublicInbox::Msgmap'; require_ok 'PublicInbox::AltId'; require_ok 'PublicInbox::WWW'; +require IO::Uncompress::Gunzip; my ($tmpdir, $for_destroy) = tmpdir(); my $aid = 'xyz'; my $cfgpath; diff --git a/t/www_listing.t b/t/www_listing.t index e0d211618..ff75655df 100644 --- a/t/www_listing.t +++ b/t/www_listing.t @@ -5,7 +5,7 @@ use v5.12; use PublicInbox::TestCommon; use PublicInbox::Import; use IO::Uncompress::Gunzip qw(gunzip); -require_mods(qw(json URI::Escape Plack::Builder HTTP::Tiny)); +require_mods qw(json URI::Escape psgi -httpd HTTP::Tiny); my $curl = require_cmd 'curl'; require PublicInbox::WwwListing; require PublicInbox::ManifestJsGz; diff --git a/t/www_static.t b/t/www_static.t index 3281751c5..83a96a5e6 100644 --- a/t/www_static.t +++ b/t/www_static.t @@ -6,8 +6,8 @@ use Test::More; use PublicInbox::TestCommon; my ($tmpdir, $for_destroy) = tmpdir(); my @mods = qw(HTTP::Request::Common Plack::Test URI::Escape); -require_mods(@mods, 'IO::Uncompress::Gunzip'); -use_ok $_ foreach @mods; +require_mods qw(psgi); +require IO::Uncompress::Gunzip; use_ok 'PublicInbox::WwwStatic'; my $app = sub {