diff options
Diffstat (limited to 'debian/perl-framework/Apache-Test/Apache-TestItSelf')
21 files changed, 1305 insertions, 0 deletions
diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/Changes b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/Changes new file mode 100644 index 0000000..adf4530 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/Changes @@ -0,0 +1,21 @@ +=head1 NAME + +Changes - Apache::TestMe changes logfile + +=head1 Changes + +=over 4 + +=item 0.01 + +new test basic/vhost.t which introduces a vhost entry in .pm. also +added a dummy vhost entry in t/conf/extra.conf.in, the setup needed by +t/minmaxclients.t from Apache-TestItSelf [Stas] + +write a basic mod_perl test: basic/hello.t [Stas] + +starting the config test suite used by Apache::TestItSelf [Stas] + +=back + +=cut diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/Makefile.PL b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/Makefile.PL new file mode 100644 index 0000000..cd2ef90 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/Makefile.PL @@ -0,0 +1,221 @@ +use 5.005; + +use lib qw(../../lib); # Apache-Test/lib + +use Apache::TestMM qw(test clean); +use Apache::TestMM (); +use Apache::TestReport; + +use ExtUtils::MakeMaker (); + +my $mp_gen = satisfy_mp_generation(); +warn "Goind to build against mod_perl/$mod_perl::VERSION Perl/$]\n"; + +Apache::TestMM::filter_args(); + +my @scripts = qw(t/TEST); +for (@scripts) { + Apache::TestMM::generate_script($_); +} +Apache::TestReport->generate_script; + +my @clean_files = (@scripts, qw(t/REPORT)); + + +my %common_opts = ( + NAME => 'Apache-TestMe', + VERSION => '0.01', + clean => { + FILES => "@clean_files", + }, +); + +if ($mp_gen == 1) { + require ExtUtils::MakeMaker; + ExtUtils::MakeMaker::WriteMakefile( + %common_opts, + ); + +} +else { + require ModPerl::MM; + ModPerl::MM::WriteMakefile( + %common_opts, + ); +} +# If a specific generation was passed as an argument, +# if satisfied +# return the same generation +# else +# die +# else @ARGV and %ENV will be checked for specific orders +# if the specification will be found +# if satisfied +# return the specified generation +# else +# die +# else if any mp generation is found +# return it +# else +# die + +sub satisfy_mp_generation { + my $wanted = shift || wanted_mp_generation(); + + unless ($wanted == 1 || $wanted == 2) { + die "don't know anything about mod_perl generation: $wanted\n" . + "currently supporting only generations 1 and 2"; + } + + my $selected = 0; + + if ($wanted == 1) { + require_mod_perl(); + if ($mod_perl::VERSION >= 1.99) { + # so we don't pick 2.0 version if 1.0 is wanted + die "You don't seem to have mod_perl 1.0 installed"; + } + $selected = 1; + } + elsif ($wanted == 2) { + #warn "Looking for mod_perl 2.0"; + require_mod_perl2(); + if ($mod_perl::VERSION < 1.99) { + die "You don't seem to have mod_perl 2.0 installed"; + } + $selected = 2; + } + else { + $selected = eval { require_mod_perl2() or require_mod_perl() }; + warn "Using $mod_perl::VERSION\n"; + } + + return $selected; +} + +sub require_mod_perl { + eval { require mod_perl }; + die "Can't find mod_perl installed\nThe error was: $@" if $@; + 1; +} + +sub require_mod_perl2 { + eval { require mod_perl2 }; + die "Can't find mod_perl installed\nThe error was: $@" if $@; + 2; +} + + +# the function looks at %ENV and Makefile.PL option to figure out +# whether a specific mod_perl generation was requested. +# It uses the following logic: +# via options: +# perl Makefile.PL MOD_PERL=2 +# or via %ENV: +# env MOD_PERL=1 perl Makefile.PL +# +# return value is: +# 1 or 2 if the specification was found (mp 1 and mp 2 respectively) +# 0 otherwise +sub wanted_mp_generation { + + # check if we have a command line specification + # flag: 0: unknown, 1: mp1, 2: mp2 + my $flag = 0; + my @pass; + while (@ARGV) { + my $key = shift @ARGV; + if ($key =~ /^MOD_PERL=(\d)$/) { + $flag = $1; + } + else { + push @pass, $key; + } + } + @ARGV = @pass; + + # check %ENV + my $env = exists $ENV{MOD_PERL} ? $ENV{MOD_PERL} : 0; + + # check for contradicting requirements + if ($env && $flag && $flag != $env) { + die <<EOF; +Can\'t decide which mod_perl version should be used, since you have +supplied contradicting requirements: + enviroment variable MOD_PERL=$env + Makefile.PL option MOD_PERL=$flag +EOF + } + + my $wanted = 0; + $wanted = 2 if $env == 2 || $flag == 2; + $wanted = 1 if $env == 1 || $flag == 1; + + unless ($wanted) { + # if still unknown try to require mod_perl.pm + eval { require mod_perl2 or require mod_perl }; + unless ($@) { + $wanted = $mod_perl::VERSION >= 1.99 ? 2 : 1; + } + } + + return $wanted; +} + + +# the function looks at %ENV and Makefile.PL option to figure out +# whether a specific mod_perl generation was requested. +# It uses the following logic: +# via options: +# perl Makefile.PL MOD_PERL=2 +# or via %ENV: +# env MOD_PERL=1 perl Makefile.PL +# +# return value is: +# 1 or 2 if the specification was found (mp 1 and mp 2 respectively) +# 0 otherwise +sub wanted_mp_generation { + + # check if we have a command line specification + # flag: 0: unknown, 1: mp1, 2: mp2 + my $flag = 0; + my @pass; + while (@ARGV) { + my $key = shift @ARGV; + if ($key =~ /^MOD_PERL=(\d)$/) { + $flag = $1; + } + else { + push @pass, $key; + } + } + @ARGV = @pass; + + # check %ENV + my $env = exists $ENV{MOD_PERL} ? $ENV{MOD_PERL} : 0; + + # check for contradicting requirements + if ($env && $flag && $flag != $env) { + die <<EOF; +Can\'t decide which mod_perl version should be used, since you have +supplied contradicting requirements: + enviroment variable MOD_PERL=$env + Makefile.PL option MOD_PERL=$flag +EOF + } + + my $wanted = 0; + $wanted = 2 if $env == 2 || $flag == 2; + $wanted = 1 if $env == 1 || $flag == 1; + + unless ($wanted) { + # if still unknown try to require mod_perl.pm + eval { require mod_perl2 or require mod_perl }; + unless ($@) { + $wanted = $mod_perl::VERSION >= 1.99 ? 2 : 1; + } + } + + return $wanted; +} + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/README b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/README new file mode 100644 index 0000000..bc79ea1 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/README @@ -0,0 +1,5 @@ +This package contains an Apache-Test test suite used by +Apache-TestItSelf. We use a dedicated test suite, so we can re-create +cases which normally won't fit into the core Apache-Test test suite. +This is the test suite that should be run from Apache-TestTestItSelf +as explained in Apache-TestItSelf/README diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/TEST.PL b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/TEST.PL new file mode 100644 index 0000000..b5d3494 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/TEST.PL @@ -0,0 +1,37 @@ +use strict; + +use FindBin; +# test against the A-T source lib for easier dev +use lib "$FindBin::Bin/../../../lib"; + +use lib qw(lib ../lib); + +use warnings FATAL => 'all'; + +use Apache::TestRunPerl (); + +package MyTest; + +use vars qw(@ISA); +@ISA = qw(Apache::TestRunPerl); + +sub new_test_config { + my $self = shift; + + #$self->{conf_opts}->{authname} = 'gold club'; + + return $self->SUPER::new_test_config; +} + +sub bug_report { + my $self = shift; + + print <<EOI; ++-----------------------------------------------------+ +| To report problems please refer to the SUPPORT file | ++-----------------------------------------------------+ +EOI +} + +MyTest->new->run(@ARGV); + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/basic/hello.t b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/basic/hello.t new file mode 100644 index 0000000..ced9f86 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/basic/hello.t @@ -0,0 +1,20 @@ +use strict; +use warnings FATAL => 'all'; + +use Apache::Test; +use Apache::TestRequest; +use Apache::TestUtil; + +plan tests => 3, have_lwp; + +my $response = GET '/TestBasic__Hello'; + +ok t_cmp $response->code, 200, '/handler returned HTTP_OK'; + +ok t_cmp $response->header('Content-Type'), 'text/plain', + '/handler set proper Content-Type'; + +chomp(my $content = $response->content); + +ok t_cmp $content, 'Hello', '/handler returned proper content'; + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/basic/vhost.t b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/basic/vhost.t new file mode 100644 index 0000000..4b4d315 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/basic/vhost.t @@ -0,0 +1,7 @@ +use Apache::TestUtil; +use Apache::TestRequest 'GET_BODY_ASSERT'; + +my $module = 'TestBasic::Vhost'; +my $url = Apache::TestRequest::module2url($module); +t_debug("connecting to $url"); +print GET_BODY_ASSERT $url; diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/conf/extra.conf.in b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/conf/extra.conf.in new file mode 100644 index 0000000..e16d963 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/conf/extra.conf.in @@ -0,0 +1,16 @@ +# this vhost entry is needed to check that when t/TEST -maxclients 1 +# or similar is called after t/TEST -conf was run, and extra.conf +# includes a vhost entry and httpd.conf includes an autogenerated +# vhost entry from some .pm file, we used to have a collision, since +# extra.conf wasn't reparsed and the same port was getting assigned to +# more than one vhost entry, preventing server startup: +# +#default_ VirtualHost overlap on port 8530, the first has precedence +#(98)Address already in use: make_sock: could not bind to address +#0.0.0.0:8530 no listening sockets available, shutting down +# +# XXX: for now using a dummy vhost entry. later if needed to put a +# real vhost entry in ths file, the dummy one can be removed +# +<VirtualHost foo_bar_tar> +</VirtualHost> diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/conf/modperl_extra.pl b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/conf/modperl_extra.pl new file mode 100755 index 0000000..a9f939a --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/conf/modperl_extra.pl @@ -0,0 +1,2 @@ + +1; diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/response/TestBasic/Hello.pm b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/response/TestBasic/Hello.pm new file mode 100644 index 0000000..953df81 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/response/TestBasic/Hello.pm @@ -0,0 +1,19 @@ +package TestBasic::Hello; + +use Apache2::RequestRec (); +use Apache2::RequestIO (); +use Apache2::Const -compile => qw(OK); + +# XXX: adjust the test that it'll work under mp1 as well + +sub handler { + + my $r = shift; + + $r->content_type('text/plain'); + $r->print('Hello'); + + return Apache2::OK; +} + +1; diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/response/TestBasic/Vhost.pm b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/response/TestBasic/Vhost.pm new file mode 100644 index 0000000..9692b49 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Apache-TestMe/t/response/TestBasic/Vhost.pm @@ -0,0 +1,28 @@ +package TestBasic::Vhost; + +use Apache2::Const -compile => qw(OK); +use Apache::Test; + +# XXX: adjust the test that it'll work under mp1 as well + +sub handler { + + my $r = shift; + + plan $r, tests => 1; + + ok 1; + + return Apache2::OK; +} + +1; +__END__ +<NoAutoConfig> +<VirtualHost TestBasic::Vhost> + <Location /TestBasic__Vhost> + SetHandler modperl + PerlResponseHandler TestBasic::Vhost + </Location> +</VirtualHost> +</NoAutoConfig> diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Changes b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Changes new file mode 100644 index 0000000..04f23d7 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Changes @@ -0,0 +1,27 @@ +=head1 NAME + +Changes - Apache::TestItSelf changes logfile + +=head1 Changes + +=over 4 + +=item 0.01 + +Fix Makefile.PL to make sure that MakeMaker won't descend into +Apache-TestMe. NORECURS doesn't work in older MM versions, so use the +DIR attr as a workaround [Stas] + +new test: minmaxclients.t: testing a bug with vhosts reproducable by +t/TEST -conf followed by t/TEST -maxclients 1 [Stas] + +new test: interactive.t: the interactive config [Stas] + +new test: httpd_arg.t: passing -httpd argument to 'perl Makefile.PL' +and to 't/TEST' [Stas] + +starting the config test suite [Stas] + +=back + +=cut diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/Makefile.PL b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Makefile.PL new file mode 100644 index 0000000..ef0d9ae --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/Makefile.PL @@ -0,0 +1,40 @@ +use 5.005; + +use lib qw(../lib); # Apache-Test/lib +use Apache::Test5005compat; + +use strict; +use warnings; + +use ExtUtils::MakeMaker; + +use Apache::TestMM (); + +Apache::TestMM::generate_script('t/TEST'); + +my @clean_files = + qw(t/TEST + Makefile.old + ); + +my %prereq = ( + # needed to be able to use one perl version to drive the test + # suite, but a different version from the tests themselves + 'Test::Harness' => '2.44', +); + +WriteMakefile( + NAME => 'Apache::TestItSelf', + PREREQ_PM => \%prereq, + VERSION => "0.01", + NORECURS => 1, # don't descend into Apache-TestMe + DIR => [], # NORECURS is broken in older MM + dist => { + COMPRESS => 'gzip -9f', SUFFIX=>'gz', + }, + clean => { + FILES => "@clean_files", + }, +); + + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/README b/debian/perl-framework/Apache-Test/Apache-TestItSelf/README new file mode 100644 index 0000000..dd332f2 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/README @@ -0,0 +1,73 @@ +This test suite tests various Apache-Test setups (i.e. whether the +configuration works correctly), something that can't be tested with +the normal run-time test suite. + +1) first of all move into Apache-TestItSelf + + % chdir Apache-TestItSelf + + + +2) now choose which test suite to run again, to test whether some + changes in A-T break its config, run 2a. But if the config testing + coverage is not complete, try other test suites and then try to + re-create this problem in 2a. + + You will need to adjust config files under sample/ to reflect the + location of your preinstalled httpd and mod_perl files. + + a. Apache-Test config test suite + + % t/TEST -config sample/testitself_conf_apache_test_core.pl + + this runs against the test suite under: + + Apache-Test/Apache-TestItSelf/Apache-TestMe/t + + it's the same as calling: + + % t/TEST -base ~/apache.org/Apache-Test/Apache-TestItSelf/Apache-TestMe \ + -config sample/testitself_conf_apache_test_core.pl + + + + b. Apache-Test + + assuming that Apache-Test is checked out under + ~/apache.org/Apache-Test, the following will run the tests against the + Apache-Test test suite + + % t/TEST -base ~/apache.org/Apache-Test \ + -config sample/testitself_conf_apache_test_core.pl + + + + c. modperl-2.0 + + assuming that modperl-2.0 is checked out under + ~/apache.org/modperl-2.0, the following will run the tests against the + modperl-2.0 test suite + + % t/TEST -base ~/apache.org/modperl-2.0 \ + -config sample/testitself_conf_mp2_core.pl t/httpd_arg.t t/interactive.t + + + + d. 3rd party modules ### + + assuming that Apache-VMonitor-2.0 is checked out under + ~/work/modules/Apache-VMonitor-2.0, the following will run the tests + against the Apache-VMonitor-2.0 test suite. of course any other 3rd + party module should do. + + + % t/TEST -base ~/work/modules/Apache-VMonitor-2.0 \ + -config sample/testitself_conf_mp2_modules.pl + + +----------------------------- + +DEBUGGING: + +env IPCRUNDEBUG=data t/TEST t/interactive.t +(for more options see IPC::Run / IPC::Run3 manpages) diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/lib/MyTest/Util.pm b/debian/perl-framework/Apache-Test/Apache-TestItSelf/lib/MyTest/Util.pm new file mode 100644 index 0000000..736eb6f --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/lib/MyTest/Util.pm @@ -0,0 +1,160 @@ +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 + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_apache_test_core.pl b/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_apache_test_core.pl new file mode 100644 index 0000000..d873eb7 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_apache_test_core.pl @@ -0,0 +1,44 @@ +# This is a config file for testing Apache-Test + +use strict; +use warnings FATAL => 'all'; + +my $base = "/home/$ENV{USER}"; + +my $perl_base = "$base/perl"; +my $perl_ver = "5.8.8-ithread"; +my $PERL = "$perl_base/$perl_ver/bin/perl$perl_ver"; + +my $httpd_base = "$base/httpd"; +my $httpd_gen = '2.0'; +my $httpd_ver = 'Apache/2.2.3'; +my @mpms = (qw(prefork worker)); + +my $mp_gen = 2.0; +my $mod_perl_so = "mod_perl-$perl_ver.so"; + +%Apache::TestItSelf::Config = ( + repos_type => 'apache_test_core', + perl_exec => $PERL, + mp_gen => $mp_gen, + httpd_gen => $httpd_gen, + httpd_version => $httpd_ver, + timeout => 200, + test_verbose => 0, +); + +@Apache::TestItSelf::Configs = (); +foreach my $mpm (@mpms) { + push @Apache::TestItSelf::Configs, + { + apxs_exec => "$httpd_base/$mpm/bin/apxs", + httpd_exec => "$httpd_base/$mpm/bin/httpd", + httpd_conf => "$httpd_base/$mpm/conf/httpd.conf", + httpd_mpm => $mpm, + makepl_arg => "MOD_PERL=2 -libmodperl $httpd_base/$mpm/modules/$mod_perl_so", + }; +} + +1; + + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_mp2_core.pl b/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_mp2_core.pl new file mode 100644 index 0000000..865c33b --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_mp2_core.pl @@ -0,0 +1,43 @@ +# This is a config file for testing modperl 2.0 core + +use strict; +use warnings FATAL => 'all'; + +my $base = "/home/$ENV{USER}"; + +my $perl_base = "$base/perl"; +my $perl_ver = "5.8.8-ithread"; +my $PERL = "$perl_base/$perl_ver/bin/perl$perl_ver"; + +my $httpd_base = "$base/httpd/svn"; +my $httpd_gen = '2.0'; +my $httpd_ver = 'Apache/2.2.3'; +my @mpms = (qw(prefork worker)); + +my $mp_gen = 2.0; +my $mod_perl_so = "mod_perl-$perl_ver.so"; +my $common_makepl_arg = "MP_MAINTAINER=1"; + +%Apache::TestItSelf::Config = ( + repos_type => 'mp2_core', + perl_exec => $PERL, + mp_gen => $mp_gen, + httpd_gen => $httpd_gen, + httpd_version => $httpd_ver,, + timeout => 900, # make test may take a long time + test_verbose => 0, +); + +@Apache::TestItSelf::Configs = (); +foreach my $mpm (@mpms) { + push @Apache::TestItSelf::Configs, + { + apxs_exec => "$httpd_base/$mpm/bin/apxs", + httpd_exec => "$httpd_base/$mpm/bin/httpd", + httpd_conf => "$httpd_base/$mpm/conf/httpd.conf", + httpd_mpm => $mpm, + makepl_arg => "MP_APXS=$httpd_base/$mpm/bin/apxs $common_makepl_arg", + }; +} + +1; diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_mp2_modules.pl b/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_mp2_modules.pl new file mode 100644 index 0000000..07b6fe0 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/sample/testitself_conf_mp2_modules.pl @@ -0,0 +1,43 @@ +# This is a config file for testing modperl 2.0 Apache:: 3rd party modules + +use strict; +use warnings FATAL => 'all'; + +my $base = "/home/$ENV{USER}"; + +my $perl_base = "$base/perl"; +my $perl_ver = "5.8.8-ithread"; +my $PERL = "$perl_base/$perl_ver/bin/perl$perl_ver"; + +my $httpd_base = "$base/httpd/svn"; +my $httpd_gen = '2.0'; +my $httpd_ver = 'Apache/2.2.3'; +my @mpms = (qw(prefork worker)); + +my $mp_gen = 2.0; +my $mod_perl_so = "mod_perl-$perl_ver.so"; + +%Apache::TestItSelf::Config = ( + repos_type => 'mp2_cpan_modules', + perl_exec => $PERL, + mp_gen => $mp_gen, + httpd_gen => $httpd_gen, + httpd_version => $httpd_ver, + timeout => 200, + test_verbose => 0, +); + + +@Apache::TestItSelf::Configs = (); +foreach my $mpm (@mpms) { + push @Apache::TestItSelf::Configs, + { + apxs_exec => "$httpd_base/$mpm/bin/apxs", + httpd_exec => "$httpd_base/$mpm/bin/httpd", + httpd_conf => "$httpd_base/$mpm/conf/httpd.conf", + httpd_mpm => $mpm, + makepl_arg => "MOD_PERL=2 -libmodperl $httpd_base/$mpm/modules/$mod_perl_so", + }; +} + +1; diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/TEST.PL b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/TEST.PL new file mode 100644 index 0000000..8e28ce4 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/TEST.PL @@ -0,0 +1,123 @@ +use strict; + +use lib qw(../../lib ../lib ./lib); + +use strict; +use warnings FATAL => 'all'; + +use Test::Harness; +use FindBin; +use File::Spec::Functions qw(catdir); +use Apache::TestTrace; +use Cwd qw(cwd); + +use Getopt::Long qw(GetOptions); + +my %usage = ( + 'base-dir' => 'which dir to run the tests in (default: Apache-TestMe)', + 'config-file' => 'which config file to use', + 'help' => 'display this message', + 'trace=T' => 'change tracing default to: warning, notice, ' . + 'info, debug, ...', + 'verbose[=1]' => 'verbose output', +); + +my @flag_opts = qw(verbose help); +my @string_opts = qw(config-file base-dir trace); + +my %opts; +# grab from @ARGV only the options that we expect +GetOptions(\%opts, @flag_opts, (map "$_=s", @string_opts)); + +# t/TEST -v -base /home/$ENV{USER}/apache.org/Apache-Test \ +# -config /home/$ENV{USER}/.apache-test/apache_test_config.pm +# + +$Test::Harness::verbose = 1 if $opts{verbose}; + +opt_help() if $opts{help}; +opt_help() unless $opts{'config-file'}; + +if ($opts{'base-dir'}) { + unless (-d $opts{'base-dir'}) { + error "can't find $opts{'base-dir'}"; + opt_help(); + } +} +else { + my $dir = catdir $FindBin::Bin, qw(.. Apache-TestMe); + # get rid of relative paths + die "can't find the default dir $dir" unless -d $dir; + my $from = cwd(); + chdir $dir or die "can't chdir to $dir: $!"; + $dir = cwd(); + chdir $from or die "can't chdir to $from: $!"; + $opts{'base-dir'} = $dir; +} + + +unless (-r $opts{'config-file'}) { + error "can't read $opts{'config-file'}"; + opt_help(); +} + + if ($opts{trace}) { + my %levels = map {$_ => 1} @Apache::TestTrace::Levels; + if (exists $levels{ $opts{trace} }) { + $Apache::TestTrace::Level = $opts{trace}; + # propogate the override for the server-side. + # -trace overrides any previous APACHE_TEST_TRACE_LEVEL settings + $ENV{APACHE_TEST_TRACE_LEVEL} = $opts{trace}; + } + else { + error "unknown trace level: $opts{trace}", + "valid levels are: @Apache::TestTrace::Levels"; + opt_help(); + } + } + +# forward the data to the sub-processes run by Test::Harness +$ENV{APACHE_TESTITSELF_CONFIG_FILE} = $opts{'config-file'}; +$ENV{APACHE_TESTITSELF_BASE_DIR} = $opts{'base-dir'}; + +run_my_tests(); + +sub run_my_tests { + + my $base = "t"; + unless (-d $base) { + # try to move into the top-level directory + chdir ".." or die "Can't chdir: $!"; + } + + my @tests; + if (@ARGV) { + for (@ARGV) { + if (-d $_) { + push @tests, <$_/*.t>; + } else { + $_ .= ".t" unless /\.t$/; + push @tests, $_; + } + } + } else { + chdir $base; + @tests = sort (<*.t>); + chdir ".."; + @tests = map { "$base/$_" } @tests; + } + + runtests @tests; +} + +sub opt_help { + print <<EOM; +usage: TEST [options ...] + where options include: +EOM + + for (sort keys %usage){ + printf " -%-13s %s\n", $_, $usage{$_}; + } + exit; +} diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/httpd_arg.t b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/httpd_arg.t new file mode 100644 index 0000000..835b328 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/httpd_arg.t @@ -0,0 +1,117 @@ +# +# basic testing with -httpd argument passed explicitly (to +# Makefile.PL, to t/TEST, etc.) +# + +# XXX: -apxs should be really the same test but passing -apxs instead +# of -httpd, so consider to just run both in this test + +use strict; +use warnings FATAL => 'all'; + +use Test::More; +use MyTest::Util qw(myrun3 go_in go_out test_configs); +use Apache::TestConfig (); + +my @configs = test_configs(); +my $tests_per_config = 18; +plan tests => $tests_per_config * @configs; + +my $orig_dir = go_in(); + +for my $c (@configs) { + Apache::TestConfig::custom_config_nuke(); + $ENV{APACHE_TEST_NO_STICKY_PREFERENCES} = 1; + makefile_pl_plus_httpd_arg($c); + + # this one will have custom config, but it shouldn't interrupt + # with the explicit one + # XXX: useless at the moment, since the previously stored custom + # config and the explicit config both point to the same config + $ENV{APACHE_TEST_NO_STICKY_PREFERENCES} = 0; + makefile_pl_plus_httpd_arg($c); + + Apache::TestConfig::custom_config_nuke(); + t_TEST_plus_httpd_arg($c); +} + +go_out($orig_dir); + +# 6 tests +# explicit Makefile.PL -httpd argument +sub makefile_pl_plus_httpd_arg { + 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 " . + "-httpd $c->{httpd_exec} -httpd_conf $c->{httpd_conf}"; + ($out, $err) = myrun3($cmd); + unlike $err, qr/\[ error\]/, $cmd; + + $cmd = "make"; + ($out, $err) = myrun3($cmd); + is $err, "", $cmd; + + my $test_verbose = $c->{test_verbose} ? "TEST_VERBOSE=1" : ""; + $cmd = "make test $test_verbose"; + ($out, $err) = myrun3($cmd); + like $out, qr/using $c->{httpd_version} \($c->{httpd_mpm} MPM\)/, $cmd; + like $out, qr/All tests successful/, $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; + } +} + +# explicit t/TEST -httpd argument +sub t_TEST_plus_httpd_arg { + 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 $test_verbose = $c->{test_verbose} ? "-v " : ""; + $cmd = "t/TEST -httpd $c->{httpd_exec} $test_verbose"; + ($out, $err) = myrun3($cmd); + like $out, + qr/using $c->{httpd_version} \($c->{httpd_mpm} MPM\)/, + $cmd; + like $out, qr/All tests successful/, $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__ + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/interactive.t b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/interactive.t new file mode 100644 index 0000000..7afb2a0 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/interactive.t @@ -0,0 +1,158 @@ +# +# 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__ + diff --git a/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/minmaxclients.t b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/minmaxclients.t new file mode 100644 index 0000000..7ba65e0 --- /dev/null +++ b/debian/perl-framework/Apache-Test/Apache-TestItSelf/t/minmaxclients.t @@ -0,0 +1,101 @@ +# +# -minclients / -maxclients argument passed explicitly (to +# Makefile.PL, to t/TEST, etc.) +# + +use strict; +use warnings FATAL => 'all'; + +use Test::More; +use MyTest::Util qw(myrun3 go_in go_out test_configs); +use Apache::TestConfig (); + +my @configs = test_configs(); +my $tests_per_config = 18; +plan tests => $tests_per_config * @configs; + +my $orig_dir = go_in(); + +# min/maxclients of 10 should work for pretty much any test suite, so +# for now hardcoded the number in this test +my $clients = 10; +for my $c (@configs) { + for my $opt_name (qw(minclients maxclients)) { + my $opt = "-$opt_name $clients"; + makefile_pl_plus_opt($c, $opt); + t_TEST_plus_opt($c, $opt); + } +} + +go_out($orig_dir); + +# 4 sub tests +# explicit Makefile.PL -(mix|max)clients +sub makefile_pl_plus_opt { + my $c = shift; + my $opt = 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 $opt " . + "-httpd $c->{httpd_exec} -httpd_conf $c->{httpd_conf}"; + ($out, $err) = myrun3($cmd); + unlike $err, qr/\[ error\]/, $cmd; + + $cmd = "make"; + ($out, $err) = myrun3($cmd); + is $err, "", $cmd; + + my $test_verbose = $c->{test_verbose} ? "TEST_VERBOSE=1" : ""; + $cmd = "make test $test_verbose"; + ($out, $err) = myrun3($cmd); + like $out, qr/All tests successful/, $cmd; + unlike $err, qr/\[ error\]/, $cmd; +} + +# 5 tests +# explicit t/TEST -(mix|max)clients +sub t_TEST_plus_opt { + my $c = shift; + my $opt = 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; + + # the bug was: + # t/TEST -conf + # t/TEST -maxclients 1 + #default_ VirtualHost overlap on port 8530, the first has precedence + #(98)Address already in use: make_sock: could not bind to address + #0.0.0.0:8530 no listening sockets available, shutting down + + my $test_verbose = $c->{test_verbose} ? "-v " : ""; + $cmd = "t/TEST -httpd $c->{httpd_exec} $test_verbose -conf"; + ($out, $err) = myrun3($cmd); + unlike $err, qr/\[ error\]/, $cmd; + + $cmd = "t/TEST -httpd $c->{httpd_exec} $test_verbose $opt"; + ($out, $err) = myrun3($cmd); + like $out, qr/All tests successful/, $cmd; + unlike $err, qr/\[ error\]/, $cmd; +} + +__END__ + |