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 )