1use lib 't/lib'; 2use Test2::Require::Module 'Capture::Tiny'; 3use Test2::Require::Module 'Test::Memory::Cycle'; 4use Test2::Require::Module 'Devel::Cycle'; 5use Test2::Plugin::EV; 6use Test2::Plugin::AnyEvent::Timeout; 7use Test2::V0 -no_srand => 1; 8use Test2::Tools::WebSocket::Server qw( start_server ); 9use AnyEvent::WebSocket::Client; 10use Capture::Tiny qw( capture_stderr ); 11use Test::Memory::Cycle; 12 13my $finished = 0; 14my $done1 = AnyEvent->condvar; 15my $done2 = AnyEvent->condvar; 16 17my $uri = start_server( 18 message => sub { 19 my $opt = { @_ }; 20 21 return if !$opt->{frame}->is_text && !$opt->{frame}->is_binary; 22 23 $opt->{hdl}->push_write($opt->{frame}->new(buffer => $opt->{message}, max_payload_size => 0 )->to_bytes); 24 25 }, 26 end => sub { 27 $finished = 1; 28 $done1->send; 29 }, 30); 31 32my $client = AnyEvent::WebSocket::Client->new; 33my $connection = $client->connect($uri)->recv; 34 35$connection->on(each_message => sub { $done2->send }); 36 37isa_ok $connection, 'AnyEvent::WebSocket::Connection'; 38 39is $finished, 0, 'finished = 0'; 40 41$connection->send('foo'); 42 43is $finished, 0, 'finished = 0'; 44 45note capture_stderr { memory_cycle_ok $connection }; 46 47$done2->recv; 48 49$connection->close; 50 51note capture_stderr { memory_cycle_ok $connection }; 52 53undef $connection; 54 55$done1->recv; 56 57is $finished, 1, 'finished = 1'; 58 59done_testing; 60