chef 11.12.0.alpha.1 → 11.12.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chef/api_client/registration.rb +46 -9
- data/lib/chef/application.rb +1 -0
- data/lib/chef/application/client.rb +25 -24
- data/lib/chef/client.rb +34 -0
- data/lib/chef/config.rb +11 -0
- data/lib/chef/cookbook/chefignore.rb +10 -2
- data/lib/chef/cookbook/metadata.rb +31 -3
- data/lib/chef/cookbook/synchronizer.rb +2 -2
- data/lib/chef/cookbook/syntax_check.rb +4 -4
- data/lib/chef/encrypted_data_bag_item.rb +37 -1
- data/lib/chef/exceptions.rb +1 -0
- data/lib/chef/guard_interpreter/default_guard_interpreter.rb +42 -0
- data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +122 -0
- data/lib/chef/http.rb +0 -1
- data/lib/chef/http/decompressor.rb +7 -4
- data/lib/chef/http/simple.rb +5 -0
- data/lib/chef/http/validate_content_length.rb +28 -12
- data/lib/chef/knife.rb +1 -0
- data/lib/chef/knife/client_bulk_delete.rb +48 -9
- data/lib/chef/knife/client_delete.rb +4 -4
- data/lib/chef/knife/cookbook_bulk_delete.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +17 -7
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/ui.rb +42 -5
- data/lib/chef/knife/node_run_list_add.rb +31 -2
- data/lib/chef/knife/ssh.rb +44 -31
- data/lib/chef/knife/ssl_check.rb +213 -0
- data/lib/chef/knife/ssl_fetch.rb +145 -0
- data/lib/chef/mixin/deep_merge.rb +13 -5
- data/lib/chef/mixin/shell_out.rb +9 -3
- data/lib/chef/node.rb +23 -4
- data/lib/chef/node/immutable_collections.rb +32 -0
- data/lib/chef/platform/provider_mapping.rb +21 -18
- data/lib/chef/platform/query_helpers.rb +10 -2
- data/lib/chef/policy_builder/expand_node_object.rb +3 -6
- data/lib/chef/provider/cron.rb +25 -3
- data/lib/chef/provider/mount/mount.rb +1 -1
- data/lib/chef/provider/package/dpkg.rb +2 -1
- data/lib/chef/provider/package/windows.rb +80 -0
- data/lib/chef/provider/package/windows/msi.rb +69 -0
- data/lib/chef/provider/powershell_script.rb +19 -6
- data/lib/chef/provider/service/solaris.rb +11 -7
- data/lib/chef/resource.rb +18 -5
- data/lib/chef/resource/conditional.rb +20 -7
- data/lib/chef/resource/cron.rb +18 -2
- data/lib/chef/resource/execute.rb +0 -2
- data/lib/chef/resource/powershell_script.rb +23 -1
- data/lib/chef/resource/script.rb +25 -0
- data/lib/chef/resource/subversion.rb +4 -0
- data/lib/chef/resource/windows_package.rb +79 -0
- data/lib/chef/resource/windows_script.rb +0 -5
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/rest.rb +6 -1
- data/lib/chef/run_context.rb +22 -2
- data/lib/chef/run_context/cookbook_compiler.rb +12 -0
- data/lib/chef/util/editor.rb +92 -0
- data/lib/chef/util/file_edit.rb +22 -54
- data/lib/chef/version.rb +2 -2
- data/lib/chef/win32/api/installer.rb +166 -0
- data/lib/chef/win32/version.rb +8 -0
- data/spec/data/standalone_cookbook/Gemfile +1 -0
- data/spec/data/standalone_cookbook/chefignore +9 -0
- data/spec/data/standalone_cookbook/recipes/default.rb +3 -0
- data/spec/data/standalone_cookbook/vendor/bundle/ruby/2.0.0/gems/multi_json-1.9.0/lib/multi_json.rb +1 -0
- data/spec/functional/resource/powershell_spec.rb +262 -1
- data/spec/functional/win32/versions_spec.rb +3 -3
- data/spec/integration/knife/chefignore_spec.rb +1 -2
- data/spec/integration/knife/raw_spec.rb +8 -13
- data/spec/integration/knife/redirection_spec.rb +6 -14
- data/spec/integration/solo/solo_spec.rb +19 -0
- data/spec/support/shared/functional/windows_script.rb +1 -1
- data/spec/support/shared/integration/app_server_support.rb +42 -0
- data/spec/support/shared/integration/integration_helper.rb +1 -0
- data/spec/support/shared/unit/script_resource.rb +38 -0
- data/spec/unit/api_client/registration_spec.rb +109 -38
- data/spec/unit/application/client_spec.rb +48 -1
- data/spec/unit/cookbook/chefignore_spec.rb +10 -0
- data/spec/unit/cookbook/metadata_spec.rb +45 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +28 -0
- data/spec/unit/cookbook_spec.rb +0 -10
- data/spec/unit/guard_interpreter/resource_guard_interpreter_spec.rb +56 -0
- data/spec/unit/http/simple_spec.rb +32 -0
- data/spec/unit/http/validate_content_length_spec.rb +187 -0
- data/spec/unit/knife/bootstrap_spec.rb +13 -4
- data/spec/unit/knife/client_bulk_delete_spec.rb +123 -38
- data/spec/unit/knife/client_delete_spec.rb +4 -4
- data/spec/unit/knife/cookbook_upload_spec.rb +181 -88
- data/spec/unit/knife/core/bootstrap_context_spec.rb +11 -1
- data/spec/unit/knife/core/ui_spec.rb +109 -38
- data/spec/unit/knife/node_run_list_add_spec.rb +24 -1
- data/spec/unit/knife/ssh_spec.rb +17 -6
- data/spec/unit/knife/ssl_check_spec.rb +187 -0
- data/spec/unit/knife/ssl_fetch_spec.rb +151 -0
- data/spec/unit/mixin/deep_merge_spec.rb +17 -0
- data/spec/unit/node/immutable_collections_spec.rb +55 -0
- data/spec/unit/node_spec.rb +9 -0
- data/spec/unit/platform/query_helpers_spec.rb +32 -0
- data/spec/unit/platform_spec.rb +193 -175
- data/spec/unit/policy_builder/expand_node_object_spec.rb +1 -1
- data/spec/unit/provider/cron_spec.rb +175 -1
- data/spec/unit/provider/mount/mount_spec.rb +33 -3
- data/spec/unit/provider/package/dpkg_spec.rb +4 -0
- data/spec/unit/provider/package/windows/msi_spec.rb +60 -0
- data/spec/unit/provider/package/windows_spec.rb +80 -0
- data/spec/unit/provider/service/macosx_spec.rb +3 -3
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +35 -10
- data/spec/unit/pure_application_spec.rb +32 -0
- data/spec/unit/recipe_spec.rb +4 -0
- data/spec/unit/resource/conditional_spec.rb +13 -12
- data/spec/unit/resource/cron_spec.rb +7 -2
- data/spec/unit/resource/powershell_spec.rb +85 -2
- data/spec/unit/resource/subversion_spec.rb +5 -0
- data/spec/unit/resource/windows_package_spec.rb +74 -0
- data/spec/unit/resource_spec.rb +23 -1
- data/spec/unit/rest_spec.rb +15 -0
- data/spec/unit/run_context/cookbook_compiler_spec.rb +12 -0
- data/spec/unit/run_context_spec.rb +7 -0
- data/spec/unit/util/editor_spec.rb +152 -0
- data/spec/unit/util/file_edit_spec.rb +37 -1
- metadata +41 -30
@@ -244,7 +244,7 @@ describe Chef::PolicyBuilder::ExpandNodeObject do
|
|
244
244
|
|
245
245
|
it "sets the override run_list on the node" do
|
246
246
|
expect(node.run_list).to eq([override_runlist])
|
247
|
-
expect(
|
247
|
+
expect(node.primary_runlist).to eq(primary_runlist)
|
248
248
|
end
|
249
249
|
|
250
250
|
it "reports that a temporary policy is being used" do
|
@@ -19,15 +19,137 @@
|
|
19
19
|
require 'spec_helper'
|
20
20
|
|
21
21
|
describe Chef::Provider::Cron do
|
22
|
+
describe "when with special time string" do
|
23
|
+
before do
|
24
|
+
@node = Chef::Node.new
|
25
|
+
@events = Chef::EventDispatch::Dispatcher.new
|
26
|
+
@run_context = Chef::RunContext.new(@node, {}, @events)
|
27
|
+
|
28
|
+
@new_resource = Chef::Resource::Cron.new("cronhole some stuff", @run_context)
|
29
|
+
@new_resource.user "root"
|
30
|
+
@new_resource.minute "30"
|
31
|
+
@new_resource.command "/bin/true"
|
32
|
+
@new_resource.time :reboot
|
33
|
+
@provider = Chef::Provider::Cron.new(@new_resource, @run_context)
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with a matching entry in the user's crontab" do
|
37
|
+
before :each do
|
38
|
+
@provider.stub!(:read_crontab).and_return(<<-CRONTAB)
|
39
|
+
0 2 * * * /some/other/command
|
40
|
+
|
41
|
+
# Chef Name: cronhole some stuff
|
42
|
+
@reboot /bin/true param1 param2
|
43
|
+
# Chef Name: something else
|
44
|
+
2 * 1 * * /bin/false
|
45
|
+
|
46
|
+
# Another comment
|
47
|
+
CRONTAB
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should set cron_exists" do
|
51
|
+
@provider.load_current_resource
|
52
|
+
@provider.cron_exists.should == true
|
53
|
+
@provider.cron_empty.should == false
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should pull the details out of the cron line" do
|
57
|
+
cron = @provider.load_current_resource
|
58
|
+
cron.time.should == :reboot
|
59
|
+
cron.command.should == '/bin/true param1 param2'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should pull env vars out" do
|
63
|
+
@provider.stub!(:read_crontab).and_return(<<-CRONTAB)
|
64
|
+
0 2 * * * /some/other/command
|
65
|
+
|
66
|
+
# Chef Name: cronhole some stuff
|
67
|
+
MAILTO=foo@example.com
|
68
|
+
SHELL=/bin/foosh
|
69
|
+
PATH=/bin:/foo
|
70
|
+
HOME=/home/foo
|
71
|
+
@reboot /bin/true param1 param2
|
72
|
+
# Chef Name: something else
|
73
|
+
2 * 1 * * /bin/false
|
74
|
+
|
75
|
+
# Another comment
|
76
|
+
CRONTAB
|
77
|
+
cron = @provider.load_current_resource
|
78
|
+
cron.mailto.should == 'foo@example.com'
|
79
|
+
cron.shell.should == '/bin/foosh'
|
80
|
+
cron.path.should == '/bin:/foo'
|
81
|
+
cron.home.should == '/home/foo'
|
82
|
+
cron.time.should == :reboot
|
83
|
+
cron.command.should == '/bin/true param1 param2'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should parse and load generic and standard environment variables from cron entry" do
|
87
|
+
@provider.stub!(:read_crontab).and_return(<<-CRONTAB)
|
88
|
+
# Chef Name: cronhole some stuff
|
89
|
+
MAILTO=warn@example.com
|
90
|
+
TEST=lol
|
91
|
+
FLAG=1
|
92
|
+
@reboot /bin/true
|
93
|
+
CRONTAB
|
94
|
+
cron = @provider.load_current_resource
|
95
|
+
|
96
|
+
cron.mailto.should == "warn@example.com"
|
97
|
+
cron.environment.should == {"TEST" => "lol", "FLAG" => "1"}
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should not break with variables that match the cron resource internals" do
|
101
|
+
@provider.stub!(:read_crontab).and_return(<<-CRONTAB)
|
102
|
+
# Chef Name: cronhole some stuff
|
103
|
+
MINUTE=40
|
104
|
+
REBOOT=midnight
|
105
|
+
TEST=lol
|
106
|
+
ENVIRONMENT=production
|
107
|
+
@reboot /bin/true
|
108
|
+
CRONTAB
|
109
|
+
cron = @provider.load_current_resource
|
110
|
+
|
111
|
+
cron.time.should == :reboot
|
112
|
+
cron.environment.should == {"MINUTE" => "40", "REBOOT" => "midnight", "TEST" => "lol", "ENVIRONMENT" => "production"}
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should report the match" do
|
116
|
+
Chef::Log.should_receive(:debug).with("Found cron '#{@new_resource.name}'")
|
117
|
+
@provider.load_current_resource
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "action_create" do
|
121
|
+
before :each do
|
122
|
+
@provider.stub!(:write_crontab)
|
123
|
+
@provider.stub!(:read_crontab).and_return(nil)
|
124
|
+
end
|
125
|
+
|
126
|
+
context "when there is no existing crontab" do
|
127
|
+
before :each do
|
128
|
+
@provider.cron_exists = false
|
129
|
+
@provider.cron_empty = true
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should create a crontab with the entry" do
|
133
|
+
@provider.should_receive(:write_crontab).with(<<-ENDCRON)
|
134
|
+
# Chef Name: cronhole some stuff
|
135
|
+
@reboot /bin/true
|
136
|
+
ENDCRON
|
137
|
+
@provider.run_action(:create)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
22
144
|
before do
|
23
145
|
@node = Chef::Node.new
|
24
146
|
@events = Chef::EventDispatch::Dispatcher.new
|
25
147
|
@run_context = Chef::RunContext.new(@node, {}, @events)
|
148
|
+
|
26
149
|
@new_resource = Chef::Resource::Cron.new("cronhole some stuff", @run_context)
|
27
150
|
@new_resource.user "root"
|
28
151
|
@new_resource.minute "30"
|
29
152
|
@new_resource.command "/bin/true"
|
30
|
-
|
31
153
|
@provider = Chef::Provider::Cron.new(@new_resource, @run_context)
|
32
154
|
end
|
33
155
|
|
@@ -110,6 +232,7 @@ CRONTAB
|
|
110
232
|
cron.day.should == '*'
|
111
233
|
cron.month.should == '1'
|
112
234
|
cron.weekday.should == '*'
|
235
|
+
cron.time.should == nil
|
113
236
|
cron.command.should == '/bin/true param1 param2'
|
114
237
|
end
|
115
238
|
|
@@ -138,6 +261,7 @@ CRONTAB
|
|
138
261
|
cron.day.should == '*'
|
139
262
|
cron.month.should == '1'
|
140
263
|
cron.weekday.should == '*'
|
264
|
+
cron.time.should == nil
|
141
265
|
cron.command.should == '/bin/true param1 param2'
|
142
266
|
end
|
143
267
|
|
@@ -227,6 +351,7 @@ CRONTAB
|
|
227
351
|
cron.day.should == '*'
|
228
352
|
cron.month.should == '*'
|
229
353
|
cron.weekday.should == '*'
|
354
|
+
cron.time.should == nil
|
230
355
|
cron.command.should == nil
|
231
356
|
end
|
232
357
|
|
@@ -244,6 +369,7 @@ CRONTAB
|
|
244
369
|
cron.day.should == '*'
|
245
370
|
cron.month.should == '*'
|
246
371
|
cron.weekday.should == '*'
|
372
|
+
cron.time.should == nil
|
247
373
|
cron.command.should == nil
|
248
374
|
end
|
249
375
|
|
@@ -265,6 +391,7 @@ CRONTAB
|
|
265
391
|
cron.day.should == '*'
|
266
392
|
cron.month.should == '*'
|
267
393
|
cron.weekday.should == '*'
|
394
|
+
cron.time.should == nil
|
268
395
|
cron.command.should == nil
|
269
396
|
end
|
270
397
|
end
|
@@ -286,6 +413,11 @@ CRONTAB
|
|
286
413
|
end
|
287
414
|
end
|
288
415
|
|
416
|
+
it "should return true if special time string doesn't match" do
|
417
|
+
@new_resource.send(:time, :reboot)
|
418
|
+
@provider.cron_different?.should eql(true)
|
419
|
+
end
|
420
|
+
|
289
421
|
it "should return true if environment doesn't match" do
|
290
422
|
@new_resource.environment "FOO" => "something_else"
|
291
423
|
@provider.cron_different?.should eql(true)
|
@@ -833,4 +965,46 @@ MAILTO=foo@example.com
|
|
833
965
|
end
|
834
966
|
|
835
967
|
end
|
968
|
+
|
969
|
+
describe "weekday_in_crontab" do
|
970
|
+
context "when weekday is symbol" do
|
971
|
+
it "should return weekday in crontab format" do
|
972
|
+
@new_resource.weekday :wednesday
|
973
|
+
@provider.send(:weekday_in_crontab).should eq("3")
|
974
|
+
end
|
975
|
+
|
976
|
+
it "should raise an error with an unknown weekday" do
|
977
|
+
expect { @new_resource.weekday :caturday }.to raise_error(RangeError)
|
978
|
+
end
|
979
|
+
end
|
980
|
+
|
981
|
+
context "when weekday is a number in a string" do
|
982
|
+
it "should return the string" do
|
983
|
+
@new_resource.weekday "3"
|
984
|
+
@provider.send(:weekday_in_crontab).should eq("3")
|
985
|
+
end
|
986
|
+
|
987
|
+
it "should raise an error with an out of range number" do
|
988
|
+
expect { @new_resource.weekday "-1" }.to raise_error(RangeError)
|
989
|
+
end
|
990
|
+
end
|
991
|
+
|
992
|
+
context "when weekday is string with the name of the week" do
|
993
|
+
it "should return the string" do
|
994
|
+
@new_resource.weekday "mon"
|
995
|
+
@provider.send(:weekday_in_crontab).should eq("mon")
|
996
|
+
end
|
997
|
+
end
|
998
|
+
|
999
|
+
context "when weekday is an integer" do
|
1000
|
+
it "should return the integer" do
|
1001
|
+
@new_resource.weekday 1
|
1002
|
+
@provider.send(:weekday_in_crontab).should eq("1")
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
it "should raise an error with an out of range integer" do
|
1006
|
+
expect { @new_resource.weekday 45 }.to raise_error(RangeError)
|
1007
|
+
end
|
1008
|
+
end
|
1009
|
+
end
|
836
1010
|
end
|
@@ -131,12 +131,27 @@ describe Chef::Provider::Mount::Mount do
|
|
131
131
|
end
|
132
132
|
|
133
133
|
it "should set mounted true if the symlink target of the device is found in the mounts list" do
|
134
|
-
target
|
134
|
+
# expand the target path to correct specs on Windows
|
135
|
+
target = ::File.expand_path('/dev/mapper/target')
|
136
|
+
|
137
|
+
::File.stub(:symlink?).with("#{@new_resource.device}").and_return(true)
|
138
|
+
::File.stub(:readlink).with("#{@new_resource.device}").and_return(target)
|
139
|
+
|
140
|
+
@provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "#{target} on /tmp/foo type ext3 (rw)\n"))
|
141
|
+
@provider.load_current_resource()
|
142
|
+
@provider.current_resource.mounted.should be_true
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should set mounted true if the symlink target of the device is relative and is found in the mounts list - CHEF-4957" do
|
146
|
+
target = "xsdz1"
|
147
|
+
|
148
|
+
# expand the target path to correct specs on Windows
|
149
|
+
absolute_target = ::File.expand_path("/dev/xsdz1")
|
135
150
|
|
136
151
|
::File.stub(:symlink?).with("#{@new_resource.device}").and_return(true)
|
137
152
|
::File.stub(:readlink).with("#{@new_resource.device}").and_return(target)
|
138
153
|
|
139
|
-
@provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "
|
154
|
+
@provider.stub(:shell_out!).and_return(OpenStruct.new(:stdout => "#{absolute_target} on /tmp/foo type ext3 (rw)\n"))
|
140
155
|
@provider.load_current_resource()
|
141
156
|
@provider.current_resource.mounted.should be_true
|
142
157
|
end
|
@@ -199,6 +214,20 @@ describe Chef::Provider::Mount::Mount do
|
|
199
214
|
@provider.current_resource.enabled.should be_true
|
200
215
|
end
|
201
216
|
|
217
|
+
it "should set enabled to true if the symlink target is relative and is in fstab - CHEF-4957" do
|
218
|
+
target = "xsdz1"
|
219
|
+
|
220
|
+
::File.stub(:symlink?).with("#{@new_resource.device}").and_return(true)
|
221
|
+
::File.stub(:readlink).with("#{@new_resource.device}").and_return(target)
|
222
|
+
|
223
|
+
fstab = "/dev/sdz1 /tmp/foo ext3 defaults 1 2\n"
|
224
|
+
|
225
|
+
::File.stub(:foreach).with("/etc/fstab").and_yield fstab
|
226
|
+
|
227
|
+
@provider.load_current_resource
|
228
|
+
@provider.current_resource.enabled.should be_true
|
229
|
+
end
|
230
|
+
|
202
231
|
it "should set enabled to false if the mount point is not in fstab" do
|
203
232
|
fstab = "/dev/sdy1 #{@new_resource.mount_point} ext3 defaults 1 2\n"
|
204
233
|
::File.stub(:foreach).with("/etc/fstab").and_yield fstab
|
@@ -225,6 +254,7 @@ describe Chef::Provider::Mount::Mount do
|
|
225
254
|
end
|
226
255
|
|
227
256
|
it "should not mangle the mount options if the device in fstab is a symlink" do
|
257
|
+
# expand the target path to correct specs on Windows
|
228
258
|
target = "/dev/mapper/target"
|
229
259
|
options = "rw,noexec,noauto"
|
230
260
|
|
@@ -238,7 +268,7 @@ describe Chef::Provider::Mount::Mount do
|
|
238
268
|
end
|
239
269
|
|
240
270
|
it "should not mangle the mount options if the symlink target is in fstab" do
|
241
|
-
target = "/dev/mapper/target"
|
271
|
+
target = ::File.expand_path("/dev/mapper/target")
|
242
272
|
options = "rw,noexec,noauto"
|
243
273
|
|
244
274
|
::File.stub(:symlink?).with(@new_resource.device).and_return(true)
|
@@ -72,6 +72,10 @@ describe Chef::Provider::Package::Dpkg do
|
|
72
72
|
it 'if distro-specific version provided' do
|
73
73
|
check_version('1.11.4-1ubuntu1~lucid')
|
74
74
|
end
|
75
|
+
|
76
|
+
it 'returns the version if an epoch is used' do
|
77
|
+
check_version('1:1.8.3-2')
|
78
|
+
end
|
75
79
|
end
|
76
80
|
|
77
81
|
it "gets the source package name from dpkg-deb correctly when the package name has `-', `+' or `.' characters" do
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Bryan McLellan <btm@loftninjas.org>
|
3
|
+
# Copyright:: Copyright (c) 2014 Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Provider::Package::Windows::MSI, :windows_only do
|
22
|
+
let(:node) { double('Chef::Node') }
|
23
|
+
let(:events) { double('Chef::Events').as_null_object } # mock all the methods
|
24
|
+
let(:run_context) { double('Chef::RunContext', :node => node, :events => events) }
|
25
|
+
let(:new_resource) { Chef::Resource::WindowsPackage.new("calculator.msi") }
|
26
|
+
let(:provider) { Chef::Provider::Package::Windows::MSI.new(new_resource) }
|
27
|
+
|
28
|
+
describe "expand_options" do
|
29
|
+
it "returns an empty string if passed no options" do
|
30
|
+
expect(provider.expand_options(nil)).to eql ""
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns a string with a leading space if passed options" do
|
34
|
+
expect(provider.expand_options("--train nope --town no_way")).to eql(" --train nope --town no_way")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "installed_version" do
|
39
|
+
it "returns the installed version" do
|
40
|
+
provider.stub(:get_product_property).and_return("{23170F69-40C1-2702-0920-000001000000}")
|
41
|
+
provider.stub(:get_installed_version).with("{23170F69-40C1-2702-0920-000001000000}").and_return("3.14159.1337.42")
|
42
|
+
expect(provider.installed_version).to eql("3.14159.1337.42")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "package_version" do
|
47
|
+
it "returns the version of a package" do
|
48
|
+
provider.stub(:get_product_property).with(/calculator.msi$/, "ProductVersion").and_return(42)
|
49
|
+
expect(provider.package_version).to eql(42)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "install_package" do
|
54
|
+
# calls shell_out!
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "remove_package" do
|
58
|
+
# calls shell_out!
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Bryan McLellan <btm@loftninjas.org>
|
3
|
+
# Copyright:: Copyright (c) 2014 Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Provider::Package::Windows, :windows_only do
|
22
|
+
let(:node) { double('Chef::Node') }
|
23
|
+
let(:events) { double('Chef::Events').as_null_object } # mock all the methods
|
24
|
+
let(:run_context) { double('Chef::RunContext', :node => node, :events => events) }
|
25
|
+
let(:new_resource) { Chef::Resource::WindowsPackage.new("calculator.msi") }
|
26
|
+
let(:provider) { Chef::Provider::Package::Windows.new(new_resource, run_context) }
|
27
|
+
|
28
|
+
describe "load_current_resource" do
|
29
|
+
before(:each) do
|
30
|
+
provider.stub(:package_provider).and_return(double('package_provider',
|
31
|
+
:installed_version => "1.0", :package_version => "2.0"))
|
32
|
+
end
|
33
|
+
|
34
|
+
it "creates a current resource with the name of the new resource" do
|
35
|
+
provider.load_current_resource
|
36
|
+
expect(provider.current_resource).to be_a(Chef::Resource::WindowsPackage)
|
37
|
+
expect(provider.current_resource.name).to eql("calculator.msi")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "sets the current version if the package is installed" do
|
41
|
+
provider.load_current_resource
|
42
|
+
expect(provider.current_resource.version).to eql("1.0")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "sets the version to be installed" do
|
46
|
+
provider.load_current_resource
|
47
|
+
expect(provider.new_resource.version).to eql("2.0")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "package_provider" do
|
52
|
+
it "sets the package provider to MSI if the the installer type is :msi" do
|
53
|
+
provider.stub(:installer_type).and_return(:msi)
|
54
|
+
expect(provider.package_provider).to be_a(Chef::Provider::Package::Windows::MSI)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "raises an error if the installer_type is unknown" do
|
58
|
+
provider.stub(:installer_type).and_return(:apt_for_windows)
|
59
|
+
expect { provider.package_provider }.to raise_error
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "installer_type" do
|
64
|
+
it "it returns @installer_type if it is set" do
|
65
|
+
provider.new_resource.installer_type("downeaster")
|
66
|
+
expect(provider.installer_type).to eql("downeaster")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "sets installer_type to msi if the source ends in .msi" do
|
70
|
+
provider.new_resource.source("microsoft_installer.msi")
|
71
|
+
expect(provider.installer_type).to eql(:msi)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "raises an error if it cannot determine the installer type" do
|
75
|
+
provider.new_resource.installer_type(nil)
|
76
|
+
provider.new_resource.source("tomfoolery.now")
|
77
|
+
expect { provider.installer_type }.to raise_error(ArgumentError)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|