aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXu Cheng2015-04-13 18:05:41 +0800
committerXu Cheng2015-04-15 19:51:54 +0800
commit11d9e553c8c44e82e492f3f1df2f0b8f62a4633d (patch)
tree8d9fbd59fe554bac72189d6fa1dc8d85d44921f7
parent62ca25e8976d4c85c7a54a8aca6153a023fef6ea (diff)
downloadhomebrew-11d9e553c8c44e82e492f3f1df2f0b8f62a4633d.tar.bz2
sandbox test
-rw-r--r--Library/Homebrew/cmd/test.rb31
-rw-r--r--Library/Homebrew/test.rb34
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