
- Move HOMEBREW_TAP_DIRECTORY to startup/config.rb because this file holds more of the directory constants - Rename `Commands.cmd_directories` to `Commands.tap_cmd_directories` to better express that the commands come from taps This file has the directory constants while the other one has regexes. Just better organization.
136 lines
4.0 KiB
Ruby
136 lines
4.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "diagnostic"
|
|
|
|
RSpec.describe Homebrew::Diagnostic::Checks do
|
|
subject(:checks) { described_class.new }
|
|
|
|
specify "#inject_file_list" do
|
|
expect(checks.inject_file_list([], "foo:\n")).to eq("foo:\n")
|
|
expect(checks.inject_file_list(%w[/a /b], "foo:\n")).to eq("foo:\n /a\n /b\n")
|
|
end
|
|
|
|
specify "#check_access_directories" do
|
|
skip "User is root so everything is writable." if Process.euid.zero?
|
|
begin
|
|
dirs = [
|
|
HOMEBREW_CACHE,
|
|
HOMEBREW_CELLAR,
|
|
HOMEBREW_REPOSITORY,
|
|
HOMEBREW_LOGS,
|
|
HOMEBREW_LOCKS,
|
|
]
|
|
modes = {}
|
|
dirs.each do |dir|
|
|
modes[dir] = dir.stat.mode & 0777
|
|
dir.chmod 0555
|
|
expect(checks.check_access_directories).to match(dir.to_s)
|
|
end
|
|
ensure
|
|
modes.each do |dir, mode|
|
|
dir.chmod mode
|
|
end
|
|
end
|
|
end
|
|
|
|
specify "#check_user_path_1" do
|
|
bin = HOMEBREW_PREFIX/"bin"
|
|
sep = File::PATH_SEPARATOR
|
|
# ensure /usr/bin is before HOMEBREW_PREFIX/bin in the PATH
|
|
ENV["PATH"] = "/usr/bin#{sep}#{bin}#{sep}" +
|
|
ENV["PATH"].gsub(%r{(?:^|#{sep})(?:/usr/bin|#{bin})}, "")
|
|
|
|
# ensure there's at least one file with the same name in both /usr/bin/ and
|
|
# HOMEBREW_PREFIX/bin/
|
|
(bin/File.basename(Dir["/usr/bin/*"].first)).mkpath
|
|
|
|
expect(checks.check_user_path_1)
|
|
.to match("/usr/bin occurs before #{HOMEBREW_PREFIX}/bin")
|
|
end
|
|
|
|
specify "#check_user_path_2" do
|
|
ENV["PATH"] = ENV["PATH"].gsub \
|
|
%r{(?:^|#{File::PATH_SEPARATOR})#{HOMEBREW_PREFIX}/bin}o, ""
|
|
|
|
expect(checks.check_user_path_1).to be_nil
|
|
expect(checks.check_user_path_2)
|
|
.to match("Homebrew's \"bin\" was not found in your PATH.")
|
|
end
|
|
|
|
specify "#check_user_path_3" do
|
|
sbin = HOMEBREW_PREFIX/"sbin"
|
|
(sbin/"something").mkpath
|
|
|
|
homebrew_path =
|
|
"#{HOMEBREW_PREFIX}/bin#{File::PATH_SEPARATOR}" +
|
|
ENV["HOMEBREW_PATH"].gsub(/(?:^|#{Regexp.escape(File::PATH_SEPARATOR)})#{Regexp.escape(sbin)}/, "")
|
|
stub_const("ORIGINAL_PATHS", PATH.new(homebrew_path).filter_map { |path| Pathname.new(path).expand_path })
|
|
|
|
expect(checks.check_user_path_1).to be_nil
|
|
expect(checks.check_user_path_2).to be_nil
|
|
expect(checks.check_user_path_3)
|
|
.to match("Homebrew's \"sbin\" was not found in your PATH")
|
|
ensure
|
|
sbin.rmtree
|
|
end
|
|
|
|
specify "#check_for_symlinked_cellar" do
|
|
HOMEBREW_CELLAR.rmtree
|
|
|
|
mktmpdir do |path|
|
|
FileUtils.ln_s path, HOMEBREW_CELLAR
|
|
|
|
expect(checks.check_for_symlinked_cellar).to match(path)
|
|
end
|
|
ensure
|
|
HOMEBREW_CELLAR.unlink
|
|
HOMEBREW_CELLAR.mkpath
|
|
end
|
|
|
|
specify "#check_tmpdir" do
|
|
ENV["TMPDIR"] = "/i/don/t/exis/t"
|
|
expect(checks.check_tmpdir).to match("doesn't exist")
|
|
end
|
|
|
|
specify "#check_for_external_cmd_name_conflict" do
|
|
mktmpdir do |path1|
|
|
mktmpdir do |path2|
|
|
[path1, path2].each do |path|
|
|
cmd = "#{path}/brew-foo"
|
|
FileUtils.touch cmd
|
|
FileUtils.chmod 0755, cmd
|
|
end
|
|
|
|
allow(Commands).to receive(:tap_cmd_directories).and_return([path1, path2])
|
|
|
|
expect(checks.check_for_external_cmd_name_conflict)
|
|
.to match("brew-foo")
|
|
end
|
|
end
|
|
end
|
|
|
|
specify "#check_homebrew_prefix" do
|
|
allow(Homebrew).to receive(:default_prefix?).and_return(false)
|
|
expect(checks.check_homebrew_prefix)
|
|
.to match("Your Homebrew's prefix is not #{Homebrew::DEFAULT_PREFIX}")
|
|
end
|
|
|
|
specify "#check_for_unnecessary_core_tap" do
|
|
ENV.delete("HOMEBREW_DEVELOPER")
|
|
ENV.delete("HOMEBREW_NO_INSTALL_FROM_API")
|
|
|
|
expect_any_instance_of(CoreTap).to receive(:installed?).and_return(true)
|
|
|
|
expect(checks.check_for_unnecessary_core_tap).to match("You have an unnecessary local Core tap")
|
|
end
|
|
|
|
specify "#check_for_unnecessary_cask_tap" do
|
|
ENV.delete("HOMEBREW_DEVELOPER")
|
|
ENV.delete("HOMEBREW_NO_INSTALL_FROM_API")
|
|
|
|
expect_any_instance_of(CoreCaskTap).to receive(:installed?).and_return(true)
|
|
|
|
expect(checks.check_for_unnecessary_cask_tap).to match("unnecessary local Cask tap")
|
|
end
|
|
end
|