143003dfeSmillert#!./perl 243003dfeSmillert 343003dfeSmillertBEGIN { 443003dfeSmillert require Config; 543003dfeSmillert if (($Config::Config{'extensions'} !~ m!\bPerlIO/via\b!) ){ 643003dfeSmillert print "1..0 # Skip -- Perl configured without PerlIO::via module\n"; 743003dfeSmillert exit 0; 843003dfeSmillert } 943003dfeSmillert} 1043003dfeSmillert 1143003dfeSmillertuse strict; 1243003dfeSmillertuse warnings; 1343003dfeSmillert 1443003dfeSmillertmy $tmp = "via$$"; 1543003dfeSmillert 16*5486feefSafresh1use Test::More tests => 32; 1743003dfeSmillert 1843003dfeSmillertmy $fh; 1943003dfeSmillertmy $a = join("", map { chr } 0..255) x 10; 2043003dfeSmillertmy $b; 2143003dfeSmillert 2243003dfeSmillertBEGIN { use_ok('PerlIO::via::QuotedPrint'); } 2343003dfeSmillert 2443003dfeSmillertok( !open($fh,"<via(PerlIO::via::QuotedPrint)", $tmp), 'open QuotedPrint for input fails'); 2543003dfeSmillertok( open($fh,">via(PerlIO::via::QuotedPrint)", $tmp), 'open QuotedPrint for output'); 2643003dfeSmillertok( (print $fh $a), "print to output file"); 2743003dfeSmillertok( close($fh), 'close output file'); 2843003dfeSmillert 2943003dfeSmillertok( open($fh,"<via(PerlIO::via::QuotedPrint)", $tmp), 'open QuotedPrint for input'); 3043003dfeSmillert{ local $/; $b = <$fh> } 3143003dfeSmillertok( close($fh), "close input file"); 3243003dfeSmillert 3343003dfeSmillertis($a, $b, 'compare original data with filtered version'); 3443003dfeSmillert 3543003dfeSmillert 3643003dfeSmillert{ 3743003dfeSmillert my $warnings = ''; 3843003dfeSmillert local $SIG{__WARN__} = sub { $warnings = join '', @_ }; 3943003dfeSmillert 4043003dfeSmillert use warnings 'layer'; 4143003dfeSmillert 4243003dfeSmillert # Find fd number we should be using 435759b3d2Safresh1 my $fd = open($fh,'>',$tmp) && fileno($fh); 4443003dfeSmillert print $fh "Hello\n"; 4543003dfeSmillert close($fh); 4643003dfeSmillert 4743003dfeSmillert ok( ! open($fh,">via(Unknown::Module)", $tmp), 'open via Unknown::Module will fail'); 4843003dfeSmillert like( $warnings, qr/^Cannot find package 'Unknown::Module'/, 'warn about unknown package' ); 4943003dfeSmillert 5043003dfeSmillert # Now open normally again to see if we get right fileno 515759b3d2Safresh1 my $fd2 = open($fh,'<',$tmp) && fileno($fh); 5243003dfeSmillert is($fd2,$fd,"Wrong fd number after failed open"); 5343003dfeSmillert 5443003dfeSmillert my $data = <$fh>; 5543003dfeSmillert 5643003dfeSmillert is($data,"Hello\n","File clobbered by failed open"); 5743003dfeSmillert 5843003dfeSmillert close($fh); 5943003dfeSmillert 6043003dfeSmillert{ 6143003dfeSmillertpackage Incomplete::Module; 6243003dfeSmillert} 6343003dfeSmillert 6443003dfeSmillert $warnings = ''; 6543003dfeSmillert no warnings 'layer'; 6643003dfeSmillert ok( ! open($fh,">via(Incomplete::Module)", $tmp), 'open via Incomplete::Module will fail'); 6743003dfeSmillert is( $warnings, "", "don't warn about unknown package" ); 6843003dfeSmillert 6943003dfeSmillert $warnings = ''; 7043003dfeSmillert no warnings 'layer'; 7143003dfeSmillert ok( ! open($fh,">via(Unknown::Module)", $tmp), 'open via Unknown::Module will fail'); 7243003dfeSmillert is( $warnings, "", "don't warn about unknown package" ); 7343003dfeSmillert} 7443003dfeSmillert 7543003dfeSmillertmy $obj = ''; 7643003dfeSmillertsub Foo::PUSHED { $obj = shift; -1; } 7743003dfeSmillertsub PerlIO::via::Bar::PUSHED { $obj = shift; -1; } 7843003dfeSmillertopen $fh, '<:via(Foo)', "foo"; 7943003dfeSmillertis( $obj, 'Foo', 'search for package Foo' ); 8043003dfeSmillertopen $fh, '<:via(Bar)', "bar"; 8143003dfeSmillertis( $obj, 'PerlIO::via::Bar', 'search for package PerlIO::via::Bar' ); 8243003dfeSmillert 835759b3d2Safresh1{ 845759b3d2Safresh1 # [perl #131221] 855759b3d2Safresh1 ok(open(my $fh1, ">", $tmp), "open $tmp"); 865759b3d2Safresh1 ok(binmode($fh1, ":via(XXX)"), "binmode :via(XXX) onto it"); 875759b3d2Safresh1 ok(open(my $fh2, ">&", $fh1), "dup it"); 885759b3d2Safresh1 close $fh1; 895759b3d2Safresh1 close $fh2; 905759b3d2Safresh1 915759b3d2Safresh1 # make sure the old workaround still works 925759b3d2Safresh1 ok(open($fh1, ">", $tmp), "open $tmp"); 935759b3d2Safresh1 ok(binmode($fh1, ":via(YYY)"), "binmode :via(YYY) onto it"); 945759b3d2Safresh1 ok(open($fh2, ">&", $fh1), "dup it"); 955759b3d2Safresh1 print $fh2 "XZXZ"; 965759b3d2Safresh1 close $fh1; 975759b3d2Safresh1 close $fh2; 985759b3d2Safresh1 995759b3d2Safresh1 ok(open($fh1, "<", $tmp), "open $tmp for check"); 1005759b3d2Safresh1 { local $/; $b = <$fh1> } 1015759b3d2Safresh1 close $fh1; 1025759b3d2Safresh1 is($b, "XZXZ", "check result is from non-filtering class"); 1035759b3d2Safresh1 1045759b3d2Safresh1 package PerlIO::via::XXX; 1055759b3d2Safresh1 1065759b3d2Safresh1 sub PUSHED { 1075759b3d2Safresh1 my $class = shift; 1085759b3d2Safresh1 bless {}, $class; 1095759b3d2Safresh1 } 1105759b3d2Safresh1 1115759b3d2Safresh1 sub WRITE { 1125759b3d2Safresh1 my ($self, $buffer, $handle) = @_; 1135759b3d2Safresh1 1145759b3d2Safresh1 print $handle $buffer; 1155759b3d2Safresh1 return length($buffer); 1165759b3d2Safresh1 } 1175759b3d2Safresh1 package PerlIO::via::YYY; 1185759b3d2Safresh1 1195759b3d2Safresh1 sub PUSHED { 1205759b3d2Safresh1 my $class = shift; 1215759b3d2Safresh1 bless {}, $class; 1225759b3d2Safresh1 } 1235759b3d2Safresh1 1245759b3d2Safresh1 sub WRITE { 1255759b3d2Safresh1 my ($self, $buffer, $handle) = @_; 1265759b3d2Safresh1 1275759b3d2Safresh1 $buffer =~ tr/X/Y/; 1285759b3d2Safresh1 print $handle $buffer; 1295759b3d2Safresh1 return length($buffer); 1305759b3d2Safresh1 } 1315759b3d2Safresh1 1325759b3d2Safresh1 sub GETARG { 1335759b3d2Safresh1 "XXX"; 1345759b3d2Safresh1 } 1355759b3d2Safresh1} 1365759b3d2Safresh1 137*5486feefSafresh1{ 138*5486feefSafresh1 my $read_buf = "x" x 10; 139*5486feefSafresh1 my $read_res; 140*5486feefSafresh1 141*5486feefSafresh1 open my $fh, "<:via(BadRead)", $tmp 142*5486feefSafresh1 or die "Cannot open via BadRead"; 143*5486feefSafresh1 my $buf; 144*5486feefSafresh1 my $warn = ''; 145*5486feefSafresh1 local $SIG{__WARN__} = sub { $warn .= "@_\n" }; 146*5486feefSafresh1 # this would segfault 147*5486feefSafresh1 $warn = ''; 148*5486feefSafresh1 $read_res = -1; 149*5486feefSafresh1 ok(!eval { read($fh, $buf, 10) }, "READ returns -1"); 150*5486feefSafresh1 like($warn, qr/Invalid return from PerlIO::via::BadRead::READ = -1, expected undef or 0 to 10/, 151*5486feefSafresh1 "check warning"); 152*5486feefSafresh1 153*5486feefSafresh1 $warn = ''; 154*5486feefSafresh1 $read_res = 11; 155*5486feefSafresh1 ok(!eval { read($fh, $buf, 10) }, "READ returns 11 when 10 requested"); 156*5486feefSafresh1 like($warn, qr/Invalid return from PerlIO::via::BadRead::READ = 11, expected undef or 0 to 10/, 157*5486feefSafresh1 "check warning"); 158*5486feefSafresh1 159*5486feefSafresh1 $warn = ''; 160*5486feefSafresh1 $read_res = 10; 161*5486feefSafresh1 $read_buf = "x" x 9; 162*5486feefSafresh1 ok(!eval { read($fh, $buf, 10) }, "READ returns 10 when 9 in buffer"); 163*5486feefSafresh1 like($warn, qr/Invalid return from PerlIO::via::BadRead::READ = 10, beyond end of the returned buffer at 9/, 164*5486feefSafresh1 "check warning"); 165*5486feefSafresh1 166*5486feefSafresh1 package PerlIO::via::BadRead; 167*5486feefSafresh1 168*5486feefSafresh1 sub PUSHED { 169*5486feefSafresh1 bless {}, shift; 170*5486feefSafresh1 } 171*5486feefSafresh1 172*5486feefSafresh1 sub READ { 173*5486feefSafresh1 $_[1] = $read_buf; 174*5486feefSafresh1 175*5486feefSafresh1 return $read_res; 176*5486feefSafresh1 } 177*5486feefSafresh1} 178*5486feefSafresh1 17943003dfeSmillertEND { 18043003dfeSmillert 1 while unlink $tmp; 18143003dfeSmillert} 18243003dfeSmillert 183