perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Steve Hay <steve....@uk.radan.com>
Subject Re: t/SMOKE on win32
Date Wed, 01 Oct 2003 15:18:38 GMT
Randy Kobes wrote:

>On Tue, 30 Sep 2003, Stas Bekman wrote:
>
>  
>
>>Barrie Slaymaker wrote:
>>    
>>
>>>On Sep 30 2003, Stas Bekman wrote:
>>>
>>>      
>>>
>>>>Isn't IPC::Run3 based on IPC::Run? So if IPC::Run doesn't work...
>>>>        
>>>>
>>>No, it's smaller, faster, lighter ;)
>>>
>>>It's "all new code", no select().  Uses File::Temp
>>>temporary files to optionally queue up input for the
>>>child, runs the child, optionally with any stdout and/or
>>>stderr redirects to other temp files, then slurps the
>>>results.  Simple.  Portable.  Relatively efficient for
>>>small to moderate amounts of data, especially when you
>>>start comparing it to the things that IPC::Run does when
>>>faced with the odd behaviors of Win32's anonymous pipe
>>>and TCP socket APIs (you want the child to have pipe()s,
>>>but you can't select() on pipes, and I don't know how to
>>>take a pipe handle that Win32 gives me and do a blocking
>>>poll on it a la select()--WaitForMultipleObjects() might
>>>do it, but I'm no guru there).
>>>      
>>>
>>So may be we could try it. If Randy says that it works for
>>him, we will happily move to use it instead ;)
>>    
>>
>
>And that does seem to work! A diff appears below (not tested
>on linux) - in this, I also added a change to TestServer.pm
>to print out a message on Win32 when shutting down the
>server, as that's expected when checking that the server
>successfully shut down in TestSmoke.pm.
>
This version gets SMOKE running, but it doesn't seem to be able to keep 
running.

I have a 1.99_10 build tree in which "nmake test" runs with all tests 
successful every time, but when I try "perl t/SMOKE" with your patch 
below, I find that one of the tests has an error and causes everything 
to stop.

I've tried it three times now.  Each time I had it fail on a different 
test (modperl\cookie, modperl\endav, modperl\post_utf8), but every time 
I get this message written into t/logs/error_log:

    Failed to dup STDIN: Permission denied.

This is the only message in the log after the server has started up, and 
it doesn't appear until the test fails.  I'm using IPC::Run3 0.009 on 
Perl 5.8.1 / Apache 2.0.47.

I also find that the SMOKE stops smoking when the test fails.  For 
example, here's the end of my third SMOKE run:

=====
[...]
modperl\post_utf8....request has failed (the response code was: 500)
see t/logs/error_log for more details
dubious
        Test returned status 9 (wstat 2304, 0x900)
!!! error running tests (please examine t\logs\error_log)
*** server localhost:8529 is not running
!!! failed to stop server
 *** server localhost:8529 is not running
=====

Is that supposed to happen?  I thought it would have carried on, and 
then given a report at the end of all the tests that failed.  Maybe it's 
just because the error that occurred actually took the Apache server 
down.  Perhaps SMOKE should have the ability to restart Apache if/when 
that happens, so that it can carry on?

- Steve

>=========================================================
>Index: lib/Apache/TestSmoke.pm
>===================================================================
>RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestSmoke.pm,v
>retrieving revision 1.23
>diff -u -r1.23 TestSmoke.pm
>--- lib/Apache/TestSmoke.pm	12 Sep 2003 02:47:41 -0000	1.23
>+++ lib/Apache/TestSmoke.pm	1 Oct 2003 04:58:38 -0000
>@@ -15,6 +15,7 @@
> use FindBin;
> use POSIX ();
> use Symbol ();
>+use IPC::Run3;
>
> #use constant DEBUG => 1;
>
>@@ -111,7 +112,7 @@
>
>     @{ $self->{tests} } = $self->get_tests($test_opts);
>
>-    $self->{base_command} = "./TEST";
>+    $self->{base_command} = "$^X $FindBin::Bin/TEST";
>
>     # options common to all
>     $self->{base_command} .= " -verbose" if $self->{verbose};
>@@ -473,16 +474,11 @@
>     # start server
>     {
>         my $command = $self->{start_command};
>-        open my $pipe, "$command 2>&1|" or die "cannot fork: $!";
>-        my $oldfh = select $pipe; $| = 1; select $oldfh;
>-        # XXX: check startup success?
>         my $started_ok = 0;
>         my $log = '';
>-        while (my $t = <$pipe>) {
>-            $started_ok = 1 if $t =~ /started/;
>-            $log .= $t;
>-        }
>-        close $pipe;
>+        run3 $command, \undef, \$log, \$log;
>+        print $log;
>+        $started_ok = 1 if $log =~ /started/;
>         unless ($started_ok) {
>             error "failed to start server\n $log";
>             exit 1;
>@@ -507,19 +503,12 @@
>             my $fill = "." x ($max_len - length $test_name);
>             $self->{total_tests_run}++;
>
>-            open my $pipe, "$command $test 2>&1|" or die "cannot fork: $!";
>-            my $oldfh = select $pipe; $| = 1; select $oldfh;
>-
>+            my $test_command = "$command $test";
>             my $ok = 0;
>             my $log = '';
>-            while (<$pipe>) {
>-                $log .= $_;
>-
>-                $ok = 1 if /All tests successful/;
>-            }
>-            # it's normal for $command to exit with a failure status if tests
>-            # fail, so we don't die/report it
>-            close $pipe;
>+            run3 $test_command, \undef, \$log, \$log;
>+            print $log;
>+            $ok = 1 if $log =~ /All tests successful/;
>
>             my @core_files_msg = $self->Apache::TestRun::scan_core_incremental;
>
>@@ -594,16 +583,11 @@
>     # stop server
>     {
>         my $command = $self->{stop_command};
>-        open my $pipe, "$command 2>&1|" or die "cannot fork: $!";
>-        my $oldfh = select $pipe; $| = 1; select $oldfh;
>-        # XXX: check stopup success?
>         my $stopped_ok = 0;
>         my $log = '';
>-        while (my $t = <$pipe>) {
>-            $stopped_ok = 1 if $t =~ /shutdown/;
>-            $log .= $t;
>-        }
>-        close $pipe;
>+        run3 $command, \undef, \$log, \$log;
>+        print $log;
>+        $stopped_ok = 1 if $log =~ /shutdown/;
>         unless ($stopped_ok) {
>             error "failed to stop server\n $log";
>             exit 1;
>Index: lib/Apache/TestServer.pm
>===================================================================
>RCS file: /home/cvs/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	1 Oct 2003 04:58:39 -0000
>@@ -317,12 +317,14 @@
>     if (Apache::TestConfig::WIN32) {
>         if ($self->{config}->{win32obj}) {
>             $self->{config}->{win32obj}->Kill(0);
>+            warning "server $self->{name} shutdown";
>             return 1;
>         }
>         else {
>             require Win32::Process;
>             my $pid = $self->pid;
>             Win32::Process::KillProcess($pid, 0);
>+            warning "server $self->{name} shutdown";
>             return 1;
> 	}
>     }
>==================================================================
>
>  
>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message