#!/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( '', ); 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 ); }