#!/usr/bin/perl
=pod
=head1 NAME
io.t - Test suite excercising IPC::Run::IO with IPC::Run::run.
=cut
use strict;
BEGIN {
$| = 1;
$^W = 1;
if( $ENV{PERL_CORE} ) {
chdir '../lib/IPC/Run' if -d '../lib/IPC/Run';
unshift @INC, 'lib', '../..';
$^X = '../../../t/' . $^X;
}
}
use Test::More tests => 14;
use IPC::Run qw( :filters run io );
use IPC::Run::Debug qw( _map_fds );
my $text = "Hello World\n";
my $emitter_script = qq{print '$text'; print STDERR uc( '$text' )};
##
## $^X is the path to the perl binary. This is used run all the subprocesses.
##
my @perl = ( $^X );
my @emitter = ( @perl, '-e', $emitter_script );
my $recv;
my $send;
my $in_file = 'io.t.in';
my $out_file = 'io.t.out';
my $err_file = 'io.t.err';
my $io;
my $r;
my $fd_map;
## TODO: Test filters, etc.
sub slurp($) {
my ( $f ) = @_;
open( S, "<$f" ) or return "$! '$f'";
my $r = join( '', <S> );
close S or warn "$! closing '$f'";
return $r;
}
sub spit($$) {
my ( $f, $s ) = @_;
open( S, ">$f" ) or die "$! '$f'";
print S $s or die "$! '$f'";
close S or die "$! '$f'";
}
sub wipe($) {
my ( $f ) = @_;
unlink $f or warn "$! unlinking '$f'" if -f $f;
}
$io = io( 'foo', '<', \$send );
ok $io->isa('IPC::Run::IO');
is( io( 'foo', '<', \$send )->mode, 'w' );
is( io( 'foo', '<<', \$send )->mode, 'wa' );
is( io( 'foo', '>', \$recv )->mode, 'r' );
is( io( 'foo', '>>', \$recv )->mode, 'ra' );
SKIP: {
if ( IPC::Run::Win32_MODE() ) {
skip( "$^O does not allow select() on non-sockets", 9 );
}
##
## Input from a file
##
SCOPE: {
spit $in_file, $text;
$recv = 'REPLACE ME';
$fd_map = _map_fds;
$r = run io( $in_file, '>', \$recv );
wipe $in_file;
ok( $r );
}
ok( ! $? );
is( _map_fds, $fd_map );
is( $recv, $text );
##
## Output to a file
##
SCOPE: {
wipe $out_file;
$send = $text;
$fd_map = _map_fds;
$r = run io( $out_file, '<', \$send );
$recv = slurp $out_file;
wipe $out_file;
ok( $r );
}
ok( ! $? );
is( _map_fds, $fd_map );
is( $send, $text );
is( $recv, $text );
}