blob: 2b8f32797b4254b483a9a7c48f582c1a4b6bbb86 [file] [log] [blame]
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestApache::read4;
# extra tests in addition to TestApache::read
use strict;
use warnings FATAL => 'all';
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use APR::Table ();
use Apache::Test;
use Apache::TestUtil;
use Apache2::Const -compile => qw(OK);
my @expected = ("123foo",
"123456".("\0"x(1000-length("123456")))."bar",
"123f",
"23f\0\0o",
qr/\bread-?only\b/,
$^V,
"ARo",
qr/\bread-?only\b/,
".........",
# Reading into $1 (the test above) eats up input since perl
# 5.10. This was also the version that blessed $^V as a
# "version" object.
(ref $^V ? "\0\0ar" : "\0\0bar"),
"12",
"");
sub X::TIESCALAR {bless []=>'X'}
sub X::FETCH {$_[0]->[0]}
sub X::STORE {$_[0]->[0]=$_[1]}
sub handler {
my $r = shift;
plan $r, tests => 12;
my $test = 0;
# we get the string "foobarfoobar" as input here
# this test consumes 3 bytes
my $data = 12345;
$r->read($data, 3, -2);
ok t_cmp($data, $expected[$test++], "negative offset");
# "barfoobar" still to be read
$data = 123456;
# now $data is a valid IV but has a PV buffer assigned.
# read() has to convert to a valid PV.
$r->read($data, 3, 1000);
ok t_cmp($data, $expected[$test++], "offset > length of string");
# "foobar" still to be read
$r->read($data, 1, 3);
ok t_cmp($data, $expected[$test++], "shrink string");
# "oobar" still to be read
substr($data, 0, 1) = ''; # set the OOK flag (PV starts at offset 1)
$r->read($data, 1, 5);
ok t_cmp($data, $expected[$test++], "PV with OOK flag set");
# "obar" still to be read
# this test dies BEFORE reading anything
eval {$r->read($^V, 1)};
ok t_cmp($@, $expected[$test++], "read-only \$^V");
ok t_cmp($^V, $expected[$test++], "\$^V untouched");
# "obar" still to be read
$data=[];
eval {$r->read($data, 1, 2)};
ok t_cmp($data, $expected[$test++], "passing an RV as data");
# "bar" still to be read
# this test consumes the "b" although it should not
"........."=~/(.*)/;
eval {$r->read($1, 1)};
my $x="$1"; # just in case
ok t_cmp($@, $expected[$test++], "read-only \$1");
ok t_cmp($x, $expected[$test++], "\$1 untouched");
# "ar" still to be read
# now eat up the rest of input
tie $data, 'X';
$data='';
$r->read($data, 100, 2);
ok t_cmp(tied($data)->[0], $expected[$test++], "read into a tied buffer");
untie $data;
# input is empty
$data=123456;
$r->read($data, 1000, 2);
ok t_cmp($data, $expected[$test++], "read at eof");
# input is empty
$r->read($data, 1000);
ok t_cmp($data, $expected[$test++], "repeated read at eof");
Apache2::Const::OK;
}
1;