diff options
| -rw-r--r-- | Library/Homebrew/cmd/test.rb | 31 | ||||
| -rw-r--r-- | Library/Homebrew/test.rb | 34 |
2 files changed, 53 insertions, 12 deletions
diff --git a/Library/Homebrew/cmd/test.rb b/Library/Homebrew/cmd/test.rb index 0983c0b81..c4f322b60 100644 --- a/Library/Homebrew/cmd/test.rb +++ b/Library/Homebrew/cmd/test.rb @@ -1,17 +1,12 @@ require "extend/ENV" -require "timeout" -require "debrew" require "formula_assertions" +require "sandbox" module Homebrew - TEST_TIMEOUT_SECONDS = 5*60 def test raise FormulaUnspecifiedError if ARGV.named.empty? - ENV.extend(Stdenv) - ENV.setup_build_environment - ARGV.formulae.each do |f| # Cannot test uninstalled formulae unless f.installed? @@ -27,15 +22,27 @@ module Homebrew puts "Testing #{f.name}" - f.extend(Assertions) - f.extend(Debrew::Formula) if ARGV.debug? - env = ENV.to_hash begin - # tests can also return false to indicate failure - Timeout::timeout TEST_TIMEOUT_SECONDS do - raise "test returned false" if f.run_test == false + args = %W[ + #{RUBY_PATH} + -W0 + -I #{HOMEBREW_LIBRARY_PATH} + -- + #{HOMEBREW_LIBRARY_PATH}/test.rb + #{f.path} + ].concat(ARGV.options_only) + + Utils.safe_fork do + if Sandbox.available? && ARGV.sandbox? + sandbox = Sandbox.new + sandbox.allow_write_temp_and_cache + sandbox.allow_write_log(f) + sandbox.exec(*args) + else + exec(*args) + end end rescue Assertions::FailedAssertion => e ofail "#{f.name}: failed" diff --git a/Library/Homebrew/test.rb b/Library/Homebrew/test.rb new file mode 100644 index 000000000..163abe93a --- /dev/null +++ b/Library/Homebrew/test.rb @@ -0,0 +1,34 @@ +old_trap = trap("INT") { exit! 130 } + +require "global" +require "extend/ENV" +require "timeout" +require "debrew" +require "formula_assertions" +require "fcntl" +require "socket" + +TEST_TIMEOUT_SECONDS = 5*60 + +begin + error_pipe = UNIXSocket.open(ENV["HOMEBREW_ERROR_PIPE"], &:recv_io) + error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) + + ENV.extend(Stdenv) + ENV.setup_build_environment + + trap("INT", old_trap) + + formula = ARGV.formulae.first + formula.extend(Homebrew::Assertions) + formula.extend(Debrew::Formula) if ARGV.debug? + + # tests can also return false to indicate failure + Timeout::timeout TEST_TIMEOUT_SECONDS do + raise "test returned false" if formula.run_test == false + end +rescue Exception => e + Marshal.dump(e, error_pipe) + error_pipe.close + exit! 1 +end |
