| 
									
										
										
										
											2018-09-02 23:30:07 +02:00
										 |  |  | require "rubocops/urls_cop" | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | describe RuboCop::Cop::FormulaAudit::Urls do | 
					
						
							|  |  |  |   subject(:cop) { described_class.new } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   context "When auditing urls" do | 
					
						
							|  |  |  |     it "with offenses" do | 
					
						
							|  |  |  |       formulas = [{ | 
					
						
							|  |  |  |         "url" => "https://ftpmirror.gnu.org/lightning/lightning-2.1.0.tar.gz", | 
					
						
							|  |  |  |         "msg" => 'Please use "https://ftp.gnu.org/gnu/lightning/lightning-2.1.0.tar.gz" instead of https://ftpmirror.gnu.org/lightning/lightning-2.1.0.tar.gz.', | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://fossies.org/linux/privat/monit-5.23.0.tar.gz", | 
					
						
							|  |  |  |         "msg" => "Please don't use fossies.org in the url (using as a mirror is fine)", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://tools.ietf.org/tools/rfcmarkup/rfcmarkup-1.119.tgz", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for http://tools.ietf.org/tools/rfcmarkup/rfcmarkup-1.119.tgz", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://search.mcpan.org/CPAN/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.003.tar.gz", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "http://search.mcpan.org/CPAN/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.003.tar.gz should be " \ | 
					
						
							|  |  |  |                  "`https://cpan.metacpan.org/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.003.tar.gz`", | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://ftp.gnome.org/pub/GNOME/binaries/mac/banshee/banshee-2.macosx.intel.dmg", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "http://ftp.gnome.org/pub/GNOME/binaries/mac/banshee/banshee-2.macosx.intel.dmg should be " \ | 
					
						
							|  |  |  |                  "`https://download.gnome.org/binaries/mac/banshee/banshee-2.macosx.intel.dmg`", | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |         "col" => 2, | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "git://anonscm.debian.org/users/foo/foostrap.git", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "git://anonscm.debian.org/users/foo/foostrap.git should be " \ | 
					
						
							|  |  |  |                  "`https://anonscm.debian.org/git/users/foo/foostrap.git`", | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "ftp://ftp.mirrorservice.org/foo-1.tar.gz", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for ftp://ftp.mirrorservice.org/foo-1.tar.gz", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "ftp://ftp.cpan.org/pub/CPAN/foo-1.tar.gz", | 
					
						
							|  |  |  |         "msg" => "ftp://ftp.cpan.org/pub/CPAN/foo-1.tar.gz should be `http://search.cpan.org/CPAN/foo-1.tar.gz`", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://sourceforge.net/projects/something/files/Something-1.2.3.dmg", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "Use https://downloads.sourceforge.net to get geolocation (url is " \ | 
					
						
							|  |  |  |                  "http://sourceforge.net/projects/something/files/Something-1.2.3.dmg).", | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://downloads.sourceforge.net/project/foo/download", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "Don't use /download in SourceForge urls (url is " \ | 
					
						
							|  |  |  |                  "https://downloads.sourceforge.net/project/foo/download).", | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://sourceforge.net/project/foo", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "Use https://downloads.sourceforge.net to get geolocation " \ | 
					
						
							|  |  |  |                  "(url is https://sourceforge.net/project/foo).", | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://prdownloads.sourceforge.net/foo/foo-1.tar.gz", | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         "msg" => <<~EOS.chomp, | 
					
						
							| 
									
										
										
										
											2017-08-17 11:41:58 +05:30
										 |  |  |           Don't use prdownloads in SourceForge urls (url is http://prdownloads.sourceforge.net/foo/foo-1.tar.gz). | 
					
						
							|  |  |  |                   See: http://librelist.com/browser/homebrew/2011/1/12/prdownloads-is-bad/ | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://foo.dl.sourceforge.net/sourceforge/foozip/foozip_1.0.tar.bz2", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "Don't use specific dl mirrors in SourceForge urls (url is " \ | 
					
						
							|  |  |  |                  "http://foo.dl.sourceforge.net/sourceforge/foozip/foozip_1.0.tar.bz2).", | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://downloads.sourceforge.net/project/foo/foo/2/foo-2.zip", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for http://downloads.sourceforge.net/project/foo/foo/2/foo-2.zip", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://http.debian.net/debian/dists/foo/", | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         "msg" => <<~EOS, | 
					
						
							| 
									
										
										
										
											2017-08-17 11:41:58 +05:30
										 |  |  |           Please use a secure mirror for Debian URLs. | 
					
						
							|  |  |  |           We recommend: | 
					
						
							|  |  |  |             https://mirrors.ocf.berkeley.edu/debian/dists/foo/ | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://foo.googlecode.com/files/foo-1.0.zip", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for http://foo.googlecode.com/files/foo-1.0.zip", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "git://github.com/foo.git", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for git://github.com/foo.git", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "git://gitorious.org/foo/foo5", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for git://gitorious.org/foo/foo5", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "http://github.com/foo/foo5.git", | 
					
						
							|  |  |  |         "msg" => "Please use https:// for http://github.com/foo/foo5.git", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://github.com/foo/foobar/archive/master.zip", | 
					
						
							|  |  |  |         "msg" => "Use versioned rather than branch tarballs for stable checksums.", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://github.com/foo/bar/tarball/v1.2.3", | 
					
						
							|  |  |  |         "msg" => "Use /archive/ URLs for GitHub tarballs (url is https://github.com/foo/bar/tarball/v1.2.3).", | 
					
						
							|  |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://codeload.github.com/foo/bar/tar.gz/v0.1.1", | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         "msg" => <<~EOS, | 
					
						
							| 
									
										
										
										
											2017-08-17 11:41:58 +05:30
										 |  |  |           Use GitHub archive URLs: | 
					
						
							|  |  |  |             https://github.com/foo/bar/archive/v0.1.1.tar.gz | 
					
						
							|  |  |  |           Rather than codeload: | 
					
						
							|  |  |  |             https://codeload.github.com/foo/bar/tar.gz/v0.1.1
 | 
					
						
							|  |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							|  |  |  |       }, { | 
					
						
							|  |  |  |         "url" => "https://central.maven.org/maven2/com/bar/foo/1.1/foo-1.1.jar", | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |         "msg" => "https://central.maven.org/maven2/com/bar/foo/1.1/foo-1.1.jar should be " \ | 
					
						
							|  |  |  |                  "`https://search.maven.org/remotecontent?filepath=com/bar/foo/1.1/foo-1.1.jar`", | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |         "col" => 2, | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |       }] | 
					
						
							|  |  |  |       formulas.each do |formula| | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         source = <<~RUBY | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |           class Foo < Formula | 
					
						
							|  |  |  |             desc "foo" | 
					
						
							|  |  |  |             url "#{formula["url"]}" | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |         RUBY | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |         expected_offenses = [{ message: formula["msg"], | 
					
						
							|  |  |  |                                severity: :convention, | 
					
						
							|  |  |  |                                line: 3, | 
					
						
							|  |  |  |                                column: formula["col"], | 
					
						
							|  |  |  |                                source: source }] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-07 22:31:23 +02:00
										 |  |  |         inspect_source(source) | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |         expected_offenses.zip(cop.offenses.reverse).each do |expected, actual| | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |           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]) | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     it "with offenses in stable/devel/head block" do | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |       expect_offense(<<~RUBY) | 
					
						
							|  |  |  |         class Foo < Formula | 
					
						
							|  |  |  |           desc "foo" | 
					
						
							|  |  |  |           url "https://foo.com" | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |           devel do | 
					
						
							|  |  |  |             url "git://github.com/foo.git", | 
					
						
							|  |  |  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Please use https:// for git://github.com/foo.git | 
					
						
							|  |  |  |                 :tag => "v1.0.0-alpha.1", | 
					
						
							|  |  |  |                 :revision => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 
					
						
							|  |  |  |             version "1.0.0-alpha.1" | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |       RUBY | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "with duplicate mirror" do | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |       expect_offense(<<~RUBY) | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         class Foo < Formula | 
					
						
							|  |  |  |           desc "foo" | 
					
						
							|  |  |  |           url "https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz" | 
					
						
							|  |  |  |           mirror "https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz" | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ URL should not be duplicated as a mirror: https://ftpmirror.fnu.org/foo/foo-1.0.tar.gz | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |       RUBY | 
					
						
							| 
									
										
										
										
											2017-07-20 01:51:43 +05:30
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-07-19 01:14:14 +05:30
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2017-07-30 12:57:57 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 07:35:26 +10:00
										 |  |  | describe RuboCop::Cop::FormulaAudit::PyPiUrls do | 
					
						
							| 
									
										
										
										
											2017-07-30 12:57:57 +05:30
										 |  |  |   subject(:cop) { described_class.new } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |   context "when a pypi.python.org URL is used" do | 
					
						
							|  |  |  |     it "reports an offense" do | 
					
						
							|  |  |  |       expect_offense(<<~RUBY) | 
					
						
							|  |  |  |         class Foo < Formula | 
					
						
							|  |  |  |           desc "foo" | 
					
						
							|  |  |  |           url "https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz" | 
					
						
							|  |  |  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz should be `https://files.pythonhosted.org/packages/source/foo/foo-0.1.tar.gz` | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       RUBY | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-07-30 12:57:57 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |     it "support auto-correction" do | 
					
						
							|  |  |  |       corrected = autocorrect_source(<<~RUBY) | 
					
						
							|  |  |  |         class Foo < Formula | 
					
						
							|  |  |  |           desc "foo" | 
					
						
							|  |  |  |           url "https://pypi.python.org/packages/source/foo/foo-0.1.tar.gz" | 
					
						
							| 
									
										
										
										
											2017-07-30 12:57:57 +05:30
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-10-21 03:12:50 +02:00
										 |  |  |       RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(corrected).to eq <<~RUBY | 
					
						
							|  |  |  |         class Foo < Formula | 
					
						
							|  |  |  |           desc "foo" | 
					
						
							|  |  |  |           url "https://files.pythonhosted.org/packages/source/foo/foo-0.1.tar.gz" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       RUBY | 
					
						
							| 
									
										
										
										
											2017-07-30 12:57:57 +05:30
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |