blob: 736eb6f7bf2a78801d4c0f1f11a7de65d3720d18 [file]
package MyTest::Util;
use strict;
use warnings FATAL => 'all';
use Apache::TestConfig;
use Apache::TestTrace;
use Exporter ();
use IPC::Run3 ();
use Cwd;
use vars qw(@ISA @EXPORT @EXPORT_OK);
@ISA = qw(Exporter);
@EXPORT = ();
@EXPORT_OK = qw(myrun3 go_in go_out work_dir dump_stds check_eval
test_configs);
sub myrun3 {
my $cmd = shift;
my $out = '';
my $err = '';
my $ok = IPC::Run3::run3($cmd, \undef, \$out, \$err);
die "IPC::Run3 failed to run $cmd" unless $ok;
dump_stds($cmd, '', $out, $err) if $?;
return ($out, $err);
}
sub go_in {
my $orig_dir = cwd();
my $dir = $ENV{APACHE_TESTITSELF_BASE_DIR} || '';
debug "chdir $dir";
chdir $dir or die "failed to chdir to $dir: $!";
return $orig_dir;
}
sub go_out {
my $dir = shift;
debug "chdir $dir";
chdir $dir or die "failed to chdir to $dir: $!";
}
# the base dir from which the A-T tests are supposed to be run
# we might not be there
sub work_dir { $ENV{APACHE_TESTITSELF_BASE_DIR} }
sub dump_stds {
my($cmd, $in, $out, $err) = @_;
$cmd = 'unknown' unless length $cmd;
$in = '' unless length $in;
$out = '' unless length $out;
$err = '' unless length $err;
if ($cmd) {
$cmd =~ s/\n$//;
$cmd =~ s/^/# /gm;
print STDERR "\n\n#== CMD ===\n$cmd\n#=============";
}
if ($in) {
$in =~ s/\n$//;
$in =~ s/^/# /gm;
print STDERR "\n### STDIN ###\n$in\n##############\n\n\n";
}
if ($out) {
$out =~ s/\n$//;
$out =~ s/^/# /gm;
print STDERR "\n### STDOUT ###\n$out\n##############\n\n\n";
}
if ($err) {
$err =~ s/\n$//;
$err =~ s/^/# /gm;
print STDERR "\n### STDERR ###\n$err\n##############\n\n\n";
}
}
# if $@ is set dumps the $out and $err streams and dies
# otherwise resets the $out and $err streams if $reset_std is true
sub check_eval {
my($cmd, $out, $err, $reset_std, $msg) = @_;
$msg ||= "unknown";
if ($@) {
dump_stds($cmd, '', $out, $err);
die "$@\nError: $msg\n";
}
# reset the streams in caller
($_[1], $_[2]) = ("", "") if $reset_std;
}
# this function returns an array of configs (hashes) coming from
# -config-file command line option
sub test_configs {
my $config_file = $ENV{APACHE_TESTITSELF_CONFIG_FILE} || '';
# reset
%Apache::TestItSelf::Config = ();
@Apache::TestItSelf::Configs = ();
require $config_file;
unless (@Apache::TestItSelf::Configs) {
error "can't find test configs in '$config_file'";
exit 1;
}
my %global = %Apache::TestItSelf::Config;
# merge the global config with instance configs
my @configs = map { { %global, %$_ } } @Apache::TestItSelf::Configs;
return @configs;
}
1;
__END__
=head1 NAME
MyTest::Util -- helper functions
=head1 Config files format
the -config-file command line option specifies which file contains the
configurations to run with.
META: expand
%Apache::TestItSelf::Config = (
perl_exec => "/home/$ENV{USER}/perl/5.8.5-ithread/bin/perl5.8.5",
mp_gen => '2.0',
httpd_gen => '2.0',
httpd_version => 'Apache/2.0.55',
timeout => 200,
makepl_arg => 'MOD_PERL=2 -libmodperl mod_perl-5.8.5-ithread.so',
);
my $path = "/home/$ENV{USER}/httpd";
@Apache::TestItSelf::Configs = (
{
apxs_exec => "$path/prefork/bin/apxs",
httpd_exec => "$path/prefork/bin/httpd",
httpd_mpm => "prefork",
test_verbose => 0,
},
{
apxs_exec => "$path/worker/bin/apxs",
httpd_exec => "$path/worker/bin/httpd",
httpd_mpm => "worker",
test_verbose => 1,
},
);
1;
=cut