X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fhttpd-unix.t;h=b321c789f4f471d3525d76de8cf55e62e8fed9bf;hb=95bdac7f09c69036efed537a4d03d5bdd2ae4eb6;hp=5ec70fd8f1836f74e7ccd7c239115e6db81eb74a;hpb=e05912ae3899a0f50a6baf3b6c1892789d24f6b1;p=public-inbox.git diff --git a/t/httpd-unix.t b/t/httpd-unix.t index 5ec70fd8..b321c789 100644 --- a/t/httpd-unix.t +++ b/t/httpd-unix.t @@ -1,20 +1,14 @@ -# Copyright (C) 2016-2019 all contributors +# Copyright (C) 2016-2020 all contributors # License: AGPL-3.0+ # Tests for binding Unix domain sockets use strict; use warnings; use Test::More; -require './t/common.perl'; +use PublicInbox::TestCommon; use Errno qw(EADDRINUSE); - -foreach my $mod (qw(Plack::Util Plack::Builder HTTP::Date HTTP::Status)) { - eval "require $mod"; - plan skip_all => "$mod missing for httpd-unix.t" if $@; -} - -use File::Temp qw/tempdir/; +require_mods(qw(Plack::Util Plack::Builder HTTP::Date HTTP::Status)); use IO::Socket::UNIX; -my $tmpdir = tempdir('httpd-unix-XXXXXX', TMPDIR => 1, CLEANUP => 1); +my ($tmpdir, $for_destroy) = tmpdir(); my $unix = "$tmpdir/unix.sock"; my $psgi = './t/httpd-corner.psgi'; my $out = "$tmpdir/out.log"; @@ -23,7 +17,6 @@ my $td; my $spawn_httpd = sub { my (@args) = @_; - push @args, '-W0'; my $cmd = [ '-httpd', @args, "--stdout=$out", "--stderr=$err", $psgi ]; $td = start_script($cmd); }; @@ -37,7 +30,7 @@ my $spawn_httpd = sub { } ok(!-S $unix, 'UNIX socket does not exist, yet'); -$spawn_httpd->("-l$unix"); +$spawn_httpd->("-l$unix", '-W0'); my %o = (Peer => $unix, Type => SOCK_STREAM); for (1..1000) { last if -S $unix && IO::Socket::UNIX->new(%o); @@ -60,7 +53,7 @@ sub check_sock ($) { check_sock($unix); { # do not clobber existing socket - my %err = ( 'linux' => EADDRINUSE ); + my %err = ( 'linux' => EADDRINUSE, 'freebsd' => EADDRINUSE ); open my $out, '>>', "$tmpdir/1" or die "redirect failed: $!"; open my $err, '>>', "$tmpdir/2" or die "redirect failed: $!"; my $cmd = ['-httpd', '-l', $unix, '-W0', $psgi]; @@ -87,27 +80,28 @@ check_sock($unix); } SKIP: { - eval 'require Net::Server::Daemonize'; - skip('Net::Server missing for pid-file/daemonization test', 10) if $@; - - # wait for daemonization - $spawn_httpd->("-l$unix", '-D', '-P', "$tmpdir/pid"); - $td->join; - is($?, 0, 'daemonized process OK'); - check_sock($unix); + require_mods('Net::Server::Daemonize', 20); + my $pid_file = "$tmpdir/pid"; + for my $w (qw(-W0 -W1)) { + # wait for daemonization + $spawn_httpd->("-l$unix", '-D', '-P', $pid_file, $w); + $td->join; + is($?, 0, "daemonized $w process"); + check_sock($unix); - ok(-f "$tmpdir/pid", 'pid file written'); - open my $fh, '<', "$tmpdir/pid" or die "open failed: $!"; - local $/ = "\n"; - my $rpid = <$fh>; - chomp $rpid; - like($rpid, qr/\A\d+\z/s, 'pid file looks like a pid'); - is(kill('TERM', $rpid), 1, 'signalled daemonized process'); - for (1..100) { - kill(0, $rpid) or last; - select undef, undef, undef, 0.02; + ok(-f $pid_file, "$w pid file written"); + open my $fh, '<', "$tmpdir/pid" or die "open failed: $!"; + my $rpid = do { local $/; <$fh> }; + chomp $rpid; + like($rpid, qr/\A\d+\z/s, "$w pid file looks like a pid"); + is(kill('TERM', $rpid), 1, "signaled daemonized $w process"); + for (1..100) { + kill(0, $rpid) or last; + select undef, undef, undef, 0.02; + } + is(kill(0, $rpid), 0, "daemonized $w process exited"); + ok(!-e $pid_file, "$w pid file unlinked at exit"); } - is(kill(0, $rpid), 0, 'daemonized process exited') } done_testing();