summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorTyler Ball <tyleraball@gmail.com>2014-10-07 16:38:59 -0700
committerTyler Ball <tyleraball@gmail.com>2014-10-07 16:38:59 -0700
commit1343bdfff0d54e20b923211f6697d42c484c1627 (patch)
tree382ffff1af107eaf08e830e9ff89d03d0b3ea4e9 /spec
parent624a7d31dbc84c3cc8cf4c85f0cc4311b5d53be5 (diff)
parente6a9db3bdadcbef85951677bcc2f7cf7470a9a6c (diff)
downloadchef-1343bdfff0d54e20b923211f6697d42c484c1627.tar.gz
Merge pull request #2102 from opscode/tball/homebrew-owner
`brew` command now ran as user owning executable
Diffstat (limited to 'spec')
-rw-r--r--spec/unit/mixin/homebrew_owner_spec.rb65
-rw-r--r--spec/unit/mixin/homebrew_user_spec.rb100
-rw-r--r--spec/unit/provider/package/homebrew_spec.rb14
-rw-r--r--spec/unit/resource/homebrew_package_spec.rb21
4 files changed, 131 insertions, 69 deletions
diff --git a/spec/unit/mixin/homebrew_owner_spec.rb b/spec/unit/mixin/homebrew_owner_spec.rb
deleted file mode 100644
index 428cd827d9..0000000000
--- a/spec/unit/mixin/homebrew_owner_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# Author:: Joshua Timberman (<joshua@getchef.com>)
-#
-# Copyright 2014, Chef Software, Inc <legal@getchef.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-require 'spec_helper'
-require 'chef/mixin/homebrew_owner'
-
-class ExampleHomebrewOwner
- include Chef::Mixin::HomebrewOwner
-end
-
-describe Chef::Mixin::HomebrewOwner do
- before(:each) do
- node.default['homebrew']['owner'] = nil
- end
-
- let(:homebrew_owner) { ExampleHomebrewOwner.new }
- let(:node) { Chef::Node.new }
-
- describe 'when the homebrew owner node attribute is set' do
- it 'raises an exception if the owner is root' do
- node.default['homebrew']['owner'] = 'root'
- expect { homebrew_owner.homebrew_owner(node) }.to raise_exception(Chef::Exceptions::CannotDetermineHomebrewOwner)
- end
-
- it 'returns the owner set by attribute' do
- node.default['homebrew']['owner'] = 'siouxsie'
- expect(homebrew_owner.homebrew_owner(node)).to eql('siouxsie')
- end
- end
-
- describe 'when the owner attribute is not set and we use sudo' do
- before(:each) do
- ENV.stub(:[]).with('SUDO_USER').and_return('john_lydon')
- end
-
- it 'uses the SUDO_USER environment variable' do
- expect(homebrew_owner.homebrew_owner(node)).to eql('john_lydon')
- end
- end
-
- describe 'when the owner attribute is not set and we arent using sudo' do
- before(:each) do
- ENV.stub(:[]).with('USER').and_return('sid_vicious')
- ENV.stub(:[]).with('SUDO_USER').and_return(nil)
- end
-
- it 'uses the current user' do
- expect(homebrew_owner.homebrew_owner(node)).to eql('sid_vicious')
- end
- end
-end
diff --git a/spec/unit/mixin/homebrew_user_spec.rb b/spec/unit/mixin/homebrew_user_spec.rb
new file mode 100644
index 0000000000..4e30455765
--- /dev/null
+++ b/spec/unit/mixin/homebrew_user_spec.rb
@@ -0,0 +1,100 @@
+#
+# Author:: Joshua Timberman (<joshua@getchef.com>)
+#
+# Copyright 2014, Chef Software, Inc <legal@getchef.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'spec_helper'
+require 'chef/mixin/homebrew_user'
+
+class ExampleHomebrewUser
+ include Chef::Mixin::HomebrewUser
+end
+
+describe Chef::Mixin::HomebrewUser do
+ before(:each) do
+ node.default['homebrew']['owner'] = nil
+ end
+
+ let(:homebrew_user) { ExampleHomebrewUser.new }
+ let(:node) { Chef::Node.new }
+
+ describe 'when the homebrew user is provided' do
+ let(:uid) { 1001 }
+ let(:user) { "foo" }
+
+ it 'returns the homebrew user without looking at the file when uid is provided' do
+ expect(File).to receive(:exist?).exactly(0).times
+ expect(homebrew_user.find_homebrew_uid(uid)).to eq(uid)
+ end
+
+ it 'returns the homebrew user without looking at the file when name is provided' do
+ expect(File).to receive(:exist?).exactly(0).times
+ Etc.stub_chain(:getpwnam, :uid).and_return(uid)
+ expect(homebrew_user.find_homebrew_uid(user)).to eq(uid)
+ end
+
+ end
+
+ shared_examples "successfully find executable" do
+ let(:user) { nil }
+ let(:brew_owner) { 2001 }
+ let(:default_brew_path) { '/usr/local/bin/brew' }
+ let(:stat_double) {
+ d = double()
+ expect(d).to receive(:uid).and_return(brew_owner)
+ d
+ }
+
+ context "debug statement prints owner name" do
+
+ before do
+ expect(Etc).to receive(:getpwuid).with(brew_owner).and_return(OpenStruct.new(:name => "name"))
+ end
+
+ it 'returns the owner of the brew executable when it is at a default location' do
+ expect(File).to receive(:exist?).with(default_brew_path).and_return(true)
+ expect(File).to receive(:stat).with(default_brew_path).and_return(stat_double)
+ expect(homebrew_user.find_homebrew_uid(user)).to eq(brew_owner)
+ end
+
+ it 'returns the owner of the brew executable when it is not at a default location' do
+ expect(File).to receive(:exist?).with(default_brew_path).and_return(false)
+ homebrew_user.stub_chain(:shell_out, :stdout, :strip).and_return("/foo")
+ expect(File).to receive(:stat).with("/foo").and_return(stat_double)
+ expect(homebrew_user.find_homebrew_uid(user)).to eq(brew_owner)
+ end
+
+ end
+ end
+
+ describe 'when the homebrew user is not provided' do
+
+ it 'raises an error if no executable is found' do
+ expect(File).to receive(:exist?).with(default_brew_path).and_return(false)
+ homebrew_user.stub_chain(:shell_out, :stdout, :strip).and_return("")
+ expect { homebrew_user.find_homebrew_uid(user) }.to raise_error(Chef::Exceptions::CannotDetermineHomebrewOwner)
+ end
+
+ include_examples "successfully find executable"
+
+ context "the executable is owned by root" do
+ include_examples "successfully find executable" do
+ let(:brew_owner) { 0 }
+ end
+ end
+
+ end
+
+end
diff --git a/spec/unit/provider/package/homebrew_spec.rb b/spec/unit/provider/package/homebrew_spec.rb
index 9f105c13b8..d38458546d 100644
--- a/spec/unit/provider/package/homebrew_spec.rb
+++ b/spec/unit/provider/package/homebrew_spec.rb
@@ -28,6 +28,8 @@ describe Chef::Provider::Package::Homebrew do
Chef::Provider::Package::Homebrew.new(new_resource, run_context)
end
+ let(:homebrew_uid) { 1001 }
+
let(:uninstalled_brew_info) do
{
'name' => 'emacs',
@@ -92,8 +94,7 @@ describe Chef::Provider::Package::Homebrew do
end
before(:each) do
- node.default['homebrew']['owner'] = 'sid_vicious'
- allow(Etc).to receive(:getpwnam).with('sid_vicious').and_return('/Users/sid_vicious')
+
end
describe 'load_current_resource' do
@@ -143,13 +144,18 @@ describe Chef::Provider::Package::Homebrew do
end
describe 'brew' do
+ before do
+ expect(provider).to receive(:find_homebrew_uid).and_return(homebrew_uid)
+ expect(Etc).to receive(:getpwuid).with(homebrew_uid).and_return(OpenStruct.new(:name => "name", :dir => "/"))
+ end
+
it 'passes a single to the brew command and return stdout' do
- allow(provider).to receive(:get_response_from_command).and_return('zombo')
+ allow(provider).to receive(:shell_out!).and_return(OpenStruct.new(:stdout => 'zombo'))
expect(provider.brew).to eql('zombo')
end
it 'takes multiple arguments as an array' do
- allow(provider).to receive(:get_response_from_command).and_return('homestarrunner')
+ allow(provider).to receive(:shell_out!).and_return(OpenStruct.new(:stdout => 'homestarrunner'))
expect(provider.brew('info', 'opts', 'bananas')).to eql('homestarrunner')
end
end
diff --git a/spec/unit/resource/homebrew_package_spec.rb b/spec/unit/resource/homebrew_package_spec.rb
index 4b4f9afe5e..bb657607b7 100644
--- a/spec/unit/resource/homebrew_package_spec.rb
+++ b/spec/unit/resource/homebrew_package_spec.rb
@@ -33,4 +33,25 @@ describe Chef::Resource::HomebrewPackage, 'initialize' do
expect(resource.provider).to eql(Chef::Provider::Package::Homebrew)
end
+ it 'sets the homebrew_user to nil' do
+ expect(resource.homebrew_user).to eql(nil)
+ end
+
+ shared_examples 'home_brew user set and returned' do
+ it 'returns the configured homebrew_user' do
+ resource.homebrew_user user
+ expect(resource.homebrew_user).to eql(user)
+ end
+ end
+
+ context 'homebrew_user is set' do
+ let(:user) { 'Captain Picard' }
+ include_examples 'home_brew user set and returned'
+
+ context 'as an integer' do
+ let(:user) { 1001 }
+ include_examples 'home_brew user set and returned'
+ end
+ end
+
end