-package PublicInboxTestProcess;
-use strict;
-
-# prevent new threads from inheriting these objects
-sub CLONE_SKIP { 1 }
-
-sub new {
- my ($klass, $pid, $tail_pid) = @_;
- bless { pid => $pid, tail_pid => $tail_pid, owner => $$ }, $klass;
-}
-
-sub kill {
- my ($self, $sig) = @_;
- CORE::kill($sig // 'TERM', $self->{pid});
-}
-
-sub join {
- my ($self, $sig) = @_;
- my $pid = delete $self->{pid} or return;
- CORE::kill($sig, $pid) if defined $sig;
- my $ret = waitpid($pid, 0) // die "waitpid($pid): $!";
- $ret == $pid or die "waitpid($pid) != $ret";
-}
-
-sub DESTROY {
- my ($self) = @_;
- return if $self->{owner} != $$;
- if (my $tail_pid = delete $self->{tail_pid}) {
- PublicInbox::TestCommon::wait_for_tail($tail_pid, -1);
- CORE::kill('TERM', $tail_pid);
+sub test_httpd ($$;$$) {
+ my ($env, $client, $skip, $cb) = @_;
+ my ($tmpdir, $for_destroy);
+ $env->{TMPDIR} //= do {
+ ($tmpdir, $for_destroy) = tmpdir();
+ $tmpdir;
+ };
+ for (qw(PI_CONFIG)) { $env->{$_} or BAIL_OUT "$_ unset" }
+ SKIP: {
+ require_mods(qw(Plack::Test::ExternalServer LWP::UserAgent),
+ $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" ];
+ my $td = start_script($cmd, $env, { 3 => $sock });
+ my ($h, $p) = tcp_host_port($sock);
+ local $ENV{PLACK_TEST_EXTERNALSERVER_URI} = "http://$h:$p";
+ my $ua = LWP::UserAgent->new;
+ $ua->max_redirect(0);
+ Plack::Test::ExternalServer::test_psgi(client => $client,
+ ua => $ua);
+ $cb->() if $cb;
+ $td->join('TERM');
+ open my $fh, '<', $err or BAIL_OUT $!;
+ my $e = do { local $/; <$fh> };
+ if ($e =~ s/^Plack::Middleware::ReverseProxy missing,\n//gms) {
+ $e =~ s/^URL generation for redirects .*\n//gms;
+ }
+ is($e, '', 'no errors');