use strict; use warnings; use Test::More; use Test::FailWarnings; plan tests => 9; use Socket; use IO::File (); #so blocking() will work BEGIN { unshift @INC, '../lib'; } use IO::Framed::Read (); my ($r, $w); if ($^O eq 'MSWin32'){ require Win32::Socketpair; ($r, $w) = Win32::Socketpair::winsocketpair(); } else { pipe $r, $w; } syswrite $w, 'x' x 3; my $rdr = IO::Framed::Read->new( $r ); my $f = $rdr->read(2); is( $f, 'xx', '2-byte frame OK' ); $f = $rdr->read(2); is( $f, undef, 'undef when full frame not available' ); syswrite $w, 'y'; $f = $rdr->read(2); is( $f, 'xy', '2-byte frame now OK' ); $r->blocking(0); $rdr = IO::Framed::Read->new( $r ); is( $rdr->read(2), undef, 'undef when OS gives EAGAIN' ); close $w; eval { $rdr->read(2) }; isa_ok( $@, 'IO::Framed::X::EmptyRead', 'error from read() on empty' ) or diag ( ref($@) ? "\$\@ type is ".ref($@) : "\$\@ is '$@'" ); is( $rdr->allow_empty_read(), $rdr, 'allow_empty_read() returns the instance' ); is( $rdr->read(2), q<>, 'allow_empty_read() works as expected' ); close $r; eval { local $SIG{'__WARN__'} = sub {}; $rdr->read(2); }; is( $@->errno_is('EBADF'), 1, '… is EAGAIN' ) or diag explain [ $@->get('OS_ERROR'), 0 + $@->get('OS_ERROR') ]; is( $@->errno_is('EPERM'), 0, '… isn’t EPERM' );