diff options
author | Robin Dupret <robin.dupret@gmail.com> | 2014-06-09 18:13:47 +0200 |
---|---|---|
committer | Robin Dupret <robin.dupret@gmail.com> | 2014-06-21 11:01:23 +0200 |
commit | 3136388e550571631d43800a45412788aee55afd (patch) | |
tree | 47f64b2387a1660f4dde8f71f6c3cfa36802c41a | |
parent | 0e9a7059664eb9dee8e3afae60d26ff858d0d84b (diff) | |
download | rails-3136388e550571631d43800a45412788aee55afd.tar.gz rails-3136388e550571631d43800a45412788aee55afd.tar.bz2 rails-3136388e550571631d43800a45412788aee55afd.zip |
Make the isolated tests run on JRuby
As there is no forking on JRuby, we need to spawn sub-processes to make
the tests run in isolation.
Previously, we were defining globally env variables and running the test
file through backticks and delete these variables once the test ran.
Now, we simply rely on IO.popen as this is cross-platform and the env
variables are available during the child-process execution only so there
are no race conditions.
[Ben Browning & Robin Dupret]
-rw-r--r-- | activesupport/lib/active_support/testing/isolation.rb | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/activesupport/lib/active_support/testing/isolation.rb b/activesupport/lib/active_support/testing/isolation.rb index 908af176be..68bda35980 100644 --- a/activesupport/lib/active_support/testing/isolation.rb +++ b/activesupport/lib/active_support/testing/isolation.rb @@ -70,14 +70,24 @@ module ActiveSupport exit! else Tempfile.open("isolation") do |tmpfile| - ENV["ISOLATION_TEST"] = self.class.name - ENV["ISOLATION_OUTPUT"] = tmpfile.path + env = { + ISOLATION_TEST: self.class.name, + ISOLATION_OUTPUT: tmpfile.path + } load_paths = $-I.map {|p| "-I\"#{File.expand_path(p)}\"" }.join(" ") - `#{Gem.ruby} #{load_paths} #{$0} #{ORIG_ARGV.join(" ")}` - - ENV.delete("ISOLATION_TEST") - ENV.delete("ISOLATION_OUTPUT") + orig_args = ORIG_ARGV.join(" ") + test_opts = "-n#{self.class.name}##{self.name}" + command = "#{Gem.ruby} #{load_paths} #{$0} #{orig_args} #{test_opts}" + + # IO.popen lets us pass env in a cross-platform way + child = IO.popen([env, command]) + + begin + Process.wait(child.pid) + rescue Errno::ECHILD # The child process may exit before we wait + nil + end return tmpfile.read.unpack("m")[0] end |