Make sure tests still pass in a fork-limited environment
Peter Rabbitson [Wed, 10 Jun 2015 14:18:01 +0000 (16:18 +0200)]
Inspired by a temporarily stuck smoker
http://www.cpantesters.org/cpan/report/751da1f2-e3ff-11e4-a1d1-8536eb4f9f07

Read under -w

t/51threadnodb.t
t/storage/txn.t

index 95c9aaf..dd1a501 100644 (file)
@@ -15,6 +15,7 @@ use threads;
 use strict;
 use warnings;
 use Test::More;
+use DBIx::Class::_Util 'sigwarn_silencer';
 
 use lib qw(t/lib);
 use DBICTest;
@@ -36,14 +37,27 @@ my $schema = DBICTest->init_schema(no_deploy => 1);
 isa_ok ($schema, 'DBICTest::Schema');
 
 my @threads;
-push @threads, threads->create(sub {
-  my $rsrc = $schema->source('Artist');
-  undef $schema;
-  isa_ok ($rsrc->schema, 'DBICTest::Schema');
-  my $s2 = $rsrc->schema->clone;
-
-  sleep 1;  # without this many tasty crashes
-}) for (1.. $num_children);
+SKIP: {
+
+  local $SIG{__WARN__} = sigwarn_silencer( qr/Thread creation failed/i );
+
+  for (1.. $num_children) {
+    push @threads, threads->create(sub {
+      my $rsrc = $schema->source('Artist');
+      undef $schema;
+      isa_ok ($rsrc->schema, 'DBICTest::Schema');
+      my $s2 = $rsrc->schema->clone;
+
+      sleep 1;  # without this many tasty crashes
+    }) || do {
+      skip "EAGAIN encountered, your system is likely bogged down: skipping rest of test", 1
+        if $! == Errno::EAGAIN();
+
+      die "Unable to start thread: $!";
+    };
+  }
+}
+
 ok(1, "past spawning");
 
 $_->join for @threads;
index 06af849..3ce4162 100644 (file)
@@ -107,6 +107,7 @@ for my $want (0,1) {
   is ($schema->storage->transaction_depth, 0, 'Start outside txn');
 
   my @pids;
+  SKIP:
   for my $action (
     sub {
       my $s = shift;
@@ -129,8 +130,13 @@ for my $want (0,1) {
     },
   ) {
     my $pid = fork();
-    die "Unable to fork: $!\n"
-      if ! defined $pid;
+
+    if( ! defined $pid ) {
+      skip "EAGAIN encountered, your system is likely bogged down: skipping forking test", 1
+        if $! == Errno::EAGAIN();
+
+      die "Unable to fork: $!"
+    }
 
     if ($pid) {
       push @pids, $pid;
@@ -206,8 +212,13 @@ sub _test_forking_action {
       if $^O eq 'MSWin32';
 
     my $pid = fork();
-    die "Unable to fork: $!\n"
-      if ! defined $pid;
+    if( ! defined $pid ) {
+
+      skip "EAGAIN encountered, your system is likely bogged down: skipping forking test", 1
+        if $! == Errno::EAGAIN();
+
+      die "Unable to fork: $!"
+    }
 
     if ($pid) {
       push @pids, $pid;