| # |
| # interactive testing (when A-T) can't figure out the configuration |
| # |
| |
| use Test::More; |
| |
| use strict; |
| use warnings FATAL => 'all'; |
| |
| use IPC::Run qw(start pump finish timeout); |
| use Cwd qw(cwd); |
| use File::Spec::Functions qw(catfile); |
| |
| use MyTest::Util qw(myrun3 go_in go_out work_dir check_eval |
| test_configs); |
| |
| use Apache::TestConfig (); |
| use Apache::TestTrace; |
| |
| # in this test we don't want any cached preconfiguration to kick in |
| # A-T is aware of this env var and won't load neither custom config, nor |
| # Apache/Build.pm from mod_perl2. |
| local $ENV{APACHE_TEST_INTERACTIVE_CONFIG_TEST} = 1; |
| |
| my @configs = test_configs(); |
| if ($configs[0]{repos_type} eq 'mp2_core') { |
| plan skip_all => "modperl2 doesn't run interactive config"; |
| } |
| else { |
| my $tests_per_config = 11; |
| plan tests => $tests_per_config * @configs + 1; |
| } |
| |
| my $orig_dir = go_in(); |
| |
| my $cwd = cwd(); |
| my $expected_work_dir = work_dir(); |
| is $cwd, $expected_work_dir, "working in $expected_work_dir"; |
| |
| debug "cwd: $cwd"; |
| |
| for my $c (@configs) { |
| |
| # install the sticky custom config |
| install($c); |
| |
| # interactive config doesn't work with this var on |
| $ENV{APACHE_TEST_NO_STICKY_PREFERENCES} = 0; |
| basic($c); |
| } |
| |
| go_out($orig_dir); |
| |
| # 4 tests |
| sub install { |
| my $c = shift; |
| |
| my($cmd, $out, $err); |
| |
| $cmd = "make clean"; |
| ($out, $err) = myrun3($cmd); |
| # ignore the results |
| |
| my $makepl_arg = $c->{makepl_arg} || ''; |
| $cmd = "$c->{perl_exec} Makefile.PL $makepl_arg " . |
| "-httpd $c->{httpd_exec} -apxs $c->{apxs_exec}"; |
| ($out, $err) = myrun3($cmd); |
| my $makefile = catfile $expected_work_dir, "Makefile"; |
| is -e $makefile, 1, "generated $makefile"; |
| unlike $err, qr/\[ error\]/, "checking for errors"; |
| |
| $cmd = "make"; |
| ($out, $err) = myrun3($cmd); |
| is $err, "", $cmd; |
| |
| $cmd = "make install"; |
| ($out, $err) = myrun3($cmd); |
| unlike $err, qr/\[ error\]/, $cmd; |
| } |
| |
| # 7 tests |
| sub basic { |
| my $c = shift; |
| |
| my($cmd, $out, $err); |
| |
| # clean and ignore the results |
| $cmd = "make clean"; |
| ($out, $err) = myrun3($cmd); |
| |
| my $makepl_arg = $c->{makepl_arg} || ''; |
| $cmd = "$c->{perl_exec} Makefile.PL $makepl_arg"; |
| ($out, $err) = myrun3($cmd); |
| unlike $err, qr/\[ error\]/, $cmd; |
| |
| $cmd = "make"; |
| ($out, $err) = myrun3($cmd); |
| is $err, "", $cmd; |
| |
| { |
| my $in; |
| my $expected = ''; |
| my @cmd = qw(make test); |
| push @cmd, "TEST_VERBOSE=1" if $c->{test_verbose}; |
| $cmd = join " ", @cmd; |
| |
| # bypass the -t STDIN checks to still ensure the interactive |
| # config prompts |
| $ENV{APACHE_TEST_INTERACTIVE_PROMPT_OK} = 1; |
| |
| $in = ''; |
| $out = ''; |
| $err = ''; |
| my $h = start \@cmd, \$in, \$out, \$err, timeout($c->{timeout}); |
| |
| # here the expect fails if the interactive config doesn't kick |
| # in, but for example somehow figures out the needed |
| # information (httpd/apxs) and runs the test suite normally |
| $expected = "Please provide a full path to 'httpd' executable"; |
| eval { $h->pump until $out =~ /$expected/gc }; |
| my $reset_std = 1; |
| check_eval($cmd, $out, $err, $reset_std, |
| "interactive config wasn't invoked"); |
| |
| $in .= "$c->{httpd_exec}\n" ; |
| $expected = "Please provide a full path to .*? 'apxs' executable"; |
| eval { $h->pump until $out =~ /$expected/gc }; |
| $reset_std = 1; |
| check_eval($cmd, $out, $err, $reset_std, |
| "interactive config had a problem"); |
| |
| $in .= "$c->{apxs_exec}\n" ; |
| eval { $h->finish }; |
| $reset_std = 0; # needed for later sub-tests |
| check_eval($cmd, $out, $err, $reset_std, |
| "failed to finish $cmd"); |
| like $out, qr/using $c->{httpd_version} \($c->{httpd_mpm} MPM\)/, |
| "$cmd: using $c->{httpd_version} \($c->{httpd_mpm} MPM"; |
| like $out, qr/All tests successful/, "$cmd: All tests successful"; |
| unlike $err, qr/\[ error\]/, "$cmd: no error messages"; |
| } |
| |
| $cmd = "make install"; |
| ($out, $err) = myrun3($cmd); |
| unlike $err, qr/\[ error\]/, $cmd; |
| |
| # test that httpd is found in t/REPORT (if exists) |
| SKIP: { |
| $cmd = "t/REPORT"; |
| skip "$cmd doesn't exist", 1 unless -e $cmd; |
| |
| ($out, $err) = myrun3($cmd); |
| like $out, qr/Server version: $c->{httpd_version}/, $cmd; |
| } |
| } |
| |
| __END__ |
| |