The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use utf8;
use Test::More;
use Server::Starter qw(start_server stop_server);
use Server::Starter::Guard;
use File::Temp qw(tempdir);

plan tests => 1;

my $dir = tempdir( CLEANUP => 1 );
my $pidfile  = "$dir/pid";
my $sockfile = "$dir/server.sock";

fork_ok(
    child => sub {
        start_server(
            pid_file  => $pidfile,
            daemonize => 1,
            path      => $sockfile,
            exec      => [ $^X, qw(t/03-starter-unix-echod.pl) ],
        );
    },

    parent => sub {
        my $guard = Server::Starter::Guard->new(sub {
            stop_server( pid_file => $pidfile );
        });

        wait_for(sub { -e $pidfile })
            or BAIL_OUT("Pidfile '$pidfile' was not created in a timely fashion");

        wait_for(sub { -e $sockfile })
            or BAIL_OUT("Socket '$sockfile' was not created in a timely fashion");

        ok(-e $sockfile, 'there is a socket');
    },
) or die "fork failed: $!";

sub fork_ok {
    my (%args) = @_;

    my $pid = fork;
    return unless defined $pid;
    if ($pid == 0) {
        $args{child}->();
    }
    else {
        $args{parent}->($pid);
    }

    return 1;
}

sub wait_for {
    my ($code, %opts) = @_;

    my $times = $opts{times} || 10;
    my $every = $opts{every} || 1;

    while ( $times > 0 ) {
        return 1 if $code->();
        $times--;
        sleep $every;
    }

    return 0;
}