1use strict; 2use warnings; 3 4use Test::More; 5use Test::Warnings; 6 7use ZMQ::FFI qw(ZMQ_PUSH ZMQ_PULL); 8 9use Time::HiRes q(usleep); 10use POSIX ":sys_wait_h"; 11 12my $server_address = "ipc:///tmp/test-zmq-ffi-$$-front"; 13my $worker_address = "ipc:///tmp/test-zmq-ffi-$$-back"; 14 15# Set up the proxy in its own process 16my $proxy = fork; 17die "fork failed: $!" unless defined $proxy; 18 19if ( $proxy == 0 ) { 20 my $ctx = ZMQ::FFI->new(); 21 22 my $front = $ctx->socket(ZMQ_PULL); 23 $front->bind($server_address); 24 25 my $back = $ctx->socket(ZMQ_PUSH); 26 $back->bind($worker_address); 27 28 $ctx->proxy($front, $back); 29 warn "proxy exited: $!"; 30 31 exit 0; 32} 33 34subtest 'proxy', sub { 35 my $ctx = ZMQ::FFI->new(); 36 37 my $server = $ctx->socket(ZMQ_PUSH); 38 $server->connect($server_address); 39 40 my $worker = $ctx->socket(ZMQ_PULL); 41 $worker->connect($worker_address); 42 43 my $message = 'ohhai'; 44 $server->send($message); 45 46 until ($worker->has_pollin) { 47 48 # sleep for a 100ms to compensate for slow subscriber problem 49 usleep 100_000; 50 } 51 52 my $payload = $worker->recv; 53 is $payload, $message, "Message received"; 54 55 kill TERM => $proxy; 56 waitpid($proxy,0); 57}; 58 59 60done_testing; 61 62