Claudia 5be80a78f6
Use Homebrew-controlled domain for Cask dummy URLs
In a number of Cask specs, the value of the `homepage` stanza is currently set
to https://example.com. As of 2018-11-28, the TLS certificate served by
example.com seems to be expired, possibly due to an oversight on ICANN’s side.

While the certificate is certainly going to be renewed soon, it would be
desirable for Homebrew’s test result to be less dependent on ICANN’s actions.
This commit changes the homepages of all test Casks to http://brew.sh, whose
domain and TLS certificate are both controlled by Homebrew.
2018-11-28 20:51:55 +01:00

806 lines
23 KiB
Ruby

require "rubocops/lines"
describe RuboCop::Cop::FormulaAudit::Lines do
subject(:cop) { described_class.new }
it "reports an offense when using depends_on :automake" do
expect_offense(<<~RUBY)
class Foo < Formula
url 'https://brew.sh/foo-1.0.tgz'
depends_on :automake
^^^^^^^^^^^^^^^^^^^^ :automake is deprecated. Usage should be \"automake\".
end
RUBY
end
it "reports an offense when using depends_on :autoconf" do
expect_offense(<<~RUBY)
class Foo < Formula
url 'https://brew.sh/foo-1.0.tgz'
depends_on :autoconf
^^^^^^^^^^^^^^^^^^^^ :autoconf is deprecated. Usage should be \"autoconf\".
end
RUBY
end
it "reports an offense when using depends_on :libtool" do
expect_offense(<<~RUBY)
class Foo < Formula
url 'https://brew.sh/foo-1.0.tgz'
depends_on :libtool
^^^^^^^^^^^^^^^^^^^ :libtool is deprecated. Usage should be \"libtool\".
end
RUBY
end
it "reports an offense when using depends_on :apr" do
expect_offense(<<~RUBY)
class Foo < Formula
url 'https://brew.sh/foo-1.0.tgz'
depends_on :apr
^^^^^^^^^^^^^^^ :apr is deprecated. Usage should be \"apr-util\".
end
RUBY
end
it "reports an offense when using depends_on :tex" do
expect_offense(<<~RUBY)
class Foo < Formula
url 'https://brew.sh/foo-1.0.tgz'
depends_on :tex
^^^^^^^^^^^^^^^ :tex is deprecated.
end
RUBY
end
end
describe RuboCop::Cop::FormulaAudit::ClassInheritance do
subject(:cop) { described_class.new }
it "reports an offense when not using spaces for class inheritance" do
expect_offense(<<~RUBY, "/homebrew-core/Formula/foo.rb")
class Foo<Formula
^^^^^^^ Use a space in class inheritance: class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
end
RUBY
end
end
describe RuboCop::Cop::FormulaAudit::Comments do
subject(:cop) { described_class.new }
context "When auditing formula" do
it "commented cmake call" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
# system "cmake", ".", *std_cmake_args
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Please remove default template comments
end
RUBY
end
it "default template comments" do
expect_offense(<<~RUBY)
class Foo < Formula
# PLEASE REMOVE
^^^^^^^^^^^^^^^ Please remove default template comments
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
end
RUBY
end
it "commented out depends_on" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
# depends_on "foo"
^^^^^^^^^^^^^^^^^^ Commented-out dependency "foo"
end
RUBY
end
end
end
describe RuboCop::Cop::FormulaAudit::AssertStatements do
subject(:cop) { described_class.new }
it "assert ...include usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
assert File.read("inbox").include?("Sample message 1")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `assert_match` instead of `assert ...include?`
end
RUBY
end
it "assert ...exist? without a negation" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
assert File.exist? "default.ini"
^^^^^^^^^^^^^^^^^^^^^^^^^ Use `assert_predicate <path_to_file>, :exist?` instead of `assert File.exist? "default.ini"`
end
RUBY
end
it "assert ...exist? with a negation" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
assert !File.exist?("default.ini")
^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `refute_predicate <path_to_file>, :exist?` instead of `assert !File.exist?("default.ini")`
end
RUBY
end
it "assert ...executable? without a negation" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
assert File.executable? f
^^^^^^^^^^^^^^^^^^ Use `assert_predicate <path_to_file>, :executable?` instead of `assert File.executable? f`
end
RUBY
end
end
describe RuboCop::Cop::FormulaAudit::OptionDeclarations do
subject(:cop) { described_class.new }
it "unless build.without? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return unless build.without? "bar"
^^^^^^^^^^^^^^^^^^^^ Use if build.with? "bar" instead of unless build.without? "bar"
end
end
RUBY
end
it "unless build.with? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return unless build.with? "bar"
^^^^^^^^^^^^^^^^^ Use if build.without? "bar" instead of unless build.with? "bar"
end
end
RUBY
end
it "negated build.with? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return if !build.with? "bar"
^^^^^^^^^^^^^^^^^^ Don't negate 'build.with?': use 'build.without?'
end
end
RUBY
end
it "negated build.without? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return if !build.without? "bar"
^^^^^^^^^^^^^^^^^^^^^ Don't negate 'build.without?': use 'build.with?'
end
end
RUBY
end
it "unnecessary build.without? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return if build.without? "--without-bar"
^^^^^^^^^^^^^ Don't duplicate 'without': Use `build.without? \"bar\"` to check for \"--without-bar\"
end
end
RUBY
end
it "unnecessary build.with? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return if build.with? "--with-bar"
^^^^^^^^^^ Don't duplicate 'with': Use `build.with? \"bar\"` to check for \"--with-bar\"
end
end
RUBY
end
it "build.include? conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return if build.include? "without-bar"
^^^^^^^^^^^ Use build.without? \"bar\" instead of build.include? 'without-bar'
end
end
RUBY
end
it "build.include? with dashed args conditional" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def post_install
return if build.include? "--bar"
^^^^^ Reference 'bar' without dashes
end
end
RUBY
end
it "def options usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def options
^^^^^^^^^^^ Use new-style option definitions
[["--bar", "desc"]]
end
end
RUBY
end
end
describe RuboCop::Cop::FormulaAudit::Miscellaneous do
subject(:cop) { described_class.new }
context "When auditing formula" do
it "FileUtils usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
FileUtils.mv "hello"
^^^^^^^^^^^^^^^^^^^^ Don\'t need \'FileUtils.\' before mv
end
RUBY
end
it "long inreplace block vars" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
inreplace "foo" do |longvar|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \"inreplace <filenames> do |s|\" is preferred over \"|longvar|\".
somerandomCall(longvar)
end
end
RUBY
end
it "an invalid rebuild statement" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
bottle do
rebuild 0
^^^^^^^^^ 'rebuild 0' should be removed
sha256 "fe0679b932dd43a87fd415b609a7fbac7a069d117642ae8ebaac46ae1fb9f0b3" => :sierra
end
end
RUBY
end
it "OS.linux? check" do
expect_offense(<<~RUBY, "/homebrew-core/")
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
bottle do
if OS.linux?
^^^^^^^^^ Don\'t use OS.linux?; Homebrew/core only supports macOS
nil
end
sha256 "fe0679b932dd43a87fd415b609a7fbac7a069d117642ae8ebaac46ae1fb9f0b3" => :sierra
end
end
RUBY
end
it "fails_with :llvm block" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
bottle do
sha256 "fe0679b932dd43a87fd415b609a7fbac7a069d117642ae8ebaac46ae1fb9f0b3" => :sierra
end
fails_with :llvm do
^^^^^^^^^^^^^^^^ 'fails_with :llvm' is now a no-op so should be removed
build 2335
cause "foo"
end
end
RUBY
end
it "def test's deprecated usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def test
^^^^^^^^ Use new-style test definitions (test do)
assert_equals "1", "1"
end
end
RUBY
end
it "with deprecated skip_clean call" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
skip_clean :all
^^^^^^^^^^^^^^^ `skip_clean :all` is deprecated; brew no longer strips symbols. Pass explicit paths to prevent Homebrew from removing empty folders.
end
RUBY
end
it "build.universal? deprecated usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
if build.universal?
^^^^^^^^^^^^^^^^ macOS has been 64-bit only since 10.6 so build.universal? is deprecated.
"foo"
end
end
RUBY
end
it "build.universal? deprecation exempted formula" do
expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/wine.rb")
class Wine < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
if build.universal?
"foo"
end
end
RUBY
end
it "deprecated ENV.universal_binary usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
if build?
ENV.universal_binary
^^^^^^^^^^^^^^^^^^^^ macOS has been 64-bit only since 10.6 so ENV.universal_binary is deprecated.
end
end
RUBY
end
it "ENV.universal_binary deprecation exempted formula" do
expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/wine.rb")
class Wine < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
if build?
ENV.universal_binary
end
end
RUBY
end
it "deprecated ENV.x11 usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
if build?
ENV.x11
^^^^^^^ Use "depends_on :x11" instead of "ENV.x11"
end
end
RUBY
end
it "install_name_tool usage instead of ruby-macho" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
system "install_name_tool", "-id"
^^^^^^^^^^^^^^^^^ Use ruby-macho instead of calling "install_name_tool"
end
RUBY
end
it "ruby-macho alternatives audit exempted formula" do
expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/cctools.rb")
class Cctools < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
system "install_name_tool", "-id"
end
RUBY
end
it "npm install without language::Node args" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
system "npm", "install"
^^^^^^^^^^^^^^^^^^^^^^^ Use Language::Node for npm install args
end
RUBY
end
it "npm install without language::Node args in kibana(exempted formula)" do
expect_no_offenses(<<~RUBY, "/homebrew-core/Formula/kibana@4.4.rb")
class KibanaAT44 < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
system "npm", "install"
end
RUBY
end
it "depends_on with an instance as argument" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on FOO::BAR.new
^^^^^^^^^^^^ `depends_on` can take requirement classes instead of instances
end
RUBY
end
it "old style OS check" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on :foo if MacOS.snow_leopard?
^^^^^^^^^^^^^^^^^^^ \"MacOS.snow_leopard?\" is deprecated, use a comparison to MacOS.version instead
end
RUBY
end
it "non glob DIR usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
rm_rf Dir["src/{llvm,test,librustdoc,etc/snapshot.pyc}"]
rm_rf Dir["src/snapshot.pyc"]
^^^^^^^^^^^^^^^^ Dir(["src/snapshot.pyc"]) is unnecessary; just use "src/snapshot.pyc"
end
RUBY
end
it "system call to fileUtils Method" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
system "mkdir", "foo"
^^^^^ Use the `mkdir` Ruby method instead of `system "mkdir", "foo"`
end
RUBY
end
it "top-level function def outside class body" do
expect_offense(<<~RUBY)
def test
^^^^^^^^ Define method test in the class body, not at the top-level
nil
end
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
end
RUBY
end
it "Using ARGV to check options" do
expect_no_offenses(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
verbose = ARGV.verbose?
end
end
RUBY
end
it 'man+"man8" usage' do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
man1.install man+"man8" => "faad.1"
^^^^ "man+"man8"" should be "man8"
end
end
RUBY
end
it "hardcoded gcc compiler system" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
system "/usr/bin/gcc", "foo"
^^^^^^^^^^^^ Use "#{ENV.cc}" instead of hard-coding "gcc"
end
end
RUBY
end
it "hardcoded g++ compiler system" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
system "/usr/bin/g++", "-o", "foo", "foo.cc"
^^^^^^^^^^^^ Use "#{ENV.cxx}" instead of hard-coding "g++"
end
end
RUBY
end
it "hardcoded llvm-g++ compiler COMPILER_PATH" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
ENV["COMPILER_PATH"] = "/usr/bin/llvm-g++"
^^^^^^^^^^^^^^^^^ Use "#{ENV.cxx}" instead of hard-coding "llvm-g++"
end
end
RUBY
end
it "hardcoded gcc compiler COMPILER_PATH" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
ENV["COMPILER_PATH"] = "/usr/bin/gcc"
^^^^^^^^^^^^ Use \"\#{ENV.cc}\" instead of hard-coding \"gcc\"
end
end
RUBY
end
it "formula path shortcut : man" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
mv "#{share}/man", share
^^^^ "#{share}/man" should be "#{man}"
end
end
RUBY
end
it "formula path shortcut : libexec" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
mv "#{prefix}/libexec", share
^^^^^^^^ "#{prefix}/libexec" should be "#{libexec}"
end
end
RUBY
end
it "formula path shortcut : info" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
system "./configure", "--INFODIR=#{prefix}/share/info"
^^^^^^ "#{prefix}/share" should be "#{share}"
^^^^^^^^^^^ "#{prefix}/share/info" should be "#{info}"
end
end
RUBY
end
it "formula path shortcut : man8" do
expect_offense(<<~'RUBY')
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
def install
system "./configure", "--MANDIR=#{prefix}/share/man/man8"
^^^^^^ "#{prefix}/share" should be "#{share}"
^^^^^^^^^^^^^^^ "#{prefix}/share/man/man8" should be "#{man8}"
end
end
RUBY
end
it "dependecies which have to vendored" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on "lpeg" => :lua51
^^^^^ lua modules should be vendored rather than use deprecated depends_on \"lpeg\" => :lua51`
end
RUBY
end
it "manually setting env" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
system "export", "var=value"
^^^^^^ Use ENV instead of invoking 'export' to modify the environment
end
RUBY
end
it "dependencies with invalid options which lead to force rebuild" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on "foo" => "with-bar"
^^^^^^^^ Dependency foo should not use option with-bar
end
RUBY
end
it "dependencies with invalid options in array value which lead to force rebuild" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on "httpd" => [:build, :test]
depends_on "foo" => [:optional, "with-bar"]
^^^^^^^^ Dependency foo should not use option with-bar
depends_on "icu4c" => [:optional, "c++11"]
^^^^^ Dependency icu4c should not use option c++11
end
RUBY
end
it "inspecting version manually" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
if version == "HEAD"
^^^^^^^^^^^^^^^^^ Use 'build.head?' instead of inspecting 'version'
foo()
end
end
RUBY
end
it "deprecated ARGV.include? (--HEAD) usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
test do
head = ARGV.include? "--HEAD"
^^^^^^ Use "if build.head?" instead
^^^^ Use build instead of ARGV to check options
end
end
RUBY
end
it "deprecated needs :openmp usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
needs :openmp
^^^^^^^^^^^^^ 'needs :openmp' should be replaced with 'depends_on \"gcc\"'
end
RUBY
end
it "deprecated MACOS_VERSION const usage" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
test do
version = MACOS_VERSION
^^^^^^^^^^^^^ Use MacOS.version instead of MACOS_VERSION
end
end
RUBY
end
it "deprecated if build.with? conditional dependency" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on "foo" if build.with? "foo"
^^^^^^^^^^^^^^^^ Replace depends_on "foo" if build.with? "foo" with depends_on "foo" => :optional
end
RUBY
end
it "unless conditional dependency with build.without?" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on :foo unless build.without? "foo"
^^^^^^^^^^^^^^^ Replace depends_on :foo unless build.without? "foo" with depends_on :foo => :recommended
end
RUBY
end
it "unless conditional dependency with build.include?" do
expect_offense(<<~RUBY)
class Foo < Formula
desc "foo"
url 'https://brew.sh/foo-1.0.tgz'
depends_on :foo unless build.include? "without-foo"
^^^^^^^^^^^^^^^ Replace depends_on :foo unless build.include? "without-foo" with depends_on :foo => :recommended
end
RUBY
end
end
end