diff options
| author | Markus Reiter | 2017-03-11 12:02:24 +0100 |
|---|---|---|
| committer | GitHub | 2017-03-11 12:02:24 +0100 |
| commit | 30a2f270b90e5a528d14c26aa44991f8b7b44fee (patch) | |
| tree | e9e3dd14ef3dff810b50a7395c4e6b46f17503ce /Library/Homebrew/test | |
| parent | 76db07e1b5ef096317701a95285b04aa7bf83187 (diff) | |
| parent | 642e355b4f042de80a78036f66d5810dc392cfdc (diff) | |
| download | brew-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.rb | 97 | ||||
| -rw-r--r-- | Library/Homebrew/test/cask/pkg_spec.rb | 100 |
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 |
