diff options
author | Yehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com> | 2009-07-06 12:25:34 -0700 |
---|---|---|
committer | Yehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com> | 2009-07-06 12:25:34 -0700 |
commit | 61604feec0fa04810f5903d13b74bad06e67b3bb (patch) | |
tree | f0b80dd729504faf9ed3ad0624b4a14aaaf48959 /activesupport/lib/active_support/testing/isolation.rb | |
parent | 9a42e06dd8ac5d9abd50b0e47e8de0ac3ab00a9d (diff) | |
download | rails-61604feec0fa04810f5903d13b74bad06e67b3bb.tar.gz rails-61604feec0fa04810f5903d13b74bad06e67b3bb.tar.bz2 rails-61604feec0fa04810f5903d13b74bad06e67b3bb.zip |
Get Initializer tests running without requiring parts of Rails being loaded first
Diffstat (limited to 'activesupport/lib/active_support/testing/isolation.rb')
-rw-r--r-- | activesupport/lib/active_support/testing/isolation.rb | 142 |
1 files changed, 72 insertions, 70 deletions
diff --git a/activesupport/lib/active_support/testing/isolation.rb b/activesupport/lib/active_support/testing/isolation.rb index dd13abcd5d..30e194536b 100644 --- a/activesupport/lib/active_support/testing/isolation.rb +++ b/activesupport/lib/active_support/testing/isolation.rb @@ -1,94 +1,96 @@ -module ActiveSupport::Testing - class ProxyTestResult - def initialize - @calls = [] - end - - def __replay__(result) - @calls.each do |name, args| - result.send(name, *args) +module ActiveSupport + module Testing + class ProxyTestResult + def initialize + @calls = [] end - end - - def method_missing(name, *args) - @calls << [name, args] - end - end - module Isolation - def self.forking_env? - !ENV["NO_FORK"] && RUBY_PLATFORM !~ /mswin|mingw|java/ - end - - def run(result) - unless defined?(@@ran_class_setup) - self.class.setup - @@ran_class_setup = true + def __replay__(result) + @calls.each do |name, args| + result.send(name, *args) + end end - yield(Test::Unit::TestCase::STARTED, name) - - @_result = result + def method_missing(name, *args) + @calls << [name, args] + end + end - proxy = run_in_isolation do |proxy| - super(proxy) { } + module Isolation + def self.forking_env? + !ENV["NO_FORK"] && RUBY_PLATFORM !~ /mswin|mingw|java/ end - proxy.__replay__(@_result) + def run(result) + unless defined?(@@ran_class_setup) + self.class.setup if self.class.respond_to?(:setup) + @@ran_class_setup = true + end - yield(Test::Unit::TestCase::FINISHED, name) - end + yield(Test::Unit::TestCase::STARTED, name) - module Forking - def run_in_isolation(&blk) - read, write = IO.pipe + @_result = result - pid = fork do - read.close - proxy = ProxyTestResult.new - yield proxy - write.puts [Marshal.dump(proxy)].pack("m") - exit! + proxy = run_in_isolation do |proxy| + super(proxy) { } end - write.close - result = read.read - Process.wait2(pid) - Marshal.load(result.unpack("m")[0]) + proxy.__replay__(@_result) + + yield(Test::Unit::TestCase::FINISHED, name) 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 + module Forking + def run_in_isolation(&blk) + read, write = IO.pipe - load_paths = $-I.map {|p| "-I\"#{File.expand_path(p)}\"" }.join(" ") - `#{Gem.ruby} #{load_paths} #{$0} #{ORIG_ARGV.join(" ")} -t\"#{self.class}\"` + pid = fork do + read.close + proxy = ProxyTestResult.new + yield proxy + write.puts [Marshal.dump(proxy)].pack("m") + exit! + end - ENV.delete("ISOLATION_TEST") - ENV.delete("ISOLATION_OUTPUT") + write.close + result = read.read + Process.wait2(pid) + Marshal.load(result.unpack("m")[0]) + end + end - return Marshal.load(tmpfile.read.unpack("m")[0]) + 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 - end - include forking_env? ? Forking : Subprocess + include forking_env? ? Forking : Subprocess + end end end |