ok, here we go :)
I have a preliminary implementation. what happens now is that two files are autogenerated if they don't already exist:
t/server-start.t t/server-stop.t
they are used to control the starting and stopping of the server. so, the output of make test looks like
# writing file: server-start.t # writing file: server-stop.t pre-start/ping....ok server-start......*** server localhost.localdomain:8529 started server-start......ok ping..............ok request...........ok server-stop.......*** server localhost.localdomain:8529 shutdown server-stop.......ok post-stop/ping....ok All tests successful. Files=6, Tests=20, 3 wallclock secs ( 2.03 cusr + 0.16 csys = 2.19 CPU) # removing file: server-start.t # removing file: server-stop.t
another condition of server-control file autogeneration is that there be real server tests to run. this makes it trivial to run pre-start or post-stop tests by themselves:
$ t/TEST t/pre-start/ *** setting ulimit to allow core files ulimit -c unlimited; t/TEST 't/pre-start/' pre-start/ping....ok All tests successful. Files=1, Tests=3, 1 wallclock secs ( 0.28 cusr + 0.03 csys = 0.31 CPU)
anyway, so that's how it looks on the outside. on the inside is another matter...
as I mentioned, I'm really not too sure about mucking with the core engine like this (although I did take some comfort in the fact that not only did the changes work for all of my personal A-T modules, but I didn't need any tweaks to get the mod_perl 2.0 suite running successfully). I might prefer to create a subclass of TestRun and TestHarness that works this way and leave it up to people to choose which they use from TEST.PL - it depends on how much the people here like the implementation (after any suggested refinements and refactoring are applied, of course :)
so, give it a whirl and let me know what you think.
--Geoff
Index: lib/Apache/TestHarness.pm
===================================================================
RCS file:
/home/cvspublic/httpd-test/perl-framework/Apache-Test/lib/Apache/TestHarness.pm,v
retrieving revision 1.12
diff -u -r1.12 TestHarness.pm
--- lib/Apache/TestHarness.pm 12 Sep 2003 02:20:27 -0000 1.12
+++ lib/Apache/TestHarness.pm 23 Sep 2003 14:04:54 -0000
@@ -6,6 +6,7 @@
use Test::Harness ();
use Apache::TestSort ();
use Apache::TestTrace;
+use Apache::TestUtil qw(t_write_file);
use File::Spec::Functions qw(catfile);
use File::Find qw(finddepth);
use File::Basename qw(dirname);
@@ -98,12 +99,11 @@
sub get_tests {
my $self = shift;
- my $args = shift;
- my @tests = ();
+ my (@tests, @pretests, @posttests) = ();
chdir_t();
- my $ts = $args->{tests} || [];
+ my $ts = $self->{tests} || [];
if (@$ts) {
for (@$ts) {
@@ -117,8 +117,8 @@
}
}
else {
- if ($args->{tdirs}) {
- push @tests, map { sort <$_/*.t> } @{ $args->{tdirs} };
+ if ($self->{tdirs}) {
+ push @tests, map { sort <$_/*.t> } @{ $self->{tdirs} };
}
else {
finddepth(sub {
@@ -138,26 +138,97 @@
@tests = grep { not /(?:$skip)/ } @tests;
}
- Apache::TestSort->run([EMAIL PROTECTED], $args);
+ Apache::TestSort->run([EMAIL PROTECTED], $self);
#when running 't/TEST t/dir' shell tab completion adds a /
#dir//foo output is annoying, fix that.
s:/+:/:g for @tests;
- return @tests;
+ # post-sort ordering:
+ # 1 - pre-start/
+ # 2 - start-server.t
+ # 3 - @tests
+ # 4 - stop-server.t
+ # 5 - post-stop/
+
+ for (my $i = 0; $i < @tests; $i++) {
+
+ my $prestart = catfile 'pre-start', '';
+ my $poststop = catfile 'post-stop', '';
+ my $delim = catfile '', '';
+
+ if ($tests[$i] =~ m!^\Q$prestart!) {
+ push @pretests, delete $tests[$i];
+ }
+ elsif ($tests[$i] =~ m!^\Q$poststop!) {
+ push @posttests, delete $tests[$i];
+ }
+
+ # server-start.t and server-stop.t need special
+ # placement if they already exist, so delete them
+ # from here and add them later
+ elsif ($tests[$i] =~ m!server-start.t!) {
+ delete $tests[$i];
+ }
+ elsif ($tests[$i] =~ m!server-stop.t!) {
+ delete $tests[$i];
+ }
+ else {
+ # nothing to do
+ }
+ }
+
+ # start and stop the server if required
+ if (@tests) {
+ $self->generate_server_script('start');
+ $self->generate_server_script('stop');
+ unshift @tests, 'server-start.t';
+ push @tests, 'server-stop.t';
+ }
+
+ return @pretests, grep { $_ } @tests, @posttests;
}
-sub run {
+sub harness {
my $self = shift;
- my $args = shift || {};
- $Test::Harness::verbose ||= $args->{verbose};
+ $Test::Harness::verbose ||= $self->{opts}->{verbose};
- if (my(@subtests) = @{ $args->{subtests} || [] }) {
+ if (my(@subtests) = @{ $self->{subtests} || [] }) {
$ENV{HTTPD_TEST_SUBTESTS} = "@subtests";
}
- Test::Harness::runtests($self->get_tests($args, @_));
+ Test::Harness::runtests($self->get_tests(@_));
+}
+
+sub generate_server_script {
+ my $self = shift;
+ my $action = shift;
+
+ return if -e "server-$action.t";
+
+ my $d = Data::Dumper->new([$self->{opts}]);
+ my $clone = $d->Purity(1)->Terse(1)->Dump;
+
+ chomp $clone;
+
+ my $file = <<EOF;
+use Apache::TestConfig ();
+use Apache::TestRun ();
+use Apache::Test;
+
+use strict;
+use warnings FATAL => 'all';
+
+plan tests => 1;
+
+ok (Apache::TestRun->new(test_config => Apache::TestConfig->thaw,
+ opts => $clone)
+ ->$action);
+
+EOF
+
+ t_write_file ("server-$action.t", $file);
}
1;
Index: lib/Apache/TestRun.pm
===================================================================
RCS file:
/home/cvspublic/httpd-test/perl-framework/Apache-Test/lib/Apache/TestRun.pm,v
retrieving revision 1.114
diff -u -r1.114 TestRun.pm
--- lib/Apache/TestRun.pm 12 Sep 2003 02:21:32 -0000 1.114
+++ lib/Apache/TestRun.pm 23 Sep 2003 14:04:55 -0000
@@ -10,12 +10,16 @@
use Apache::TestRequest ();
use Apache::TestHarness ();
use Apache::TestTrace;
+use Apache::TestUtil qw(t_write_file);
use File::Find qw(finddepth);
use File::Spec::Functions qw(catfile);
use Getopt::Long qw(GetOptions);
use Config;
+use vars qw(@ISA);
[EMAIL PROTECTED] = qw(Apache::TestHarness);
+
use constant STARTUP_TIMEOUT => 300; # secs (good for extreme debug cases)
use subs qw(exit_shell exit_perl);
@@ -447,7 +451,7 @@
}
my $opts = $self->{opts};
- my $server = $self->{server};
+ my $server = $self->{server} || $self->{test_config}->server;
#if t/TEST -d is running make sure we don't try to stop/start the server
my $file = $server->debugger_file;
@@ -482,20 +486,11 @@
sub run_tests {
my $self = shift;
- my $test_opts = {
- verbose => $self->{opts}->{verbose},
- tests => $self->{tests},
- times => $self->{opts}->{times},
- order => $self->{opts}->{order},
- subtests => $self->{subtests} || [],
- };
-
if (grep { exists $self->{opts}->{$_} } @request_opts) {
run_request($self->{test_config}, $self->{opts});
}
else {
- Apache::TestHarness->run($test_opts)
- if $self->{opts}->{'run-tests'};
+ $self->harness if $self->{opts}->{'run-tests'};
}
}
@@ -504,7 +499,9 @@
$self->restore_t_perms;
- return $self->{server}->stop if $self->{opts}->{'stop-httpd'};
+ my $server = $self->{server} || $self->{test_config}->server;
+
+ return $server->stop if $self->{opts}->{'stop-httpd'};
}
sub new_test_config {
@@ -609,11 +606,7 @@
$self->die_on_invalid_args;
- $self->start;
-
$self->run_tests;
-
- $self->stop;
}
my @oh = qw(jeez golly gosh darn shucks dangit rats nuts dangnabit crap);
Index: lib/Apache/TestServer.pm
===================================================================
RCS file:
/home/cvspublic/httpd-test/perl-framework/Apache-Test/lib/Apache/TestServer.pm,v
retrieving revision 1.65
diff -u -r1.65 TestServer.pm
--- lib/Apache/TestServer.pm 18 Sep 2003 07:39:35 -0000 1.65
+++ lib/Apache/TestServer.pm 23 Sep 2003 14:04:55 -0000
@@ -518,7 +518,7 @@
$SIG{CHLD} = $old_sig || 'DEFAULT';
if (my $pid = $self->pid) {
- print "server $self->{name} started\n";
+ warning "server $self->{name} started";
my $vh = $config->{vhosts};
my $by_port = sub { $vh->{$a}->{port} <=> $vh->{$b}->{port} };--- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ t/pre-start/ping.t 2003-09-23 09:26:40.000000000 -0400 @@ -0,0 +1,17 @@ +use strict; +use warnings FATAL => 'all'; + +use Apache::Test; + +plan tests => 3; + +my $config = Apache::Test::config(); + +ok $config; + +my $server = $config->server; + +ok $server; + +ok ! $server->ping; + --- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ t/post-stop/ping.t 2003-09-23 09:26:31.000000000 -0400 @@ -0,0 +1,17 @@ +use strict; +use warnings FATAL => 'all'; + +use Apache::Test; + +plan tests => 3; + +my $config = Apache::Test::config(); + +ok $config; + +my $server = $config->server; + +ok $server; + +ok ! $server->ping; +
