chef 15.2.20 → 15.3.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/chef.gemspec +3 -2
  4. data/lib/chef/application.rb +1 -1
  5. data/lib/chef/application/base.rb +7 -0
  6. data/lib/chef/application/client.rb +6 -2
  7. data/lib/chef/application/solo.rb +7 -1
  8. data/lib/chef/cookbook/gem_installer.rb +7 -2
  9. data/lib/chef/exceptions.rb +12 -0
  10. data/lib/chef/knife/bootstrap.rb +8 -1
  11. data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
  12. data/lib/chef/knife/bootstrap/train_connector.rb +3 -3
  13. data/lib/chef/knife/cookbook_metadata_from_file.rb +1 -1
  14. data/lib/chef/node.rb +0 -2
  15. data/lib/chef/policy_builder/expand_node_object.rb +1 -1
  16. data/lib/chef/policy_builder/policyfile.rb +4 -3
  17. data/lib/chef/provider.rb +4 -2
  18. data/lib/chef/provider/ifconfig.rb +5 -3
  19. data/lib/chef/provider/package/chocolatey.rb +12 -22
  20. data/lib/chef/provider/user.rb +1 -1
  21. data/lib/chef/provider/user/dscl.rb +2 -2
  22. data/lib/chef/provider/user/mac.rb +628 -0
  23. data/lib/chef/providers.rb +1 -0
  24. data/lib/chef/resource.rb +28 -20
  25. data/lib/chef/resource/chocolatey_feature.rb +1 -1
  26. data/lib/chef/resource/chocolatey_package.rb +2 -2
  27. data/lib/chef/resource/cron_d.rb +1 -1
  28. data/lib/chef/resource/ohai.rb +1 -1
  29. data/lib/chef/resource/resource_notification.rb +17 -13
  30. data/lib/chef/resource/ruby_block.rb +1 -1
  31. data/lib/chef/resource/service.rb +1 -1
  32. data/lib/chef/resource/user.rb +1 -0
  33. data/lib/chef/resource/user/dscl_user.rb +1 -1
  34. data/lib/chef/resource/user/mac_user.rb +119 -0
  35. data/lib/chef/resource/windows_ad_join.rb +1 -1
  36. data/lib/chef/resource_collection.rb +6 -0
  37. data/lib/chef/resources.rb +1 -0
  38. data/lib/chef/run_context.rb +61 -27
  39. data/lib/chef/runner.rb +50 -12
  40. data/lib/chef/version.rb +1 -1
  41. data/spec/functional/resource/chocolatey_package_spec.rb +19 -1
  42. data/spec/functional/resource/user/mac_user_spec.rb +207 -0
  43. data/spec/integration/client/client_spec.rb +22 -0
  44. data/spec/integration/knife/raw_spec.rb +39 -19
  45. data/spec/integration/knife/redirection_spec.rb +22 -13
  46. data/spec/integration/knife/serve_spec.rb +1 -2
  47. data/spec/integration/recipes/unified_mode_spec.rb +876 -0
  48. data/spec/spec_helper.rb +1 -0
  49. data/spec/support/platform_helpers.rb +10 -0
  50. data/spec/support/shared/integration/integration_helper.rb +1 -2
  51. data/spec/unit/application/client_spec.rb +5 -6
  52. data/spec/unit/application/solo_spec.rb +3 -8
  53. data/spec/unit/application_spec.rb +1 -1
  54. data/spec/unit/cookbook/gem_installer_spec.rb +22 -1
  55. data/spec/unit/knife/bootstrap/train_connector_spec.rb +20 -7
  56. data/spec/unit/knife/bootstrap_spec.rb +13 -5
  57. data/spec/unit/provider/ifconfig_spec.rb +11 -0
  58. data/spec/unit/provider/package/chocolatey_spec.rb +34 -30
  59. data/spec/unit/provider/user/dscl_spec.rb +1 -0
  60. data/spec/unit/provider/user/mac_spec.rb +38 -0
  61. data/spec/unit/provider/user_spec.rb +38 -22
  62. data/tasks/docs.rb +14 -10
  63. metadata +25 -41
  64. data/lib/.DS_Store +0 -0
  65. data/lib/chef/.DS_Store +0 -0
  66. data/lib/chef/dsl/.DS_Store +0 -0
  67. data/lib/chef/knife/.DS_Store +0 -0
  68. data/lib/chef/mixin/.DS_Store +0 -0
  69. data/lib/chef/provider/.DS_Store +0 -0
  70. data/lib/chef/provider/package/.DS_Store +0 -0
  71. data/lib/chef/provider/package/freebsd/.DS_Store +0 -0
  72. data/lib/chef/resource/.DS_Store +0 -0
  73. data/lib/chef/resource/file/.DS_Store +0 -0
  74. data/spec/.DS_Store +0 -0
  75. data/spec/data/.DS_Store +0 -0
  76. data/spec/data/cookbooks/.DS_Store +0 -0
  77. data/spec/data/cookbooks/java/.DS_Store +0 -0
  78. data/spec/data/cookbooks/java/files/.DS_Store +0 -0
  79. data/spec/data/mac_users/.DS_Store +0 -0
  80. data/spec/data/nodes/Tim.local.json +0 -3
  81. data/spec/data/nodes/Tims-MBP.local.json +0 -3
  82. data/spec/data/run_context/.DS_Store +0 -0
  83. data/spec/data/run_context/cookbooks/.DS_Store +0 -0
  84. data/spec/functional/.DS_Store +0 -0
  85. data/spec/functional/resource/.DS_Store +0 -0
  86. data/spec/functional/util/.DS_Store +0 -0
  87. data/spec/integration/.DS_Store +0 -0
  88. data/spec/stress/.DS_Store +0 -0
  89. data/spec/support/.DS_Store +0 -0
  90. data/spec/support/shared/integration/app_server_support.rb +0 -39
  91. data/spec/unit/.DS_Store +0 -0
  92. data/tasks/.DS_Store +0 -0
@@ -145,6 +145,7 @@ RSpec.configure do |config|
145
145
  config.filter_run_excluding not_supported_on_windows: true if windows?
146
146
  config.filter_run_excluding not_supported_on_macos: true if mac_osx?
147
147
  config.filter_run_excluding macos_only: true unless mac_osx?
148
+ config.filter_run_excluding macos_1014: true unless mac_osx_1014?
148
149
  config.filter_run_excluding not_supported_on_aix: true if aix?
149
150
  config.filter_run_excluding not_supported_on_solaris: true if solaris?
150
151
  config.filter_run_excluding not_supported_on_gce: true if gce?
@@ -3,6 +3,7 @@ require "chef/mixin/shell_out"
3
3
  require "ohai/mixin/http_helper"
4
4
  require "ohai/mixin/gce_metadata"
5
5
  require "chef/mixin/powershell_out"
6
+ require "chef/version_class"
6
7
 
7
8
  class ShellHelpers
8
9
  extend Chef::Mixin::ShellOut
@@ -110,6 +111,15 @@ def mac_osx_106?
110
111
  false
111
112
  end
112
113
 
114
+ def mac_osx_1014?
115
+ if mac_osx?
116
+ ver = Chef::Version.new(ohai[:platform_version])
117
+ return ver.major == 10 && ver.minor == 14
118
+ end
119
+
120
+ false
121
+ end
122
+
113
123
  def mac_osx?
114
124
  if File.exists? "/usr/bin/sw_vers"
115
125
  result = ShellHelpers.shell_out("/usr/bin/sw_vers")
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # Author:: John Keiser (<jkeiser@chef.io>)
3
3
  # Author:: Ho-Sheng Hsiao (<hosh@chef.io>)
4
- # Copyright:: Copyright 2012-2016, Chef Software Inc.
4
+ # Copyright:: Copyright 2012-2019, Chef Software Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,6 @@ require "chef/config"
23
23
  require "chef/json_compat"
24
24
  require "chef/server_api"
25
25
  require "support/shared/integration/knife_support"
26
- require "support/shared/integration/app_server_support"
27
26
  require "cheffish/rspec/chef_run_support"
28
27
  require "spec_helper"
29
28
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  # Author:: AJ Christensen (<aj@junglist.gen.nz>)
3
- # Copyright:: Copyright 2008-2018, Chef Software Inc.
3
+ # Copyright:: Copyright 2008-2019, 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");
@@ -85,7 +85,6 @@ describe Chef::Application::Client, "reconfigure" do
85
85
 
86
86
  allow(app).to receive(:trap)
87
87
  allow(app).to receive(:configure_logging).and_return(true)
88
- Chef::Config[:interval] = 10
89
88
 
90
89
  Chef::Config[:once] = false
91
90
 
@@ -162,7 +161,7 @@ describe Chef::Application::Client, "reconfigure" do
162
161
  it_behaves_like "sets the configuration", "--no-fork", client_fork: false
163
162
  end
164
163
 
165
- context "with an interval" do
164
+ context "with an interval", :unix_only do
166
165
  it_behaves_like "sets the configuration", "--interval 1800", client_fork: true
167
166
  end
168
167
 
@@ -322,7 +321,7 @@ describe Chef::Application::Client, "reconfigure" do
322
321
  Chef::Config[:splay] = nil
323
322
  end
324
323
 
325
- it "should terminal with message when interval is given" do
324
+ it "should terminate with message when interval is given" do
326
325
  Chef::Config[:interval] = 600
327
326
  allow(ChefConfig).to receive(:windows?).and_return(false)
328
327
  expect(Chef::Application).to receive(:fatal!).with(
@@ -340,8 +339,8 @@ Enable .* interval runs by setting `:client_fork = true` in your config file or
340
339
  allow(ChefConfig).to receive(:windows?).and_return(true)
341
340
  end
342
341
 
343
- it "should not terminate" do
344
- expect(Chef::Application).not_to receive(:fatal!)
342
+ it "should terminate" do
343
+ expect(Chef::Application).to receive(:fatal!)
345
344
  app.reconfigure
346
345
  end
347
346
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: AJ Christensen (<aj@junglist.gen.nz>)
3
- # Copyright:: Copyright 2008-2018, Chef Software Inc.
3
+ # Copyright:: Copyright 2008-2019, 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");
@@ -64,18 +64,13 @@ describe Chef::Application::Solo do
64
64
  end
65
65
 
66
66
  it "should terminate with message" do
67
- expect(Chef::Application).to receive(:fatal!).with(
68
- /Unforked .* interval runs are disabled by default\.
69
- Configuration settings:
70
- interval = 600 seconds
71
- Enable .* interval runs by setting `:client_fork = true` in your config file or adding `--fork` to your command line options\./
72
- )
67
+ expect(Chef::Application).to receive(:fatal!).with(/interval runs are (disabled|not supported)/)
73
68
  app.reconfigure
74
69
  end
75
70
  end
76
71
  end
77
72
 
78
- describe "when in daemonized mode and no interval has been set" do
73
+ describe "when in daemonized mode and no interval has been set", :unix_only do
79
74
  before do
80
75
  Chef::Config[:daemonize] = true
81
76
  end
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # Author:: AJ Christensen (<aj@junglist.gen.nz>)
3
3
  # Author:: Mark Mzyk (mmzyk@chef.io)
4
- # Copyright:: Copyright 2008-2018, Chef Software Inc.
4
+ # Copyright:: Copyright 2008-2019, Chef Software Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -59,23 +59,25 @@ describe Chef::Cookbook::GemInstaller do
59
59
  expect(File).to receive(:open).and_yield(gemfile)
60
60
  expect(gemfile).to receive(:path).and_return("")
61
61
  expect(IO).to receive(:read).and_return("")
62
- expect(gem_installer).to receive(:shell_out!).and_return(shell_out)
63
62
 
64
63
  end
65
64
 
66
65
  it "generates a valid Gemfile" do
66
+ expect(gem_installer).to receive(:shell_out!).and_return(shell_out)
67
67
  expect { gem_installer.install }.to_not raise_error
68
68
 
69
69
  expect { bundler_dsl }.to_not raise_error
70
70
  end
71
71
 
72
72
  it "generate a Gemfile with all constraints" do
73
+ expect(gem_installer).to receive(:shell_out!).and_return(shell_out)
73
74
  expect { gem_installer.install }.to_not raise_error
74
75
 
75
76
  expect(bundler_dsl.dependencies.find { |d| d.name == "httpclient" }.requirements_list.length).to eql(2)
76
77
  end
77
78
 
78
79
  it "generates a valid Gemfile when Chef::Config[:rubygems_url] is set to a String" do
80
+ expect(gem_installer).to receive(:shell_out!).and_return(shell_out)
79
81
  Chef::Config[:rubygems_url] = "https://www.rubygems.org"
80
82
  expect { gem_installer.install }.to_not raise_error
81
83
 
@@ -83,10 +85,29 @@ describe Chef::Cookbook::GemInstaller do
83
85
  end
84
86
 
85
87
  it "generates a valid Gemfile when Chef::Config[:rubygems_url] is set to an Array" do
88
+ expect(gem_installer).to receive(:shell_out!).and_return(shell_out)
86
89
  Chef::Config[:rubygems_url] = [ "https://www.rubygems.org" ]
87
90
 
88
91
  expect { gem_installer.install }.to_not raise_error
89
92
 
90
93
  expect(bundler_dsl.dependencies.find { |d| d.name == "httpclient" }.requirements_list.length).to eql(2)
91
94
  end
95
+
96
+ it "skip metadata installation when Chef::Config[:skip_gem_metadata_installation] is set to true" do
97
+ Chef::Config[:skip_gem_metadata_installation] = true
98
+ expect(gem_installer.install).to_not receive(:shell_out!)
99
+ end
100
+
101
+ it "install metadata when Chef::Config[:skip_gem_metadata_installation] is not true" do
102
+ expect(gem_installer).to receive(:shell_out!).and_return(shell_out)
103
+ expect(Chef::Log).to receive(:info).and_return("")
104
+ expect(gem_installer.install).to be_nil
105
+ end
106
+
107
+ it "install from local cache when Chef::Config[:gem_installer_bundler_options] is set to local" do
108
+ Chef::Config[:gem_installer_bundler_options] = "--local"
109
+ expect(gem_installer).to receive(:shell_out!).with(["bundle", "install", "--local"], any_args).and_return(shell_out)
110
+ expect(Chef::Log).to receive(:info).and_return("")
111
+ expect(gem_installer.install).to be_nil
112
+ end
92
113
  end
@@ -162,16 +162,29 @@ describe Chef::Knife::Bootstrap::TrainConnector do
162
162
  allow(SecureRandom).to receive(:alphanumeric).with(6).and_return(random)
163
163
  end
164
164
 
165
- it "uses the *nix command to create the temp dir and sets ownership to logged-in user" do
166
- expected_command = "mkdir -p #{dir} && sudo chown user1 '#{dir}'"
167
- expect(subject).to receive(:run_command!).with(expected_command)
168
- .and_return double("result", stdout: "\r\n")
169
- expect(subject.temp_dir).to eq(dir)
165
+ context "uses the *nix command to create the temp dir and sets ownership to logged-in" do
166
+ it "with sudo privilege" do
167
+ subject.config[:sudo] = true
168
+ expected_command1 = "mkdir -p '#{dir}'"
169
+ expected_command2 = "chown user1 '#{dir}'"
170
+ expect(subject).to receive(:run_command!).with(expected_command1)
171
+ .and_return double("result", stdout: "\r\n")
172
+ expect(subject).to receive(:run_command!).with(expected_command2)
173
+ .and_return double("result", stdout: "\r\n")
174
+ expect(subject.temp_dir).to eq(dir)
175
+ end
176
+
177
+ it "without sudo privilege" do
178
+ expected_command = "mkdir -p '#{dir}'"
179
+ expect(subject).to receive(:run_command!).with(expected_command)
180
+ .and_return double("result", stdout: "\r\n")
181
+ expect(subject.temp_dir).to eq(dir)
182
+ end
170
183
  end
171
184
 
172
185
  context "with noise in stderr" do
173
- it "uses the *nix command to create the temp dir and sets ownership to logged-in user" do
174
- expected_command = "mkdir -p #{dir} && sudo chown user1 '#{dir}'"
186
+ it "uses the *nix command to create the temp dir" do
187
+ expected_command = "mkdir -p '#{dir}'"
175
188
  expect(subject).to receive(:run_command!).with(expected_command)
176
189
  .and_return double("result", stdout: "sudo: unable to resolve host hostname.localhost\r\n" + "#{dir}\r\n")
177
190
  expect(subject.temp_dir).to eq(dir)
@@ -1021,7 +1021,6 @@ describe Chef::Knife::Bootstrap do
1021
1021
  verify_host_key: nil,
1022
1022
  port: 9999,
1023
1023
  non_interactive: true,
1024
- pty: true,
1025
1024
  }
1026
1025
  end
1027
1026
 
@@ -1076,7 +1075,6 @@ describe Chef::Knife::Bootstrap do
1076
1075
  verify_host_key: nil, # Config
1077
1076
  port: 12, # cli
1078
1077
  non_interactive: true,
1079
- pty: true,
1080
1078
  }
1081
1079
  end
1082
1080
 
@@ -1128,7 +1126,6 @@ describe Chef::Knife::Bootstrap do
1128
1126
  sudo_password: "blah",
1129
1127
  verify_host_key: true,
1130
1128
  non_interactive: true,
1131
- pty: true,
1132
1129
  }
1133
1130
  end
1134
1131
  it "generates a config hash using the CLI options and pulling nothing from Chef::Config" do
@@ -1152,7 +1149,6 @@ describe Chef::Knife::Bootstrap do
1152
1149
  sudo: false,
1153
1150
  verify_host_key: "always",
1154
1151
  non_interactive: true,
1155
- pty: true,
1156
1152
  connection_timeout: 60,
1157
1153
  }
1158
1154
  end
@@ -1504,7 +1500,6 @@ describe Chef::Knife::Bootstrap do
1504
1500
  let(:default_opts) do
1505
1501
  {
1506
1502
  non_interactive: true,
1507
- pty: true,
1508
1503
  forward_agent: false,
1509
1504
  connection_timeout: 60,
1510
1505
  }
@@ -2003,6 +1998,19 @@ describe Chef::Knife::Bootstrap do
2003
1998
  expect(connection).to receive(:connect!)
2004
1999
  knife.do_connect({})
2005
2000
  end
2001
+
2002
+ context "when sshd confgiured with requiretty" do
2003
+ let(:pty_err_msg) { "Sudo requires a TTY. Please see the README on how to configure sudo to allow for non-interactive usage." }
2004
+ let(:expected_error) { Train::UserError.new(pty_err_msg, :sudo_no_tty) }
2005
+ before do
2006
+ allow(connection).to receive(:connect!).and_raise(expected_error)
2007
+ end
2008
+ it "retry with pty true request option" do
2009
+ expect(Chef::Knife::Bootstrap::TrainConnector).to receive(:new).and_return(connection).exactly(2).times
2010
+ expect(knife.ui).to receive(:warn).with("#{pty_err_msg} - trying with pty request")
2011
+ expect { knife.do_connect({}) }.to raise_error(expected_error)
2012
+ end
2013
+ end
2006
2014
  end
2007
2015
 
2008
2016
  describe "validate_winrm_transport_opts!" do
@@ -94,6 +94,17 @@ describe Chef::Provider::Ifconfig do
94
94
  expect(@new_resource).not_to be_updated
95
95
  end
96
96
 
97
+ it "should add a bridge interface" do
98
+ allow(@provider).to receive(:load_current_resource)
99
+ @new_resource.device "br-1234"
100
+ command = "ifconfig br-1234 10.0.0.1 netmask 255.255.254.0 metric 1 mtu 1500"
101
+ expect(@provider).to receive(:shell_out_compacted!).with(*command.split(" "))
102
+ expect(@provider).to receive(:generate_config)
103
+
104
+ @provider.run_action(:add)
105
+ expect(@new_resource).to be_updated
106
+ end
107
+
97
108
  # We are not testing this case with the assumption that anyone writing the cookbook would not make a typo == lo
98
109
  # it "should add a blank command if the #{@new_resource.device} == lo" do
99
110
  # end
@@ -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-2019, 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");
@@ -46,7 +46,7 @@ describe Chef::Provider::Package::Chocolatey do
46
46
  allow(provider).to receive(:choco_install_path).and_return(choco_install_path)
47
47
  allow(provider).to receive(:choco_exe).and_return(choco_exe)
48
48
  local_list_obj = double(stdout: local_list_stdout)
49
- allow(provider).to receive(:shell_out_compacted!).with("#{choco_exe} list -l -r", { returns: [0], timeout: timeout }).and_return(local_list_obj)
49
+ allow(provider).to receive(:shell_out_compacted!).with(choco_exe, "list", "-l", "-r", { returns: [0], timeout: timeout }).and_return(local_list_obj)
50
50
  end
51
51
 
52
52
  def allow_remote_list(package_names, args = nil)
@@ -60,7 +60,11 @@ describe Chef::Provider::Package::Chocolatey do
60
60
  EOF
61
61
  remote_list_obj = double(stdout: remote_list_stdout)
62
62
  package_names.each do |pkg|
63
- allow(provider).to receive(:shell_out_compacted!).with("#{choco_exe} list -r #{pkg}#{args}", { returns: [0], timeout: timeout }).and_return(remote_list_obj)
63
+ if args
64
+ allow(provider).to receive(:shell_out_compacted!).with(choco_exe, "list", "-r", pkg, *args, { returns: [0], timeout: timeout }).and_return(remote_list_obj)
65
+ else
66
+ allow(provider).to receive(:shell_out_compacted!).with(choco_exe, "list", "-r", pkg, { returns: [0], timeout: timeout }).and_return(remote_list_obj)
67
+ end
64
68
  end
65
69
  end
66
70
 
@@ -182,7 +186,7 @@ describe Chef::Provider::Package::Chocolatey do
182
186
  it "should install a single package" do
183
187
  allow_remote_list(["git"])
184
188
  provider.load_current_resource
185
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y git", { returns: [0], timeout: timeout }).and_return(double)
189
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "git", { returns: [0], timeout: timeout }).and_return(double)
186
190
  provider.run_action(:install)
187
191
  expect(new_resource).to be_updated_by_last_action
188
192
  end
@@ -193,7 +197,7 @@ describe Chef::Provider::Package::Chocolatey do
193
197
  allow_remote_list(["git"])
194
198
  new_resource.timeout(timeout)
195
199
  provider.load_current_resource
196
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y git", { returns: [0], timeout: timeout }).and_return(double)
200
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "git", { returns: [0], timeout: timeout }).and_return(double)
197
201
  provider.run_action(:install)
198
202
  expect(new_resource).to be_updated_by_last_action
199
203
  end
@@ -222,7 +226,7 @@ describe Chef::Provider::Package::Chocolatey do
222
226
  new_resource.package_name("ConEmu")
223
227
  new_resource.version("15.10.25.1")
224
228
  provider.load_current_resource
225
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y --version 15.10.25.1 conemu", { returns: [0], timeout: timeout }).and_return(double)
229
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "--version", "15.10.25.1", "conemu", { returns: [0], timeout: timeout }).and_return(double)
226
230
  provider.run_action(:install)
227
231
  expect(new_resource).to be_updated_by_last_action
228
232
  end
@@ -235,7 +239,7 @@ describe Chef::Provider::Package::Chocolatey do
235
239
  new_resource.package_name(%w{chocolatey ConEmu})
236
240
  new_resource.version([nil, "15.10.25.1"])
237
241
  provider.load_current_resource
238
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y --version 15.10.25.1 conemu", { returns: [0], timeout: timeout }).and_return(double)
242
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "--version", "15.10.25.1", "conemu", { returns: [0], timeout: timeout }).and_return(double)
239
243
  provider.run_action(:install)
240
244
  expect(new_resource).to be_updated_by_last_action
241
245
  end
@@ -245,7 +249,7 @@ describe Chef::Provider::Package::Chocolatey do
245
249
  new_resource.package_name("conemu")
246
250
  new_resource.version("15.10.25.1")
247
251
  provider.load_current_resource
248
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y --version 15.10.25.1 conemu", { returns: [0], timeout: timeout }).and_return(double)
252
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "--version", "15.10.25.1", "conemu", { returns: [0], timeout: timeout }).and_return(double)
249
253
  provider.run_action(:install)
250
254
  expect(new_resource).to be_updated_by_last_action
251
255
  end
@@ -255,8 +259,8 @@ describe Chef::Provider::Package::Chocolatey do
255
259
  new_resource.package_name(%w{ConEmu git})
256
260
  new_resource.version(["15.10.25.1", nil])
257
261
  provider.load_current_resource
258
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y --version 15.10.25.1 conemu", { returns: [0], timeout: timeout }).and_return(double)
259
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y git", { returns: [0], timeout: timeout }).and_return(double)
262
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "--version", "15.10.25.1", "conemu", { returns: [0], timeout: timeout }).and_return(double)
263
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "git", { returns: [0], timeout: timeout }).and_return(double)
260
264
  provider.run_action(:install)
261
265
  expect(new_resource).to be_updated_by_last_action
262
266
  end
@@ -265,27 +269,27 @@ describe Chef::Provider::Package::Chocolatey do
265
269
  allow_remote_list(%w{git munin-node})
266
270
  new_resource.package_name(%w{git munin-node})
267
271
  provider.load_current_resource
268
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y git munin-node", { returns: [0], timeout: timeout }).and_return(double)
272
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "git", "munin-node", { returns: [0], timeout: timeout }).and_return(double)
269
273
  provider.run_action(:install)
270
274
  expect(new_resource).to be_updated_by_last_action
271
275
  end
272
276
 
273
277
  context "when passing a source argument" do
274
278
  it "should pass options into the install command" do
275
- allow_remote_list(["git"], " -source localpackages")
279
+ allow_remote_list(["git"], ["-source", "localpackages"])
276
280
  new_resource.source("localpackages")
277
281
  provider.load_current_resource
278
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y -source localpackages git", { returns: [0], timeout: timeout }).and_return(double)
282
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "-source", "localpackages", "git", { returns: [0], timeout: timeout }).and_return(double)
279
283
  provider.run_action(:install)
280
284
  expect(new_resource).to be_updated_by_last_action
281
285
  end
282
286
  end
283
287
 
284
288
  it "should pass options into the install command" do
285
- allow_remote_list(["git"], " -force")
289
+ allow_remote_list(["git"], "-force")
286
290
  new_resource.options("-force")
287
291
  provider.load_current_resource
288
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y -force git", { returns: [0], timeout: timeout }).and_return(double)
292
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "-force", "git", { returns: [0], timeout: timeout }).and_return(double)
289
293
  provider.run_action(:install)
290
294
  expect(new_resource).to be_updated_by_last_action
291
295
  end
@@ -306,7 +310,7 @@ describe Chef::Provider::Package::Chocolatey do
306
310
 
307
311
  context "alternate source" do
308
312
  it "installing a package that does not exist throws an error" do
309
- allow_remote_list(["package-does-not-exist"], " -source alternate_source")
313
+ allow_remote_list(["package-does-not-exist"], ["-source", "alternate_source"])
310
314
  new_resource.package_name("package-does-not-exist")
311
315
  new_resource.source("alternate_source")
312
316
  provider.load_current_resource
@@ -316,7 +320,7 @@ describe Chef::Provider::Package::Chocolatey do
316
320
 
317
321
  context "private source" do
318
322
  it "installing a package without auth options throws an error" do
319
- allow_remote_list(["package-without-auth"], " -source auth_source")
323
+ allow_remote_list(["package-without-auth"], ["-source", "auth_source"])
320
324
  new_resource.package_name("package-without-auth")
321
325
  new_resource.source("auth_source")
322
326
  provider.load_current_resource
@@ -324,7 +328,7 @@ describe Chef::Provider::Package::Chocolatey do
324
328
  end
325
329
 
326
330
  it "installing a package with invalid credentials throws an error" do
327
- allow_remote_list(["package-invalid-auth"], " -source auth_source -u user -p password")
331
+ allow_remote_list(["package-invalid-auth"], [ "-source", "auth_source", "-u user -p password"])
328
332
  new_resource.package_name("package-invalid-auth")
329
333
  new_resource.source("auth_source")
330
334
  new_resource.options("-u user -p password")
@@ -333,11 +337,11 @@ describe Chef::Provider::Package::Chocolatey do
333
337
  end
334
338
 
335
339
  it "installing a package with valid credentials" do
336
- allow_remote_list(["git"], " -source auth_source -u user -p password")
340
+ allow_remote_list(["git"], [ "-source", "auth_source", "-u user -p password" ])
337
341
  new_resource.source("auth_source")
338
342
  new_resource.options("-u user -p password")
339
343
  provider.load_current_resource
340
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} install -y -u user -p password -source auth_source git", { returns: [0], timeout: timeout }).and_return(double)
344
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "install", "-y", "-u user -p password", "-source", "auth_source", "git", { returns: [0], timeout: timeout }).and_return(double)
341
345
  provider.run_action(:install)
342
346
  expect(new_resource).to be_updated_by_last_action
343
347
  end
@@ -348,7 +352,7 @@ describe Chef::Provider::Package::Chocolatey do
348
352
  it "should install a package that is not installed" do
349
353
  allow_remote_list(["git"])
350
354
  provider.load_current_resource
351
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} upgrade -y git", { returns: [0], timeout: timeout }).and_return(double)
355
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "upgrade", "-y", "git", { returns: [0], timeout: timeout }).and_return(double)
352
356
  provider.run_action(:upgrade)
353
357
  expect(new_resource).to be_updated_by_last_action
354
358
  end
@@ -357,7 +361,7 @@ describe Chef::Provider::Package::Chocolatey do
357
361
  allow_remote_list(["ConEmu"])
358
362
  new_resource.package_name("ConEmu")
359
363
  provider.load_current_resource
360
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} upgrade -y conemu", { returns: [0], timeout: timeout }).and_return(double)
364
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "upgrade", "-y", "conemu", { returns: [0], timeout: timeout }).and_return(double)
361
365
  provider.run_action(:upgrade)
362
366
  expect(new_resource).to be_updated_by_last_action
363
367
  end
@@ -366,7 +370,7 @@ describe Chef::Provider::Package::Chocolatey do
366
370
  allow_remote_list(["conemu"])
367
371
  new_resource.package_name("conemu")
368
372
  provider.load_current_resource
369
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} upgrade -y conemu", { returns: [0], timeout: timeout }).and_return(double)
373
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "upgrade", "-y", "conemu", { returns: [0], timeout: timeout }).and_return(double)
370
374
  provider.run_action(:upgrade)
371
375
  expect(new_resource).to be_updated_by_last_action
372
376
  end
@@ -375,7 +379,7 @@ describe Chef::Provider::Package::Chocolatey do
375
379
  allow_remote_list(["chocolatey"])
376
380
  new_resource.package_name("chocolatey")
377
381
  provider.load_current_resource
378
- expect(provider).not_to receive(:shell_out_compacted!).with("#{choco_exe} upgrade -y chocolatey", { returns: [0], timeout: timeout })
382
+ expect(provider).not_to receive(:shell_out_compacted!).with(choco_exe, "upgrade", "-y", "chocolatey", { returns: [0], timeout: timeout })
379
383
  provider.run_action(:upgrade)
380
384
  expect(new_resource).not_to be_updated_by_last_action
381
385
  end
@@ -384,7 +388,7 @@ describe Chef::Provider::Package::Chocolatey do
384
388
  allow_remote_list(["git"])
385
389
  new_resource.version("2.6.2")
386
390
  provider.load_current_resource
387
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} upgrade -y --version 2.6.2 git", { returns: [0], timeout: timeout })
391
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "upgrade", "-y", "--version", "2.6.2", "git", { returns: [0], timeout: timeout })
388
392
  provider.run_action(:upgrade)
389
393
  expect(new_resource).to be_updated_by_last_action
390
394
  end
@@ -392,7 +396,7 @@ describe Chef::Provider::Package::Chocolatey do
392
396
  it "upgrading multiple packages uses a single command" do
393
397
  allow_remote_list(%w{conemu git})
394
398
  new_resource.package_name(%w{conemu git})
395
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} upgrade -y conemu git", { returns: [0], timeout: timeout }).and_return(double)
399
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "upgrade", "-y", "conemu", "git", { returns: [0], timeout: timeout }).and_return(double)
396
400
  provider.run_action(:upgrade)
397
401
  expect(new_resource).to be_updated_by_last_action
398
402
  end
@@ -413,7 +417,7 @@ describe Chef::Provider::Package::Chocolatey do
413
417
 
414
418
  context "alternate source" do
415
419
  it "installing a package that does not exist throws an error" do
416
- allow_remote_list(["package-does-not-exist"], " -source alternate_source")
420
+ allow_remote_list(["package-does-not-exist"], ["-source", "alternate_source"])
417
421
  new_resource.package_name("package-does-not-exist")
418
422
  new_resource.source("alternate_source")
419
423
  provider.load_current_resource
@@ -444,7 +448,7 @@ describe Chef::Provider::Package::Chocolatey do
444
448
  allow_remote_list(["ConEmu"])
445
449
  new_resource.package_name("ConEmu")
446
450
  provider.load_current_resource
447
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} uninstall -y ConEmu", { returns: [0], timeout: timeout }).and_return(double)
451
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "uninstall", "-y", "ConEmu", { returns: [0], timeout: timeout }).and_return(double)
448
452
  provider.run_action(:remove)
449
453
  expect(new_resource).to be_updated_by_last_action
450
454
  end
@@ -453,7 +457,7 @@ describe Chef::Provider::Package::Chocolatey do
453
457
  allow_remote_list(["conemu"])
454
458
  new_resource.package_name("conemu")
455
459
  provider.load_current_resource
456
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} uninstall -y conemu", { returns: [0], timeout: timeout }).and_return(double)
460
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "uninstall", "-y", "conemu", { returns: [0], timeout: timeout }).and_return(double)
457
461
  provider.run_action(:remove)
458
462
  expect(new_resource).to be_updated_by_last_action
459
463
  end
@@ -463,7 +467,7 @@ describe Chef::Provider::Package::Chocolatey do
463
467
  allow_remote_list(%w{git conemu})
464
468
  new_resource.package_name(%w{git conemu})
465
469
  provider.load_current_resource
466
- expect(provider).to receive(:shell_out_compacted!).with("#{choco_exe} uninstall -y conemu", { returns: [0], timeout: timeout }).and_return(double)
470
+ expect(provider).to receive(:shell_out_compacted!).with(choco_exe, "uninstall", "-y", "conemu", { returns: [0], timeout: timeout }).and_return(double)
467
471
  provider.run_action(:remove)
468
472
  expect(new_resource).to be_updated_by_last_action
469
473
  end