You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2003/01/16 06:15:18 UTC
cvs commit: modperl-2.0/t/filter/TestFilter in_str_consume.pm
stas 2003/01/15 21:15:18
Added: t/filter in_str_consume.t
t/filter/TestFilter in_str_consume.pm
Log:
add a faulty filter test, but keep the fault disabled for now
Revision Changes Path
1.1 modperl-2.0/t/filter/in_str_consume.t
Index: in_str_consume.t
===================================================================
use strict;
use warnings FATAL => 'all';
use Apache::Test;
use Apache::TestUtil;
use Apache::TestRequest;
plan tests => 1;
my $location = '/TestFilter::in_str_consume';
# send a message bigger than 8k, so to make sure that the input filter
# will get more than one bucket brigade with data.
my $data = "A 22 chars long string" x 500; # about 11k
my $received = POST_BODY $location, content => $data;
my $expected = "read just the first 1024b from the first brigade";
ok t_cmp($expected, $received, "input stream filter partial consume")
1.1 modperl-2.0/t/filter/TestFilter/in_str_consume.pm
Index: in_str_consume.pm
===================================================================
package TestFilter::in_str_consume;
# this test verifies that streaming filters framework handles
# gracefully the case when a filter doesn't print anything at all to
# the caller. I figure it's absolutely doesn't matter if the incoming
# bb from the upstream is consumed or not. What matter is that the
# filter sends something downstream (an empty bb will do).
#
# e.g. a filter that cleans up the incoming stream (extra spaces?)
# might reduce the whole bb into nothing (e.g. if it was made of only
# white spaces) then it should send "" down.
#
# another problem with not reading in the while() loop, is that the
# eos bucket won't be detected by the streaming framework and
# consequently won't be sent downstream, probably breaking other
# filters who rely on receiving the EOS bucket.
use strict;
use warnings FATAL => 'all';
use Apache::Filter ();
use Apache::Const -compile => qw(OK M_POST);
sub handler {
my($filter, $bb, $mode, $block, $readbytes) = @_;
my $ctx = $filter->ctx;
unless ($ctx) {
# read a bit from the first brigade and leave the second
# brigade completely unconsumed. we assume that there are two
# brigades because the core input filter will split data in
# 8kb chunks per brigade and we have sent 11k of data (1st bb:
# 8kb, 2nd bb: ~3kb)
my $len = $filter->read($mode, $block, $readbytes, my $buffer, 1024);
warn "FILTER READ: $len bytes\n";
$filter->print("read just the first 1024b from the first brigade");
$filter->ctx(1);
}
else {
unless ($filter->seen_eos) {
# XXX: comment out the next line to reproduce the segfault
$filter->print("");
}
}
return Apache::OK;
}
sub response {
my $r = shift;
$r->content_type('text/plain');
if ($r->method_number == Apache::M_POST) {
my $data = ModPerl::Test::read_post($r);
#warn "HANDLER READ: $data\n";
$r->print($data);
}
return Apache::OK;
}
1;
__DATA__
SetHandler modperl
PerlResponseHandler TestFilter::in_str_consume::response