mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

Large refactor to Formula, mostly improving reliability and error handling but also layout and readability. General improvements so testing can be more complete. Patches are automatically downloaded and applied for Formula that return a list of urls from Formula::patches. Split out the brew command logic to facilitate testing. Facility from Adam Vandenberg to allow selective cleaning of files, added because Python doesn't work when stripped.
259 lines
6.2 KiB
Ruby
Executable File
259 lines
6.2 KiB
Ruby
Executable File
#!/usr/bin/ruby
|
|
$:.unshift File.dirname(__FILE__)
|
|
require 'pathname+yeast'
|
|
require 'formula'
|
|
require 'keg'
|
|
require 'utils'
|
|
|
|
# these are defined in env.rb usually, but we don't want to break our actual
|
|
# homebrew tree, and we do want to test everything :)
|
|
HOMEBREW_PREFIX=Pathname.new '/tmp/testbrew/prefix'
|
|
HOMEBREW_CACHE=HOMEBREW_PREFIX.parent+"cache"
|
|
HOMEBREW_CELLAR=HOMEBREW_PREFIX.parent+"cellar"
|
|
HOMEBREW_USER_AGENT="Homebrew"
|
|
|
|
HOMEBREW_CELLAR.mkpath
|
|
raise "HOMEBREW_CELLAR couldn't be created!" unless HOMEBREW_CELLAR.directory?
|
|
at_exit { HOMEBREW_PREFIX.parent.rmtree }
|
|
require 'test/unit' # must be after at_exit
|
|
require 'ARGV+yeast' # needs to be after test/unit to avoid conflict with OptionsParser
|
|
|
|
|
|
class MockFormula <Formula
|
|
def initialize url
|
|
@url=url
|
|
super 'test'
|
|
end
|
|
end
|
|
|
|
class MostlyAbstractFormula <AbstractFormula
|
|
@url=''
|
|
end
|
|
|
|
class TestBall <Formula
|
|
def initialize
|
|
@url="file:///#{Pathname.new(__FILE__).parent.realpath}/testball-0.1.tbz"
|
|
super "testball"
|
|
end
|
|
|
|
def install
|
|
prefix.install "bin"
|
|
prefix.install "libexec"
|
|
end
|
|
end
|
|
|
|
class TestBallValidMd5 <TestBall
|
|
@md5='71aa838a9e4050d1876a295a9e62cbe6'
|
|
end
|
|
|
|
class TestBallInvalidMd5 <TestBall
|
|
@md5='61aa838a9e4050d1876a295a9e62cbe6'
|
|
end
|
|
|
|
class TestBallOverrideBrew <Formula
|
|
def initialize
|
|
super "foo"
|
|
end
|
|
def brew
|
|
# We can't override brew
|
|
end
|
|
end
|
|
|
|
class TestScriptFileFormula <ScriptFileFormula
|
|
@url="file:///#{Pathname.new(__FILE__).realpath}"
|
|
@version="1"
|
|
|
|
def initialize
|
|
super
|
|
@name='test-script-formula'
|
|
end
|
|
end
|
|
|
|
def nostdout
|
|
require 'stringio'
|
|
tmpo=$stdout
|
|
tmpe=$stderr
|
|
$stdout=StringIO.new
|
|
yield
|
|
ensure
|
|
$stdout=tmpo
|
|
end
|
|
|
|
|
|
class BeerTasting <Test::Unit::TestCase
|
|
def test_version_all_dots
|
|
r=MockFormula.new "http://example.com/foo.bar.la.1.14.zip"
|
|
assert_equal '1.14', r.version
|
|
end
|
|
|
|
def test_version_underscore_separator
|
|
r=MockFormula.new "http://example.com/grc_1.1.tar.gz"
|
|
assert_equal '1.1', r.version
|
|
end
|
|
|
|
def test_boost_version_style
|
|
r=MockFormula.new "http://example.com/boost_1_39_0.tar.bz2"
|
|
assert_equal '1.39.0', r.version
|
|
end
|
|
|
|
def test_erlang_version_style
|
|
r=MockFormula.new "http://erlang.org/download/otp_src_R13B.tar.gz"
|
|
assert_equal 'R13B', r.version
|
|
end
|
|
|
|
def test_p7zip_version_style
|
|
r=MockFormula.new "http://kent.dl.sourceforge.net/sourceforge/p7zip/p7zip_9.04_src_all.tar.bz2"
|
|
assert_equal '9.04', r.version
|
|
end
|
|
|
|
def test_gloox_beta_style
|
|
r=MockFormula.new "http://camaya.net/download/gloox-1.0-beta7.tar.bz2"
|
|
assert_equal '1.0-beta7', r.version
|
|
end
|
|
|
|
def test_astyle_verson_style
|
|
r=MockFormula.new "http://kent.dl.sourceforge.net/sourceforge/astyle/astyle_1.23_macosx.tar.gz"
|
|
assert_equal '1.23', r.version
|
|
end
|
|
|
|
def test_version_libvorbis
|
|
r=MockFormula.new "http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2"
|
|
assert_equal '1.2.2rc1', r.version
|
|
end
|
|
|
|
def test_dos2unix
|
|
r=MockFormula.new "http://www.sfr-fresh.com/linux/misc/dos2unix-3.1.tar.gz"
|
|
assert_equal '3.1', r.version
|
|
end
|
|
|
|
def test_version_internal_dash
|
|
r=MockFormula.new "http://example.com/foo-arse-1.1-2.tar.gz"
|
|
assert_equal '1.1-2', r.version
|
|
end
|
|
|
|
def test_version_single_digit
|
|
r=MockFormula.new "http://example.com/foo_bar.45.tar.gz"
|
|
assert_equal '45', r.version
|
|
end
|
|
|
|
def test_noseparator_single_digit
|
|
r=MockFormula.new "http://example.com/foo_bar45.tar.gz"
|
|
assert_equal '45', r.version
|
|
end
|
|
|
|
def test_version_developer_that_hates_us_format
|
|
r=MockFormula.new "http://example.com/foo-bar-la.1.2.3.tar.gz"
|
|
assert_equal '1.2.3', r.version
|
|
end
|
|
|
|
def test_version_regular
|
|
r=MockFormula.new "http://example.com/foo_bar-1.21.tar.gz"
|
|
assert_equal '1.21', r.version
|
|
end
|
|
|
|
def test_yet_another_version
|
|
r=MockFormula.new "http://example.com/mad-0.15.1b.tar.gz"
|
|
assert_equal '0.15.1b', r.version
|
|
end
|
|
|
|
def test_supported_compressed_types
|
|
assert_nothing_raised do
|
|
MockFormula.new 'test-0.1.tar.gz'
|
|
MockFormula.new 'test-0.1.tar.bz2'
|
|
MockFormula.new 'test-0.1.tgz'
|
|
MockFormula.new 'test-0.1.bgz'
|
|
MockFormula.new 'test-0.1.zip'
|
|
end
|
|
end
|
|
|
|
def test_prefix
|
|
nostdout do
|
|
TestBall.new.brew do |f|
|
|
assert_equal File.expand_path(f.prefix), (HOMEBREW_CELLAR+f.name+'0.1').to_s
|
|
assert_kind_of Pathname, f.prefix
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_install
|
|
f=TestBall.new
|
|
|
|
assert_equal Formula.path(f.name), f.path
|
|
assert !f.installed?
|
|
|
|
nostdout do
|
|
f.brew do
|
|
f.install
|
|
end
|
|
end
|
|
|
|
assert_match Regexp.new("^#{HOMEBREW_CELLAR}/"), f.prefix.to_s
|
|
|
|
assert f.bin.directory?
|
|
assert_equal 3, f.bin.children.length
|
|
libexec=f.prefix+'libexec'
|
|
assert libexec.directory?
|
|
assert_equal 1, libexec.children.length
|
|
assert !(f.prefix+'main.c').exist?
|
|
assert f.installed?
|
|
|
|
keg=Keg.new f.prefix
|
|
keg.link
|
|
assert_equal 2, HOMEBREW_PREFIX.children.length
|
|
assert (HOMEBREW_PREFIX+'bin').directory?
|
|
assert_equal 3, (HOMEBREW_PREFIX+'bin').children.length
|
|
|
|
keg.uninstall
|
|
assert !keg.exist?
|
|
assert !f.installed?
|
|
end
|
|
|
|
def test_script_install
|
|
f=TestScriptFileFormula.new
|
|
|
|
nostdout do
|
|
f.brew do
|
|
f.install
|
|
end
|
|
end
|
|
|
|
assert_equal 1, f.bin.children.length
|
|
end
|
|
|
|
def test_md5
|
|
assert_nothing_raised { nostdout { TestBallValidMd5.new.brew {} } }
|
|
end
|
|
|
|
def test_badmd5
|
|
assert_raises RuntimeError do
|
|
nostdout { TestBallInvalidMd5.new.brew {} }
|
|
end
|
|
end
|
|
|
|
FOOBAR='foo-bar'
|
|
def test_formula_funcs
|
|
classname=Formula.class(FOOBAR)
|
|
path=Formula.path(FOOBAR)
|
|
|
|
assert_equal "FooBar", classname
|
|
assert_match Regexp.new("^#{HOMEBREW_PREFIX}/Library/Formula"), path.to_s
|
|
|
|
path=HOMEBREW_PREFIX+'Library'+'Formula'+"#{FOOBAR}.rb"
|
|
path.dirname.mkpath
|
|
`echo "require 'brewkit'; class #{classname} <Formula; @url=''; end" > #{path}`
|
|
|
|
assert_not_nil Formula.factory(FOOBAR)
|
|
end
|
|
|
|
def test_cant_override_brew
|
|
assert_raises(RuntimeError) { TestBallOverrideBrew.new }
|
|
end
|
|
|
|
def test_abstract_formula
|
|
f=MostlyAbstractFormula.new
|
|
assert_nil f.name
|
|
assert_raises(RuntimeError) { f.prefix }
|
|
nostdout { assert_raises(ExecutionError) { f.brew } }
|
|
end
|
|
end
|