aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Library/Homebrew/cmd/update-report.rb10
-rw-r--r--Library/Homebrew/dev-cmd/audit.rb40
-rw-r--r--Library/Homebrew/extend/ARGV.rb2
-rw-r--r--Library/Homebrew/extend/os/linux/requirements/java_requirement.rb16
-rw-r--r--Library/Homebrew/extend/os/mac/requirements/java_requirement.rb35
-rw-r--r--Library/Homebrew/extend/os/requirements/java_requirement.rb7
-rw-r--r--Library/Homebrew/formula.rb7
-rw-r--r--Library/Homebrew/requirements/java_requirement.rb108
-rw-r--r--Library/Homebrew/test/download_strategies_spec.rb232
-rw-r--r--Library/Homebrew/test/download_strategies_test.rb245
-rw-r--r--Library/Homebrew/test/gpg_spec.rb21
-rw-r--r--Library/Homebrew/test/gpg_test.rb18
-rw-r--r--Library/Homebrew/test/java_requirement_test.rb50
-rw-r--r--Library/Homebrew/test/os/mac/java_requirement_test.rb31
14 files changed, 527 insertions, 295 deletions
diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb
index dcf2891d9..7cc1ce264 100644
--- a/Library/Homebrew/cmd/update-report.rb
+++ b/Library/Homebrew/cmd/update-report.rb
@@ -475,12 +475,18 @@ class Reporter
if new_tap_name == "caskroom/cask"
if new_tap.installed? && (HOMEBREW_PREFIX/"Caskroom").directory?
ohai "#{name} has been moved to Homebrew-Cask."
- ohai "brew uninstall --force #{name}"
- system HOMEBREW_BREW_FILE, "uninstall", "--force", name
+ ohai "brew unlink #{name}"
+ system HOMEBREW_BREW_FILE, "unlink", name
ohai "brew prune"
system HOMEBREW_BREW_FILE, "prune"
ohai "brew cask install #{new_name}"
system HOMEBREW_BREW_FILE, "cask", "install", new_name
+ ohai <<-EOS.undent
+ #{name} has been moved to Homebrew-Cask.
+ The existing keg has been unlinked.
+ Please uninstall the formula when convenient by running:
+ brew uninstall --force #{name}
+ EOS
else
ohai "#{name} has been moved to Homebrew-Cask.", <<-EOS.undent
To uninstall the formula and install the cask run:
diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index 6aeb18749..5ed363f7c 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -39,6 +39,7 @@ require "cmd/search"
require "cmd/style"
require "date"
require "blacklist"
+require "digest"
module Homebrew
module_function
@@ -670,11 +671,11 @@ class FormulaAuditor
%w[Stable Devel HEAD].each do |name|
next unless spec = formula.send(name.downcase)
- ra = ResourceAuditor.new(spec).audit
+ ra = ResourceAuditor.new(spec, online: @online).audit
problems.concat ra.problems.map { |problem| "#{name}: #{problem}" }
spec.resources.each_value do |resource|
- ra = ResourceAuditor.new(resource).audit
+ ra = ResourceAuditor.new(resource, online: @online).audit
problems.concat ra.problems.map { |problem|
"#{name} resource #{resource.name.inspect}: #{problem}"
}
@@ -1221,7 +1222,7 @@ class ResourceAuditor
attr_reader :problems
attr_reader :version, :checksum, :using, :specs, :url, :mirrors, :name
- def initialize(resource)
+ def initialize(resource, options = {})
@name = resource.name
@version = resource.version
@checksum = resource.checksum
@@ -1229,6 +1230,7 @@ class ResourceAuditor
@mirrors = resource.mirrors
@using = resource.using
@specs = resource.specs
+ @online = options[:online]
@problems = []
end
@@ -1485,9 +1487,41 @@ class ResourceAuditor
next unless u =~ %r{https?://(?:central|repo\d+)\.maven\.org/maven2/(.+)$}
problem "#{u} should be `https://search.maven.org/remotecontent?filepath=#{$1}`"
end
+
+ return unless @online
+ urls.each do |url|
+ check_insecure_mirror(url) if url.start_with? "http:"
+ end
+ end
+
+ def check_insecure_mirror(url)
+ details = get_content_details(url)
+ secure_url = url.sub "http", "https"
+ secure_details = get_content_details(secure_url)
+
+ return if !details[:status].start_with?("2") || !secure_details[:status].start_with?("2")
+
+ etag_match = details[:etag] && details[:etag] == secure_details[:etag]
+ content_length_match = details[:content_length] && details[:content_length] == secure_details[:content_length]
+ file_match = details[:file_hash] == secure_details[:file_hash]
+
+ return if !etag_match && !content_length_match && !file_match
+ problem "The URL #{url} could use HTTPS rather than HTTP"
end
def problem(text)
@problems << text
end
+
+ def get_content_details(url)
+ out = {}
+ output, = curl_output "--connect-timeout", "15", "--include", url
+ split = output.partition("\r\n\r\n")
+ headers = split.first
+ out[:status] = headers[%r{HTTP\/.* (\d+)}, 1]
+ out[:etag] = headers[%r{ETag: ([wW]\/)?"(([^"]|\\")*)"}, 2]
+ out[:content_length] = headers[/Content-Length: (\d+)/, 1]
+ out[:file_hash] = Digest::SHA256.digest split.last
+ out
+ end
end
diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb
index 767ddc6e3..0825b13a7 100644
--- a/Library/Homebrew/extend/ARGV.rb
+++ b/Library/Homebrew/extend/ARGV.rb
@@ -16,11 +16,13 @@ module HomebrewArgvExtension
--build-bottle
--force-bottle
--verbose
+ --force
-i
-v
-d
-g
-s
+ -f
].freeze
end
diff --git a/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb b/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb
new file mode 100644
index 000000000..7816f6b6f
--- /dev/null
+++ b/Library/Homebrew/extend/os/linux/requirements/java_requirement.rb
@@ -0,0 +1,16 @@
+require "language/java"
+
+class JavaRequirement < Requirement
+ default_formula "jdk"
+
+ env do
+ env_java_common
+ env_oracle_jdk
+ end
+
+ private
+
+ def oracle_java_os
+ :linux
+ end
+end
diff --git a/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb
new file mode 100644
index 000000000..451e0001b
--- /dev/null
+++ b/Library/Homebrew/extend/os/mac/requirements/java_requirement.rb
@@ -0,0 +1,35 @@
+class JavaRequirement
+ cask "java"
+
+ env do
+ env_java_common
+ env_oracle_jdk || env_apple
+ end
+
+ private
+
+ def possible_javas
+ javas = []
+ javas << Pathname.new(ENV["JAVA_HOME"])/"bin/java" if ENV["JAVA_HOME"]
+ javas << java_home_cmd
+ javas << which("java")
+ javas
+ end
+
+ def java_home_cmd
+ return nil unless File.executable?("/usr/libexec/java_home")
+ args = %w[--failfast]
+ args << "--version" << @version.to_s if @version
+ java_home = Utils.popen_read("/usr/libexec/java_home", *args).chomp
+ return nil unless $?.success?
+ Pathname.new(java_home)/"bin/java"
+ end
+
+ def env_apple
+ ENV.append_to_cflags "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/"
+ end
+
+ def oracle_java_os
+ :darwin
+ end
+end
diff --git a/Library/Homebrew/extend/os/requirements/java_requirement.rb b/Library/Homebrew/extend/os/requirements/java_requirement.rb
new file mode 100644
index 000000000..b512ada47
--- /dev/null
+++ b/Library/Homebrew/extend/os/requirements/java_requirement.rb
@@ -0,0 +1,7 @@
+require "requirements/java_requirement"
+
+if OS.mac?
+ require "extend/os/mac/requirements/java_requirement"
+elsif OS.linux?
+ require "extend/os/linux/requirements/java_requirement"
+end
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index a4ef11276..35bf52584 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -2033,7 +2033,7 @@ class Formula
# @!attribute [w] url
# The URL used to download the source for the {#stable} version of the formula.
# We prefer `https` for security and proxy reasons.
- # Optionally specify the download strategy with `:using => ...`
+ # If not inferrable, specify the download strategy with `:using => ...`
# `:git`, `:hg`, `:svn`, `:bzr`, `:cvs`,
# `:curl` (normal file download. Will also extract.)
# `:nounzip` (without extracting)
@@ -2041,7 +2041,10 @@ class Formula
# `S3DownloadStrategy` (download from S3 using signed request)
#
# <pre>url "https://packed.sources.and.we.prefer.https.example.com/archive-1.2.3.tar.bz2"</pre>
- # <pre>url "https://some.dont.provide.archives.example.com", :using => :git, :tag => "1.2.3", :revision => "db8e4de5b2d6653f66aea53094624468caad15d2"</pre>
+ # <pre>url "https://some.dont.provide.archives.example.com",
+ # :using => :git,
+ # :tag => "1.2.3",
+ # :revision => "db8e4de5b2d6653f66aea53094624468caad15d2"</pre>
def url(val, specs = {})
stable.url(val, specs)
end
diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb
index 33fc01229..010b7dbc9 100644
--- a/Library/Homebrew/requirements/java_requirement.rb
+++ b/Library/Homebrew/requirements/java_requirement.rb
@@ -2,28 +2,12 @@ require "language/java"
class JavaRequirement < Requirement
fatal true
- cask "java"
download "http://www.oracle.com/technetwork/java/javase/downloads/index.html"
satisfy build_env: false do
- next false unless File.executable? "/usr/libexec/java_home"
-
- args = %w[--failfast]
- args << "--version" << @version.to_s if @version
- @java_home = Utils.popen_read("/usr/libexec/java_home", *args).chomp
- $?.success?
- end
-
- env do
- java_home = Pathname.new(@java_home)
- ENV["JAVA_HOME"] = java_home
- ENV.prepend_path "PATH", java_home/"bin"
- if (java_home/"include").exist? # Oracle JVM
- ENV.append_to_cflags "-I#{java_home}/include"
- ENV.append_to_cflags "-I#{java_home}/include/darwin"
- else # Apple JVM
- ENV.append_to_cflags "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/"
- end
+ setup_java
+ next false unless @java
+ next true
end
def initialize(tags)
@@ -45,16 +29,90 @@ class JavaRequirement < Requirement
def display_s
if @version
- if @version[-1] == "+"
- op = ">="
- version = @version[0, @version.length-1]
- else
+ if exact_version?
op = "="
- version = @version
+ else
+ op = ">="
end
- "#{name} #{op} #{version}"
+ "#{name} #{op} #{version_without_plus}"
else
name
end
end
+
+ private
+
+ def version_without_plus
+ if exact_version?
+ @version
+ else
+ @version[0, @version.length-1]
+ end
+ end
+
+ def exact_version?
+ @version && @version.to_s.chars.last != "+"
+ end
+
+ def setup_java
+ java = preferred_java
+ return unless java
+ @java = java
+ @java_home = java.parent.parent
+ end
+
+ def possible_javas
+ javas = []
+ javas << Pathname.new(ENV["JAVA_HOME"])/"bin/java" if ENV["JAVA_HOME"]
+ jdk = begin
+ Formula["jdk"]
+ rescue FormulaUnavailableError
+ nil
+ end
+ javas << jdk.bin/"java" if jdk && jdk.installed?
+ javas << which("java")
+ javas
+ end
+
+ def preferred_java
+ possible_javas.detect do |java|
+ next false unless java && java.executable?
+ next true unless @version
+ next true if satisfies_version(java)
+ end
+ end
+
+ def env_java_common
+ return unless @java_home
+ java_home = Pathname.new(@java_home)
+ ENV["JAVA_HOME"] = java_home
+ ENV.prepend_path "PATH", java_home/"bin"
+ end
+
+ def env_oracle_jdk
+ return unless @java_home
+ java_home = Pathname.new(@java_home)
+ return unless (java_home/"include").exist?
+ ENV.append_to_cflags "-I#{java_home}/include"
+ ENV.append_to_cflags "-I#{java_home}/include/#{oracle_java_os}"
+ true
+ end
+
+ def oracle_java_os
+ nil
+ end
+
+ def satisfies_version(java)
+ java_version_s = Utils.popen_read("#{java} -version 2>&1")[/1.\d/]
+ return false unless java_version_s
+ java_version = Version.create(java_version_s)
+ needed_version = Version.create(version_without_plus)
+ if exact_version?
+ java_version == needed_version
+ else
+ java_version >= needed_version
+ end
+ end
end
+
+require "extend/os/requirements/java_requirement"
diff --git a/Library/Homebrew/test/download_strategies_spec.rb b/Library/Homebrew/test/download_strategies_spec.rb
new file mode 100644
index 000000000..f466b97f4
--- /dev/null
+++ b/Library/Homebrew/test/download_strategies_spec.rb
@@ -0,0 +1,232 @@
+require "download_strategy"
+
+describe AbstractDownloadStrategy do
+ subject { described_class.new(name, resource) }
+ let(:name) { "foo" }
+ let(:url) { "http://example.com/foo.tar.gz" }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: nil) }
+ let(:args) { %w[foo bar baz] }
+
+ describe "#expand_safe_system_args" do
+ it "works with an explicit quiet flag" do
+ args << { quiet_flag: "--flag" }
+ expanded_args = subject.expand_safe_system_args(args)
+ expect(expanded_args).to eq(%w[foo bar baz --flag])
+ end
+
+ it "adds an implicit quiet flag" do
+ expanded_args = subject.expand_safe_system_args(args)
+ expect(expanded_args).to eq(%w[foo bar -q baz])
+ end
+
+ it "does not mutate the arguments" do
+ result = subject.expand_safe_system_args(args)
+ expect(args).to eq(%w[foo bar baz])
+ expect(result).not_to be args
+ end
+ end
+
+ specify "#source_modified_time" do
+ FileUtils.mktemp "mtime" do
+ FileUtils.touch "foo", mtime: Time.now - 10
+ FileUtils.touch "bar", mtime: Time.now - 100
+ FileUtils.ln_s "not-exist", "baz"
+ expect(subject.source_modified_time).to eq(File.mtime("foo"))
+ end
+ end
+end
+
+describe VCSDownloadStrategy do
+ let(:url) { "http://example.com/bar" }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: nil) }
+
+ describe "#cached_location" do
+ it "returns the path of the cached resource" do
+ allow_any_instance_of(described_class).to receive(:cache_tag).and_return("foo")
+ downloader = described_class.new("baz", resource)
+ expect(downloader.cached_location).to eq(HOMEBREW_CACHE/"baz--foo")
+ end
+ end
+end
+
+describe GitHubPrivateRepositoryDownloadStrategy do
+ subject { described_class.new("foo", resource) }
+ let(:url) { "https://github.com/owner/repo/archive/1.1.5.tar.gz" }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: nil) }
+
+ before(:each) do
+ ENV["HOMEBREW_GITHUB_API_TOKEN"] = "token"
+ allow(GitHub).to receive(:repository).and_return({})
+ end
+
+ it "sets the @github_token instance variable" do
+ expect(subject.instance_variable_get(:@github_token)).to eq("token")
+ end
+
+ it "parses the URL and sets the corresponding instance variables" do
+ expect(subject.instance_variable_get(:@owner)).to eq("owner")
+ expect(subject.instance_variable_get(:@repo)).to eq("repo")
+ expect(subject.instance_variable_get(:@filepath)).to eq("archive/1.1.5.tar.gz")
+ end
+
+ its(:download_url) { is_expected.to eq("https://token@github.com/owner/repo/archive/1.1.5.tar.gz") }
+end
+
+describe GitHubPrivateRepositoryReleaseDownloadStrategy do
+ subject { described_class.new("foo", resource) }
+ let(:url) { "https://github.com/owner/repo/releases/download/tag/foo_v0.1.0_darwin_amd64.tar.gz" }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: nil) }
+
+ before(:each) do
+ ENV["HOMEBREW_GITHUB_API_TOKEN"] = "token"
+ allow(GitHub).to receive(:repository).and_return({})
+ end
+
+ it "parses the URL and sets the corresponding instance variables" do
+ expect(subject.instance_variable_get(:@owner)).to eq("owner")
+ expect(subject.instance_variable_get(:@repo)).to eq("repo")
+ expect(subject.instance_variable_get(:@tag)).to eq("tag")
+ expect(subject.instance_variable_get(:@filename)).to eq("foo_v0.1.0_darwin_amd64.tar.gz")
+ end
+
+ describe "#download_url" do
+ it "returns the download URL for a given resource" do
+ allow(subject).to receive(:resolve_asset_id).and_return(456)
+ expect(subject.download_url).to eq("https://token@api.github.com/repos/owner/repo/releases/assets/456")
+ end
+ end
+
+ specify "#resolve_asset_id" do
+ release_metadata = {
+ "assets" => [
+ {
+ "id" => 123,
+ "name" => "foo_v0.1.0_linux_amd64.tar.gz",
+ },
+ {
+ "id" => 456,
+ "name" => "foo_v0.1.0_darwin_amd64.tar.gz",
+ },
+ ],
+ }
+ allow(subject).to receive(:fetch_release_metadata).and_return(release_metadata)
+ expect(subject.send(:resolve_asset_id)).to eq(456)
+ end
+
+ describe "#fetch_release_metadata" do
+ it "fetches release metadata from GitHub" do
+ expected_release_url = "https://api.github.com/repos/owner/repo/releases/tags/tag"
+ expect(GitHub).to receive(:open).with(expected_release_url).and_return({})
+ subject.send(:fetch_release_metadata)
+ end
+ end
+end
+
+describe GitHubGitDownloadStrategy do
+ subject { described_class.new(name, resource) }
+ let(:name) { "brew" }
+ let(:url) { "https://github.com/homebrew/brew.git" }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: nil) }
+
+ it "parses the URL and sets the corresponding instance variables" do
+ expect(subject.instance_variable_get(:@user)).to eq("homebrew")
+ expect(subject.instance_variable_get(:@repo)).to eq("brew")
+ end
+end
+
+describe GitDownloadStrategy do
+ subject { described_class.new(name, resource) }
+ let(:name) { "baz" }
+ let(:url) { "https://github.com/homebrew/foo" }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: nil) }
+ let(:cached_location) { subject.cached_location }
+
+ before(:each) do
+ @commit_id = 1
+ FileUtils.mkpath cached_location
+ end
+
+ def git_commit_all
+ shutup do
+ system "git", "add", "--all"
+ system "git", "commit", "-m", "commit number #{@commit_id}"
+ @commit_id += 1
+ end
+ end
+
+ def setup_git_repo
+ shutup do
+ system "git", "init"
+ system "git", "remote", "add", "origin", "https://github.com/Homebrew/homebrew-foo"
+ end
+ FileUtils.touch "README"
+ git_commit_all
+ end
+
+ describe "#source_modified_time" do
+ it "returns the right modification time" do
+ cached_location.cd do
+ setup_git_repo
+ end
+ expect(subject.source_modified_time.to_i).to eq(1_485_115_153)
+ end
+ end
+
+ specify "#last_commit" do
+ cached_location.cd do
+ setup_git_repo
+ FileUtils.touch "LICENSE"
+ git_commit_all
+ end
+ expect(subject.last_commit).to eq("f68266e")
+ end
+
+ describe "#fetch_last_commit" do
+ let(:url) { "file://#{remote_repo}" }
+ let(:version) { Version.create("HEAD") }
+ let(:resource) { double(Resource, url: url, mirrors: [], specs: {}, version: version) }
+ let(:remote_repo) { HOMEBREW_PREFIX/"remote_repo" }
+
+ before(:each) { remote_repo.mkpath }
+
+ after(:each) { FileUtils.rm_rf remote_repo }
+
+ it "fetches the hash of the last commit" do
+ remote_repo.cd do
+ setup_git_repo
+ FileUtils.touch "LICENSE"
+ git_commit_all
+ end
+
+ subject.shutup!
+ expect(subject.fetch_last_commit).to eq("f68266e")
+ end
+ end
+end
+
+describe DownloadStrategyDetector do
+ describe "::detect" do
+ subject { described_class.detect(url) }
+ let(:url) { Object.new }
+
+ context "when given Git URL" do
+ let(:url) { "git://example.com/foo.git" }
+ it { is_expected.to eq(GitDownloadStrategy) }
+ end
+
+ context "when given a GitHub Git URL" do
+ let(:url) { "https://github.com/homebrew/brew.git" }
+ it { is_expected.to eq(GitHubGitDownloadStrategy) }
+ end
+
+ it "defaults to cURL" do
+ expect(subject).to eq(CurlDownloadStrategy)
+ end
+
+ it "raises an error when passed an unrecognized strategy" do
+ expect {
+ described_class.detect("foo", Class.new)
+ }.to raise_error(TypeError)
+ end
+ end
+end
diff --git a/Library/Homebrew/test/download_strategies_test.rb b/Library/Homebrew/test/download_strategies_test.rb
deleted file mode 100644
index 40236b420..000000000
--- a/Library/Homebrew/test/download_strategies_test.rb
+++ /dev/null
@@ -1,245 +0,0 @@
-require "testing_env"
-require "download_strategy"
-
-class ResourceDouble
- attr_reader :url, :specs, :version, :mirrors
-
- def initialize(url = "http://example.com/foo.tar.gz", specs = {})
- @url = url
- @specs = specs
- @mirrors = []
- end
-end
-
-class AbstractDownloadStrategyTests < Homebrew::TestCase
- include FileUtils
-
- def setup
- super
- @name = "foo"
- @resource = ResourceDouble.new
- @strategy = AbstractDownloadStrategy.new(@name, @resource)
- @args = %w[foo bar baz]
- end
-
- def test_expand_safe_system_args_with_explicit_quiet_flag
- @args << { quiet_flag: "--flag" }
- expanded_args = @strategy.expand_safe_system_args(@args)
- assert_equal %w[foo bar baz --flag], expanded_args
- end
-
- def test_expand_safe_system_args_with_implicit_quiet_flag
- expanded_args = @strategy.expand_safe_system_args(@args)
- assert_equal %w[foo bar -q baz], expanded_args
- end
-
- def test_expand_safe_system_args_does_not_mutate_argument
- result = @strategy.expand_safe_system_args(@args)
- assert_equal %w[foo bar baz], @args
- refute_same @args, result
- end
-
- def test_source_modified_time
- mktemp "mtime" do
- touch "foo", mtime: Time.now - 10
- touch "bar", mtime: Time.now - 100
- ln_s "not-exist", "baz"
- assert_equal File.mtime("foo"), @strategy.source_modified_time
- end
- end
-end
-
-class VCSDownloadStrategyTests < Homebrew::TestCase
- def test_cache_filename
- resource = ResourceDouble.new("http://example.com/bar")
- strategy = Class.new(VCSDownloadStrategy) do
- def cache_tag
- "foo"
- end
- end
- downloader = strategy.new("baz", resource)
- assert_equal HOMEBREW_CACHE.join("baz--foo"), downloader.cached_location
- end
-end
-
-class GitHubPrivateRepositoryDownloadStrategyTests < Homebrew::TestCase
- def setup
- super
- resource = ResourceDouble.new("https://github.com/owner/repo/archive/1.1.5.tar.gz")
- ENV["HOMEBREW_GITHUB_API_TOKEN"] = "token"
- GitHub.stubs(:repository).returns {}
- @strategy = GitHubPrivateRepositoryDownloadStrategy.new("foo", resource)
- end
-
- def test_set_github_token
- assert_equal "token", @strategy.instance_variable_get(:@github_token)
- end
-
- def test_parse_url_pattern
- assert_equal "owner", @strategy.instance_variable_get(:@owner)
- assert_equal "repo", @strategy.instance_variable_get(:@repo)
- assert_equal "archive/1.1.5.tar.gz", @strategy.instance_variable_get(:@filepath)
- end
-
- def test_download_url
- expected = "https://token@github.com/owner/repo/archive/1.1.5.tar.gz"
- assert_equal expected, @strategy.download_url
- end
-end
-
-class GitHubPrivateRepositoryReleaseDownloadStrategyTests < Homebrew::TestCase
- def setup
- super
- resource = ResourceDouble.new("https://github.com/owner/repo/releases/download/tag/foo_v0.1.0_darwin_amd64.tar.gz")
- ENV["HOMEBREW_GITHUB_API_TOKEN"] = "token"
- GitHub.stubs(:repository).returns {}
- @strategy = GitHubPrivateRepositoryReleaseDownloadStrategy.new("foo", resource)
- end
-
- def test_parse_url_pattern
- assert_equal "owner", @strategy.instance_variable_get(:@owner)
- assert_equal "repo", @strategy.instance_variable_get(:@repo)
- assert_equal "tag", @strategy.instance_variable_get(:@tag)
- assert_equal "foo_v0.1.0_darwin_amd64.tar.gz", @strategy.instance_variable_get(:@filename)
- end
-
- def test_download_url
- @strategy.stubs(:resolve_asset_id).returns(456)
- expected = "https://token@api.github.com/repos/owner/repo/releases/assets/456"
- assert_equal expected, @strategy.download_url
- end
-
- def test_resolve_asset_id
- release_metadata = {
- "assets" => [
- {
- "id" => 123,
- "name" => "foo_v0.1.0_linux_amd64.tar.gz",
- },
- {
- "id" => 456,
- "name" => "foo_v0.1.0_darwin_amd64.tar.gz",
- },
- ],
- }
- @strategy.stubs(:fetch_release_metadata).returns(release_metadata)
- assert_equal 456, @strategy.send(:resolve_asset_id)
- end
-
- def test_fetch_release_metadata
- expected_release_url = "https://api.github.com/repos/owner/repo/releases/tags/tag"
- github_mock = MiniTest::Mock.new
- github_mock.expect :call, {}, [expected_release_url]
- GitHub.stub :open, github_mock do
- @strategy.send(:fetch_release_metadata)
- end
- github_mock.verify
- end
-end
-
-class GitDownloadStrategyTests < Homebrew::TestCase
- include FileUtils
-
- def setup
- super
- resource = ResourceDouble.new("https://github.com/homebrew/foo")
- @commit_id = 1
- @strategy = GitDownloadStrategy.new("baz", resource)
- @cached_location = @strategy.cached_location
- mkpath @cached_location
- end
-
- def git_commit_all
- shutup do
- system "git", "add", "--all"
- system "git", "commit", "-m", "commit number #{@commit_id}"
- @commit_id += 1
- end
- end
-
- def setup_git_repo
- @cached_location.cd do
- shutup do
- system "git", "init"
- system "git", "remote", "add", "origin", "https://github.com/Homebrew/homebrew-foo"
- end
- touch "README"
- git_commit_all
- end
- end
-
- def test_github_git_download_strategy_user_repo
- resource = ResourceDouble.new("https://github.com/homebrew/brew.git")
- strategy = GitHubGitDownloadStrategy.new("brew", resource)
-
- assert_equal strategy.instance_variable_get(:@user), "homebrew"
- assert_equal strategy.instance_variable_get(:@repo), "brew"
- end
-
- def test_source_modified_time
- setup_git_repo
- assert_equal 1_485_115_153, @strategy.source_modified_time.to_i
- end
-
- def test_last_commit
- setup_git_repo
- @cached_location.cd do
- touch "LICENSE"
- git_commit_all
- end
- assert_equal "f68266e", @strategy.last_commit
- end
-
- def test_fetch_last_commit
- remote_repo = HOMEBREW_PREFIX.join("remote_repo")
- remote_repo.mkdir
-
- resource = ResourceDouble.new("file://#{remote_repo}")
- resource.instance_variable_set(:@version, Version.create("HEAD"))
- @strategy = GitDownloadStrategy.new("baz", resource)
-
- remote_repo.cd do
- shutup do
- system "git", "init"
- system "git", "remote", "add", "origin", "https://github.com/Homebrew/homebrew-foo"
- end
- touch "README"
- git_commit_all
- touch "LICENSE"
- git_commit_all
- end
-
- @strategy.shutup!
- assert_equal "f68266e", @strategy.fetch_last_commit
- ensure
- remote_repo.rmtree if remote_repo.directory?
- end
-end
-
-class DownloadStrategyDetectorTests < Homebrew::TestCase
- def setup
- super
- @d = DownloadStrategyDetector.new
- end
-
- def test_detect_git_download_startegy
- @d = DownloadStrategyDetector.detect("git://example.com/foo.git")
- assert_equal GitDownloadStrategy, @d
- end
-
- def test_detect_github_git_download_strategy
- @d = DownloadStrategyDetector.detect("https://github.com/homebrew/brew.git")
- assert_equal GitHubGitDownloadStrategy, @d
- end
-
- def test_default_to_curl_strategy
- @d = DownloadStrategyDetector.detect(Object.new)
- assert_equal CurlDownloadStrategy, @d
- end
-
- def test_raises_when_passed_unrecognized_strategy
- assert_raises(TypeError) do
- DownloadStrategyDetector.detect("foo", Class.new)
- end
- end
-end
diff --git a/Library/Homebrew/test/gpg_spec.rb b/Library/Homebrew/test/gpg_spec.rb
new file mode 100644
index 000000000..9809dccb5
--- /dev/null
+++ b/Library/Homebrew/test/gpg_spec.rb
@@ -0,0 +1,21 @@
+require "gpg"
+
+describe Gpg do
+ subject { described_class }
+
+ describe "::create_test_key" do
+ it "creates a test key in the home directory" do
+ skip "GPG Unavailable" unless subject.available?
+
+ Dir.mktmpdir do |dir|
+ ENV["HOME"] = dir
+ dir = Pathname.new(dir)
+
+ shutup do
+ subject.create_test_key(dir)
+ end
+ expect(dir/".gnupg/secring.gpg").to exist
+ end
+ end
+ end
+end
diff --git a/Library/Homebrew/test/gpg_test.rb b/Library/Homebrew/test/gpg_test.rb
deleted file mode 100644
index ea4372549..000000000
--- a/Library/Homebrew/test/gpg_test.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-require "testing_env"
-require "gpg"
-
-class GpgTest < Homebrew::TestCase
- def setup
- super
- skip "GPG Unavailable" unless Gpg.available?
- @dir = Pathname.new(mktmpdir)
- end
-
- def test_create_test_key
- Dir.chdir(@dir) do
- ENV["HOME"] = @dir
- shutup { Gpg.create_test_key(@dir) }
- assert_predicate @dir/".gnupg/secring.gpg", :exist?
- end
- end
-end
diff --git a/Library/Homebrew/test/java_requirement_test.rb b/Library/Homebrew/test/java_requirement_test.rb
new file mode 100644
index 000000000..d0b51f92c
--- /dev/null
+++ b/Library/Homebrew/test/java_requirement_test.rb
@@ -0,0 +1,50 @@
+require "testing_env"
+require "requirements/java_requirement"
+
+class JavaRequirementTests < Homebrew::TestCase
+ def setup
+ super
+ ENV["JAVA_HOME"] = nil
+ end
+
+ def test_message
+ a = JavaRequirement.new([])
+ assert_match(/Java is required to install this formula./, a.message)
+ end
+
+ def test_inspect
+ a = JavaRequirement.new(%w[1.7+])
+ assert_equal a.inspect, '#<JavaRequirement: "java" [] version="1.7+">'
+ end
+
+ def test_display_s
+ x = JavaRequirement.new([])
+ assert_equal x.display_s, "java"
+ y = JavaRequirement.new(%w[1.8])
+ assert_equal y.display_s, "java = 1.8"
+ z = JavaRequirement.new(%w[1.8+])
+ assert_equal z.display_s, "java >= 1.8"
+ end
+
+ def test_satisfied?
+ a = JavaRequirement.new(%w[1.8])
+ File.stubs(:executable?).returns(false)
+ refute_predicate a, :satisfied?
+
+ b = JavaRequirement.new([])
+ b.stubs(:preferred_java).returns(Pathname.new("/usr/bin/java"))
+ assert_predicate b, :satisfied?
+
+ c = JavaRequirement.new(%w[1.7+])
+ c.stubs(:possible_javas).returns([Pathname.new("/usr/bin/java")])
+ Utils.stubs(:popen_read).returns('java version "1.6.0_5"')
+ refute_predicate c, :satisfied?
+ Utils.stubs(:popen_read).returns('java version "1.8.0_5"')
+ assert_predicate c, :satisfied?
+
+ d = JavaRequirement.new(%w[1.7])
+ d.stubs(:possible_javas).returns([Pathname.new("/usr/bin/java")])
+ Utils.stubs(:popen_read).returns('java version "1.8.0_5"')
+ refute_predicate d, :satisfied?
+ end
+end
diff --git a/Library/Homebrew/test/os/mac/java_requirement_test.rb b/Library/Homebrew/test/os/mac/java_requirement_test.rb
new file mode 100644
index 000000000..83c1af95c
--- /dev/null
+++ b/Library/Homebrew/test/os/mac/java_requirement_test.rb
@@ -0,0 +1,31 @@
+require "testing_env"
+require "requirements/java_requirement"
+require "fileutils"
+
+class OSMacJavaRequirementTests < Homebrew::TestCase
+ def setup
+ super
+ @java_req = JavaRequirement.new(%w[1.8])
+ @tmp_java_home = mktmpdir
+ @tmp_pathname = Pathname.new(@tmp_java_home)
+ FileUtils.mkdir @tmp_pathname/"bin"
+ FileUtils.touch @tmp_pathname/"bin/java"
+ @java_req.stubs(:preferred_java).returns(@tmp_pathname/"bin/java")
+ @java_req.satisfied?
+ end
+
+ def test_java_env_apple
+ ENV.expects(:prepend_path)
+ ENV.expects(:append_to_cflags)
+ @java_req.modify_build_environment
+ assert_equal ENV["JAVA_HOME"], @tmp_java_home
+ end
+
+ def test_java_env_oracle
+ FileUtils.mkdir @tmp_pathname/"include"
+ ENV.expects(:prepend_path)
+ ENV.expects(:append_to_cflags).twice
+ @java_req.modify_build_environment
+ assert_equal ENV["JAVA_HOME"], @tmp_java_home
+ end
+end