xref: /openbsd/gnu/usr.bin/perl/ext/PerlIO-via/t/via.t (revision 5486feef)
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