diff options
author | Yehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com> | 2009-06-30 17:26:46 -0700 |
---|---|---|
committer | Yehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com> | 2009-06-30 17:39:32 -0700 |
commit | eea7b5db1db5d7e6020c5bcb6b4d85afcbc2e696 (patch) | |
tree | 32271eaad754ee5fd65eb62dbb94bcd7187d4d06 /activesupport/lib | |
parent | 45e6f19925f23c3db257c15371d8f512cca843cd (diff) | |
download | rails-eea7b5db1db5d7e6020c5bcb6b4d85afcbc2e696.tar.gz rails-eea7b5db1db5d7e6020c5bcb6b4d85afcbc2e696.tar.bz2 rails-eea7b5db1db5d7e6020c5bcb6b4d85afcbc2e696.zip |
Crazy hacks to get the Isolation testing module to work on non forking environments
Diffstat (limited to 'activesupport/lib')
-rw-r--r-- | activesupport/lib/active_support/testing/isolation.rb | 79 |
1 files changed, 69 insertions, 10 deletions
diff --git a/activesupport/lib/active_support/testing/isolation.rb b/activesupport/lib/active_support/testing/isolation.rb index 8b2957fbe1..090e0c5c89 100644 --- a/activesupport/lib/active_support/testing/isolation.rb +++ b/activesupport/lib/active_support/testing/isolation.rb @@ -16,24 +16,83 @@ module ActiveSupport::Testing end module Isolation + def self.forking_env? + !ENV["NO_FORK"] && RUBY_PLATFORM !~ /mswin|mingw|java/ + end + def run(result) yield(Test::Unit::TestCase::STARTED, name) - read, write = IO.pipe + @_result = result - pid = fork do - # child - read.close - proxy = ProxyTestResult.new + proxy = run_in_isolation do |proxy| super(proxy) { } - write.puts [Marshal.dump(proxy)].pack("m") - exit! end - write.close - Marshal.load(read.read.unpack("m")[0]).__replay__(result) - Process.wait2(pid) + proxy.__replay__(@_result) + yield(Test::Unit::TestCase::FINISHED, name) end + + module Forking + def run_in_isolation(&blk) + read, write = IO.pipe + + pid = fork do + read.close + proxy = ProxyTestResult.new + yield proxy + write.puts [Marshal.dump(proxy)].pack("m") + exit! + end + + write.close + result = read.read + Process.wait2(pid) + Marshal.load(result.unpack("m")[0]) + end + end + + module Subprocess + # Crazy H4X to get this working in windows / jruby with + # no forking. + def run_in_isolation(&blk) + require "tempfile" + + if ENV["ISOLATION_TEST"] + proxy = ProxyTestResult.new + yield proxy + File.open(ENV["ISOLATION_OUTPUT"], "w") do |file| + file.puts [Marshal.dump(proxy)].pack("m") + end + exit! + else + Tempfile.open("isolation") do |tmpfile| + ENV["ISOLATION_TEST"] = @method_name + ENV["ISOLATION_OUTPUT"] = tmpfile.path + + load_paths = $-I.map {|p| "-I\"#{File.expand_path(p)}\"" }.join(" ") + `#{Gem.ruby} #{load_paths} #{$0} #{ORIG_ARGV.join(" ")} -t\"#{self.class}\"` + + ENV.delete("ISOLATION_TEST") + ENV.delete("ISOLATION_OUTPUT") + + return Marshal.load(tmpfile.read.unpack("m")[0]) + end + end + end + end + + include forking_env? ? Forking : Subprocess + end +end + +# Only in subprocess for windows / jruby. +if ENV['ISOLATION_TEST'] + require "test/unit/collector/objectspace" + class Test::Unit::Collector::ObjectSpace + def include?(test) + super && test.method_name == ENV['ISOLATION_TEST'] + end end end
\ No newline at end of file |