summaryrefslogtreecommitdiff
path: root/spec/unit/file_content_management
diff options
context:
space:
mode:
authordanielsdeleo <dan@opscode.com>2013-06-04 13:15:26 -0700
committerdanielsdeleo <dan@opscode.com>2013-06-06 16:47:45 -0700
commit48e77fddc2907577496903a678531285cc37207c (patch)
tree7957bc883db39ed9b386631a33b95260c51344f2 /spec/unit/file_content_management
parentc4631816132fcfefaba3d123a1d0dfe8bc2866bb (diff)
downloadchef-48e77fddc2907577496903a678531285cc37207c.tar.gz
Add unit level specs for mv (Unix) deploy strategy
Diffstat (limited to 'spec/unit/file_content_management')
-rw-r--r--spec/unit/file_content_management/deploy/mv_unix_spec.rb103
1 files changed, 103 insertions, 0 deletions
diff --git a/spec/unit/file_content_management/deploy/mv_unix_spec.rb b/spec/unit/file_content_management/deploy/mv_unix_spec.rb
new file mode 100644
index 0000000000..2be0abe7bb
--- /dev/null
+++ b/spec/unit/file_content_management/deploy/mv_unix_spec.rb
@@ -0,0 +1,103 @@
+#
+# Author:: Daniel DeLeo (<dan@opscode.com>)
+# Copyright:: Copyright (c) 2013 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# 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'
+
+describe Chef::FileContentManagement::Deploy::MvUnix do
+
+ let(:content_deployer) { described_class.new }
+ let(:target_file_path) { "/etc/my_app.conf" }
+
+ describe "creating the file" do
+
+ it "touches the file to create it" do
+ FileUtils.should_receive(:touch).with(target_file_path)
+ content_deployer.create(target_file_path)
+ end
+ end
+
+ describe "updating the file" do
+
+ let(:staging_file_path) { "/tmp/random-dir/staging-file.tmp" }
+
+ let(:target_file_mode) { 0644 }
+ let(:target_file_stat) do
+ mock "File::Stat struct for target file",
+ :mode => target_file_mode,
+ :uid => target_file_uid,
+ :gid => target_file_gid
+ end
+
+ before do
+ File.should_receive(:stat).with(target_file_path).and_return(target_file_stat)
+ File.should_receive(:chmod).with(target_file_mode, staging_file_path).and_return(1)
+ FileUtils.should_receive(:mv).with(staging_file_path, target_file_path)
+ end
+
+ # This context represents the case where:
+ # * Chef runs as root
+ # * The owner and group of the target file match the owner and group of the
+ # staging file.
+ context "when the user has permissions to set file ownership" do
+
+ # For the purposes of this test, the uid/gid can be anything. These
+ # values are just chosen because (assuming chef-client's euid == 1001 and
+ # egid == 1001), the `chown` call is allowed by the OS. See the
+ # description of `EPERM` in `man 2 chown` for reference.
+ let(:target_file_uid) { 1001 }
+ let(:target_file_gid) { 1001 }
+
+ before do
+ File.should_receive(:chown).with(target_file_uid, nil, staging_file_path).and_return(1)
+ File.should_receive(:chown).with(nil, target_file_gid, staging_file_path).and_return(1)
+ end
+
+ it "fixes up permissions and moves the file into place" do
+ content_deployer.deploy(staging_file_path, target_file_path)
+ end
+
+ end
+
+ context "when the user does not have permissions to set file ownership" do
+
+ # The test code does not care what these values are. These values are
+ # chosen because they're representitive of the case that chef-client is
+ # running as non-root and is managing a file that got ownership set to
+ # root somehow. In this example, gid==20 is something like "staff" which
+ # the user running chef-client is a member of (but it's not that user's
+ # primary group).
+ let(:target_file_uid) { 0 }
+ let(:target_file_gid) { 20 }
+
+ before do
+ File.should_receive(:chown).with(target_file_uid, nil, staging_file_path).and_raise(Errno::EPERM)
+ File.should_receive(:chown).with(nil, target_file_gid, staging_file_path).and_raise(Errno::EPERM)
+
+ Chef::Log.should_receive(:warn).with(/^Could not set uid/)
+ Chef::Log.should_receive(:warn).with(/^Could not set gid/)
+ end
+
+ it "fixes up permissions and moves the file into place" do
+ content_deployer.deploy(staging_file_path, target_file_path)
+ end
+ end
+
+ end
+end
+
+