diff options
| author | Xu Cheng | 2015-04-13 18:05:41 +0800 | 
|---|---|---|
| committer | Xu Cheng | 2015-04-15 19:51:54 +0800 | 
| commit | 11d9e553c8c44e82e492f3f1df2f0b8f62a4633d (patch) | |
| tree | 8d9fbd59fe554bac72189d6fa1dc8d85d44921f7 | |
| parent | 62ca25e8976d4c85c7a54a8aca6153a023fef6ea (diff) | |
| download | homebrew-11d9e553c8c44e82e492f3f1df2f0b8f62a4633d.tar.bz2 | |
sandbox test
| -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 | 
