From efb835c9c0aea9d2a6487a6fdd31d459f1771879 Mon Sep 17 00:00:00 2001
From: Aaron Patterson <aaron.patterson@gmail.com>
Date: Wed, 13 Aug 2014 14:22:29 -0700
Subject: UnexpectedErrors may reference exceptions that can't be dumped

UnexpectedError exceptions wrap the original exception, and the original
exception may contain a reference to something that can't be marshal
dumped which will cause the process to die.
---
 actionpack/test/abstract_unit.rb | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

(limited to 'actionpack/test')

diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb
index 4e17d57dad..674fb253f4 100644
--- a/actionpack/test/abstract_unit.rb
+++ b/actionpack/test/abstract_unit.rb
@@ -484,6 +484,9 @@ class ForkingExecutor
           method   = job[1]
           reporter = job[2]
           result = Minitest.run_one_method klass, method
+          if result.error?
+            translate_exceptions result
+          end
           queue.record reporter, result
         end
       }
@@ -491,6 +494,20 @@ class ForkingExecutor
     @size.times { @queue << nil }
     pool.each { |pid| Process.waitpid pid }
   end
+
+  private
+  def translate_exceptions(result)
+    result.failures.map! { |e|
+      begin
+        Marshal.dump e
+        e
+      rescue TypeError
+        ex = Exception.new e.message
+        ex.set_backtrace e.backtrace
+        Minitest::UnexpectedError.new ex
+      end
+    }
+  end
 end
 
 if ActiveSupport::Testing::Isolation.forking_env? && PROCESS_COUNT > 0
-- 
cgit v1.2.3