
In order to allow kegs built with the same version but differing formula revisions to coexist, we must encode the revision as part of the keg's name. This is necessary to actually perform an upgrade, as we cannot upgrade a keg in-place, and temporarily moving it pending the result of the upgrade is error-prone and potentially slow. To accomplish this, we introduce a new Formula#pkg_version method that concatenates the active_spec version with the formula revision. An exception is made for a formula that has no revision: the tag is omitted. This preserves compatibility with existing installations.
267 lines
6.1 KiB
Ruby
267 lines
6.1 KiB
Ruby
require 'testing_env'
|
|
require 'test/testball'
|
|
|
|
class FormulaTests < Test::Unit::TestCase
|
|
include VersionAssertions
|
|
|
|
def test_formula_path_initialization
|
|
name = "formula_name"
|
|
klass = Class.new(Formula) { url "http://example.com/foo-1.0.tar.gz" }
|
|
|
|
f = klass.new(name)
|
|
assert_equal Formula.path(name), f.path
|
|
|
|
f = klass.new(name, path = Object.new)
|
|
assert_equal path, f.path
|
|
|
|
f = klass.new(name, nil)
|
|
assert_nil f.path
|
|
end
|
|
|
|
def test_prefix
|
|
f = TestBall.new
|
|
assert_equal HOMEBREW_CELLAR/f.name/'0.1', f.prefix
|
|
assert_kind_of Pathname, f.prefix
|
|
end
|
|
|
|
def test_revised_prefix
|
|
f = Class.new(TestBall) { revision 1 }.new
|
|
assert_equal HOMEBREW_CELLAR/f.name/'0.1_1', f.prefix
|
|
end
|
|
|
|
def test_installed?
|
|
f = TestBall.new
|
|
f.stubs(:installed_prefix).returns(stub(:directory? => false))
|
|
assert !f.installed?
|
|
|
|
f.stubs(:installed_prefix).returns(
|
|
stub(:directory? => true, :children => [])
|
|
)
|
|
assert !f.installed?
|
|
|
|
f.stubs(:installed_prefix).returns(
|
|
stub(:directory? => true, :children => [stub])
|
|
)
|
|
assert f.installed?
|
|
end
|
|
|
|
def test_installed_prefix
|
|
f = Class.new(TestBall).new
|
|
assert_equal f.prefix, f.installed_prefix
|
|
end
|
|
|
|
def test_installed_prefix_head_installed
|
|
f = formula do
|
|
head 'foo'
|
|
devel do
|
|
url 'foo'
|
|
version '1.0'
|
|
end
|
|
end
|
|
prefix = HOMEBREW_CELLAR+f.name+f.head.version
|
|
prefix.mkpath
|
|
assert_equal prefix, f.installed_prefix
|
|
ensure
|
|
prefix.rmtree
|
|
end
|
|
|
|
def test_installed_prefix_devel_installed
|
|
f = formula do
|
|
head 'foo'
|
|
devel do
|
|
url 'foo'
|
|
version '1.0'
|
|
end
|
|
end
|
|
prefix = HOMEBREW_CELLAR+f.name+f.devel.version
|
|
prefix.mkpath
|
|
assert_equal prefix, f.installed_prefix
|
|
ensure
|
|
prefix.rmtree
|
|
end
|
|
|
|
def test_installed_prefix_stable_installed
|
|
f = formula do
|
|
head 'foo'
|
|
devel do
|
|
url 'foo'
|
|
version '1.0-devel'
|
|
end
|
|
end
|
|
prefix = HOMEBREW_CELLAR+f.name+f.version
|
|
prefix.mkpath
|
|
assert_equal prefix, f.installed_prefix
|
|
ensure
|
|
prefix.rmtree
|
|
end
|
|
|
|
def test_installed_prefix_head_active_spec
|
|
ARGV.stubs(:build_head? => true)
|
|
|
|
f = formula do
|
|
head 'foo'
|
|
devel do
|
|
url 'foo'
|
|
version '1.0-devel'
|
|
end
|
|
end
|
|
prefix = HOMEBREW_CELLAR+f.name+f.head.version
|
|
assert_equal prefix, f.installed_prefix
|
|
end
|
|
|
|
def test_installed_prefix_devel_active_spec
|
|
ARGV.stubs(:build_devel? => true)
|
|
|
|
f = formula do
|
|
head 'foo'
|
|
devel do
|
|
url 'foo'
|
|
version '1.0-devel'
|
|
end
|
|
end
|
|
prefix = HOMEBREW_CELLAR+f.name+f.devel.version
|
|
assert_equal prefix, f.installed_prefix
|
|
end
|
|
|
|
def test_equality
|
|
x = TestBall.new
|
|
y = TestBall.new
|
|
assert x == y
|
|
assert y == x
|
|
assert x.eql?(y)
|
|
assert y.eql?(x)
|
|
assert x.hash == y.hash
|
|
end
|
|
|
|
def test_inequality
|
|
x = TestBall.new("foo")
|
|
y = TestBall.new("bar")
|
|
assert x != y
|
|
assert y != x
|
|
assert x.hash != y.hash
|
|
assert !x.eql?(y)
|
|
assert !y.eql?(x)
|
|
end
|
|
|
|
def test_comparison_with_non_formula_objects_does_not_raise
|
|
assert_not_equal TestBall.new, Object.new
|
|
end
|
|
|
|
def test_class_naming
|
|
assert_equal 'ShellFm', Formulary.class_s('shell.fm')
|
|
assert_equal 'Fooxx', Formulary.class_s('foo++')
|
|
assert_equal 'SLang', Formulary.class_s('s-lang')
|
|
assert_equal 'PkgConfig', Formulary.class_s('pkg-config')
|
|
assert_equal 'FooBar', Formulary.class_s('foo_bar')
|
|
end
|
|
|
|
def test_formula_spec_integration
|
|
f = Class.new(Formula) do
|
|
homepage 'http://example.com'
|
|
url 'file:///foo.com/testball-0.1.tbz'
|
|
mirror 'file:///foo.org/testball-0.1.tbz'
|
|
sha1 TEST_SHA1
|
|
|
|
head 'https://github.com/Homebrew/homebrew.git', :tag => 'foo'
|
|
|
|
devel do
|
|
url 'file:///foo.com/testball-0.2.tbz'
|
|
mirror 'file:///foo.org/testball-0.2.tbz'
|
|
sha256 TEST_SHA256
|
|
end
|
|
|
|
bottle { sha1 TEST_SHA1 => bottle_tag }
|
|
|
|
def initialize(name="spec_test_ball", path=nil)
|
|
super
|
|
end
|
|
end.new
|
|
|
|
assert_equal 'http://example.com', f.homepage
|
|
assert_version_equal '0.1', f.version
|
|
assert_equal f.stable, f.active_spec
|
|
|
|
assert_instance_of SoftwareSpec, f.stable
|
|
assert_instance_of Bottle, f.bottle
|
|
assert_instance_of SoftwareSpec, f.devel
|
|
assert_instance_of HeadSoftwareSpec, f.head
|
|
end
|
|
|
|
def test_path
|
|
name = 'foo-bar'
|
|
assert_equal Pathname.new("#{HOMEBREW_LIBRARY}/Formula/#{name}.rb"), Formula.path(name)
|
|
end
|
|
|
|
def test_factory
|
|
name = 'foo-bar'
|
|
path = HOMEBREW_PREFIX+"Library/Formula/#{name}.rb"
|
|
path.dirname.mkpath
|
|
File.open(path, 'w') do |f|
|
|
f << %{
|
|
require 'formula'
|
|
class #{Formulary.class_s(name)} < Formula
|
|
url 'foo-1.0'
|
|
def initialize(*args)
|
|
@homepage = 'http://example.com/'
|
|
super
|
|
end
|
|
end
|
|
}
|
|
end
|
|
assert_kind_of Formula, Formula.factory(name)
|
|
ensure
|
|
path.unlink
|
|
end
|
|
|
|
def test_class_specs_are_always_initialized
|
|
f = formula { url 'foo-1.0' }
|
|
|
|
%w{stable devel head bottle}.each do |spec|
|
|
assert_kind_of SoftwareSpec, f.class.send(spec)
|
|
end
|
|
end
|
|
|
|
def test_incomplete_instance_specs_are_not_accessible
|
|
f = formula { url 'foo-1.0' }
|
|
|
|
%w{devel head bottle}.each { |spec| assert_nil f.send(spec) }
|
|
end
|
|
|
|
def test_honors_attributes_declared_before_specs
|
|
f = formula do
|
|
url 'foo-1.0'
|
|
depends_on 'foo'
|
|
devel { url 'foo-1.1' }
|
|
end
|
|
|
|
%w{stable devel head bottle}.each do |spec|
|
|
assert_equal 'foo', f.class.send(spec).deps.first.name
|
|
end
|
|
end
|
|
|
|
def test_simple_version
|
|
assert_equal PkgVersion.parse('1.0'), formula { url 'foo-1.0.bar' }.pkg_version
|
|
end
|
|
|
|
def test_version_with_revision
|
|
f = formula do
|
|
url 'foo-1.0.bar'
|
|
revision 1
|
|
end
|
|
|
|
assert_equal PkgVersion.parse('1.0_1'), f.pkg_version
|
|
end
|
|
|
|
def test_head_ignores_revisions
|
|
ARGV.stubs(:build_head?).returns(true)
|
|
|
|
f = formula do
|
|
url 'foo-1.0.bar'
|
|
revision 1
|
|
head 'foo'
|
|
end
|
|
|
|
assert_equal PkgVersion.parse('HEAD'), f.pkg_version
|
|
end
|
|
end
|