perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Torsten Förtsch <>
Subject 2 A-T patches and a bug without patch
Date Mon, 23 Aug 2010 12:47:01 GMT

the first patch fixes a behavior that is a bug in my humble opinion. 
"t/TEST -start-httpd" can be used to start the httpd. Later on one can use
"t/TEST -run-tests t/*.t" to perform the actual test run. Unfortunately, this 
2nd call overwrites the configuration. Normally, this should not be a problem 
because the same configuration should be generated. But it the server already 
runs and has port-based VHosts enabled those ports are already in use. So, the 
new config contains other ports. In my case '-start-httpd' has created a 
config that used ports 8529, 8530 and 8531. Then the '-run-tests' recreates 
the config but now it contains the ports 8529, 8532 and 8533. In my tests I 
then use for example

  Apache::TestRequest::module 'ssl';

That reads the new/wrong config and the tests fail.

Not to the patch, it mainly shifts the time when the config is saved a few 
steps further in the program. split_test_args and die_on_invalid_args finish 
processing of the command line and die if something is wrong. This is a good 
thing to do before anything is saved (IMO).

default_run_opts then makes sure that at least one of -start-httpd,
-stop-httpd or -run-tests is specified. If nothing is given all 3 are set.

After that the new code checks if either -start-httpd or -configure is given. 
Only in these cases the config is written. Strictly speaking, the -configure 
check is not necessary because if only -configure is set -start-httpd is set 
by default_run_opts.

Please comment!

Does my reasoning make sense? Did I miss something?

Index: lib/Apache/
--- lib/Apache/       (revision 987941)
+++ lib/Apache/       (working copy)
@@ -719,9 +719,15 @@
+    $self->split_test_args;
+    $self->die_on_invalid_args;
+    $self->default_run_opts;
     # if configure() fails for some reason before it has flushed the
     # config to a file, save it so -clean will be able to clean
-    unless ($self->{opts}->{clean}) {
+    if ($self->{opts}->{'start-httpd'} || $self->{opts}->{'configure'}) {
         eval { $self->configure };
         if ($@) {
             error "configure() has failed:\n$@";
@@ -737,12 +743,6 @@
         exit_perl 1;
-    $self->default_run_opts;
-    $self->split_test_args;
-    $self->die_on_invalid_args;
     $self->start unless $self->{opts}->{'no-httpd'};

The next patch fixes a bug that occurs if LWP is installed. The function below 
check whether the server is up. It issues a request for /index.html. Now, if 
LWP is not installed and the server is not running Apache::TestRequest::GET 
returns undef. That is correctly handled by the old code. But if LWP is 
installed even if the server is down a response object is returned. The HTTP 
code of this response is set to 500 by LWP and a response header indicates the 
connection failure. That part is not caught by the old code and hence

  t/TEST -ping=block

returns immediately even if the server is down.

Index: lib/Apache/
--- lib/Apache/    (revision 987941)
+++ lib/Apache/    (working copy)
@@ -672,8 +672,10 @@
     my $server_up = sub {
         local $SIG{__WARN__} = sub {}; #avoid "cannot connect ..." warnings
         # avoid fatal errors when LWP is not available
-        my $r = eval { Apache::TestRequest::GET('/index.html') };
-        return !$@ && defined $r ? $r->code : 0;
+        return eval {
+           my $r=Apache::TestRequest::GET('/index.html');
+           $r->code!=500 or $r->header('client-warning')!~/internal/i;
+       } || 0;
     if ($server_up->()) {

Again, please comment!

The only thing that bothers me here is: what if the server if it is running 
returns an INTERNAL_SERVER_ERROR for /index.html and emits a Client-Warning 
HTTP header that contains the word "internal"? It is not very likely that that 
happens but you never know...

Now on a bug that I haven't found a satisfying patch yet. The A-T can work 
with and with Test::More. Apache/ contains a global variable 
@testmore to tell these cases apart. test_pm_refresh() then checks @testmore 
to reset eihter or Test::More.

Now, what happens if the same apache worker (meaning the same perl 
interpreter) first performs a server based Test::More test like 
t/more/02testmore.t and then a server based test like 
t/more/03testpm.t? The Test::More test loads Test::More but it also 
initializes the global @testmore variable. When the test hits after 
that test_pm_refresh thinks it works for Test::More. So, is not reset 
and the next test is at least out of order.

This happens in the current A-T test suite.

A possible fix could be to check defined(&Test::plan) and 
defined(&Test::More::plan) and reinitialize both if both are loaded. The same 
should be done for plan() ($real_plan).


Torsten Förtsch

Need professional modperl support? Hire me! (

Like fantasy?

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message