summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPete Higgins <pete@peterhiggins.org>2020-06-02 18:31:28 -0700
committerPete Higgins <pete@peterhiggins.org>2020-06-03 11:46:53 -0700
commitd302bc8a56db553045d28cd2467309247906d8dc (patch)
tree775cff50dafd36837b3df044c5a88a6e2c075cbe
parent6e81130508423bd94759e66b1b9099d76a23fdf7 (diff)
downloadchef-d302bc8a56db553045d28cd2467309247906d8dc.tar.gz
Adapt old tests from Script provider to Batch provider.
Signed-off-by: Pete Higgins <pete@peterhiggins.org>
-rw-r--r--spec/unit/provider/batch_spec.rb130
1 files changed, 130 insertions, 0 deletions
diff --git a/spec/unit/provider/batch_spec.rb b/spec/unit/provider/batch_spec.rb
new file mode 100644
index 0000000000..3ca1334489
--- /dev/null
+++ b/spec/unit/provider/batch_spec.rb
@@ -0,0 +1,130 @@
+#
+# Author:: Adam Jacob (adam@chef.io)
+# Copyright:: Copyright 2009-2016, Opscode
+# 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::Provider::Batch do
+ let(:node) do
+ node = Chef::Node.new
+ node.default["kernel"] = {}
+ node.default["kernel"][:machine] = :x86_64.to_s
+ node
+ end
+
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
+
+ let(:run_context) { Chef::RunContext.new(node, {}, events) }
+
+ let(:new_resource) do
+ new_resource = Chef::Resource::Batch.new("cmd.exe and conquer")
+ new_resource.code %q{echo "hello"}
+ new_resource
+ end
+
+ let(:provider) { Chef::Provider::Batch.new(new_resource, run_context) }
+
+ context "#grant_alternate_user_read_access" do
+ before do
+ allow(ChefUtils).to receive(:windows?).and_return(true)
+ stub_const("Chef::ReservedNames::Win32::API::Security::GENERIC_READ", 1)
+ stub_const("Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE", 4)
+ stub_const("Chef::ReservedNames::Win32::Security", Class.new)
+ stub_const("Chef::ReservedNames::Win32::Security::SecurableObject", Class.new)
+ stub_const("Chef::ReservedNames::Win32::Security::SID", Class.new)
+ stub_const("Chef::ReservedNames::Win32::Security::ACE", Class.new)
+ stub_const("Chef::ReservedNames::Win32::Security::ACL", Class.new)
+
+ provider.singleton_class.send(:public, :grant_alternate_user_read_access)
+ end
+
+ context "when an alternate user is not specified" do
+ it "does not attempt to set the script file's security descriptor" do
+ expect(provider).to receive(:grant_alternate_user_read_access)
+ expect(Chef::ReservedNames::Win32::Security::SecurableObject).not_to receive(:new)
+ provider.grant_alternate_user_read_access("a fake path")
+ end
+ end
+
+ context "when an alternate user is specified" do
+ let(:security_descriptor) { instance_double("Chef::ReservedNames::Win32::Security::SecurityDescriptor", dacl: []) }
+ let(:securable_object) { instance_double("Chef::ReservedNames::Win32::Security::SecurableObject", :security_descriptor => security_descriptor, :dacl= => nil) }
+
+ it "sets the script file's security descriptor" do
+ new_resource.user("toor")
+ expect(Chef::ReservedNames::Win32::Security::SecurableObject).to receive(:new).and_return(securable_object)
+ expect(Chef::ReservedNames::Win32::Security::SID).to receive(:from_account).and_return(nil)
+ expect(Chef::ReservedNames::Win32::Security::ACE).to receive(:access_allowed).and_return(nil)
+ expect(Chef::ReservedNames::Win32::Security::ACL).to receive(:create).and_return(nil)
+ expect(securable_object).to receive(:dacl=)
+ provider.grant_alternate_user_read_access("a fake path")
+ end
+ end
+ end
+
+ describe "#with_temp_script_file" do
+ before do
+ provider.singleton_class.send(:public, :with_temp_script_file)
+ provider.singleton_class.send(:public, :script_file_path)
+ end
+
+ it "should put the contents of the script in the temp file" do
+ temp_file_contents = nil
+
+ provider.with_temp_script_file do
+ temp_file_contents = File.read(provider.script_file_path)
+ end
+
+ expect(temp_file_contents.strip).to eq(%q{echo "hello"})
+ end
+ end
+
+ describe "#command" do
+ let(:basepath) { "C:\\Windows\\system32" }
+ let(:interpreter) { File.join(basepath, "cmd.exe") }
+
+ before do
+ allow(provider).to receive(:basepath).and_return(basepath)
+ provider.singleton_class.send(:public, :with_temp_script_file)
+ provider.singleton_class.send(:public, :script_file_path)
+ end
+
+ it 'should set the command to "interpreter" "tempfile"' do
+ command = nil
+ script_file_path = nil
+ provider.with_temp_script_file do
+ command = provider.command
+ script_file_path = provider.script_file_path
+ end
+
+ expect(command).to eq(%Q{"#{interpreter}" /c "#{script_file_path}"})
+ end
+
+ it "should set the command to 'interpreter flags tempfile'" do
+ new_resource.flags "/f"
+
+ command = nil
+ script_file_path = nil
+ provider.with_temp_script_file do
+ command = provider.command
+ script_file_path = provider.script_file_path
+ end
+
+ expect(command).to eq(%Q{"#{interpreter}" /f /c "#{script_file_path}"})
+ end
+ end
+end