[Moscow.pm] Простые однотипные операции с AnyEvent

Mons Anderson mons на cpan.org
Вт Авг 14 04:11:51 PDT 2012


У меня есть набросок Test::Async
Если интересно, могу выложить.

используется в тесте вот так:

my $c = AnyEvent::*::Client->new(...);

my $test = Test::Async->new(
    prepare => sub {
        my $s = shift;
        $s->{w} = $c->on(
            error => sub {
                diag "@_";
            }
        );
    },
    postpone => sub {
        my $s = shift;
        delete $s->{w};
    },
    finish => sub {
        undef $c;
    },
);

$test->test(sub {
    my $ok = shift;
    $c->connect;
    my $w;$w = $c->on('connected', sub {
        $ok->('con');
        undef $w;
    });
}, 'connect', wait => ['con'], t => 2);
# waits for $ok->('con') for 2 seconds, fails otherwise

$test->test(sub {
    my $ok = shift;
    delete $test->{proxy};

    my $w;$w = $c->on(
        'disconnected', sub {
            shift;
            diag "disconnected: @_";
            $ok->('dis');
        },
        'connfail' => sub {
            shift;
            diag "connfail: @_";
            $ok->('fail');
            $test->{proxy} = tcp_proxy(0,12321,0,11300);
        },
        'connected' => sub {
            shift;
            diag "connected: @_";
            $ok->('con');
            undef $w;
        },
    );
}, 'disconnect', wait => [qw(dis fail con)], t => 20);
# waits for 3 ok's: dis fail con for 20 seconds, fails otherwise

...

$test->run;





On Thursday 09 August 2012 11:13:17 Ivan Petrov wrote:
> > Приветствую!
> >
> > Время от времени при написании (интеграционных?) тестов чего-то с
> > эниэвентом возникает почти одинаковая портянка:
> >
> > my $cv = AnyEvent->condvar;
> > my $tm = AnyEvent->timer( after => 10, cb => sub { $cv->croak("Timeout");
> > }; do_something( sub{ $cv->send(shift); }, sub{ $cv->croak(shift); } );
> > my $result = $cv->recv();
> > undef $tm;
> > analyze_do_something( $result );
> >
> > Чешутся руки написать вместо этого
> >
> > my $result = ae_recv {
> > do_something( ae_send, ae_croak );
> > } 10; # timeout
> > analyze_do_something( $result );
> >
> > Соответственно, вопрос:
> > 1) А есть ли уже такой интерфейс?
> > 2) Нужен ли он кому-то ещё?
>
> если будет соответствующе оформлен, то хороший будет модуль.
> только кроме ae_send, очевидно надо еще обязательно приделать ae_begin
> и ae_end.
>
> потому что очень много групповых тестов, вроде того "делаем 5
> одновременных запросов"



-- 
Mons Anderson aka Vladimir Perepelitsa
<mons на cpan.org> / #99779956 / quanth на irc.freenode.net


Подробная информация о списке рассылки Moscow-pm