stas 2004/08/17 22:49:03
Added: t/hooks/TestHooks hookrun.pm
t/hooks hookrun.t
Log:
Apache::HookRun tests
Revision Changes Path
1.1 modperl-2.0/t/hooks/TestHooks/hookrun.pm
Index: hookrun.pm
===================================================================
package TestHooks::hookrun;
# this test runs all Apache phases from within the very first http
# phase
# XXX: may be improve the test to do a full-blown test, where each
# phase does something useful.
# see also TestProtocol::pseudo_http
use strict;
use warnings FATAL => 'all';
use Apache::RequestRec ();
use Apache::RequestUtil ();
use Apache::HookRun ();
use APR::Table ();
use Apache::Test;
use Apache::TestUtil;
use Apache::TestTrace;
use Apache::Const -compile => qw(OK DECLINED DONE SERVER_ERROR);
my $path = '/' . Apache::TestRequest::module2path(__PACKAGE__);
my @phases = qw(
PerlPostReadRequestHandler
PerlTransHandler
PerlMapToStorageHandler
PerlHeaderParserHandler
PerlAccessHandler
PerlAuthenHandler
PerlAuthzHandler
PerlTypeHandler
PerlFixupHandler
PerlResponseHandler
PerlLogHandler
);
sub post_read_request {
my $r = shift;
my $rc;
$r->push_handlers(PerlTransHandler => \&any);
$r->push_handlers(PerlMapToStorageHandler => \&any);
$r->push_handlers(PerlHeaderParserHandler => \&any);
$r->push_handlers(PerlAccessHandler => \&any);
$r->push_handlers(PerlAuthenHandler => \&any);
$r->push_handlers(PerlAuthzHandler => \&any);
$r->push_handlers(PerlTypeHandler => \&any);
$r->push_handlers(PerlFixupHandler => \&any);
$r->push_handlers(PerlLogHandler => \&any);
any($r); # indicate that the post_read_request phase was run
# for the full Apache logic for running phases starting from
# post_read_request and ending with fixup see
# ap_process_request_internal in httpd-2.0/server/request.c
$rc = $r->run_translate_name;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
$rc = $r->run_map_to_storage;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
# this must be run all a big havoc will happen in the following
# phases
$r->location_merge($path);
$rc = $r->run_header_parser;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
my $args = $r->args || '';
if ($args eq 'die') {
$r->die(Apache::SERVER_ERROR);
return Apache::DONE;
}
$rc = $r->run_access_checker;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
$rc = $r->run_auth_checker;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
$rc = $r->run_check_user_id;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
$rc = $r->run_type_checker;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
$rc = $r->run_fixups;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
# $r->run_handler is called internally by $r->invoke_handler,
# invoke_handler sets all kind of filters, and does a few other
# things but it's possible to call $r->run_handler, bypassing
# invoke_handler
$rc = $r->invoke_handler;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
$rc = $r->run_log_transaction;
return $rc unless $rc == Apache::OK or $rc == Apache::DECLINED;
return Apache::DONE;
# Apache runs ap_finalize_request_protocol on return of this
# handler
}
sub any {
my $r = shift;
my $callback = Apache::current_callback();
debug "running $callback\n";
$r->notes->set($callback => 1);
# unset the callback that was already run
$r->set_handlers($callback => []);
Apache::OK;
}
sub response {
my $r = shift;
my @pre_response = (@phases)[0..($#phases-2)];
plan tests => scalar(@pre_response);
for my $phase (@pre_response) {
my $note = $r->notes->get($phase);
$r->print("$phase:$note\n");
}
Apache::OK;
}
1;
__END__
<NoAutoConfig>
<VirtualHost TestHooks::hookrun>
PerlModule TestHooks::hookrun
PerlPostReadRequestHandler Apache::Reload
PerlPostReadRequestHandler TestHooks::hookrun::post_read_request
<Location /TestHooks__hookrun>
SetHandler modperl
PerlResponseHandler TestHooks::hookrun::response
AuthName modperl
AuthType none
Require valid-user
</Location>
</VirtualHost>
</NoAutoConfig>
1.1 modperl-2.0/t/hooks/hookrun.t
Index: hookrun.t
===================================================================
use strict;
use warnings FATAL => 'all';
use Apache::Test;
use Apache::TestUtil;
use Apache::TestRequest;
my $module = 'TestHooks::hookrun';
my $config = Apache::Test::config();
my $path = Apache::TestRequest::module2path($module);
Apache::TestRequest::module($module);
my $hostport = Apache::TestRequest::hostport($config);
t_debug("connecting to $hostport");
plan tests => 10;
my $ret = GET "http://$hostport/$path?die";
ok t_cmp $ret->code, 500, '$r->die';
my $body = GET_BODY_ASSERT "http://$hostport/$path?normal";
for my $line (split /\n/, $body) {
my($phase, $value) = split /:/, $line;
ok t_cmp $value, 1, "$phase";
}