Hypersonic
view release on metacpan or search on metacpan
t/2103-ua-minimal-compile.t view on Meta::CPAN
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/lib";
use Test::More;
use POSIX ":sys_wait_h";
use IO::Socket::INET;
use HypersonicTest qw(spawn_server wait_for_port);
# Test minimal (blocking-only) UA compilation
my $PORT = 34000 + ($$ % 1000);
my $server_pid;
my $server_log;
sub start_test_server {
($server_pid, $server_log) = spawn_server(sub {
require Hypersonic;
my $server = Hypersonic->new(cache_dir => "_test_minimal_server_$$");
$server->get('/hello' => sub { 'Hello, World!' });
$server->get('/json' => sub { '{"status":"ok"}' });
$server->post('/echo' => sub {
my ($req) = @_;
return 'Echo: ' . ($req->body // '');
}, { dynamic => 1 });
$server->compile();
$server->run(port => $PORT, workers => 1);
});
# tries => 50 was 10s, which timed out on the ANDK k93msid
# DEBUGGING perl 5.24.0 smoker (Hypersonic 0.18 report
# 404e86a8) with `Child server still alive but not listening on
# port 34861`. Raise to 600 (120s) and let HypersonicTest's
# 60s floor + PERL_TEST_TIME_OUT_FACTOR scaling handle the rest.
# This is the same budget t/0035-e2e-streaming.t uses.
wait_for_port($PORT, { pid => $server_pid, log => $server_log, tries => 600, sleep => 0.2 })
or die "Server failed to start";
return 1;
}
sub stop_test_server {
if ($server_pid) {
kill('TERM', $server_pid);
waitpid($server_pid, 0);
}
do { local $@; eval { require File::Path; File::Path::remove_tree($_, { safe => 1, error => \my $e }) for grep { -e $_ } glob(qq(_test_minimal_server_*)); }; };
}
END { stop_test_server() }
start_test_server();
pass('Test server started');
use_ok('Hypersonic::UA');
subtest 'Minimal compile (no options)' => sub {
# Compile with defaults (blocking only)
eval { Hypersonic::UA->compile(cache_dir => "_test_minimal_client_$$") };
ok(!$@, 'Minimal compile succeeded') or diag $@;
# Check features
ok(!$Hypersonic::UA::FEATURES{needs_async}, 'async not enabled');
ok(!$Hypersonic::UA::FEATURES{needs_parallel}, 'parallel not enabled');
};
my $ua = Hypersonic::UA->new();
ok($ua, 'Created UA instance');
subtest 'Blocking GET works' => sub {
my $res = $ua->get("http://127.0.0.1:$PORT/hello");
ok($res, 'Got response');
is($res->{status}, 200, 'Status 200');
is($res->{body}, 'Hello, World!', 'Body matches');
};
subtest 'Blocking POST works' => sub {
my $res = $ua->post("http://127.0.0.1:$PORT/echo", 'test data');
ok($res, 'Got response');
is($res->{status}, 200, 'Status 200');
like($res->{body}, qr/Echo:.*test data/, 'POST body echoed');
};
subtest 'Async methods fail with helpful error' => sub {
eval { $ua->get_async("http://127.0.0.1:$PORT/hello") };
like($@, qr/get_async.*requires.*async => 1/, 'get_async gives helpful error');
eval { $ua->tick() };
like($@, qr/tick.*requires.*async => 1/, 'tick gives helpful error');
eval { $ua->run() };
like($@, qr/run.*requires.*async => 1/, 'run gives helpful error');
eval { $ua->pending() };
like($@, qr/pending.*requires.*async => 1/, 'pending gives helpful error');
};
( run in 1.204 second using v1.01-cache-2.11-cpan-b16cb0d3907 )