chef 13.2.20 → 13.3.42

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -1
  3. data/Gemfile +2 -8
  4. data/README.md +6 -2
  5. data/Rakefile +0 -11
  6. data/VERSION +1 -1
  7. data/acceptance/Gemfile.lock +1 -1
  8. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/api.rb +34 -18
  9. data/acceptance/data-collector/.acceptance/data-collector-test/recipes/default.rb +6 -0
  10. data/lib/chef/cookbook/metadata.rb +2 -2
  11. data/lib/chef/deprecation/warnings.rb +3 -1
  12. data/lib/chef/exceptions.rb +1 -1
  13. data/lib/chef/http.rb +9 -10
  14. data/lib/chef/http/api_versions.rb +2 -0
  15. data/lib/chef/http/http_request.rb +3 -0
  16. data/lib/chef/knife/core/bootstrap_context.rb +1 -0
  17. data/lib/chef/knife/core/status_presenter.rb +1 -1
  18. data/lib/chef/knife/ssh.rb +4 -0
  19. data/lib/chef/provider/apt_preference.rb +99 -0
  20. data/lib/chef/provider/execute.rb +3 -2
  21. data/lib/chef/provider/http_request.rb +14 -0
  22. data/lib/chef/provider/mount/aix.rb +49 -8
  23. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
  24. data/lib/chef/provider/package/zypper.rb +5 -5
  25. data/lib/chef/provider/service/systemd.rb +12 -11
  26. data/lib/chef/provider/support/zypper_repo.erb +17 -0
  27. data/lib/chef/provider/systemd_unit.rb +3 -2
  28. data/lib/chef/provider/windows_task.rb +92 -71
  29. data/lib/chef/provider/zypper_repository.rb +81 -0
  30. data/lib/chef/providers.rb +2 -0
  31. data/lib/chef/resource/apt_preference.rb +36 -0
  32. data/lib/chef/resource/execute.rb +12 -2
  33. data/lib/chef/resource/http_request.rb +1 -1
  34. data/lib/chef/resource/zypper_repository.rb +51 -0
  35. data/lib/chef/resources.rb +2 -0
  36. data/lib/chef/search/query.rb +6 -1
  37. data/lib/chef/server_api_versions.rb +21 -2
  38. data/lib/chef/version.rb +3 -4
  39. data/lib/chef/win32/api/file.rb +1 -0
  40. data/lib/chef/win32/file.rb +2 -0
  41. data/lib/chef/win32/version.rb +6 -0
  42. data/spec/functional/knife/ssh_spec.rb +1 -1
  43. data/spec/functional/resource/execute_spec.rb +2 -2
  44. data/spec/spec_helper.rb +8 -1
  45. data/spec/unit/cookbook/metadata_spec.rb +3 -3
  46. data/spec/unit/http/api_versions_spec.rb +6 -3
  47. data/spec/unit/knife/bootstrap_spec.rb +4 -0
  48. data/spec/unit/knife/cookbook_show_spec.rb +3 -3
  49. data/spec/unit/knife/ssh_spec.rb +7 -1
  50. data/spec/unit/knife/status_spec.rb +2 -0
  51. data/spec/unit/provider/apt_preference_spec.rb +87 -0
  52. data/spec/unit/provider/apt_update_spec.rb +7 -7
  53. data/spec/unit/provider/dsc_resource_spec.rb +2 -2
  54. data/spec/unit/provider/execute_spec.rb +32 -14
  55. data/spec/unit/provider/mount/aix_spec.rb +33 -1
  56. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  57. data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +56 -3
  58. data/spec/unit/provider/package/windows_spec.rb +1 -1
  59. data/spec/unit/provider/package/zypper_spec.rb +43 -0
  60. data/spec/unit/provider/script_spec.rb +1 -1
  61. data/spec/unit/provider/service/systemd_service_spec.rb +23 -21
  62. data/spec/unit/provider/systemd_unit_spec.rb +42 -41
  63. data/spec/unit/provider/windows_task_spec.rb +40 -0
  64. data/spec/unit/resource/apt_preference_spec.rb +41 -0
  65. data/spec/unit/resource/execute_spec.rb +21 -1
  66. data/spec/unit/resource/powershell_script_spec.rb +2 -2
  67. data/spec/unit/resource/zypper_repository_spec.rb +65 -0
  68. data/spec/unit/search/query_spec.rb +13 -18
  69. data/spec/unit/server_api_spec.rb +75 -1
  70. data/spec/unit/server_api_versions_spec.rb +22 -0
  71. data/spec/unit/win32/link_spec.rb +73 -0
  72. data/tasks/dependencies.rb +0 -1
  73. metadata +13 -6
  74. data/tasks/changelog.rb +0 -37
  75. data/tasks/version.rb +0 -41
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright:: Copyright 2017, Chef Software, Inc.
2
+ # Copyright:: Copyright 2017-2017, Chef Software Inc.
3
3
  # License:: Apache License, Version 2.0
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,7 +27,7 @@ describe Chef::HTTP::APIVersions do
27
27
  end
28
28
 
29
29
  let(:method) { "GET" }
30
- let(:url) { "http://dummy.com" }
30
+ let(:url) { "http://localhost:60123" }
31
31
  let(:headers) { {} }
32
32
  let(:data) { false }
33
33
 
@@ -53,8 +53,11 @@ describe Chef::HTTP::APIVersions do
53
53
  m
54
54
  end
55
55
 
56
+ let(:client) do
57
+ TestVersionClient.new(url, { version_class: VersionedClassVersions })
58
+ end
59
+
56
60
  let(:middleware) do
57
- client = TestVersionClient.new(url)
58
61
  client.middlewares[0]
59
62
  end
60
63
 
@@ -586,6 +586,10 @@ describe Chef::Knife::Bootstrap do
586
586
  expect(knife.bootstrap_context.first_boot).to have_key(:policy_group)
587
587
  end
588
588
 
589
+ it "ensures that run_list is not set in the bootstrap context" do
590
+ expect(knife.bootstrap_context.first_boot).to_not have_key(:run_list)
591
+ end
592
+
589
593
  end
590
594
 
591
595
  # https://github.com/chef/chef/issues/4131
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@chef.io>)
3
- # Copyright:: Copyright 2008-2016, Chef Software Inc.
3
+ # Copyright:: Copyright 2008-2017, Chef Software Inc.
4
4
  # License:: Apache License, eersion 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -110,8 +110,8 @@ describe Chef::Knife::CookbookShow do
110
110
  "name" => nil,
111
111
  "description" => "",
112
112
  "long_description" => "",
113
- "maintainer" => nil,
114
- "maintainer_email" => nil,
113
+ "maintainer" => "",
114
+ "maintainer_email" => "",
115
115
  "license" => "All rights reserved",
116
116
  "platforms" => {},
117
117
  "dependencies" => {},
@@ -187,7 +187,7 @@ describe Chef::Knife::Ssh do
187
187
  describe "#session_from_list" do
188
188
  before :each do
189
189
  @knife.instance_variable_set(:@longest, 0)
190
- ssh_config = { :timeout => 50, :user => "locutus", :port => 23 }
190
+ ssh_config = { :timeout => 50, :user => "locutus", :port => 23, :keepalive => true, :keepalive_interval => 60 }
191
191
  allow(Net::SSH).to receive(:configuration_for).with("the.b.org", true).and_return(ssh_config)
192
192
  end
193
193
 
@@ -223,6 +223,12 @@ describe Chef::Knife::Ssh do
223
223
  @knife.session_from_list([["the.b.org", 123]])
224
224
  expect(@knife.session.servers[0].user).to eq("locutus")
225
225
  end
226
+
227
+ it "uses keepalive settings from an ssh config file" do
228
+ @knife.session_from_list([["the.b.org", 123]])
229
+ expect(@knife.session.servers[0].options[:keepalive]).to be true
230
+ expect(@knife.session.servers[0].options[:keepalive_interval]).to eq 60
231
+ end
226
232
  end
227
233
 
228
234
  describe "#ssh_command" do
@@ -23,6 +23,8 @@ describe Chef::Knife::Status do
23
23
  node = Chef::Node.new.tap do |n|
24
24
  n.automatic_attrs["fqdn"] = "foobar"
25
25
  n.automatic_attrs["ohai_time"] = 1343845969
26
+ n.automatic_attrs["platform"] = "mac_os_x"
27
+ n.automatic_attrs["platform_version"] = "10.12.5"
26
28
  end
27
29
  allow(Time).to receive(:now).and_return(Time.at(1428573420))
28
30
  @query = double("Chef::Search::Query")
@@ -0,0 +1,87 @@
1
+ #
2
+ # Author:: Thom May (<thom@chef.io>)
3
+ # Author:: Tim Smith (<tim@chef.io>)
4
+ # Copyright:: 2016-2017, Chef Software, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require "spec_helper"
21
+
22
+ describe Chef::Provider::AptPreference do
23
+ let(:new_resource) { Chef::Resource::AptPreference.new("libmysqlclient16.1*") }
24
+ let(:pref_dir) { Dir.mktmpdir("apt_pref_d") }
25
+
26
+ before do
27
+ stub_const("Chef::Provider::AptPreference::APT_PREFERENCE_DIR", pref_dir)
28
+ new_resource.pin = "1.0.1"
29
+ new_resource.pin_priority 1001
30
+ end
31
+
32
+ let(:provider) do
33
+ node = Chef::Node.new
34
+ events = Chef::EventDispatch::Dispatcher.new
35
+ run_context = Chef::RunContext.new(node, {}, events)
36
+ Chef::Provider::AptPreference.new(new_resource, run_context)
37
+ end
38
+
39
+ it "responds to load_current_resource" do
40
+ expect(provider).to respond_to(:load_current_resource)
41
+ end
42
+
43
+ context "#action_add" do
44
+ context "without a preferences.d directory" do
45
+ before do
46
+ FileUtils.rmdir pref_dir
47
+ end
48
+
49
+ it "creates the preferences.d directory" do
50
+ provider.run_action(:add)
51
+ expect(new_resource).to be_updated_by_last_action
52
+ expect(File.exist?(pref_dir)).to be true
53
+ expect(File.directory?(pref_dir)).to be true
54
+ end
55
+ end
56
+
57
+ context "with a preferences.d directory" do
58
+ before do
59
+ FileUtils.mkdir pref_dir unless ::File.exist?(pref_dir)
60
+ FileUtils.touch("#{pref_dir}/libmysqlclient16.1*.pref")
61
+ FileUtils.touch("#{pref_dir}/libmysqlclient16.1*")
62
+ end
63
+
64
+ # FileUtils.touch throws "Invalid argument @ utime_failed" in appveyer
65
+ it "creates a sanitized .pref file and removes the legacy cookbook files", :unix_only do
66
+ provider.run_action(:add)
67
+ expect(new_resource).to be_updated_by_last_action
68
+ expect(File).not_to exist("#{pref_dir}/libmysqlclient16.1*.pref")
69
+ expect(File).not_to exist("#{pref_dir}/libmysqlclient16.1*")
70
+ expect(File.read(::File.join(pref_dir, "libmysqlclient16_1wildcard.pref"))).to match(/Package: libmysqlclient16.1*.*Pin: 1.0.1.*Pin-Priority: 1001/m)
71
+ end
72
+ end
73
+ end
74
+
75
+ context "#action_delete" do
76
+ before do
77
+ FileUtils.mkdir pref_dir unless ::File.exist?(pref_dir)
78
+ FileUtils.touch("#{pref_dir}/libmysqlclient16_1wildcard.pref")
79
+ end
80
+
81
+ it "deletes the name santized .pref file" do
82
+ provider.run_action(:remove)
83
+ expect(new_resource).to be_updated_by_last_action
84
+ expect(File).not_to exist("#{pref_dir}/libmysqlclient16_1wildcard.pref")
85
+ end
86
+ end
87
+ end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Thom May (<thom@chef.io>)
3
- # Copyright:: Copyright (c) 2016 Chef Software, Inc.
3
+ # Copyright:: Copyright (c) 2016-2017, Chef Software Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,7 +45,7 @@ describe Chef::Provider::AptUpdate do
45
45
  before do
46
46
  FileUtils.rmdir config_dir
47
47
  expect(File.exist?(config_dir)).to be false
48
- allow_any_instance_of(Chef::Provider::Execute).to receive(:shell_out!).with("apt-get -q update", anything())
48
+ allow_any_instance_of(Chef::Provider::Execute).to receive(:shell_out_with_systems_locale!).with("apt-get -q update", anything())
49
49
  end
50
50
 
51
51
  it "should create the directory" do
@@ -64,7 +64,7 @@ describe Chef::Provider::AptUpdate do
64
64
  describe "#action_update" do
65
65
  it "should update the apt cache" do
66
66
  provider.load_current_resource
67
- expect_any_instance_of(Chef::Provider::Execute).to receive(:shell_out!).with("apt-get -q update", anything())
67
+ expect_any_instance_of(Chef::Provider::Execute).to receive(:shell_out_with_systems_locale!).with("apt-get -q update", anything())
68
68
  provider.run_action(:update)
69
69
  expect(new_resource).to be_updated_by_last_action
70
70
  end
@@ -79,14 +79,14 @@ describe Chef::Provider::AptUpdate do
79
79
 
80
80
  it "should run if the time stamp is old" do
81
81
  expect(File).to receive(:mtime).with("#{stamp_dir}/update-success-stamp").and_return(Time.now - 86_500)
82
- expect_any_instance_of(Chef::Provider::Execute).to receive(:shell_out!).with("apt-get -q update", anything())
82
+ expect_any_instance_of(Chef::Provider::Execute).to receive(:shell_out_with_systems_locale!).with("apt-get -q update", anything())
83
83
  provider.run_action(:periodic)
84
84
  expect(new_resource).to be_updated_by_last_action
85
85
  end
86
86
 
87
87
  it "should not run if the time stamp is new" do
88
88
  expect(File).to receive(:mtime).with("#{stamp_dir}/update-success-stamp").and_return(Time.now)
89
- expect_any_instance_of(Chef::Provider::Execute).not_to receive(:shell_out!).with("apt-get -q update", anything())
89
+ expect_any_instance_of(Chef::Provider::Execute).not_to receive(:shell_out_with_systems_locale!).with("apt-get -q update", anything())
90
90
  provider.run_action(:periodic)
91
91
  expect(new_resource).to_not be_updated_by_last_action
92
92
  end
@@ -98,14 +98,14 @@ describe Chef::Provider::AptUpdate do
98
98
 
99
99
  it "should run if the time stamp is old" do
100
100
  expect(File).to receive(:mtime).with("#{stamp_dir}/update-success-stamp").and_return(Time.now - 500)
101
- expect_any_instance_of(Chef::Provider::Execute).to receive(:shell_out!).with("apt-get -q update", anything())
101
+ expect_any_instance_of(Chef::Provider::Execute).to receive(:shell_out_with_systems_locale!).with("apt-get -q update", anything())
102
102
  provider.run_action(:periodic)
103
103
  expect(new_resource).to be_updated_by_last_action
104
104
  end
105
105
 
106
106
  it "should not run if the time stamp is new" do
107
107
  expect(File).to receive(:mtime).with("#{stamp_dir}/update-success-stamp").and_return(Time.now - 300)
108
- expect_any_instance_of(Chef::Provider::Execute).not_to receive(:shell_out!).with("apt-get -q update", anything())
108
+ expect_any_instance_of(Chef::Provider::Execute).not_to receive(:shell_out_with_systems_locale!).with("apt-get -q update", anything())
109
109
  provider.run_action(:periodic)
110
110
  expect(new_resource).to_not be_updated_by_last_action
111
111
  end
@@ -155,8 +155,8 @@ describe Chef::Provider::DscResource do
155
155
  context "multiple resource are found" do
156
156
  let (:resource_records) do
157
157
  [
158
- { "Module" => { "Name" => "ModuleName1" } },
159
- { "Module" => { "Name" => "ModuleName2" } },
158
+ { "Module" => { "Name" => "ModuleName1", "Version" => "1.0.0.0" } },
159
+ { "Module" => { "Name" => "ModuleName1", "Version" => "2.0.0.0" } },
160
160
  ] end
161
161
 
162
162
  it "raises MultipleDscResourcesFound" do
@@ -76,16 +76,34 @@ describe Chef::Provider::Execute do
76
76
 
77
77
  describe "#action_run" do
78
78
  it "runs shell_out with the default options" do
79
- expect(provider).to receive(:shell_out!).with(new_resource.name, opts)
79
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, opts)
80
80
  expect(provider).to receive(:converge_by).with("execute foo_resource").and_call_original
81
81
  expect(Chef::Log).not_to receive(:warn)
82
82
  provider.run_action(:run)
83
83
  expect(new_resource).to be_updated
84
84
  end
85
85
 
86
+ # this next test is tightly coupled to the implementation of the underlying shell_out mixin that we're using
87
+ # but the point is to ensure that we are not picking up the PATH mangling and locale-variable mangling that the internal
88
+ # shell_out API uses. we are asserting that we emulate `ls -la` when the user does `execute "ls -la"`, and to
89
+ # do that we get dirty and start mocking the implementation of the shell_out mixin itself. while arguments like
90
+ # "timeout", "returns", "log_level" and "log_tag" appear here, we MUST NOT have an "environment" or "env" argument
91
+ # that we are passing to Mixlib::ShellOut by default -- ever. you might have to add some other argument here from
92
+ # time to time, but you MUST NOT change the environment.
93
+ it "does not use shell_out in such a way as to insert extra environment variables" do
94
+ mock = instance_double(Mixlib::ShellOut)
95
+ expect(Mixlib::ShellOut).to receive(:new).with("foo_resource", { timeout: 3600, returns: 0, log_level: :info, log_tag: "execute[foo_resource]" }).and_return(mock)
96
+ expect(mock).to receive(:live_stream=).with(nil)
97
+ allow(mock).to receive(:live_stream)
98
+ expect(mock).to receive(:run_command)
99
+ expect(mock).to receive(:error!)
100
+ provider.run_action(:run)
101
+ expect(new_resource).to be_updated
102
+ end
103
+
86
104
  it "if you pass a command attribute, it runs the command" do
87
105
  new_resource.command "/usr/argelbargle/bin/oogachacka 12345"
88
- expect(provider).to receive(:shell_out!).with(new_resource.command, opts)
106
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.command, opts)
89
107
  expect(provider).to receive(:converge_by).with("execute #{new_resource.command}").and_call_original
90
108
  expect(Chef::Log).not_to receive(:warn)
91
109
  provider.run_action(:run)
@@ -96,7 +114,7 @@ describe Chef::Provider::Execute do
96
114
  new_resource.sensitive true
97
115
  # Since the resource is sensitive, it should not have :live_stream set
98
116
  opts.delete(:live_stream)
99
- expect(provider).to receive(:shell_out!).with(new_resource.name, opts)
117
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, opts)
100
118
  expect(provider).to receive(:converge_by).with("execute sensitive resource").and_call_original
101
119
  expect(Chef::Log).not_to receive(:warn)
102
120
  provider.run_action(:run)
@@ -106,7 +124,7 @@ describe Chef::Provider::Execute do
106
124
  it "should do nothing if the sentinel file exists" do
107
125
  new_resource.creates "/foo_resource"
108
126
  expect(FileTest).to receive(:exist?).with(new_resource.creates).and_return(true)
109
- expect(provider).not_to receive(:shell_out!)
127
+ expect(provider).not_to receive(:shell_out_with_systems_locale!)
110
128
  expect(Chef::Log).not_to receive(:warn)
111
129
  provider.run_action(:run)
112
130
  expect(new_resource).not_to be_updated
@@ -119,7 +137,7 @@ describe Chef::Provider::Execute do
119
137
  end
120
138
 
121
139
  it "should raise if user specified relative path without cwd for Chef-13" do
122
- expect(provider).not_to receive(:shell_out!)
140
+ expect(provider).not_to receive(:shell_out_with_systems_locale!)
123
141
  expect { provider.run_action(:run) }.to raise_error(Chef::Exceptions::Execute)
124
142
  end
125
143
  end
@@ -130,7 +148,7 @@ describe Chef::Provider::Execute do
130
148
  expect(FileTest).not_to receive(:exist?).with(new_resource.creates)
131
149
  expect(FileTest).to receive(:exist?).with(File.join("/tmp", new_resource.creates)).and_return(true)
132
150
  expect(Chef::Log).not_to receive(:warn)
133
- expect(provider).not_to receive(:shell_out!)
151
+ expect(provider).not_to receive(:shell_out_with_systems_locale!)
134
152
 
135
153
  provider.run_action(:run)
136
154
  expect(new_resource).not_to be_updated
@@ -139,7 +157,7 @@ describe Chef::Provider::Execute do
139
157
  it "should not include stdout/stderr in failure exception for sensitive resource" do
140
158
  opts.delete(:live_stream)
141
159
  new_resource.sensitive true
142
- expect(provider).to receive(:shell_out!).and_raise(Mixlib::ShellOut::ShellCommandFailed)
160
+ expect(provider).to receive(:shell_out_with_systems_locale!).and_raise(Mixlib::ShellOut::ShellCommandFailed)
143
161
  expect do
144
162
  provider.run_action(:run)
145
163
  end.to raise_error(Mixlib::ShellOut::ShellCommandFailed, /suppressed for sensitive resource/)
@@ -148,7 +166,7 @@ describe Chef::Provider::Execute do
148
166
  describe "streaming output" do
149
167
  it "should not set the live_stream if sensitive is on" do
150
168
  new_resource.sensitive true
151
- expect(provider).to receive(:shell_out!).with(new_resource.name, opts)
169
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, opts)
152
170
  expect(provider).to receive(:converge_by).with("execute sensitive resource").and_call_original
153
171
  expect(Chef::Log).not_to receive(:warn)
154
172
  provider.run_action(:run)
@@ -165,7 +183,7 @@ describe Chef::Provider::Execute do
165
183
  it "should set the live_stream if the log level is info or above" do
166
184
  nopts = opts
167
185
  nopts[:live_stream] = @live_stream
168
- expect(provider).to receive(:shell_out!).with(new_resource.name, nopts)
186
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, nopts)
169
187
  expect(provider).to receive(:converge_by).with("execute foo_resource").and_call_original
170
188
  expect(Chef::Log).not_to receive(:warn)
171
189
  provider.run_action(:run)
@@ -177,7 +195,7 @@ describe Chef::Provider::Execute do
177
195
  new_resource.live_stream true
178
196
  nopts = opts
179
197
  nopts[:live_stream] = @live_stream
180
- expect(provider).to receive(:shell_out!).with(new_resource.name, nopts)
198
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, nopts)
181
199
  expect(provider).to receive(:converge_by).with("execute foo_resource").and_call_original
182
200
  expect(Chef::Log).not_to receive(:warn)
183
201
  provider.run_action(:run)
@@ -186,7 +204,7 @@ describe Chef::Provider::Execute do
186
204
 
187
205
  it "should not set the live_stream if the resource is sensitive" do
188
206
  new_resource.sensitive true
189
- expect(provider).to receive(:shell_out!).with(new_resource.name, opts)
207
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, opts)
190
208
  expect(provider).to receive(:converge_by).with("execute sensitive resource").and_call_original
191
209
  expect(Chef::Log).not_to receive(:warn)
192
210
  provider.run_action(:run)
@@ -199,7 +217,7 @@ describe Chef::Provider::Execute do
199
217
  nopts = opts
200
218
  nopts[:live_stream] = STDOUT
201
219
  allow(STDOUT).to receive(:tty?).and_return(true)
202
- expect(provider).to receive(:shell_out!).with(new_resource.name, nopts)
220
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, nopts)
203
221
  expect(provider).to receive(:converge_by).with("execute foo_resource").and_call_original
204
222
  expect(Chef::Log).not_to receive(:warn)
205
223
  provider.run_action(:run)
@@ -209,7 +227,7 @@ describe Chef::Provider::Execute do
209
227
  it "should not set the live_stream to STDOUT if we are a TTY, not daemonized, but sensitive" do
210
228
  new_resource.sensitive true
211
229
  allow(STDOUT).to receive(:tty?).and_return(true)
212
- expect(provider).to receive(:shell_out!).with(new_resource.name, opts)
230
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, opts)
213
231
  expect(provider).to receive(:converge_by).with("execute sensitive resource").and_call_original
214
232
  expect(Chef::Log).not_to receive(:warn)
215
233
  provider.run_action(:run)
@@ -219,7 +237,7 @@ describe Chef::Provider::Execute do
219
237
  it "should not set the live_stream to STDOUT if we are a TTY, but daemonized" do
220
238
  Chef::Config[:daemon] = true
221
239
  allow(STDOUT).to receive(:tty?).and_return(true)
222
- expect(provider).to receive(:shell_out!).with(new_resource.name, opts)
240
+ expect(provider).to receive(:shell_out_with_systems_locale!).with(new_resource.name, opts)
223
241
  expect(provider).to receive(:converge_by).with("execute foo_resource").and_call_original
224
242
  expect(Chef::Log).not_to receive(:warn)
225
243
  provider.run_action(:run)
@@ -44,6 +44,11 @@ MOUNT
44
44
  #MountPoint:Device:Vfs:Nodename:Type:Size:Options:AutoMount:Acct
45
45
  /tmp/foo:/dev/sdz1:jfs2::bootfs:10485760:rw:yes:no
46
46
  ENABLED
47
+
48
+ @test_wrong_output = <<-WRONG
49
+ #MountPoint:Device:Vfs:Nodename:Type:Size:Options:AutoMount:Acct
50
+ /tmp/foo::/dev/sdz1:jfs2:bootfs:10485760:rw:yes:no
51
+ WRONG
47
52
  end
48
53
 
49
54
  before(:each) do
@@ -102,6 +107,25 @@ ENABLED
102
107
 
103
108
  expect(@provider.current_resource.mounted).to be_falsey
104
109
  end
110
+
111
+ context "mount_options_unchanged?" do
112
+ it "should return true if mounted device is the same" do
113
+ stub_mounted_enabled(@provider, @mounted_output, @enabled_output)
114
+ @provider.load_current_resource
115
+
116
+ allow(@provider.current_resource).to receive(:fstype).and_return("jfs2")
117
+ expect(@provider.send :mount_options_unchanged?).to be true
118
+ end
119
+
120
+ it "should return false if mounted device has changed" do
121
+ stub_mounted_enabled(@provider, @mounted_output, @enabled_output)
122
+ @provider.load_current_resource
123
+
124
+ allow(@provider.current_resource).to receive(:fstype).and_return("XXXX")
125
+ expect(@provider.send :mount_options_unchanged?).to be false
126
+ end
127
+ end
128
+
105
129
  end
106
130
 
107
131
  # tests for #enabled?
@@ -188,12 +212,20 @@ ENABLED
188
212
 
189
213
  it "should not enable mount if it is mounted and already enabled and mount options are unchanged" do
190
214
  stub_mounted_enabled(@provider, @mounted_output, @enabled_output)
191
- @new_resource.options "rw"
192
215
 
193
216
  expect(@provider).not_to receive(:enable_fs)
194
217
 
195
218
  @provider.run_action(:enable)
196
219
  end
220
+
221
+ it "should return false if enabled_output is given in wrong syntax" do
222
+ stub_mounted_enabled(@provider, @mounted_output, @test_wrong_output)
223
+
224
+ expect(@provider).to receive(:enable_fs)
225
+
226
+ @provider.run_action(:enable)
227
+ end
228
+
197
229
  end
198
230
 
199
231
  describe "disable_fs" do