brew/Library/Homebrew/test/rubocops/patches_spec.rb
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

247 lines
9.2 KiB
Ruby

require "rubocops/patches"
describe RuboCop::Cop::FormulaAudit::Patches do
subject(:cop) { described_class.new }
context "When auditing legacy patches" do
it "When there is no legacy patch" do
expect_no_offenses(<<~RUBY)
class Foo < Formula
url 'https://brew.sh/foo-1.0.tgz'
end
RUBY
end
it "Formula with `def patches`" do
expect_offense(<<~RUBY)
class Foo < Formula
homepage "ftp://brew.sh/foo"
url "https://brew.sh/foo-1.0.tgz"
def patches
^^^^^^^^^^^ Use the patch DSL instead of defining a 'patches' method
DATA
end
end
RUBY
end
it "Patch URLs" do
patch_urls = [
"https://raw.github.com/mogaal/sendemail",
"https://mirrors.ustc.edu.cn/macports/trunk/",
"http://trac.macports.org/export/102865/trunk/dports/mail/uudeview/files/inews.c.patch",
"http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=patch-libunac1.txt;att=1;bug=623340",
"https://patch-diff.githubusercontent.com/raw/foo/foo-bar/pull/100.patch",
"https://github.com/dlang/dub/pull/1221.patch",
]
patch_urls.each do |patch_url|
source = <<~EOS
class Foo < Formula
homepage "ftp://brew.sh/foo"
url "https://brew.sh/foo-1.0.tgz"
def patches
"#{patch_url}"
end
end
EOS
inspect_source(source)
expected_offense = if patch_url =~ %r{/raw\.github\.com/}
[{ message:
<<~EOS.chomp,
GitHub/Gist patches should specify a revision:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 12,
source: source }]
elsif patch_url =~ %r{macports/trunk}
[{ message:
<<~EOS.chomp,
MacPorts patches should specify a revision instead of trunk:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 33,
source: source }]
elsif patch_url =~ %r{^http://trac\.macports\.org}
[{ message:
<<~EOS.chomp,
Patches from MacPorts Trac should be https://, not http:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 5,
source: source }]
elsif patch_url =~ %r{^http://bugs\.debian\.org}
[{ message:
<<~EOS.chomp,
Patches from Debian should be https://, not http:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 5,
source: source }]
elsif patch_url =~ %r{https?://patch-diff\.githubusercontent\.com/raw/(.+)/(.+)/pull/(.+)\.(?:diff|patch)}
[{ message:
<<~EOS,
use GitHub pull request URLs:
https://github.com/foo/foo-bar/pull/100.patch
Rather than patch-diff:
https://patch-diff.githubusercontent.com/raw/foo/foo-bar/pull/100.patch
EOS
severity: :convention,
line: 5,
column: 5,
source: source }]
elsif patch_url =~ %r{https?://github\.com/.+/.+/(?:commit|pull)/[a-fA-F0-9]*.(?:patch|diff)}
[{ message:
<<~EOS,
GitHub patches should use the full_index parameter:
#{patch_url}?full_index=1
EOS
severity: :convention,
line: 5,
column: 5,
source: source }]
end
expected_offense.zip([cop.offenses.last]).each do |expected, actual|
expect(actual.message).to eq(expected[:message])
expect(actual.severity).to eq(expected[:severity])
expect(actual.line).to eq(expected[:line])
expect(actual.column).to eq(expected[:column])
end
end
end
it "Formula with nested `def patches`" do
source = <<~RUBY
class Foo < Formula
homepage "ftp://brew.sh/foo"
url "https://brew.sh/foo-1.0.tgz"
def patches
files = %w[patch-domain_resolver.c patch-colormask.c patch-trafshow.c patch-trafshow.1 patch-configure]
{
:p0 =>
files.collect{|p| "http://trac.macports.org/export/68507/trunk/dports/net/trafshow/files/\#{p}"}
}
end
end
RUBY
expected_offenses = [{ message: "Use the patch DSL instead of defining a 'patches' method",
severity: :convention,
line: 4,
column: 2,
source: source },
{ message:
<<~EOS.chomp,
Patches from MacPorts Trac should be https://, not http:
http://trac.macports.org/export/68507/trunk/dports/net/trafshow/files/
EOS
severity: :convention,
line: 8,
column: 26,
source: source }]
inspect_source(source)
expected_offenses.zip(cop.offenses).each do |expected, actual|
expect(actual.message).to eq(expected[:message])
expect(actual.severity).to eq(expected[:severity])
expect(actual.line).to eq(expected[:line])
expect(actual.column).to eq(expected[:column])
end
end
end
context "When auditing external patches" do
it "Patch URLs" do
patch_urls = [
"https://raw.github.com/mogaal/sendemail",
"https://mirrors.ustc.edu.cn/macports/trunk/",
"http://trac.macports.org/export/102865/trunk/dports/mail/uudeview/files/inews.c.patch",
"http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=patch-libunac1.txt;att=1;bug=623340",
"https://patch-diff.githubusercontent.com/raw/foo/foo-bar/pull/100.patch",
]
patch_urls.each do |patch_url|
source = <<~RUBY
class Foo < Formula
homepage "ftp://brew.sh/foo"
url "https://brew.sh/foo-1.0.tgz"
patch do
url "#{patch_url}"
sha256 "63376b8fdd6613a91976106d9376069274191860cd58f039b29ff16de1925621"
end
end
RUBY
inspect_source(source)
expected_offense = if patch_url =~ %r{/raw\.github\.com/}
[{ message:
<<~EOS.chomp,
GitHub/Gist patches should specify a revision:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 16,
source: source }]
elsif patch_url =~ %r{macports/trunk}
[{ message:
<<~EOS.chomp,
MacPorts patches should specify a revision instead of trunk:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 37,
source: source }]
elsif patch_url =~ %r{^http://trac\.macports\.org}
[{ message:
<<~EOS.chomp,
Patches from MacPorts Trac should be https://, not http:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 9,
source: source }]
elsif patch_url =~ %r{^http://bugs\.debian\.org}
[{ message:
<<~EOS.chomp,
Patches from Debian should be https://, not http:
#{patch_url}
EOS
severity: :convention,
line: 5,
column: 9,
source: source }]
elsif patch_url =~ %r{https?://patch-diff\.githubusercontent\.com/raw/(.+)/(.+)/pull/(.+)\.(?:diff|patch)}
[{ message:
<<~EOS,
use GitHub pull request URLs:
https://github.com/foo/foo-bar/pull/100.patch
Rather than patch-diff:
https://patch-diff.githubusercontent.com/raw/foo/foo-bar/pull/100.patch
EOS
severity: :convention,
line: 5,
column: 9,
source: source }]
end
expected_offense.zip([cop.offenses.last]).each do |expected, actual|
expect(actual.message).to eq(expected[:message])
expect(actual.severity).to eq(expected[:severity])
expect(actual.line).to eq(expected[:line])
expect(actual.column).to eq(expected[:column])
end
end
end
end
end