Feersum

 view release on metacpan or  search on metacpan

xt/core-01-access-log-streaming.t  view on Meta::CPAN

use Test::More tests => 6;  # 5 explicit + 1 simple_client implicit
use utf8;
use lib 't'; use Utils;
use File::Temp qw(tempdir);
use POSIX ();

my $parent_pid = $$;
END { $? = 0 if $$ != $parent_pid }

my $dir = tempdir(CLEANUP => 1);
my $log_file = "$dir/stream.log";
my (undef, $port) = get_listen_socket();

my $pid = fork // die "fork: $!";
if (!$pid) {
    require Feersum::Runner;
    eval {
        Feersum::Runner->new(
            listen     => ["localhost:$port"],
            quiet      => 1,
            access_log => sub {
                my ($method, $uri, $elapsed) = @_;
                open my $fh, '>>', $log_file;
                printf $fh "%s %s %.4f\n", $method, $uri, $elapsed;
                close $fh;
            },
            app => sub {
                my $r = shift;
                # Streaming response: start, write chunks with delay, close
                my $w = $r->start_streaming(200, ['Content-Type' => 'text/plain']);
                $w->write("chunk1\n");
                my $t; $t = EV::timer(0.2, 0, sub {
                    $w->write("chunk2\n");
                    $w->close();
                    undef $t;
                });
            },
        )->run();
    };
    POSIX::_exit(0);
}

select undef, undef, undef, 0.8 * TIMEOUT_MULT;

# Request a streaming response
my $body;
my $cv = AE::cv;
my $cli; $cli = simple_client GET => '/stream', port => $port,
    timeout => 5 * TIMEOUT_MULT, sub {
        my ($b, $h) = @_;
        $body = $b;
        $cv->send; undef $cli;
    };
$cv->recv;
like $body, qr/chunk1.*chunk2/s, "got full streaming response";

# Wait for response_guard to fire (after close)
select undef, undef, undef, 0.5 * TIMEOUT_MULT;

ok -f $log_file, "access_log file created for streaming response";
my $log = do { local (@ARGV, $/) = ($log_file); <> } // '';
like $log, qr{^GET /stream 0\.\d+}m, "access_log entry has elapsed time > 0 (stream completed)";

# Verify elapsed time is >= 0.2s (the delay between chunks)
my ($elapsed) = $log =~ /(\d+\.\d+)/;
ok defined($elapsed) && $elapsed >= 0.1,
    "elapsed time reflects streaming duration (${elapsed}s)";

reap_server($pid);
pass "streaming access_log clean shutdown";



( run in 0.887 second using v1.01-cache-2.11-cpan-ac8be02dad9 )