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