AnyEvent-WebSocket-Client

 view release on metacpan or  search on metacpan

t/anyevent_websocket_client__server_initial_data_shutdown.t  view on Meta::CPAN

use lib 't/lib';
use Test2::Require::SSL ();
use Test2::Plugin::EV;
use Test2::Plugin::AnyEvent::Timeout;
use Test2::V0 -no_srand => 1;
use Test2::Tools::WebSocket::Server qw( start_server );
use AnyEvent::WebSocket::Client;

my @test_cases = (
  { label => 'without TLS', tls => 0,                                     },
  { label => 'with TLS',    tls => 1, tls_cert => do { local $/; <DATA> } },
);

foreach my $test_case (@test_cases)
{
  subtest $test_case->{label}, sub {

    if($test_case->{tls})
    {
      my $reason = Test2::Require::SSL->skip;
      skip_all $reason if $reason;
    }

    my %server_args = (
      handshake => sub {
        my $opt = { @_ };
        $opt->{hdl}->push_write(Protocol::WebSocket::Frame->new("initial message from server")->to_bytes);
        $opt->{hdl}->push_shutdown();
      },
      message => sub {
        fail("server should not receive a message");
      },
    );

    if($test_case->{tls})
    {
      $server_args{tls} = AnyEvent::TLS->new(cert => $test_case->{tls_cert});
    }

    my $url = start_server(%server_args);
    my $cv_finish = AnyEvent->condvar;
    my $conn = eval { AnyEvent::WebSocket::Client->new(ssl_no_verify => 1)->connect($url)->recv };
    if($@)
    {
      my $error = $@;
      die $error;
    }
    my @received_messages = ();
    $conn->on(each_message => sub {
      my ($conn, $message) = @_;
      push(@received_messages, $message->body);
    });
    $conn->on(finish => sub {
      $cv_finish->send;
    });
    $cv_finish->recv;
    is(
      \@received_messages, ["initial message from server"],
      "client should receive the initial message sent from the server, even if the server immediately shuts down."
    );
  };
}

done_testing;

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.512 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )