#!/usr/bin/perl -w

use strict;

use Test::More tests => 3;

use POSIX qw( EAGAIN );
use IO::Socket::UNIX;

use IO::Async::Buffer;

# 4 ends of sockets:
#  test => notifier ; notifier => test
#  S[0]    S[1]       S[2]        S[3]

my @S;
@S[0,1] = IO::Socket::UNIX->socketpair( AF_UNIX, SOCK_STREAM, PF_UNSPEC ) or
   die "Cannot create socket pair - $!";
@S[2,3] = IO::Socket::UNIX->socketpair( AF_UNIX, SOCK_STREAM, PF_UNSPEC ) or
   die "Cannot create socket pair - $!";

# Want all pipes to be nonblocking, autoflushing
for ( @S ) {
   $_->blocking( 0 );
   $_->autoflush( 1 );
}

sub read_data($)
{
   my ( $s ) = @_;

   my $buffer;
   my $ret = sysread( $s, $buffer, 8192 );

   return $buffer if( defined $ret && $ret > 0 );
   die "Socket closed" if( defined $ret && $ret == 0 );
   return "" if( $! == EAGAIN );
   die "Cannot sysread() - $!";
}

my $incoming_buffer = "";
sub on_incoming_data
{
   my $self = shift;
   my ( $buffref, $buffclosed ) = @_;

   $incoming_buffer .= $$buffref;
   $$buffref = "";

   return 0;
}

my $buff = IO::Async::Buffer->new(
   read_handle  => $S[1],
   write_handle => $S[2],
   on_incoming_data => \&on_incoming_data,
);

# Sending
$buff->send( "message\n" );
$buff->on_write_ready;

is( read_data( $S[3] ), "message\n", '$S[3] receives data' );
is( read_data( $S[0] ), "",          '$S[0] empty' );

# Receiving
$S[0]->syswrite( "another message\n" );
# Reverse push - should be ignored
$S[3]->syswrite( "reverse\n" );

$buff->on_read_ready;

is( $incoming_buffer, "another message\n", 'incoming buffer contains message' );


syntax highlighted by Code2HTML, v. 0.9.1