brew/Library/Homebrew/test/cask/pkg_spec.rb

172 lines
5.0 KiB
Ruby
Raw Normal View History

2020-10-10 14:16:11 +02:00
# typed: false
# frozen_string_literal: true
2018-09-06 08:29:14 +02:00
describe Cask::Pkg, :cask do
2017-03-08 03:03:49 +01:00
describe "#uninstall" do
let(:fake_system_command) { NeverSudoSystemCommand }
2017-03-10 08:24:40 +01:00
let(:empty_response) { double(stdout: "", plist: { "volume" => "/", "install-location" => "", "paths" => {} }) }
2017-02-08 09:58:38 +01:00
let(:pkg) { described_class.new("my.fake.pkg", fake_system_command) }
it "removes files and dirs referenced by the pkg" do
some_files = Array.new(3) { Pathname.new(Tempfile.new("plain_file").path) }
allow(pkg).to receive(:pkgutil_bom_files).and_return(some_files)
some_specials = Array.new(3) { Pathname.new(Tempfile.new("special_file").path) }
allow(pkg).to receive(:pkgutil_bom_specials).and_return(some_specials)
some_dirs = Array.new(3) { mktmpdir }
allow(pkg).to receive(:pkgutil_bom_dirs).and_return(some_dirs)
root_dir = Pathname.new(mktmpdir)
allow(pkg).to receive(:root).and_return(root_dir)
allow(pkg).to receive(:forget)
pkg.uninstall
some_files.each do |file|
expect(file).not_to exist
end
some_dirs.each do |dir|
expect(dir).not_to exist
end
expect(root_dir).not_to exist
end
describe "pkgutil" do
2017-02-08 09:58:38 +01:00
it "forgets the pkg" do
allow(fake_system_command).to receive(:run!).with(
"/usr/sbin/pkgutil",
args: ["--pkg-info-plist", "my.fake.pkg"],
).and_return(empty_response)
expect(fake_system_command).to receive(:run!).with(
"/usr/sbin/pkgutil",
args: ["--files", "my.fake.pkg"],
2017-02-08 09:58:38 +01:00
).and_return(empty_response)
expect(fake_system_command).to receive(:run!).with(
"/usr/sbin/pkgutil",
args: ["--forget", "my.fake.pkg"],
sudo: true,
2017-02-08 09:58:38 +01:00
)
pkg.uninstall
end
end
it "removes broken symlinks" do
fake_root = mktmpdir
fake_dir = mktmpdir
fake_file = fake_dir.join("ima_file").tap do |path|
FileUtils.touch(path)
end
2017-02-08 09:58:38 +01:00
intact_symlink = fake_dir.join("intact_symlink").tap { |path| path.make_symlink(fake_file) }
broken_symlink = fake_dir.join("broken_symlink").tap { |path| path.make_symlink("im_nota_file") }
allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
allow(pkg).to receive(:pkgutil_bom_files).and_return([])
allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_dir])
allow(pkg).to receive(:root).and_return(fake_root)
2017-02-08 09:58:38 +01:00
allow(pkg).to receive(:forget)
pkg.uninstall
expect(intact_symlink).to exist
expect(broken_symlink).not_to exist
expect(fake_dir).to exist
expect(fake_root).not_to exist
2017-02-08 09:58:38 +01:00
end
it "snags permissions on ornery dirs, but returns them afterwards" do
fake_root = mktmpdir
fake_dir = mktmpdir
fake_file = fake_dir.join("ima_unrelated_file").tap { |path| FileUtils.touch(path) }
2017-02-08 09:58:38 +01:00
fake_dir.chmod(0000)
allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
allow(pkg).to receive(:pkgutil_bom_files).and_return([])
2017-02-08 09:58:38 +01:00
allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_dir])
allow(pkg).to receive(:root).and_return(fake_root)
2017-02-08 09:58:38 +01:00
allow(pkg).to receive(:forget)
2017-07-29 19:55:05 +02:00
pkg.uninstall
2017-02-08 09:58:38 +01:00
expect(fake_dir).to be_a_directory
expect((fake_dir.stat.mode % 01000)).to eq(0)
fake_dir.chmod(0777)
expect(fake_file).to be_a_file
FileUtils.rm_r fake_dir
2017-02-08 09:58:38 +01:00
end
end
describe "#info" do
let(:fake_system_command) { class_double(SystemCommand) }
let(:volume) { "/" }
let(:install_location) { "tmp" }
let(:pkg_id) { "my.fancy.package.main" }
let(:pkg_files) do
%w[
fancy/bin/fancy.exe
fancy/var/fancy.data
]
end
let(:pkg_directories) do
%w[
fancy
fancy/bin
fancy/var
]
end
let(:pkg_info_plist) do
2018-07-11 15:17:40 +02:00
<<~XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>install-location</key>
<string>#{install_location}</string>
<key>volume</key>
<string>#{volume}</string>
<key>paths</key>
<dict>
2018-06-14 22:48:37 +02:00
#{(pkg_files + pkg_directories).map { |f| "<key>#{f}</key><dict></dict>" }.join}
</dict>
</dict>
</plist>
2018-07-11 15:17:40 +02:00
XML
end
it "correctly parses a Property List" do
2019-07-23 17:09:57 +01:00
pkg = described_class.new(pkg_id, fake_system_command)
expect(fake_system_command).to receive(:run!).with(
"/usr/sbin/pkgutil",
2018-06-06 23:34:19 -04:00
args: ["--pkg-info-plist", pkg_id],
).and_return(
2020-11-23 02:05:50 +01:00
SystemCommand::Result.new(
["/usr/sbin/pkgutil", "--pkg-info-plist", pkg_id],
[[:stdout, pkg_info_plist]],
instance_double(Process::Status, exitstatus: 0),
secrets: [],
),
)
info = pkg.info
expect(info["install-location"]).to eq(install_location)
expect(info["volume"]).to eq(volume)
expect(info["paths"].keys).to eq(pkg_files + pkg_directories)
end
end
2017-02-08 09:58:38 +01:00
end