#!/usr/bin/perl -w
use strict;
use Test::More tests => 19;
use Test::Exception;
use POSIX qw( EAGAIN );
use IO::Socket::UNIX;
use IO::Async::Buffer;
( my $S1, my $S2 ) = IO::Socket::UNIX->socketpair( AF_UNIX, SOCK_STREAM, PF_UNSPEC ) or
die "Cannot create socket pair - $!";
# Need sockets in nonblocking mode
$S1->blocking( 0 );
$S2->blocking( 0 );
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 @received;
my $closed = 0;
sub on_incoming_data
{
my $self = shift;
my ( $buffref, $buffclosed ) = @_;
if( $buffclosed ) {
$closed = $buffclosed;
@received = ();
return 0;
}
return 0 unless( $$buffref =~ s/^(.*\n)// );
push @received, $1;
return 1;
}
my $buff = IO::Async::Buffer->new(
handle => $S1,
on_incoming_data => \&on_incoming_data
);
# First corner case - byte at a time
foreach( split( m//, "my line here\n" ) ) {
$S2->syswrite( $_ );
is( scalar @received, 0, 'scalar @received no data yet' );
$buff->on_read_ready;
}
is( scalar @received, 1, 'scalar @received line' );
is( $received[0], "my line here\n", '$received[0] line' );
@received = ();
# Second corner case - multiple lines at once
$S2->syswrite( "my\nlines\nhere\n" );
$buff->on_read_ready;
is( scalar @received, 3, 'scalar @received line' );
is( $received[0], "my\n", '$recieved[0] line' );
is( $received[1], "lines\n", '$recieved[0] line' );
is( $received[2], "here\n", '$recieved[0] line' );
syntax highlighted by Code2HTML, v. 0.9.1