Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re: Timeout on prove

by perlfan (Vicar)
on Jul 02, 2014 at 23:53 UTC ( [id://1092061]=note: print w/replies, xml ) Need Help??


in reply to Timeout on prove

Wrap whatever thing you're doing that times out in a alarm and eval block.

You can do one of 2 things (or both):

a. BAIL_OUT, or

b. check $@ outside of the eval with an ok.

In some case, you may actually want it to time out.

However, that you're timing tells me that what is timing out should probably mocked. It also tells me that you may want to have a more robust wrapper around whatever it is that is timing out - because it may time out when run for real. Throwing Exception::Class is always good - and you can even test that you handle things like timeouts properly using Test::Exception.

A quick and easy way to mock whatever it is that is timing out is to use a typeglob:

# mock returned data *Package::method = sub { return 'some expected data' };
Similarly, you can force a timeout:
# mock a timeout, but wrap this in an eval/alarm my $a_long_time = 900; # seconds *Package::method = sub { sleep $a_long_time; return; };
Or just straight up die throw an exception (i.e., from Exception::Class):
# mock a die from timeout, but wrap this in an eval/alarm *Package::method = sub { die "Timed out!\n"; };
# mock a timeout exception, but wrap this in an eval/alarm *Package::method = sub { throw My::Exception::Timeout; };

Replies are listed 'Best First'.
Re^2: Timeout on prove
by chrestomanci (Priest) on Jul 03, 2014 at 11:06 UTC

    Thanks, but the issue is not caused by slow connections to external resources. We already mock those. The issue was caused by a bug in normal perl code that had no external dependencies.

    What happened, is that the unit test contained code to set-up the initial test data, but that setup code was broken by a change elsewhere in the code base. A bit like:

    my @objects = map { My::Object->new() } 1..100; # Give a random 10 object the bar property, skip any where foo is set. for( 1..10 ) { my $object = $objects[ int rand 100 ]; redo if $object->is_foo(); $object->is_bar(1); } # Use the object array in the unit tests.

    The problem was that someone else changed the default constructor for My::Object, so that foo was always set to true, so the while loop above looped forever.

    Nothing to do with external resources, just quick and dirty test code broken by an API change.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1092061]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (3)
As of 2024-04-26 04:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found