Commit | Line | Data |
7e1af8bc |
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; |