[inseparable changes from patch from perl5.003_12 to perl5.003_13]
[p5sagit/p5-mst-13.2.git] / t / lib / open3.t
CommitLineData
7e1af8bc 1#!./perl -w
2use strict;
3
4BEGIN {
5 chdir 't' if -d 't';
6 @INC = '../lib';
7 # make warnings fatal
8 $SIG{__WARN__} = sub { die @_ };
9}
10
11use IO::Handle;
12use IPC::Open3;
13#require 'open3.pl'; use subs 'open3';
14
15sub ok {
16 my ($n, $result, $info) = @_;
17 if ($result) {
18 print "ok $n\n";
19 }
20 else {
21 print "not ok $n\n";
22 print "# $info\n" if $info;
23 }
24}
25
26my ($pid, $reaped_pid);
27STDOUT->autoflush;
28STDERR->autoflush;
29
30print "1..21\n";
31
32# basic
33ok 1, $pid = open3 'WRITE', 'READ', 'ERROR', $^X, '-e', <<'EOF';
34 $| = 1;
35 print scalar <STDIN>;
36 print STDERR "hi error\n";
37EOF
38ok 2, print WRITE "hi kid\n";
39ok 3, <READ> eq "hi kid\n";
40ok 4, <ERROR> eq "hi error\n";
41ok 5, close(WRITE), $!;
42ok 6, close(READ), $!;
43ok 7, close(ERROR), $!;
44$reaped_pid = waitpid $pid, 0;
45ok 8, $reaped_pid == $pid, $reaped_pid;
46ok 9, $? == 0, $?;
47
48# read and error together, both named
49$pid = open3 'WRITE', 'READ', 'READ', $^X, '-e', <<'EOF';
50 $| = 1;
51 print scalar <STDIN>;
52 print STDERR scalar <STDIN>;
53EOF
54print WRITE "ok 10\n";
55print scalar <READ>;
56print WRITE "ok 11\n";
57print scalar <READ>;
58waitpid $pid, 0;
59
60# read and error together, error empty
61$pid = open3 'WRITE', 'READ', '', $^X, '-e', <<'EOF';
62 $| = 1;
63 print scalar <STDIN>;
64 print STDERR scalar <STDIN>;
65EOF
66print WRITE "ok 12\n";
67print scalar <READ>;
68print WRITE "ok 13\n";
69print scalar <READ>;
70waitpid $pid, 0;
71
72# dup writer
73ok 14, pipe PIPE_READ, PIPE_WRITE;
74$pid = open3 '<&PIPE_READ', 'READ', '',
75 $^X, '-e', 'print scalar <STDIN>';
76close PIPE_READ;
77print PIPE_WRITE "ok 15\n";
78close PIPE_WRITE;
79print scalar <READ>;
80waitpid $pid, 0;
81
82# dup reader
83$pid = open3 'WRITE', '>&STDOUT', 'ERROR',
84 $^X, '-e', 'print scalar <STDIN>';
85print WRITE "ok 16\n";
86waitpid $pid, 0;
87
88# dup error: This particular case, duping stderr onto the existing
89# stdout but putting stdout somewhere else, is a good case because it
90# used not to work.
91$pid = open3 'WRITE', 'READ', '>&STDOUT',
92 $^X, '-e', 'print STDERR scalar <STDIN>';
93print WRITE "ok 17\n";
94waitpid $pid, 0;
95
96# dup reader and error together, both named
97$pid = open3 'WRITE', '>&STDOUT', '>&STDOUT', $^X, '-e', <<'EOF';
98 $| = 1;
99 print STDOUT scalar <STDIN>;
100 print STDERR scalar <STDIN>;
101EOF
102print WRITE "ok 18\n";
103print WRITE "ok 19\n";
104waitpid $pid, 0;
105
106# dup reader and error together, error empty
107$pid = open3 'WRITE', '>&STDOUT', '', $^X, '-e', <<'EOF';
108 $| = 1;
109 print STDOUT scalar <STDIN>;
110 print STDERR scalar <STDIN>;
111EOF
112print WRITE "ok 20\n";
113print WRITE "ok 21\n";
114waitpid $pid, 0;