7 skip_all("VMS too picky about line endings for record-oriented pipes")
13 my $Perl = which_perl();
21 (my $data2 = $data) =~ s/\n/\n\n/g;
23 my $t1 = { data => $data, write_c => [1,2,length $data], read_c => [1,2,3,length $data]};
24 my $t2 = { data => $data2, write_c => [1,2,length $data2], read_c => [1,2,3,length $data2]};
26 $_->{write_c} = [1..length($_->{data})],
27 $_->{read_c} = [1..length($_->{data})+1, 0xe000] # Need <0xffff for REx
30 my $c; # len write tests, for each: one _all test, and 3 each len+2
31 $c += @{$_->{write_c}} * (1 + 3*@{$_->{read_c}}) for $t1, $t2;
32 $c *= 3*2*2; # $how_w, file/pipe, 2 reports
34 $c += 6; # Tests with sleep()...
39 $set_out = "binmode STDOUT, ':crlf'"
40 if defined $main::use_crlf && $main::use_crlf == 1;
42 sub testread ($$$$$$$) {
43 my ($fh, $str, $read_c, $how_r, $write_c, $how_w, $why) = @_;
45 if ($how_r eq 'readline_all') {
46 $buf .= $_ while <$fh>;
47 } elsif ($how_r eq 'readline') {
49 $buf .= $_ while <$fh>;
50 } elsif ($how_r eq 'read') {
52 $buf .= $in while $c = read($fh, $in, $read_c);
53 } elsif ($how_r eq 'sysread') {
55 $buf .= $in while $c = sysread($fh, $in, $read_c);
57 die "Unrecognized read: '$how_r'";
59 close $fh or die "close: $!";
60 # The only contamination allowed is with sysread/prints
61 $buf =~ s/\r\n/\n/g if $how_r eq 'sysread' and $how_w =~ /print/;
62 is(length $buf, length $str, "length with wrc=$write_c, rdc=$read_c, $how_w, $how_r, $why");
63 is($buf, $str, "content with wrc=$write_c, rdc=$read_c, $how_w, $how_r, $why");
66 sub testpipe ($$$$$$) {
67 my ($str, $write_c, $read_c, $how_w, $how_r, $why) = @_;
68 (my $quoted = $str) =~ s/\n/\\n/g;;
70 if ($how_w eq 'print') { # AUTOFLUSH???
71 # Should be shell-neutral:
72 open $fh, '-|', qq[$Perl -we "$set_out;print for grep length, split /(.{1,$write_c})/s, qq($quoted)"] or die "open: $!";
73 } elsif ($how_w eq 'print/flush') {
74 # shell-neutral and miniperl-enabled autoflush? qq(\x24\x7c) eq '$|'
76 open $fh, '-|', qq[$Perl -we "$set_out;eval qq(\\x24\\x7c = 1) or die;print for grep length, split /(.{1,$write_c})/s, qq($quoted)"] or die "open: $!";
79 open $fh, '-|', qq[$Perl -we "$set_out;eval qq(\\x5b\\x4f = 1) or die;print for grep length, split /(.{1,$write_c})/s, qq($quoted)"] or die "open: $!";
81 } elsif ($how_w eq 'syswrite') {
82 ### How to protect \$_
84 open $fh, '-|', qq[$Perl -we "$set_out;eval qq(sub w {syswrite STDOUT, \\x24_} 1) or die; w() for grep length, split /(.{1,$write_c})/s, qq($quoted)"] or die "open: $!";
87 open $fh, '-|', qq[$Perl -we "$set_out;eval qq(sub w {syswrite STDOUT, \\x5B_} 1) or die; w() for grep length, split /(.{1,$write_c})/s, qq($quoted)"] or die "open: $!";
90 die "Unrecognized write: '$how_w'";
93 if defined $main::use_crlf && $main::use_crlf == 1;
94 testread($fh, $str, $read_c, $how_r, $write_c, $how_w, "pipe$why");
97 sub testfile ($$$$$$) {
98 my ($str, $write_c, $read_c, $how_w, $how_r, $why) = @_;
99 my @data = grep length, split /(.{1,$write_c})/s, $str;
101 my $filename = tempfile();
102 open my $fh, '>', $filename or die;
105 if defined $main::use_crlf && $main::use_crlf == 1;
106 if ($how_w eq 'print') { # AUTOFLUSH???
108 print $fh $_ for @data;
109 } elsif ($how_w eq 'print/flush') {
111 print $fh $_ for @data;
112 } elsif ($how_w eq 'syswrite') {
113 syswrite $fh, $_ for @data;
115 die "Unrecognized write: '$how_w'";
117 close $fh or die "close: $!";
118 open $fh, '<', $filename or die;
120 if defined $main::use_crlf && $main::use_crlf == 1;
121 testread($fh, $str, $read_c, $how_r, $write_c, $how_w, "file$why");
124 # shell-neutral and miniperl-enabled autoflush? qq(\x24\x7c) eq '$|'
127 open $fh, '-|', qq[$Perl -we "eval qq(\\x24\\x7c = 1) or die; binmode STDOUT; sleep 1, print for split //, qq(a\nb\n\nc\n\n\n)"] or die "open: $!";
130 open $fh, '-|', qq[$Perl -we "eval qq(\\x5B\\x4f = 1) or die; binmode STDOUT; sleep 1, print for split //, qq(a\nb\n\nc\n\n\n)"] or die "open: $!";
133 binmode $fh, q(:crlf);
137 push @c, ord $c while $c = getc $fh;
139 is(scalar @c, 9, 'got 9 chars');
140 is("@c", join(" ", utf8::unicode_to_native(97),
141 utf8::unicode_to_native(10),
142 utf8::unicode_to_native(98),
143 utf8::unicode_to_native(10),
144 utf8::unicode_to_native(10),
145 utf8::unicode_to_native(99),
146 utf8::unicode_to_native(10),
147 utf8::unicode_to_native(10),
148 utf8::unicode_to_native(10)),
149 'got expected chars');
150 ok(close($fh), 'close');
153 my $t = ($t1, $t2)[$s-1];
154 my $str = $t->{data};
155 my $r = $t->{read_c};
156 my $w = $t->{write_c};
157 for my $read_c (@$r) {
158 for my $write_c (@$w) {
159 for my $how_r (qw(readline_all readline read sysread)) {
160 next if $how_r eq 'readline_all' and $read_c != 1;
161 for my $how_w (qw(print print/flush syswrite)) {
162 testfile($str, $write_c, $read_c, $how_w, $how_r, $s);
163 testpipe($str, $write_c, $read_c, $how_w, $how_r, $s);