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 )