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