diff options
| -rw-r--r-- | Library/Homebrew/cmd/update-report.rb | 10 | ||||
| -rw-r--r-- | Library/Homebrew/dev-cmd/audit.rb | 40 | ||||
| -rw-r--r-- | Library/Homebrew/extend/ARGV.rb | 2 | ||||
| -rw-r--r-- | Library/Homebrew/extend/os/linux/requirements/java_requirement.rb | 16 | ||||
| -rw-r--r-- | Library/Homebrew/extend/os/mac/requirements/java_requirement.rb | 35 | ||||
| -rw-r--r-- | Library/Homebrew/extend/os/requirements/java_requirement.rb | 7 | ||||
| -rw-r--r-- | Library/Homebrew/formula.rb | 7 | ||||
| -rw-r--r-- | Library/Homebrew/requirements/java_requirement.rb | 108 | ||||
| -rw-r--r-- | Library/Homebrew/test/download_strategies_spec.rb | 232 | ||||
| -rw-r--r-- | Library/Homebrew/test/download_strategies_test.rb | 245 | ||||
| -rw-r--r-- | Library/Homebrew/test/gpg_spec.rb | 21 | ||||
| -rw-r--r-- | Library/Homebrew/test/gpg_test.rb | 18 | ||||
| -rw-r--r-- | Library/Homebrew/test/java_requirement_test.rb | 50 | ||||
| -rw-r--r-- | Library/Homebrew/test/os/mac/java_requirement_test.rb | 31 |
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 |
