EV-Websockets

 view release on metacpan or  search on metacpan

t/24-callback-and-accessor-coverage.t  view on Meta::CPAN

    my $port = $ctx->listen(
        port => 0,
        on_connect => sub { $keep{srv} = $_[0] },
        on_message => sub { $_[0]->send("ack:" . $_[1]) },
        on_close => sub { delete $keep{srv} },
    );
    $keep{cli} = $ctx->connect(
        url => "ws://127.0.0.1:$port",
        on_connect => sub {
            $connect_seen = 1;
            $_[0]->send("after_connect");
            die "intentional die in on_connect";
        },
        on_message => sub {
            $msg_after = $_[1];
            $_[0]->close(1000);
        },
        on_close => sub { delete $keep{cli}; EV::break },
        on_error => sub { delete $keep{cli}; EV::break },
    );
    my $to = EV::timer(5, 0, sub { diag "timeout"; EV::break });
    {
        local $SIG{__WARN__} = sub { $warn_text .= $_[0] };
        EV::run;
    }
    ok($connect_seen, "on_connect fired");
    like($warn_text, qr/exception in connect handler/,
        "G_EVAL warned 'exception in connect handler'");
    is($msg_after, "ack:after_connect",
        "connection survived die in on_connect and round-tripped a message");
}

# 7. stash() croaks after the connection is destroyed
{
    my $ctx = EV::Websockets::Context->new;
    my ($conn_after, %keep);
    my $port = $ctx->listen(
        port => 0,
        on_connect => sub { $keep{srv} = $_[0] },
        on_message => sub { $_[0]->close(1000) },
        on_close => sub { delete $keep{srv} },
    );
    $keep{cli} = $ctx->connect(
        url => "ws://127.0.0.1:$port",
        on_connect => sub { $_[0]->send("done") },
        on_close => sub {
            $conn_after = $_[0];        # keep a strong ref past EV::run
            delete $keep{cli};
            my $t; $t = EV::timer(0.1, 0, sub { undef $t; EV::break });
        },
        on_error => sub { delete $keep{cli}; EV::break },
    );
    my $to = EV::timer(5, 0, sub { diag "timeout"; EV::break });
    EV::run;
    undef $ctx;
    # $conn_after is still a Perl-side EV::Websockets::Connection object;
    # the wsi is gone but stash() should still work on it (state="closed").
    # The destroyed-magic croak fires only after the C struct is freed,
    # which happens when the last Perl ref drops. We can verify the
    # already-closed-but-not-destroyed branch:
    ok(eval { $conn_after->stash; 1 }, "stash on closed-but-alive conn returns hashref");
    is(ref $conn_after->stash, "HASH", "stash hashref persists across close");
}

done_testing;



( run in 0.651 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )