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

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

Constant Summary collapse

ORIG_ARGV =
ARGV.dup

Instance Method Summary collapse

Instance Method Details

#run_in_isolation(&blk) ⇒ Object

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



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
96
97
98
99
100
101
102
103
104
105
# File 'lib/active_support/testing/isolation.rb', line 69

def run_in_isolation(&blk)
  require "tempfile"

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

      test_opts = "-n#{self.class.name}##{name}"

      load_path_args = []
      $-I.each do |p|
        load_path_args << "-I"
        load_path_args << File.expand_path(p)
      end

      child = IO.popen([env, Gem.ruby, *load_path_args, $0, *ORIG_ARGV, test_opts])

      begin
        Process.wait(child.pid)
      rescue Errno::ECHILD # The child process may exit before we wait
        nil
      end

      return tmpfile.read.unpack1("m")
    end
  end
end