use strict;
use File::Temp qw(tempfile);
use IO::Socket::UNIX;
use Plack::Loader;
use Socket;
use Test::More;
(undef, my $sockfile) = tempfile(UNLINK => 0);
unlink $sockfile;
sub doit {
my $create_loader = shift;
my $pid = fork;
die "fork failed:$!"
unless defined $pid;
if ($pid == 0) {
# server
my $loader = $create_loader->();
$loader->run(sub {
my $env = shift;
my $remote = $env->{REMOTE_ADDR};
$remote = 'UNIX' if ! defined $remote;
return [
200,
['Content-Type'=>'text/html'],
["HELLO $remote"],
];
});
exit;
}
sleep 1;
my $client = IO::Socket::UNIX->new(
Peer => $sockfile,
timeout => 3,
) or die "failed to listen to socket $sockfile:$!";
$client->syswrite("GET / HTTP/1.0\015\012\015\012");
$client->sysread(my $buf, 1024);
like $buf, qr/Starlet/;
like $buf, qr/HELLO UNIX/;
kill 'TERM', $pid;
waitpid($pid, 0);
unlink($sockfile);
}
subtest 'direct' => sub {
doit(sub {
return Plack::Loader->load(
'Starlet',
max_workers => 5,
socket => $sockfile,
);
});
};
subtest 'server-starter' => sub {
doit(sub {
my $sock = IO::Socket::UNIX->new(
Listen => Socket::SOMAXCONN(),
Local => $sockfile,
) or die "failed to listen to socket $sockfile:$!";
$ENV{SERVER_STARTER_PORT} = "$sockfile=@{[$sock->fileno]}";
return Plack::Loader->load(
'Starlet',
max_workers => 5,
);
});
};
done_testing();