diff options
author | Tyler Ball <tyleraball@gmail.com> | 2014-10-07 16:38:59 -0700 |
---|---|---|
committer | Tyler Ball <tyleraball@gmail.com> | 2014-10-07 16:38:59 -0700 |
commit | 1343bdfff0d54e20b923211f6697d42c484c1627 (patch) | |
tree | 382ffff1af107eaf08e830e9ff89d03d0b3ea4e9 /spec | |
parent | 624a7d31dbc84c3cc8cf4c85f0cc4311b5d53be5 (diff) | |
parent | e6a9db3bdadcbef85951677bcc2f7cf7470a9a6c (diff) | |
download | chef-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.rb | 65 | ||||
-rw-r--r-- | spec/unit/mixin/homebrew_user_spec.rb | 100 | ||||
-rw-r--r-- | spec/unit/provider/package/homebrew_spec.rb | 14 | ||||
-rw-r--r-- | spec/unit/resource/homebrew_package_spec.rb | 21 |
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 |