AnyEvent-WebSocket-Server

 view release on metacpan or  search on metacpan

t/validator.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;
use FindBin;
use lib ($FindBin::RealBin);
use testlib::Util qw(start_server set_timeout);
use testlib::ConnConfig;
use AnyEvent::WebSocket::Client;
use AnyEvent::WebSocket::Server;
use Try::Tiny;

set_timeout;

my $USER_ID_MIN = 1;
my $USER_ID_MAX = 100;

testlib::ConnConfig->for_all_ok_conn_configs(sub {
    my ($cconfig) = @_;

    my $server = AnyEvent::WebSocket::Server->new(
        $cconfig->server_args,
        validator => sub {
            my ($req) = @_;
            my $path = $req->resource_name;
            die "invalid format" if $path !~ m{^/user/(\d+)};
            my $user_id = $1;
            die "invalid user ID" if $user_id < $USER_ID_MIN || $user_id > $USER_ID_MAX;
            return ($user_id, "HOGE");
        }
    );

    my @results = ();

    my $cv_port = start_server sub {
        my $fh = shift;
        $server->establish($fh)->cb(sub {
            my $cv = shift;
            try {
                my ($conn, $user_id, $hoge) = $cv->recv;
                push(@results, { id => $user_id, hoge => $hoge });
            }catch {
                my $e = shift;
                push(@results, { error => $e });
            };
        });
    };
    my $port = $cv_port->recv;
    note("port $port opened.");

    my $client = AnyEvent::WebSocket::Client->new($cconfig->client_args);

    foreach my $case (
        {label => "valid ID", path => '/user/10', exp => {id => 10, hoge => "HOGE"}},
        {label => "invalid ID", path => '/user/102', exp => {error => qr/^invalid user ID/}},
        {label => "invalid path format", path => '/2013/10/19', exp => {error => qr/^invalid format/}},
    ) {
        subtest $case->{label}, sub {
            my $cv_close = AnyEvent->condvar;
            @results = ();
            try {
                my $conn = $client->connect($cconfig->connect_url($port, $case->{path}))->recv;
                note("connection OK");
                $conn->on(finish => sub { undef $conn; $cv_close->send });
                $conn->close;
            }catch {



( run in 1.145 second using v1.01-cache-2.11-cpan-39bf76dae61 )