aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/test
diff options
context:
space:
mode:
authorMarkus Reiter2017-03-11 12:02:24 +0100
committerGitHub2017-03-11 12:02:24 +0100
commit30a2f270b90e5a528d14c26aa44991f8b7b44fee (patch)
treee9e3dd14ef3dff810b50a7395c4e6b46f17503ce /Library/Homebrew/test
parent76db07e1b5ef096317701a95285b04aa7bf83187 (diff)
parent642e355b4f042de80a78036f66d5810dc392cfdc (diff)
downloadbrew-30a2f270b90e5a528d14c26aa44991f8b7b44fee.tar.bz2
Merge pull request #2303 from reitermarkus/fix-pkg-not-uninstalling-apps
Fix `uninstall :pkgutil` leaving empty `.app` directories.
Diffstat (limited to 'Library/Homebrew/test')
-rw-r--r--Library/Homebrew/test/cask/artifact/uninstall_zap_shared_examples.rb97
-rw-r--r--Library/Homebrew/test/cask/pkg_spec.rb100
2 files changed, 84 insertions, 113 deletions
diff --git a/Library/Homebrew/test/cask/artifact/uninstall_zap_shared_examples.rb b/Library/Homebrew/test/cask/artifact/uninstall_zap_shared_examples.rb
index 2b69a06a8..69e015489 100644
--- a/Library/Homebrew/test/cask/artifact/uninstall_zap_shared_examples.rb
+++ b/Library/Homebrew/test/cask/artifact/uninstall_zap_shared_examples.rb
@@ -66,94 +66,23 @@ shared_examples "#uninstall_phase or #zap_phase" do
let(:fake_system_command) { class_double(Hbc::SystemCommand) }
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-#{artifact_name}-pkgutil.rb") }
+
let(:main_pkg_id) { "my.fancy.package.main" }
let(:agent_pkg_id) { "my.fancy.package.agent" }
- let(:main_files) do
- %w[
- fancy/bin/fancy.exe
- fancy/var/fancy.data
- ]
- end
- let(:main_dirs) do
- %w[
- fancy
- fancy/bin
- fancy/var
- ]
- end
- let(:agent_files) do
- %w[
- fancy/agent/fancy-agent.exe
- fancy/agent/fancy-agent.pid
- fancy/agent/fancy-agent.log
- ]
- end
- let(:agent_dirs) do
- %w[
- fancy
- fancy/agent
- ]
- end
- let(:pkg_info_plist) do
- <<-EOS.undent
- <?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>tmp</string>
- <key>volume</key>
- <string>/</string>
- </dict>
- </plist>
- EOS
- end
it "is supported" do
- allow(fake_system_command).to receive(:run).with(
- "/usr/sbin/pkgutil",
- args: ["--pkgs=my.fancy.package.*"],
- ).and_return(double(stdout: "#{main_pkg_id}\n#{agent_pkg_id}"))
-
- [
- [main_pkg_id, main_files, main_dirs],
- [agent_pkg_id, agent_files, agent_dirs],
- ].each do |pkg_id, pkg_files, pkg_dirs|
-
- allow(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--only-files", "--files", pkg_id.to_s],
- ).and_return(double(stdout: pkg_files.join("\n")))
-
- allow(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--only-dirs", "--files", pkg_id.to_s],
- ).and_return(double(stdout: pkg_dirs.join("\n")))
-
- allow(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--files", pkg_id.to_s],
- ).and_return(double(stdout: (pkg_files + pkg_dirs).join("\n")))
-
- result = Hbc::SystemCommand::Result.new(nil, pkg_info_plist, nil, 0)
- allow(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--pkg-info-plist", pkg_id.to_s],
- ).and_return(result)
-
- expect(fake_system_command).to receive(:run).with(
- "/usr/bin/xargs",
- args: ["-0", "--", "/bin/rm", "-f", "--"],
- input: pkg_files.map { |path| "/tmp/#{path}" }.join("\0"),
- sudo: true,
- )
-
- expect(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--forget", pkg_id.to_s],
- sudo: true,
- )
- end
+ main_pkg = Hbc::Pkg.new(main_pkg_id, fake_system_command)
+ agent_pkg = Hbc::Pkg.new(agent_pkg_id, fake_system_command)
+
+ expect(Hbc::Pkg).to receive(:all_matching).and_return(
+ [
+ main_pkg,
+ agent_pkg,
+ ],
+ )
+
+ expect(main_pkg).to receive(:uninstall)
+ expect(agent_pkg).to receive(:uninstall)
subject
end
diff --git a/Library/Homebrew/test/cask/pkg_spec.rb b/Library/Homebrew/test/cask/pkg_spec.rb
index a77ce85b9..9930cd00f 100644
--- a/Library/Homebrew/test/cask/pkg_spec.rb
+++ b/Library/Homebrew/test/cask/pkg_spec.rb
@@ -1,7 +1,7 @@
describe Hbc::Pkg, :cask do
describe "#uninstall" do
let(:fake_system_command) { Hbc::NeverSudoSystemCommand }
- let(:empty_response) { double(stdout: "") }
+ let(:empty_response) { double(stdout: "", plist: { "volume" => "/", "install-location" => "", "paths" => {} }) }
let(:pkg) { described_class.new("my.fake.pkg", fake_system_command) }
it "removes files and dirs referenced by the pkg" do
@@ -14,6 +14,9 @@ describe Hbc::Pkg, :cask do
some_dirs = Array.new(3) { Pathname.new(Dir.mktmpdir) }
allow(pkg).to receive(:pkgutil_bom_dirs).and_return(some_dirs)
+ root_dir = Pathname.new(Dir.mktmpdir)
+ allow(pkg).to receive(:root).and_return(root_dir)
+
allow(pkg).to receive(:forget)
pkg.uninstall
@@ -25,25 +28,15 @@ describe Hbc::Pkg, :cask do
some_dirs.each do |dir|
expect(dir).not_to exist
end
+
+ expect(root_dir).not_to exist
end
context "pkgutil" do
- let(:fake_system_command) { class_double(Hbc::SystemCommand) }
-
it "forgets the pkg" do
allow(fake_system_command).to receive(:run!).with(
"/usr/sbin/pkgutil",
- args: ["--only-files", "--files", "my.fake.pkg"],
- ).and_return(empty_response)
-
- allow(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--only-dirs", "--files", "my.fake.pkg"],
- ).and_return(empty_response)
-
- allow(fake_system_command).to receive(:run!).with(
- "/usr/sbin/pkgutil",
- args: ["--files", "my.fake.pkg"],
+ args: ["--export-plist", "my.fake.pkg"],
).and_return(empty_response)
expect(fake_system_command).to receive(:run!).with(
@@ -58,6 +51,7 @@ describe Hbc::Pkg, :cask do
it "removes broken symlinks" do
fake_dir = Pathname.new(Dir.mktmpdir)
+ fake_root = Pathname.new(Dir.mktmpdir)
fake_file = fake_dir.join("ima_file").tap { |path| FileUtils.touch(path) }
intact_symlink = fake_dir.join("intact_symlink").tap { |path| path.make_symlink(fake_file) }
@@ -66,6 +60,7 @@ describe Hbc::Pkg, :cask do
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)
allow(pkg).to receive(:forget)
pkg.uninstall
@@ -73,24 +68,11 @@ describe Hbc::Pkg, :cask do
expect(intact_symlink).to exist
expect(broken_symlink).not_to exist
expect(fake_dir).to exist
- end
-
- it "removes files incorrectly reportes as directories" do
- fake_dir = Pathname.new(Dir.mktmpdir)
- fake_file = fake_dir.join("ima_file_pretending_to_be_a_dir").tap { |path| FileUtils.touch(path) }
-
- 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_file, fake_dir])
- allow(pkg).to receive(:forget)
-
- pkg.uninstall
-
- expect(fake_file).not_to exist
- expect(fake_dir).not_to exist
+ expect(fake_root).not_to exist
end
it "snags permissions on ornery dirs, but returns them afterwards" do
+ fake_root = Pathname.new(Dir.mktmpdir)
fake_dir = Pathname.new(Dir.mktmpdir)
fake_file = fake_dir.join("ima_installed_file").tap { |path| FileUtils.touch(path) }
fake_dir.chmod(0000)
@@ -98,6 +80,7 @@ describe Hbc::Pkg, :cask do
allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
allow(pkg).to receive(:pkgutil_bom_files).and_return([fake_file])
allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_dir])
+ allow(pkg).to receive(:root).and_return(fake_root)
allow(pkg).to receive(:forget)
shutup do
@@ -109,4 +92,63 @@ describe Hbc::Pkg, :cask do
expect((fake_dir.stat.mode % 01000).to_s(8)).to eq("0")
end
end
+
+ describe "#info" do
+ let(:fake_system_command) { class_double(Hbc::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
+ <<-EOS.undent
+ <?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>
+ #{(pkg_files + pkg_directories).map { |f| "<key>#{f}</key><dict></dict>" }.join("")}
+ </dict>
+ </dict>
+ </plist>
+ EOS
+ end
+
+ it "correctly parses a Property List" do
+ pkg = Hbc::Pkg.new(pkg_id, fake_system_command)
+
+ expect(fake_system_command).to receive(:run!).with(
+ "/usr/sbin/pkgutil",
+ args: ["--export-plist", pkg_id],
+ ).and_return(
+ Hbc::SystemCommand::Result.new(nil, pkg_info_plist, nil, 0),
+ )
+
+ 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
end