require "testing_env" require "fileutils" require "pathname" require "formulary" require "dev-cmd/audit" class FormulaAuditorTests < Homebrew::TestCase def setup super @dir = mktmpdir end def formula_auditor(name, text, options = {}) path = Pathname.new "#{@dir}/#{name}.rb" path.open("w") do |f| f.write text end FormulaAuditor.new Formulary.factory(path), options end def test_init_no_problems fa = formula_auditor "foo", <<-EOS.undent class Foo < Formula url "http://example.com/foo-1.0.tgz" end EOS assert_equal [], fa.problems end def test_audit_file_permissions File.stubs(:umask).returns 022 fa = formula_auditor "foo", <<-EOS.undent class Foo < Formula url "http://example.com/foo-1.0.tgz" end EOS path = fa.formula.path path.chmod 0400 fa.audit_file assert_equal ["Incorrect file permissions (400): chmod 644 #{path}"], fa.problems end def test_audit_file_data_no_end fa = formula_auditor "foo", <<-EOS.undent class Foo < Formula url "http://example.com/foo-1.0.tgz" patch :DATA end EOS fa.audit_file assert_equal ["'DATA' was found, but no '__END__'"], fa.problems end def test_audit_file_end_no_data fa = formula_auditor "foo", <<-EOS.undent class Foo < Formula url "http://example.com/foo-1.0.tgz" end __END__ a patch goes here EOS fa.audit_file assert_equal ["'__END__' was found, but 'DATA' is not used"], fa.problems end def test_audit_file_no_trailing_newline fa = formula_auditor "foo", 'class Foo "http://www.freedesktop.org/wiki/bar", "baz" => "http://www.freedesktop.org/wiki/Software/baz", "qux" => "https://code.google.com/p/qux", "quux" => "http://github.com/quux", "corge" => "http://savannah.nongnu.org/corge", "grault" => "http://grault.github.io/", "garply" => "http://www.gnome.org/garply", "sf1" => "http://foo.sourceforge.net/", "sf2" => "http://foo.sourceforge.net", "sf3" => "http://foo.sf.net/", "sf4" => "http://foo.sourceforge.io/", "waldo" => "http://www.gnu.org/waldo", } formula_homepages.each do |name, homepage| fa = formula_auditor name, <<-EOS.undent class #{Formulary.class_s(name)} < Formula homepage "#{homepage}" url "http://example.com/#{name}-1.0.tgz" end EOS fa.audit_homepage if homepage =~ %r{http:\/\/www\.freedesktop\.org} if homepage =~ /Software/ assert_match "#{homepage} should be styled " \ "`https://wiki.freedesktop.org/www/Software/project_name`", fa.problems.first else assert_match "#{homepage} should be styled " \ "`https://wiki.freedesktop.org/project_name`", fa.problems.first end elsif homepage =~ %r{https:\/\/code\.google\.com} assert_match "#{homepage} should end with a slash", fa.problems.first elsif homepage =~ /foo\.(sf|sourceforge)\.net/ assert_match "#{homepage} should be `https://foo.sourceforge.io/`", fa.problems.first else assert_match "Please use https:// for #{homepage}", fa.problems.first end end end def test_audit_without_homepage fa = formula_auditor "foo", <<-EOS.undent, online: true class Foo < Formula url "http://example.com/foo-1.0.tgz" end EOS fa.audit_homepage assert_match "Formula should have a homepage.", fa.problems.first end def test_audit_xcodebuild_suggests_symroot fa = formula_auditor "foo", <<-EOS.undent class Foo < Formula url "http://example.com/foo-1.0.tgz" homepage "http://example.com" def install xcodebuild "-project", "meow.xcodeproject" end end EOS fa.audit_text assert_match 'xcodebuild should be passed an explicit "SYMROOT"', fa.problems.first end def test_audit_bare_xcodebuild_suggests_symroot_also fa = formula_auditor "foo", <<-EOS.undent class Foo < Formula url "http://example.com/foo-1.0.tgz" homepage "http://example.com" def install xcodebuild end end EOS fa.audit_text assert_match 'xcodebuild should be passed an explicit "SYMROOT"', fa.problems.first end end