module ActiveSupport::Testing::Isolation::Subprocess - activesupport-4.2.3 Documentation

# module ActiveSupport::Testing::Isolation::Subprocess

### Constants

ORIG_ARGV

### Public Instance Methods

run_in_isolation() { || ... } click to toggle source

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

    # File 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