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