blob: f80e41622a1762c5007cb37d3825914607e45979 [file] [log] [blame]
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
##########################################################
### IMPORTANT: only things that must be run absolutely ###
### during the config phase should be in this file ###
##########################################################
#
# On the 2nd pass, during server-internal restart, none of the code
# running from this file (config phase) will be able to log any STDERR
# messages. This is because Apache redirects STDERR to /dev/null until
# the open_logs phase. That means that any of the code fails, the
# error message will be lost (but it should have failed on the 1st
# pass, when STDERR goes to the console and any error messages are
# properly logged). Therefore avoid putting any code here (unless
# there is no other way) and instead put all the code to be run at the
# server startup into post_config_startup.pl. when the latter is run,
# STDERR is sent to $ErrorLog.
#
use strict;
use warnings FATAL => 'all';
die '$ENV{MOD_PERL} not set!' unless $ENV{MOD_PERL};
die '$ENV{MOD_PERL_API_VERSION} not set!'
unless $ENV{MOD_PERL_API_VERSION} == 2;
use File::Spec::Functions qw(canonpath catdir);
use Apache2::ServerUtil ();
use Apache2::ServerRec ();
use Apache2::Process ();
use Apache2::Log ();
use Apache2::Const -compile => ':common';
reorg_INC();
startup_info();
test_add_config();
test_add_version_component();
test_hooks_startup();
test_modperl_env();
### only subs below this line ###
# need to run from config phase, since we want to adjust @INC as early
# as possible
sub reorg_INC {
# after Apache2 has pushed blib and core dirs including Apache2 on
# top reorg @INC to have first devel libs, then blib libs, and
# only then perl core libs
my $pool = Apache2::ServerUtil->server->process->pool;
my $project_root = canonpath
Apache2::ServerUtil::server_root_relative($pool, "..");
my (@a, @b, @c);
for (@INC) {
if (m|^\Q$project_root\E|) {
m|blib| ? push @b, $_ : push @a, $_;
}
else {
push @c, $_;
}
}
@INC = (@a, @b, @c);
}
# this can be run from post_config_startup.pl, but then it'll do the
# logging twice, so in this case it's actually good to have this code
# run during config phase, so it's logged only once (even though it's
# run the second time, but STDERR == /dev/null)
sub startup_info {
my $ap_mods = scalar grep { /^Apache2/ } keys %INC;
my $apr_mods = scalar grep { /^APR/ } keys %INC;
Apache2::Log->info("$ap_mods Apache2:: modules loaded");
Apache2::ServerRec->log->info("$apr_mods APR:: modules loaded");
my $server = Apache2::ServerUtil->server;
my $vhosts = 0;
for (my $s = $server->next; $s; $s = $s->next) {
$vhosts++;
}
$server->log->info("base server + $vhosts vhosts ready to run tests");
}
# need to run from config phase, since it changes server config
sub test_add_config {
# testing $s->add_config()
my $conf = <<'EOC';
# must use PerlModule here to check for segfaults
PerlModule Apache::TestHandler
<Location /apache/add_config>
SetHandler perl-script
PerlResponseHandler Apache::TestHandler::ok1
</Location>
EOC
Apache2::ServerUtil->server->add_config([split /\n/, $conf]);
# test a directive that triggers an early startup, so we get an
# attempt to use perl's mip early
Apache2::ServerUtil->server->add_config(['<Perl >', '1;', '</Perl>']);
}
# need to run from config phase, since it registers PerlPostConfigHandler
sub test_add_version_component {
Apache2::ServerUtil->server->push_handlers(
PerlPostConfigHandler => \&add_my_version);
sub add_my_version {
my ($conf_pool, $log_pool, $temp_pool, $s) = @_;
$s->add_version_component("world domination series/2.0");
return Apache2::Const::OK;
}
}
# cleanup files for TestHooks::startup which can't be done from the
# test itself because the files are created at the server startup and
# the test needing these files may run more than once (t/SMOKE)
#
# we need to run it at config phase since we need to cleanup before
# the open_logs phase
sub test_hooks_startup {
require Apache::Test;
my $dir = catdir Apache::Test::vars('documentroot'), qw(hooks startup);
for (<$dir/*>) {
my $file = ($_ =~ /(.*(?:open_logs|post_config)-\d+)/);
unlink $file;
}
}
sub test_modperl_env {
# see t/response/TestModperl/env.pm
$ENV{MODPERL_EXTRA_PL} = __FILE__;
}
1;