Improve python tests for brew bots

Allow `build.with?` and similar methods to be used during the test
phase. The BuildOptions (`build`) are initialized with the
`Tab.used_options` unless explicitly overwritten on the command line.

So basically `build.with?` works in `def install` and in `test do` as
one would naively expect. (For the test, gramatically it should be
`built.with?` but who cares)

If a formula was installed `--with-python`, now the tests are also
run `--with-python`. This enables us to use the `python do ... end` in
a meaningful manner.

Using `python do ... end` blocks for the tests, because the bot.brew.sh has
system python per default and we need to set the PYTHONPATH for the test.
Potentially to different values for Python 2.x and 3.x.
This commit is contained in:
Samuel John 2013-06-13 15:52:23 +02:00
parent 6ae2e872d3
commit 59a0c1e1b5
4 changed files with 42 additions and 12 deletions

View File

@ -100,13 +100,26 @@ class BuildOptions
# implicit_options are needed because `depends_on 'spam' => 'with-stuff'` # implicit_options are needed because `depends_on 'spam' => 'with-stuff'`
# complains if 'spam' has stuff as default and only defines `--without-stuff`. # complains if 'spam' has stuff as default and only defines `--without-stuff`.
def implicit_options def implicit_options
implicit = unused_options.map do |o| implicit = unused_options.map do |option|
if o.name =~ /^with-(.+)$/ && without?($1) opposite_of option unless has_opposite_of? option
Option.new("without-#{$1}") # we lose the description, but that's ok
elsif o.name =~ /^without-(.+)$/ && with?($1)
Option.new("with-#{$1}")
end
end.compact end.compact
Options.new(implicit) Options.new(implicit)
end end
def has_opposite_of? option
true if args.include? opposite_of option
end
def opposite_of option
option = Option.new option
if option.name =~ /^with-(.+)$/
Option.new("without-#{$1}")
elsif option.name =~ /^without-(.+)$/
Option.new("with-#{$1}")
elsif option.name =~ /^enable-(.+)$/
Option.new("disable-#{$1}")
elsif option.name =~ /^disable-(.+)$/
Option.new("enable-#{$1}")
end
end
end end

View File

@ -515,6 +515,9 @@ class Formula
def test def test
require 'test/unit/assertions' require 'test/unit/assertions'
extend(Test::Unit::Assertions) extend(Test::Unit::Assertions)
# Adding the used options allows us to use `build.with?` inside of tests
tab = Tab.for_name(name)
tab.used_options.each { |opt| build.args << opt unless build.has_opposite_of? opt }
ret = nil ret = nil
mktemp do mktemp do
@testpath = Pathname.pwd @testpath = Pathname.pwd

View File

@ -16,11 +16,11 @@
def python_helper(options={:allowed_major_versions => [2, 3]}, &block) def python_helper(options={:allowed_major_versions => [2, 3]}, &block)
if !block_given? and !@current_python.nil? if !block_given? and !@current_python.nil?
# We are already inside of a `python do ... end` block, so just return # We are already inside of a `python do ... end` block, so just return
# the current_python or false if the version.major is not allowed. # the current_python or nil if the version.major is not allowed.
if options[:allowed_major_versions].include?(@current_python.version.major) if options[:allowed_major_versions].include?(@current_python.version.major)
return @current_python return @current_python
else else
return false return nil
end end
end end
@ -42,7 +42,7 @@ def python_helper(options={:allowed_major_versions => [2, 3]}, &block)
end end
# Allow to use an else-branch like so: `if python do ... end; else ... end`. # Allow to use an else-branch like so: `if python do ... end; else ... end`.
return false if filtered_python_reqs.empty? return nil if filtered_python_reqs.empty?
# Sort by version, so the older 2.x will be used first and if no # Sort by version, so the older 2.x will be used first and if no
# block_given? then 2.x is preferred because it is returned. # block_given? then 2.x is preferred because it is returned.

View File

@ -1,9 +1,9 @@
require 'testing_env' require 'testing_env'
require 'build_options' require 'build_options'
class BuildOptionsTests < Test::Unit::TestCase class BuildOptionsTests < Test::Unit::TestCase
def setup def setup
args = %w{--with-foo --with-bar --without-qux} args = %w{--with-foo --with-bar --without-qux} # args fake the command line
@build = BuildOptions.new(args) @build = BuildOptions.new(args)
@build.add("with-foo") @build.add("with-foo")
@build.add("with-bar") @build.add("with-bar")
@ -44,7 +44,7 @@ class BuildOptionsTests < Test::Unit::TestCase
end end
def test_implicit_options def test_implicit_options
# --without-baz is not explicitly specified on the command line # --without-baz is not explicitly specified on the command line (i.e. args)
# therefore --with-baz should be implicitly assumed: # therefore --with-baz should be implicitly assumed:
assert @build.implicit_options.include?("--with-baz") assert @build.implicit_options.include?("--with-baz")
# But all these should not be in the implict_options: # But all these should not be in the implict_options:
@ -53,4 +53,18 @@ class BuildOptionsTests < Test::Unit::TestCase
assert !@build.implicit_options.include?("--without-bar") assert !@build.implicit_options.include?("--without-bar")
assert !@build.implicit_options.include?("--with-qux") assert !@build.implicit_options.include?("--with-qux")
end end
def test_opposite_of
assert @build.opposite_of(Option.new("with-foo")) == Option.new("without-foo")
assert @build.opposite_of("without-foo") == Option.new("with-foo")
assert @build.opposite_of(Option.new("enable-spam")) == Option.new("disable-spam")
assert @build.opposite_of("disable-beer") == Option.new("enable-beer")
end
def test_has_opposite_of?
assert @build.has_opposite_of?("--without-foo")
assert @build.has_opposite_of?(Option.new("--with-qux"))
assert !@build.has_opposite_of?("--without-qux")
assert !@build.has_opposite_of?("--without-nonexisting")
end
end end