Module: ActiveSupport::Testing::Isolation::Subprocess

Defined in:
activesupport/lib/active_support/testing/isolation.rb

Constant Summary

ORIG_ARGV =
ARGV.dup

Instance Method Summary collapse

Instance Method Details

#run_in_isolation(&blk) ⇒ Object

Crazy H4X to get this working in windows / jruby with no forking.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'activesupport/lib/active_support/testing/isolation.rb', line 62

def run_in_isolation(&blk)
  require "tempfile"

  if ENV["ISOLATION_TEST"]
    yield
    File.open(ENV["ISOLATION_OUTPUT"], "w") do |file|
      file.puts [Marshal.dump(self.dup)].pack("m")
    end
    exit!
  else
    Tempfile.open("isolation") do |tmpfile|
      env = {
        ISOLATION_TEST: self.class.name,
        ISOLATION_OUTPUT: tmpfile.path
      }

      load_paths = $-I.map {|p| "-I\"#{File.expand_path(p)}\"" }.join(" ")
      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
  end
end