Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check that a single uninstall_* and zap stanza is defined #3389

Merged
merged 6 commits into from Nov 3, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
32 changes: 32 additions & 0 deletions Library/Homebrew/cask/lib/hbc/audit.rb
Expand Up @@ -31,6 +31,8 @@ def run!
check_generic_artifacts
check_token_conflicts
check_download
check_single_pre_postflight
check_single_uninstall_zap
self
rescue StandardError => e
odebug "#{e.message}\n#{e.backtrace.join("\n")}"
Expand All @@ -48,6 +50,36 @@ def summary_header

private

def check_single_pre_postflight
odebug "Auditing preflight and postflight stanzas"

if cask.artifacts.count { |k| k.is_a?(Hbc::Artifact::PreflightBlock) && k.directives.key?(:preflight) } > 1
add_warning "only a single preflight stanza is allowed"
end

return unless cask.artifacts.count { |k| k.is_a?(Hbc::Artifact::PostflightBlock) && k.directives.key?(:postflight) } > 1
add_warning "only a single postflight stanza is allowed"
end

def check_single_uninstall_zap
odebug "Auditing single uninstall_* and zap stanzas"

if cask.artifacts.count { |k| k.is_a?(Hbc::Artifact::Uninstall) } > 1
add_warning "only a single uninstall stanza is allowed"
end

if cask.artifacts.count { |k| k.is_a?(Hbc::Artifact::PreflightBlock) && k.directives.key?(:uninstall_preflight) } > 1
add_warning "only a single uninstall_preflight stanza is allowed"
end

if cask.artifacts.count { |k| k.is_a?(Hbc::Artifact::PostflightBlock) && k.directives.key?(:uninstall_postflight) } > 1
add_warning "only a single uninstall_postflight stanza is allowed"
end

return unless cask.artifacts.count { |k| k.is_a?(Hbc::Artifact::Zap) } > 1
add_warning "only a single zap stanza is allowed"
end

def check_required_stanzas
odebug "Auditing required stanzas"
[:version, :sha256, :url, :homepage].each do |sym|
Expand Down
114 changes: 114 additions & 0 deletions Library/Homebrew/test/cask/audit_spec.rb
Expand Up @@ -91,6 +91,120 @@ def include_msg?(messages, msg)
end
end

describe "preflight stanza checks" do
let(:error_msg) { "only a single preflight stanza is allowed" }

context "when the cask has no preflight stanza" do
let(:cask_token) { "with-zap-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has only one preflight stanza" do
let(:cask_token) { "with-preflight" }
it { should_not warn_with(error_msg) }
end

context "when the cask has multiple preflight stanzas" do
let(:cask_token) { "with-preflight-multi" }
it { is_expected.to warn_with(error_msg) }
end
end

describe "uninstall_postflight stanza checks" do
let(:error_msg) { "only a single postflight stanza is allowed" }

context "when the cask has no postflight stanza" do
let(:cask_token) { "with-zap-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has only one postflight stanza" do
let(:cask_token) { "with-postflight" }
it { should_not warn_with(error_msg) }
end

context "when the cask has multiple postflight stanzas" do
let(:cask_token) { "with-postflight-multi" }
it { is_expected.to warn_with(error_msg) }
end
end

describe "uninstall stanza checks" do
let(:error_msg) { "only a single uninstall stanza is allowed" }

context "when the cask has no uninstall stanza" do
let(:cask_token) { "with-zap-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has only one uninstall stanza" do
let(:cask_token) { "with-uninstall-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has multiple uninstall stanzas" do
let(:cask_token) { "with-uninstall-multi" }
it { is_expected.to warn_with(error_msg) }
end
end

describe "uninstall_preflight stanza checks" do
let(:error_msg) { "only a single uninstall_preflight stanza is allowed" }

context "when the cask has no uninstall_preflight stanza" do
let(:cask_token) { "with-zap-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has only one uninstall_preflight stanza" do
let(:cask_token) { "with-uninstall-preflight" }
it { should_not warn_with(error_msg) }
end

context "when the cask has multiple uninstall_preflight stanzas" do
let(:cask_token) { "with-uninstall-preflight-multi" }
it { is_expected.to warn_with(error_msg) }
end
end

describe "uninstall_postflight stanza checks" do
let(:error_msg) { "only a single uninstall_postflight stanza is allowed" }

context "when the cask has no uninstall_postflight stanza" do
let(:cask_token) { "with-zap-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has only one uninstall_postflight stanza" do
let(:cask_token) { "with-uninstall-postflight" }
it { should_not warn_with(error_msg) }
end

context "when the cask has multiple uninstall_postflight stanzas" do
let(:cask_token) { "with-uninstall-postflight-multi" }
it { is_expected.to warn_with(error_msg) }
end
end

describe "zap stanza checks" do
let(:error_msg) { "only a single zap stanza is allowed" }

context "when the cask has no zap stanza" do
let(:cask_token) { "with-uninstall-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has only one zap stanza" do
let(:cask_token) { "with-zap-rmdir" }
it { should_not warn_with(error_msg) }
end

context "when the cask has multiple zap stanzas" do
let(:cask_token) { "with-zap-multi" }
it { is_expected.to warn_with(error_msg) }
end
end

describe "version checks" do
let(:error_msg) { "you should use version :latest instead of version 'latest'" }

Expand Down
@@ -0,0 +1,15 @@
cask 'with-postflight-multi' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

postflight do
end

postflight do
end
end
@@ -0,0 +1,12 @@
cask 'with-postflight' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

postflight do
end
end
@@ -0,0 +1,15 @@
cask 'with-preflight-multi' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

preflight do
end

preflight do
end
end
@@ -0,0 +1,12 @@
cask 'with-preflight' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

preflight do
end
end
@@ -0,0 +1,13 @@
cask 'with-uninstall-multi' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

uninstall rmdir: "#{TEST_TMPDIR}/empty_directory_path"

uninstall delete: "#{TEST_TMPDIR}/empty_directory_path"
end
@@ -0,0 +1,15 @@
cask 'with-uninstall-postflight-multi' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

uninstall_postflight do
end

uninstall_postflight do
end
end
@@ -0,0 +1,12 @@
cask 'with-uninstall-postflight' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

uninstall_postflight do
end
end
@@ -0,0 +1,15 @@
cask 'with-uninstall-preflight-multi' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

uninstall_preflight do
end

uninstall_preflight do
end
end
@@ -0,0 +1,12 @@
cask 'with-uninstall-preflight' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

uninstall_preflight do
end
end
@@ -0,0 +1,13 @@
cask 'with-zap-multi' do
version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'

url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip"
homepage 'http://example.com/fancy-pkg'

pkg 'MyFancyPkg/Fancy.pkg'

zap rmdir: "#{TEST_TMPDIR}/empty_directory_path"

zap delete: "#{TEST_TMPDIR}/empty_directory_path"
end