aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/dev-cmd/test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/dev-cmd/test.rb')
-rw-r--r--Library/Homebrew/dev-cmd/test.rb89
1 files changed, 89 insertions, 0 deletions
diff --git a/Library/Homebrew/dev-cmd/test.rb b/Library/Homebrew/dev-cmd/test.rb
new file mode 100644
index 000000000..a80fa5e4f
--- /dev/null
+++ b/Library/Homebrew/dev-cmd/test.rb
@@ -0,0 +1,89 @@
+#: * `test` [`--devel`|`--HEAD`] [`--debug`] [`--keep-tmp`] <formula>:
+#: A few formulae provide a test method. `brew test` <formula> runs this
+#: test method. There is no standard output or return code, but it should
+#: generally indicate to the user if something is wrong with the installed
+#: formula.
+#:
+#: To test the development or head version of a formula, use `--devel` or
+#: `--HEAD`.
+#:
+#: If `--debug` is passed and the test fails, an interactive debugger will be
+#: launched with access to IRB or a shell inside the temporary test directory.
+#:
+#: If `--keep-tmp` is passed, the temporary files created for the test are
+#: not deleted.
+#:
+#: Example: `brew install jruby && brew test jruby`
+
+require "extend/ENV"
+require "formula_assertions"
+require "sandbox"
+require "timeout"
+
+module Homebrew
+ def test
+ raise FormulaUnspecifiedError if ARGV.named.empty?
+
+ ARGV.resolved_formulae.each do |f|
+ # Cannot test uninstalled formulae
+ unless f.installed?
+ ofail "Testing requires the latest version of #{f.full_name}"
+ next
+ end
+
+ # Cannot test formulae without a test method
+ unless f.test_defined?
+ ofail "#{f.full_name} defines no test"
+ next
+ end
+
+ puts "Testing #{f.full_name}"
+
+ env = ENV.to_hash
+
+ begin
+ args = %W[
+ #{RUBY_PATH}
+ -W0
+ -I #{HOMEBREW_LOAD_PATH}
+ --
+ #{HOMEBREW_LIBRARY_PATH}/test.rb
+ #{f.path}
+ ].concat(ARGV.options_only)
+
+ if f.head?
+ args << "--HEAD"
+ elsif f.devel?
+ args << "--devel"
+ end
+
+ Sandbox.print_sandbox_message if Sandbox.test?
+
+ Utils.safe_fork do
+ if Sandbox.test?
+ sandbox = Sandbox.new
+ f.logs.mkpath
+ sandbox.record_log(f.logs/"test.sandbox.log")
+ sandbox.allow_write_temp_and_cache
+ sandbox.allow_write_log(f)
+ sandbox.allow_write_xcode
+ sandbox.allow_write_path(HOMEBREW_PREFIX/"var/cache")
+ sandbox.allow_write_path(HOMEBREW_PREFIX/"var/log")
+ sandbox.allow_write_path(HOMEBREW_PREFIX/"var/run")
+ sandbox.exec(*args)
+ else
+ exec(*args)
+ end
+ end
+ rescue Assertions::FailedAssertion => e
+ ofail "#{f.full_name}: failed"
+ puts e.message
+ rescue Exception => e
+ ofail "#{f.full_name}: failed"
+ puts e, e.backtrace
+ ensure
+ ENV.replace(env)
+ end
+ end
+ end
+end