The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More;
use Test::Requires qw( Test::TCP AnyEvent );

BEGIN {
    use_ok "ZMQ::LibZMQ2";
    use_ok "ZMQ::Constants", ":v2.1.11", ":all";
}

my $server = Test::TCP->new(code => sub {
    my $port = shift;
    my $ctxt = zmq_init(1);
    my $sock = zmq_socket( $ctxt, ZMQ_REP );
    zmq_bind( $sock, "tcp://127.0.0.1:$port" );

    my $msg;
    if ( $^O eq 'MSWin32' ) {
        note "Win32 server, using zmq_poll";
        my $timeout = time() + 5;
        do {
            zmq_poll([
                {
                    socket   => $sock,
                    events   => ZMQ_POLLIN,
                    callback => sub {
                        $msg = zmq_recv( $sock, ZMQ_RCVMORE );
                    }
                },
            ], 5);
        } while (! $msg && time < $timeout );
    } else {
        note "Using zmq_getsockopt + AE";
        my $cv = AE::cv;

        note " + Extracting ZMQ_FD";
        my $fh = zmq_getsockopt( $sock, ZMQ_FD );

        note " + Creating AE::io for fd";
        my $w; $w = AE::io $fh, 0, sub {
            if (my $msg = zmq_recv( $sock, ZMQ_RCVMORE )) {
                undef $w;
                $cv->send( $msg );
            }
        };
        note "Waiting...";
        $msg = $cv->recv;
    }

    zmq_send( $sock, zmq_msg_data( $msg ) );
    exit 0;
});

my $port = $server->port;
my $ctxt = zmq_init(1);
my $sock = zmq_socket( $ctxt, ZMQ_REQ );

zmq_connect( $sock, "tcp://127.0.0.1:$port" );
my $data = join '.', time(), $$, rand, {};

note "Sending data to server";
zmq_send( $sock, $data );
my $msg = zmq_recv( $sock );
if (ok $msg) {
    is $data, zmq_msg_data( $msg ), "Got back same data";
}

done_testing;