1use common::sense; 2 3use List::Util; 4 5use Callback::Frame; 6 7use AnyEvent::Strict; 8use AnyEvent::Util; 9use AnyEvent::Task::Server; 10use AnyEvent::Task::Client; 11 12use Test::More tests => 16; 13 14 15## The point of this test is to verify that arguments, errors, and 16## return values are passed correctly between client and server. 17 18 19 20AnyEvent::Task::Server::fork_task_server( 21 listen => ['unix/', '/tmp/anyevent-task-test.socket'], 22 interface => sub { 23 die "ERR: $_[1]" if $_[0] eq 'error'; 24 return \@_; 25 }, 26); 27 28 29 30my $client = AnyEvent::Task::Client->new( 31 connect => ['unix/', '/tmp/anyevent-task-test.socket'], 32 max_workers => 1, 33 name => 'MY CLIENT NAME', 34 ); 35 36 37my $cv = AE::cv; 38 39 40{ 41 $client->checkout->(1, [2], { three => 3, λ => '' }, sub { 42 my ($checkout, $ret) = @_; 43 44 ok(!$@, 'no error set'); 45 is(@$ret, 3); 46 is($ret->[0], 1); 47 is($ret->[1]->[0], 2); 48 is(ref($ret->[2]), 'HASH'); 49 is($ret->[2]->{three}, 3); 50 is(ord($ret->[2]->{λ}), 0x1D1DA, 'unicode character round-tripped ok'); 51 }); 52 53 $client->checkout->some_method(1, sub { 54 my ($checkout, $ret) = @_; 55 56 ok(!$@, 'no error set 2'); 57 ok(@$ret == 2); 58 ok($ret->[0] eq 'some_method'); 59 ok($ret->[1] == 1); 60 }); 61 62 $client->checkout->error('die please', frame(code => sub { 63 die "should never get here"; 64 }, catch => sub { 65 ok($@, 'no error set 3'); 66 ok($@ =~ /ERR: die please/); 67 ok($@ !~ /setup exception/i); 68 })); 69 70 frame(code => sub { 71 $client->checkout->error('again, plz die', sub { 72 die "should never get here 2"; 73 }); 74 }, catch => sub { 75 my $trace = shift; 76 ok($@ =~ /ERR: again, plz die/, '$@ has the exception'); 77 ok($trace =~ /MY CLIENT NAME -> error/, 'argument to callback has stack trace'); 78 79 $cv->send; 80 })->(); 81 82} 83 84 85$cv->recv; 86