mod_perl
view release on metacpan or search on metacpan
Apache-Test/lib/Apache/TestRun.pm view on Meta::CPAN
warning "Skipping 'set unlimited ulimit for coredumps', " .
"since we are running as a non-root user on Solaris";
return;
}
}
my $binsh = '/bin/sh';
return unless -e $binsh;
$ENV{APACHE_TEST_ULIMIT_SET} = 1;
my $sh = Symbol::gensym();
open $sh, "echo ulimit -a | $binsh|" or die;
local $_;
while (<$sh>) {
if (/^core.*unlimited$/) {
#already set to unlimited
$ENV{APACHE_TEST_ULIMIT_SET} = 1;
return;
}
}
close $sh;
$orig_command = "ulimit -c unlimited; $orig_command";
warning "setting ulimit to allow core files\n$orig_command";
# use 'or die' to avoid warnings due to possible overrides of die
exec $orig_command or die "exec $orig_command has failed";
}
sub set_ulimit {
my $self = shift;
#return if $self->set_ulimit_via_bsd_resource;
eval { $self->set_ulimit_via_sh };
}
sub set_env {
#export some environment variables for t/modules/env.t
#(the values are unimportant)
$ENV{APACHE_TEST_HOSTNAME} = 'test.host.name';
$ENV{APACHE_TEST_HOSTTYPE} = 'z80';
}
sub run {
my $self = shift;
# assuming that test files are always in the same directory as the
# driving script, make it possible to run the test suite from any place
# use a full path, which will work after chdir (e.g. ./TEST)
$0 = File::Spec->rel2abs($0);
if (-e $0) {
my $top = dirname dirname $0;
chdir $top if $top and -d $top;
}
# reconstruct argv, preserve multiwords args, eg 'PerlTrace all'
my $argv = join " ", map { /^-/ ? $_ : qq['$_'] } @ARGV;
$orig_command = "$^X $0 $argv";
$orig_cwd = Cwd::cwd();
$self->set_ulimit;
$self->set_env; #make sure these are always set
$self->detect_relocation($orig_cwd);
my(@argv) = @_;
$self->getopts(\@argv);
$self->pre_configure();
# can't setup the httpd-specific parts of the config object yet
$self->{test_config} = $self->new_test_config();
$self->warn_core();
# give TestServer access to our runtime configuration directives
# so we can tell the server stuff if we need to
$self->{test_config}->{server}->{run} = $self;
$self->{server} = $self->{test_config}->server;
local($SIG{__DIE__}, $SIG{INT});
$self->install_sighandlers;
$self->try_exit_opts(@exit_opts_no_need_httpd);
# httpd is found here (unless it was already configured before)
$self->{test_config}->httpd_config();
$self->try_exit_opts(@exit_opts_need_httpd);
if ($self->{opts}->{configure}) {
warning "cleaning out current configuration";
$self->opt_clean(1);
}
$self->split_test_args;
$self->die_on_invalid_args;
$self->default_run_opts;
# if configure() fails for some reason before it has flushed the
# config to a file, save it so -clean will be able to clean
if ($self->{opts}->{'start-httpd'} || $self->{opts}->{'configure'}) {
eval { $self->configure };
if ($@) {
error "configure() has failed:\n$@";
warning "forcing Apache::TestConfig object save";
$self->{test_config}->save;
warning "run 't/TEST -clean' to clean up before continuing";
exit_perl 0;
}
}
if ($self->{opts}->{configure}) {
warning "reconfiguration done";
exit_perl 1;
}
$self->start unless $self->{opts}->{'no-httpd'};
$self->run_tests;
$self->stop unless $self->{opts}->{'no-httpd'};
}
sub rerun {
my $vars = shift;
# in %$vars
# - httpd will be always set
# - apxs is optional
$orig_cwd ||= Cwd::cwd();
chdir $orig_cwd;
my $new_opts = " -httpd $vars->{httpd}";
$new_opts .= " -apxs $vars->{apxs}" if $vars->{apxs};
my $new_command = $orig_command;
# strip any old bogus -httpd/-apxs
$new_command =~ s/--?httpd\s+$orig_conf_opts->{httpd}//
if $orig_conf_opts->{httpd};
$new_command =~ s/--?httpd\s+$orig_conf_opts->{httpd}//
if $orig_conf_opts->{httpd} and $vars->{apxs};
# add new opts
$new_command .= $new_opts;
warning "running with new config opts: $new_command";
# use 'or die' to avoid warnings due to possible overrides of die
exec $new_command or die "exec $new_command has failed";
}
# make it easy to move the whole distro w/o running
# 't/TEST -clean' before moving. when moving the whole package,
# the old cached config will stay, so we want to nuke it only if
# we realize that it's no longer valid. we can't just check the
# existance of the saved top_dir value, since the project may have
# been copied and the old dir could be still there, but that's not
# the one that we work in
sub detect_relocation {
my($self, $cur_top_dir) = @_;
my $config_file = catfile qw(t conf apache_test_config.pm);
return unless -e $config_file;
my %inc = %INC;
eval { require "./$config_file" };
%INC = %inc; # be stealth
warn($@), return if $@;
my $cfg = 'apache_test_config'->new;
# if the top_dir from saved config doesn't match the current
# top_dir, that means that the whole project was relocated to a
# different directory, w/o running t/TEST -clean first (in each
# directory with a test suite)
my $cfg_top_dir = $cfg->{vars}->{top_dir};
return unless $cfg_top_dir;
return if $cfg_top_dir eq $cur_top_dir;
# if that's the case silently fixup the saved config to use the
# new paths, and force a complete cleanup. if we don't fixup the
# config files, the cleanup process won't be able to locate files
# to delete and re-configuration will fail
{
# in place editing
local @ARGV = $config_file;
local $^I = ".bak"; # Win32 needs a backup
while (<>) {
s{$cfg_top_dir}{$cur_top_dir}g;
print;
}
unlink $config_file . $^I;
}
my $cleanup_cmd = "$^X $0 -clean";
warning "cleaning up the old config";
# XXX: do we care to check success?
system $cleanup_cmd;
# XXX: I tried hard to accomplish that w/o starting a new process,
# but too many things get on the way, so for now just keep it as an
# external process, as it's absolutely transparent to the normal
# app-run
}
my @oh = qw(jeez golly gosh darn shucks dangit rats nuts dangnabit crap);
sub oh {
$oh[ rand scalar @oh ];
}
#e.g. t/core or t/core.12499
my $core_pat = '^core(\.\d+)?' . "\$";
# $self->scan_core_incremental([$only_top_dir])
# normally would be called after each test
# and since it updates the list of seen core files
# scan_core() won't report these again
# currently used in Apache::TestSmoke
#
# if $only_t_dir arg is true only the t_dir dir (t/) will be scanned
sub scan_core_incremental {
my($self, $only_t_dir) = @_;
my $vars = $self->{test_config}->{vars};
# no core files dropped on win32
return () if Apache::TestConfig::WIN32;
if ($only_t_dir) {
require IO::Dir;
my @cores = ();
for (IO::Dir->new($vars->{t_dir})->read) {
my $file = catfile $vars->{t_dir}, $_;
next unless -f $file;
( run in 0.455 second using v1.01-cache-2.11-cpan-5511b514fd6 )