This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[inseparable changes from patch from perl5.003_12 to perl5.003_13]
[perl5.git] / t / lib / open3.t
1 #!./perl -w
2 use strict;
3
4 BEGIN {
5     chdir 't' if -d 't';
6     @INC = '../lib';
7     # make warnings fatal
8     $SIG{__WARN__} = sub { die @_ };
9 }
10
11 use IO::Handle;
12 use IPC::Open3;
13 #require 'open3.pl'; use subs 'open3';
14
15 sub 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
26 my ($pid, $reaped_pid);
27 STDOUT->autoflush;
28 STDERR->autoflush;
29
30 print "1..21\n";
31
32 # basic
33 ok 1, $pid = open3 'WRITE', 'READ', 'ERROR', $^X, '-e', <<'EOF';
34     $| = 1;
35     print scalar <STDIN>;
36     print STDERR "hi error\n";
37 EOF
38 ok 2, print WRITE "hi kid\n";
39 ok 3, <READ> eq "hi kid\n";
40 ok 4, <ERROR> eq "hi error\n";
41 ok 5, close(WRITE), $!;
42 ok 6, close(READ), $!;
43 ok 7, close(ERROR), $!;
44 $reaped_pid = waitpid $pid, 0;
45 ok 8, $reaped_pid == $pid, $reaped_pid;
46 ok 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>;
53 EOF
54 print WRITE "ok 10\n";
55 print scalar <READ>;
56 print WRITE "ok 11\n";
57 print scalar <READ>;
58 waitpid $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>;
65 EOF
66 print WRITE "ok 12\n";
67 print scalar <READ>;
68 print WRITE "ok 13\n";
69 print scalar <READ>;
70 waitpid $pid, 0;
71
72 # dup writer
73 ok 14, pipe PIPE_READ, PIPE_WRITE;
74 $pid = open3 '<&PIPE_READ', 'READ', '',
75                     $^X, '-e', 'print scalar <STDIN>';
76 close PIPE_READ;
77 print PIPE_WRITE "ok 15\n";
78 close PIPE_WRITE;
79 print scalar <READ>;
80 waitpid $pid, 0;
81
82 # dup reader
83 $pid = open3 'WRITE', '>&STDOUT', 'ERROR',
84                     $^X, '-e', 'print scalar <STDIN>';
85 print WRITE "ok 16\n";
86 waitpid $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>';
93 print WRITE "ok 17\n";
94 waitpid $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>;
101 EOF
102 print WRITE "ok 18\n";
103 print WRITE "ok 19\n";
104 waitpid $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>;
111 EOF
112 print WRITE "ok 20\n";
113 print WRITE "ok 21\n";
114 waitpid $pid, 0;