diff options
-rw-r--r-- | lib/chef/provider/env/windows.rb | 14 | ||||
-rwxr-xr-x | spec/functional/resource/env_spec.rb | 137 |
2 files changed, 142 insertions, 9 deletions
diff --git a/lib/chef/provider/env/windows.rb b/lib/chef/provider/env/windows.rb index 96b5d3871f..f73cb42f7e 100644 --- a/lib/chef/provider/env/windows.rb +++ b/lib/chef/provider/env/windows.rb @@ -51,17 +51,13 @@ class Chef return obj ? obj.variablevalue : nil end - def find_env(environment_variables, key_name) - environment_variables.find do | environment_variable | - environment_variable['name'].downcase == key_name - end - end - def env_obj(key_name) wmi = WmiLite::Wmi.new - environment_variables = wmi.instances_of('Win32_Environment') - existing_variable = find_env(environment_variables, key_name) - existing_variable.nil? ? nil : existing_variable.wmi_ole_object + # Note that by design this query is case insensitive with regard to key_name + environment_variables = wmi.query("select * from Win32_Environment where name = '#{key_name}'") + if environment_variables && environment_variables.length > 0 + environment_variables[0].wmi_ole_object + end end #see: http://msdn.microsoft.com/en-us/library/ms682653%28VS.85%29.aspx diff --git a/spec/functional/resource/env_spec.rb b/spec/functional/resource/env_spec.rb new file mode 100755 index 0000000000..9002d4b727 --- /dev/null +++ b/spec/functional/resource/env_spec.rb @@ -0,0 +1,137 @@ +# +# Author:: Adam Edwards (<adamed@getchef.com>) +# Copyright:: Copyright (c) 2014 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::Resource::Env, :windows_only do + context 'when running on Windows' do + let(:chef_env_test_lower_case) { 'chefenvtest' } + let(:chef_env_test_mixed_case) { 'chefENVtest' } + let(:env_value1) { 'value1' } + let(:env_value2) { 'value2' } + let(:test_run_context) { + node = Chef::Node.new + node.default['platform'] = 'windows' + node.default['platform_version'] = '6.1' + empty_events = Chef::EventDispatch::Dispatcher.new + Chef::RunContext.new(node, {}, empty_events) + } + let(:test_resource) { + Chef::Resource::Env.new('unknown', test_run_context) + } + + before(:each) do + resource_lower = Chef::Resource::Env.new(chef_env_test_lower_case, test_run_context) + resource_lower.run_action(:delete) + resource_mixed = Chef::Resource::Env.new(chef_env_test_mixed_case, test_run_context) + resource_mixed.run_action(:delete) + end + + context "when the create action is invoked" do + it 'should create an environment variable for action create' do + expect(ENV[chef_env_test_lower_case]).to eq(nil) + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + end + + it "should modify an existing variable's value to a new value" do + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + test_resource.value(env_value2) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value2) + end + + it "should modify an existing variable's value to a new value if the variable name case differs from the existing variable" do + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + test_resource.key_name(chef_env_test_mixed_case) + test_resource.value(env_value2) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value2) + end + end + + context "when the modify action is invoked" do + it "should raise an exception for modify if the variable doesn't exist" do + expect(ENV[chef_env_test_lower_case]).to eq(nil) + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + expect {test_resource.run_action(:modify) }.to raise_error(Chef::Exceptions::Env) + end + + it "should modify an existing variable's value to a new value" do + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + test_resource.value(env_value2) + test_resource.run_action(:modify) + expect(ENV[chef_env_test_lower_case]).to eq(env_value2) + end + + # This examlpe covers Chef Issue #1754 + it "should modify an existing variable's value to a new value if the variable name case differs from the existing variable" do + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + test_resource.key_name(chef_env_test_mixed_case) + test_resource.value(env_value2) + test_resource.run_action(:modify) + expect(ENV[chef_env_test_lower_case]).to eq(env_value2) + end + end + + context "when the delete action is invoked" do + it "should delete an environment variable" do + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + test_resource.run_action(:delete) + expect(ENV[chef_env_test_lower_case]).to eq(nil) + end + + it "should not raise an exception when a non-existent environment variable is deleted" do + expect(ENV[chef_env_test_lower_case]).to eq(nil) + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + expect{test_resource.run_action(:delete)}.not_to raise_error + expect(ENV[chef_env_test_lower_case]).to eq(nil) + end + + it "should delete an existing variable's value to a new value if the specified variable name case differs from the existing variable" do + test_resource.key_name(chef_env_test_lower_case) + test_resource.value(env_value1) + test_resource.run_action(:create) + expect(ENV[chef_env_test_lower_case]).to eq(env_value1) + test_resource.key_name(chef_env_test_mixed_case) + test_resource.run_action(:delete) + expect(ENV[chef_env_test_lower_case]).to eq(nil) + expect(ENV[chef_env_test_mixed_case]).to eq(nil) + end + end + end +end |