[Melbourne-pm] Testing fork

David Dick david_dick at iprimus.com.au
Fri Nov 12 16:13:59 CST 2004


ok, following on from previous attempts, this sort of works.  Basically 
so long as BSD::Resource is supported on the platform ( 
http://testers.cpan.org/show/BSD-Resource.html#BSD-Resource-1.24 )
at least the EAGAIN stuff will be tested (hopefully?).  Of course, this 
test might actually limit the portability of the code base too.

Another interesting point was the use of $test->no_ending(1) to stop the 
two processes (if they accidentally got created) from both outputing 
their opinion on the final result and hence stuffing up the output.

I don't even want to get started on the horrific possibilities created 
by now needing to do coverage analysis on the test suite. :)

However i think this is a case where this sort of test is required, as 
distinct from Leif's excellent example of overriding functions, simply 
because of the difficulty in knowing exactly what the OS will return in 
this case.

         use BSD::Resource();
         use POSIX();
         ok(BSD::Resource::setrlimit(BSD::Resource::RLIMIT_NPROC(), 1, 
1), "Can set the number of allowed children to 1");
         my ($success) = 0;
         my ($pid);
         if ($pid = fork()) {
                 waitpid($pid, 0); # Should never get here either.
         } elsif (defined $pid) {
                 my ($test) = Test::Builder->new();
                 $test->no_ending(1);
                 exit(1); # Just a Guarantee. Should never get here
         } elsif ($! == POSIX::EAGAIN()) {
                 $success = 1;
         }
         ok($success == 1, "Successfully received an EAGAIN");

Hopefully this was interesting. :)
Uru
-Dave


More information about the Melbourne-pm mailing list