chef 16.2.73-universal-mingw32 → 16.3.38-universal-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/Rakefile +1 -1
  4. data/chef-universal-mingw32.gemspec +2 -2
  5. data/chef.gemspec +2 -1
  6. data/lib/chef/application.rb +12 -0
  7. data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
  8. data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
  9. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
  10. data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -5
  11. data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
  12. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
  13. data/lib/chef/client.rb +3 -3
  14. data/lib/chef/cookbook/remote_file_vendor.rb +1 -3
  15. data/lib/chef/cookbook/syntax_check.rb +1 -2
  16. data/lib/chef/cookbook_loader.rb +15 -29
  17. data/lib/chef/data_bag.rb +1 -2
  18. data/lib/chef/deprecated.rb +8 -0
  19. data/lib/chef/dsl/platform_introspection.rb +2 -0
  20. data/lib/chef/environment.rb +1 -2
  21. data/lib/chef/exceptions.rb +3 -0
  22. data/lib/chef/http/authenticator.rb +1 -1
  23. data/lib/chef/knife.rb +4 -4
  24. data/lib/chef/knife/bootstrap.rb +4 -10
  25. data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
  26. data/lib/chef/knife/config_get.rb +1 -0
  27. data/lib/chef/knife/config_list_profiles.rb +4 -1
  28. data/lib/chef/knife/configure.rb +1 -1
  29. data/lib/chef/knife/cookbook_upload.rb +5 -10
  30. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  31. data/lib/chef/knife/core/hashed_command_loader.rb +1 -0
  32. data/lib/chef/knife/core/subcommand_loader.rb +20 -1
  33. data/lib/chef/knife/core/ui.rb +8 -2
  34. data/lib/chef/knife/core/windows_bootstrap_context.rb +1 -2
  35. data/lib/chef/knife/rehash.rb +3 -21
  36. data/lib/chef/knife/ssh.rb +5 -1
  37. data/lib/chef/log.rb +7 -2
  38. data/lib/chef/mixin/chef_utils_wiring.rb +40 -0
  39. data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
  40. data/lib/chef/mixin/openssl_helper.rb +27 -5
  41. data/lib/chef/mixin/path_sanity.rb +5 -4
  42. data/lib/chef/mixin/shell_out.rb +4 -188
  43. data/lib/chef/mixin/template.rb +1 -0
  44. data/lib/chef/mixin/which.rb +6 -3
  45. data/lib/chef/mixins.rb +1 -0
  46. data/lib/chef/node.rb +36 -12
  47. data/lib/chef/node_map.rb +21 -18
  48. data/lib/chef/platform/service_helpers.rb +31 -28
  49. data/lib/chef/provider/git.rb +12 -4
  50. data/lib/chef/provider/mount/solaris.rb +0 -1
  51. data/lib/chef/provider/package/snap.rb +2 -3
  52. data/lib/chef/provider/package/windows.rb +9 -4
  53. data/lib/chef/provider/package/zypper.rb +0 -1
  54. data/lib/chef/provider/service.rb +2 -2
  55. data/lib/chef/provider/yum_repository.rb +1 -1
  56. data/lib/chef/provider/zypper_repository.rb +1 -1
  57. data/lib/chef/resource.rb +2 -0
  58. data/lib/chef/resource/build_essential.rb +2 -2
  59. data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
  60. data/lib/chef/resource/chocolatey_feature.rb +1 -2
  61. data/lib/chef/resource/cron/cron_d.rb +1 -1
  62. data/lib/chef/resource/cron_access.rb +2 -2
  63. data/lib/chef/resource/execute.rb +2 -2
  64. data/lib/chef/resource/lwrp_base.rb +1 -0
  65. data/lib/chef/resource/macos_userdefaults.rb +176 -61
  66. data/lib/chef/resource/openssl_x509_certificate.rb +11 -14
  67. data/lib/chef/resource/openssl_x509_crl.rb +1 -2
  68. data/lib/chef/resource/service.rb +2 -2
  69. data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
  70. data/lib/chef/resource/sudo.rb +1 -1
  71. data/lib/chef/resource/user_ulimit.rb +1 -1
  72. data/lib/chef/resource/windows_dns_record.rb +17 -0
  73. data/lib/chef/resource/windows_firewall_profile.rb +197 -0
  74. data/lib/chef/resource/windows_security_policy.rb +49 -20
  75. data/lib/chef/resource_inspector.rb +7 -1
  76. data/lib/chef/resources.rb +1 -0
  77. data/lib/chef/role.rb +1 -2
  78. data/lib/chef/shell/shell_session.rb +2 -0
  79. data/lib/chef/util/diff.rb +0 -1
  80. data/lib/chef/version.rb +2 -2
  81. data/lib/chef/win32/registry.rb +1 -2
  82. data/spec/functional/knife/ssh_spec.rb +5 -16
  83. data/spec/functional/resource/aix_service_spec.rb +0 -2
  84. data/spec/functional/resource/aixinit_service_spec.rb +0 -1
  85. data/spec/functional/resource/apt_package_spec.rb +0 -1
  86. data/spec/functional/resource/cron_spec.rb +0 -1
  87. data/spec/functional/resource/git_spec.rb +23 -1
  88. data/spec/functional/resource/group_spec.rb +6 -2
  89. data/spec/functional/resource/insserv_spec.rb +0 -1
  90. data/spec/functional/resource/remote_file_spec.rb +1 -7
  91. data/spec/functional/resource/windows_user_privilege_spec.rb +1 -1
  92. data/spec/functional/run_lock_spec.rb +2 -1
  93. data/spec/functional/shell_spec.rb +5 -5
  94. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  95. data/spec/functional/version_spec.rb +1 -1
  96. data/spec/integration/knife/config_list_profiles_spec.rb +30 -2
  97. data/spec/integration/knife/cookbook_upload_spec.rb +27 -0
  98. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  99. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
  100. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  101. data/spec/integration/recipes/notifies_spec.rb +1 -1
  102. data/spec/integration/recipes/notifying_block_spec.rb +1 -1
  103. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -1
  104. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
  105. data/spec/integration/recipes/resource_load_spec.rb +2 -0
  106. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  107. data/spec/integration/recipes/use_partial_spec.rb +1 -1
  108. data/spec/scripts/ssl-serve.rb +1 -1
  109. data/spec/spec_helper.rb +10 -4
  110. data/spec/support/chef_helpers.rb +1 -20
  111. data/spec/support/platform_helpers.rb +0 -2
  112. data/spec/support/shared/functional/file_resource.rb +0 -1
  113. data/spec/support/shared/integration/knife_support.rb +2 -9
  114. data/spec/support/shared/unit/application_dot_d.rb +0 -1
  115. data/spec/unit/application_spec.rb +4 -2
  116. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
  117. data/spec/unit/chef_fs/{parallelizer.rb → parallelizer_spec.rb} +1 -1
  118. data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
  119. data/spec/unit/data_collector_spec.rb +1 -1
  120. data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
  121. data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
  122. data/spec/unit/json_compat_spec.rb +1 -1
  123. data/spec/unit/knife/bootstrap_spec.rb +2 -6
  124. data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
  125. data/spec/unit/log/syslog_spec.rb +6 -10
  126. data/spec/unit/log/winevt_spec.rb +21 -13
  127. data/spec/unit/lwrp_spec.rb +4 -4
  128. data/spec/unit/mixin/{path_sanity_spec.rb → default_paths_spec.rb} +14 -14
  129. data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
  130. data/spec/unit/mixin/securable_spec.rb +0 -1
  131. data/spec/unit/mixin/shell_out_spec.rb +25 -26
  132. data/spec/unit/mixin/which.rb +8 -0
  133. data/spec/unit/node_spec.rb +98 -11
  134. data/spec/unit/property_spec.rb +5 -5
  135. data/spec/unit/provider/execute_spec.rb +0 -7
  136. data/spec/unit/provider/ifconfig_spec.rb +0 -1
  137. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  138. data/spec/unit/provider/package/rubygems_spec.rb +5 -10
  139. data/spec/unit/provider/package/smartos_spec.rb +1 -1
  140. data/spec/unit/provider/package/windows_spec.rb +30 -53
  141. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  142. data/spec/unit/provider/service/windows_spec.rb +2 -6
  143. data/spec/unit/provider/systemd_unit_spec.rb +28 -24
  144. data/spec/unit/provider_spec.rb +1 -0
  145. data/spec/unit/resource/execute_spec.rb +10 -0
  146. data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
  147. data/spec/unit/resource/windows_firewall_profile_spec.rb +77 -0
  148. data/spec/unit/resource/windows_package_spec.rb +1 -0
  149. data/spec/unit/resource_reporter_spec.rb +1 -1
  150. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  151. data/spec/unit/run_lock_spec.rb +1 -1
  152. data/spec/unit/scan_access_control_spec.rb +1 -1
  153. data/spec/unit/util/diff_spec.rb +1 -15
  154. data/spec/unit/win32/security_spec.rb +4 -3
  155. metadata +38 -15
@@ -111,11 +111,11 @@ describe "Chef::Resource.property" do
111
111
 
112
112
  with_property ":Straße" do
113
113
  it "properties with UTF-8 in their name work" do
114
- expect(resource.Straße).to eql(nil)
115
- expect(resource.Straße "foo").to eql("foo")
116
- expect(resource.Straße).to eql("foo")
117
- expect(resource.Straße = "bar").to eql("bar")
118
- expect(resource.Straße).to eql("bar")
114
+ expect(resource.Straße).to eql(nil) # rubocop: disable Naming/AsciiIdentifiers
115
+ expect(resource.Straße "foo").to eql("foo") # rubocop: disable Naming/AsciiIdentifiers
116
+ expect(resource.Straße).to eql("foo") # rubocop: disable Naming/AsciiIdentifiers
117
+ expect(resource.Straße = "bar").to eql("bar") # rubocop: disable Naming/AsciiIdentifiers
118
+ expect(resource.Straße).to eql("bar") # rubocop: disable Naming/AsciiIdentifiers
119
119
  end
120
120
  end
121
121
 
@@ -43,17 +43,10 @@ describe Chef::Provider::Execute do
43
43
  before do
44
44
  allow(Chef::EventDispatch::EventsOutputStream).to receive(:new) { @live_stream }
45
45
  allow(ChefUtils).to receive(:windows?) { false }
46
- @original_log_level = Chef::Log.level
47
46
  Chef::Log.level = :info
48
47
  allow(STDOUT).to receive(:tty?).and_return(false)
49
48
  end
50
49
 
51
- after do
52
- Chef::Log.level = @original_log_level
53
- Chef::Config[:always_stream_execute] = false
54
- Chef::Config[:daemon] = false
55
- end
56
-
57
50
  describe "#initialize" do
58
51
  it "should return a Chef::Provider::Execute provider" do
59
52
  expect(provider.class).to eql(Chef::Provider::Execute)
@@ -16,7 +16,6 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- # require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
20
19
  require "spec_helper"
21
20
  require "chef/exceptions"
22
21
 
@@ -22,7 +22,7 @@ require "spec_helper"
22
22
  describe Chef::Provider::Package::Dnf::PythonHelper do
23
23
  let(:helper) { Chef::Provider::Package::Dnf::PythonHelper.instance }
24
24
 
25
- it "propagates stacktraces on stderr from the forked subprocess" do
25
+ it "propagates stacktraces on stderr from the forked subprocess", :rhel do
26
26
  allow(helper).to receive(:dnf_command).and_return("ruby -e 'raise \"your hands in the air\"'")
27
27
  expect { helper.package_query(:whatprovides, "tcpdump") }.to raise_error(/your hands in the air/)
28
28
  end
@@ -106,30 +106,25 @@ describe Chef::Provider::Package::Rubygems::CurrentGemEnvironment do
106
106
  context "new default rubygems behavior" do
107
107
  before do
108
108
  Chef::Config[:rubygems_cache_enabled] = false
109
+
110
+ dep_installer = Gem::DependencyInstaller.new
111
+ expect(dep_installer).not_to receive(:find_gems_with_sources)
112
+ allow(@gem_env).to receive(:dependency_installer).and_return(dep_installer)
109
113
  end
110
114
 
111
115
  it "finds a matching gem candidate version on rubygems 2.0.0+" do
112
116
  dep = Gem::Dependency.new("rspec", ">= 0")
113
- dep_installer = Gem::DependencyInstaller.new
114
- allow(@gem_env).to receive(:dependency_installer).and_return(dep_installer)
115
- expect(dep_installer).not_to receive(:find_gems_with_sources).with(dep).and_call_original
116
117
  expect(@gem_env.candidate_version_from_remote(dep)).to be_kind_of(Gem::Version)
117
118
  end
118
119
 
119
120
  it "gives the candidate version as nil if none is found" do
120
121
  dep = Gem::Dependency.new("lksdjflksdjflsdkfj", ">= 0")
121
- dep_installer = Gem::DependencyInstaller.new
122
- allow(@gem_env).to receive(:dependency_installer).and_return(dep_installer)
123
- expect(dep_installer).not_to receive(:find_gems_with_sources).with(dep).and_call_original
124
122
  expect(@gem_env.candidate_version_from_remote(dep)).to be_nil
125
123
  end
126
124
 
127
125
  it "finds a matching gem from a specific gemserver when explicit sources are given (to a server that doesn't respond to api requests)" do
128
126
  dep = Gem::Dependency.new("rspec", ">= 0")
129
- dep_installer = Gem::DependencyInstaller.new
130
- allow(@gem_env).to receive(:dependency_installer).and_return(dep_installer)
131
- expect(dep_installer).not_to receive(:find_gems_with_sources).with(dep).and_call_original
132
- expect(@gem_env.candidate_version_from_remote(dep, "http://production.cf.rubygems.org")).to be_kind_of(Gem::Version)
127
+ expect(@gem_env.candidate_version_from_remote(dep, "https://rubygems.org")).to be_kind_of(Gem::Version)
133
128
  end
134
129
  end
135
130
 
@@ -17,7 +17,7 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
20
+ require "spec_helper"
21
21
  require "ostruct"
22
22
 
23
23
  describe Chef::Provider::Package::SmartOS, "load_current_resource" do
@@ -42,7 +42,7 @@ describe Chef::Provider::Package::Windows, :windows_only do
42
42
  let(:cache_path) { 'c:\\cache\\' }
43
43
 
44
44
  before(:each) do
45
- allow(::File).to receive(:exist?).with(provider.new_resource.source).and_return(true)
45
+ allow(::File).to receive(:exist?).with(new_resource.source).and_return(true)
46
46
  end
47
47
 
48
48
  describe "load_current_resource" do
@@ -66,20 +66,22 @@ describe Chef::Provider::Package::Windows, :windows_only do
66
66
 
67
67
  it "sets the version to be installed" do
68
68
  provider.load_current_resource
69
- expect(provider.new_resource.version).to eql("2.0")
69
+ expect(new_resource.version).to eql("2.0")
70
70
  end
71
71
  end
72
72
 
73
- context "when the source is a uri" do
74
- let(:resource_source) { "https://foo.bar/calculator.msi" }
75
-
76
- context "when the source has not been downloaded" do
73
+ context "when the source is not present it loads from cache" do
74
+ context "when the package is not installed" do
77
75
  before(:each) do
78
- allow(provider).to receive(:downloadable_file_missing?).and_return(true)
76
+ allow(provider).to receive(:uri_scheme?).and_return(false)
77
+ allow(provider.package_provider).to receive(:get_product_property).and_return(nil)
78
+ allow(provider.package_provider).to receive(:get_installed_version).and_return(nil)
79
+ allow(provider.package_provider).to receive(:package_version).and_return(nil)
79
80
  end
80
- it "sets the current version to unknown" do
81
+
82
+ it "sets the current version nil" do
81
83
  provider.load_current_resource
82
- expect(provider.current_resource.version).to eql("unknown")
84
+ expect(provider.current_resource.version).to eql(nil)
83
85
  end
84
86
  end
85
87
 
@@ -233,9 +235,9 @@ describe Chef::Provider::Package::Windows, :windows_only do
233
235
  end
234
236
  end
235
237
 
236
- it "returns @installer_type if it is set" do
237
- provider.new_resource.installer_type(:downeaster)
238
- expect(provider.installer_type).to eql(:downeaster)
238
+ it "returns the resource's installer_type if it is set" do
239
+ new_resource.installer_type(:nsis)
240
+ expect(provider.installer_type).to eql(:nsis)
239
241
  end
240
242
 
241
243
  it "sets installer_type to inno if the source contains inno" do
@@ -275,7 +277,7 @@ describe Chef::Provider::Package::Windows, :windows_only do
275
277
 
276
278
  it "raises an error" do
277
279
  allow(::Kernel).to receive(:open).and_yield(StringIO.new(""))
278
- provider.new_resource.installer_type(nil)
280
+ new_resource.installer_type(nil)
279
281
  expect { provider.installer_type }.to raise_error(Chef::Exceptions::CannotDetermineWindowsInstallerType)
280
282
  end
281
283
  end
@@ -312,7 +314,10 @@ describe Chef::Provider::Package::Windows, :windows_only do
312
314
  let(:resource_source) { "https://foo.bar/calculator.exe" }
313
315
 
314
316
  it "downloads the http resource" do
315
- allow(File).to receive(:exist?).with('c:\cache\calculator.exe').and_return(false)
317
+ allow(provider).to receive(:uri_scheme?).and_return(true)
318
+ allow(provider).to receive(:installer_type).and_return(nil)
319
+ allow(File).to receive(:exist?).with("https\\foo.bar\\calculator.exe").and_return(false)
320
+ allow(provider).to receive(:compile_and_converge_action)
316
321
  expect(provider).to receive(:download_source_file)
317
322
  provider.run_action(:install)
318
323
  end
@@ -400,7 +405,7 @@ describe Chef::Provider::Package::Windows, :windows_only do
400
405
  let(:resource_source) { "C:/a_missing_file.exe" }
401
406
  let(:installer_type) { nil }
402
407
  before do
403
- allow(::File).to receive(:exist?).with(provider.new_resource.source).and_return(false)
408
+ allow(::File).to receive(:exist?).with(new_resource.source).and_return(false)
404
409
  provider.load_current_resource
405
410
  end
406
411
 
@@ -414,51 +419,23 @@ describe Chef::Provider::Package::Windows, :windows_only do
414
419
  Chef::Config[:why_run] = false
415
420
  end
416
421
  end
417
- end
418
422
 
419
- shared_context "valid checksum" do
420
- context "checksum is valid" do
421
- before do
422
- allow(provider).to receive(:checksum).and_return("jiie00u3bbs92vsbhvgvklb2lasgh20ah")
423
- end
423
+ it "does not raise an error with a valid checksum" do
424
+ expect(Chef::Digester).to receive(:checksum_for_file).with(new_resource.source).and_return("abcdef1234567890")
425
+ expect(provider).to receive(:install_package)
424
426
 
425
- it "does not raise the checksum mismatch exception" do
426
- expect { provider.send(:validate_content!) }.to_not raise_error
427
- end
428
- end
429
- end
430
-
431
- shared_context "invalid checksum" do
432
- context "checksum is invalid" do
433
- before do
434
- allow(provider).to receive(:checksum).and_return("kiie30u3bbs92vsbhvgvklb2lasgh20ah")
435
- end
427
+ new_resource.checksum("abcdef1234567890")
436
428
 
437
- it "raises the checksum mismatch exception" do
438
- expect { provider.send(:validate_content!) }.to raise_error(
439
- Chef::Exceptions::ChecksumMismatch
440
- )
441
- end
429
+ provider.run_action(:install)
442
430
  end
443
- end
444
431
 
445
- describe "validate_content!" do
446
- before(:each) do
447
- new_resource.checksum("jiie00u3bbs92vsbhvgvklb2lasgh20ah")
448
- end
449
-
450
- context "checksum is in lowercase" do
451
- include_context "valid checksum"
452
- include_context "invalid checksum"
453
- end
432
+ it "raises an error with an invalid checksum" do
433
+ expect(Chef::Digester).to receive(:checksum_for_file).with(new_resource.source).and_return("abcdef1234567890")
434
+ expect(provider).not_to receive(:install_package)
454
435
 
455
- context "checksum is in uppercase" do
456
- before do
457
- new_resource.checksum = new_resource.checksum.upcase
458
- end
436
+ new_resource.checksum("ffffffffffffffff")
459
437
 
460
- include_context "valid checksum"
461
- include_context "invalid checksum"
438
+ expect { provider.run_action(:install) }.to raise_error(Chef::Exceptions::Package)
462
439
  end
463
440
  end
464
441
  end
@@ -16,7 +16,7 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper"))
19
+ require "spec_helper"
20
20
  require "ostruct"
21
21
 
22
22
  shared_examples_for "define_resource_requirements_common" do
@@ -22,12 +22,8 @@ require "spec_helper"
22
22
  describe Chef::Provider::Service::Windows, "load_current_resource" do
23
23
  include_context "Win32"
24
24
 
25
- before(:all) do
26
- Chef::ReservedNames::Win32::Security = Class.new unless windows?
27
- end
28
-
29
- after(:all) do
30
- Chef::ReservedNames::Win32.send(:remove_const, :Security) unless windows?
25
+ before do
26
+ stub_const("Chef::ReservedNames::Win32::Security", Class.new) unless windows?
31
27
  end
32
28
 
33
29
  let(:logger) { double("Mixlib::Log::Child").as_null_object }
@@ -220,31 +220,35 @@ describe Chef::Provider::SystemdUnit do
220
220
  expect(current_resource.content).to eq(nil)
221
221
  end
222
222
 
223
- it "loads the user unit content if the file exists and user is set" do
224
- new_resource.user("joe")
225
- allow(File).to receive(:exist?)
226
- .with(unit_path_user)
227
- .and_return(true)
228
- allow(File).to receive(:read)
229
- .with(unit_path_user)
230
- .and_return(unit_content_string)
231
- expect(File).to receive(:exist?)
232
- .with(unit_path_user)
233
- expect(File).to receive(:read)
234
- .with(unit_path_user)
235
- provider.load_current_resource
236
- expect(current_resource.content).to eq(unit_content_string)
237
- end
223
+ # A password is required when specifying a user on Windows. Since systemd resources
224
+ # won't actually run on Windows, skip these tests rather than code a workaround.
225
+ unless windows?
226
+ it "loads the user unit content if the file exists and user is set" do
227
+ new_resource.user("joe")
228
+ allow(File).to receive(:exist?)
229
+ .with(unit_path_user)
230
+ .and_return(true)
231
+ allow(File).to receive(:read)
232
+ .with(unit_path_user)
233
+ .and_return(unit_content_string)
234
+ expect(File).to receive(:exist?)
235
+ .with(unit_path_user)
236
+ expect(File).to receive(:read)
237
+ .with(unit_path_user)
238
+ provider.load_current_resource
239
+ expect(current_resource.content).to eq(unit_content_string)
240
+ end
238
241
 
239
- it "does not load the user unit if the file does not exist and user is set" do
240
- new_resource.user("joe")
241
- allow(File).to receive(:exist?)
242
- .with(unit_path_user)
243
- .and_return(false)
244
- expect(File).to_not receive(:read)
245
- .with(unit_path_user)
246
- provider.load_current_resource
247
- expect(current_resource.content).to eq(nil)
242
+ it "does not load the user unit if the file does not exist and user is set" do
243
+ new_resource.user("joe")
244
+ allow(File).to receive(:exist?)
245
+ .with(unit_path_user)
246
+ .and_return(false)
247
+ expect(File).to_not receive(:read)
248
+ .with(unit_path_user)
249
+ provider.load_current_resource
250
+ expect(current_resource.content).to eq(nil)
251
+ end
248
252
  end
249
253
  end
250
254
 
@@ -20,6 +20,7 @@ require "spec_helper"
20
20
 
21
21
  class NoWhyrunDemonstrator < Chef::Provider
22
22
  attr_reader :system_state_altered
23
+
23
24
  def whyrun_supported?
24
25
  false
25
26
  end
@@ -63,6 +63,16 @@ describe Chef::Resource::Execute do
63
63
  expect(identity[:user]).to eq("user")
64
64
  end
65
65
  end
66
+
67
+ context "when username is passed as an integer" do
68
+ let(:username) { 499 }
69
+
70
+ it "correctly parses the user and domain" do
71
+ identity = resource.qualify_user(username, password, domain)
72
+ expect(identity[:domain]).to eq(nil)
73
+ expect(identity[:user]).to eq(499)
74
+ end
75
+ end
66
76
  end
67
77
 
68
78
  shared_examples_for "it received valid credentials" do
@@ -20,16 +20,117 @@ require "spec_helper"
20
20
  describe Chef::Resource::MacosUserDefaults do
21
21
 
22
22
  let(:resource) { Chef::Resource::MacosUserDefaults.new("foo") }
23
+ let(:provider) { resource.provider_for_action(:write) }
23
24
 
24
25
  it "has a resource name of :macos_userdefaults" do
25
- expect(resource.resource_name).to eql(:macos_userdefaults)
26
+ expect(resource.resource_name).to eq(:macos_userdefaults)
27
+ end
28
+
29
+ it "the domain property defaults to NSGlobalDomain" do
30
+ expect(resource.domain).to eq("NSGlobalDomain")
31
+ end
32
+
33
+ it "the value property coerces keys in hashes to strings so we can compare them with plist data" do
34
+ resource.value "User": "/Library/Managed Installs/way_fake.log"
35
+ expect(resource.value).to eq({ "User" => "/Library/Managed Installs/way_fake.log" })
36
+ end
37
+
38
+ it "the host property defaults to nil" do
39
+ expect(resource.host).to be_nil
40
+ end
41
+
42
+ it "the sudo property defaults to false" do
43
+ expect(resource.sudo).to be false
26
44
  end
27
45
 
28
46
  it "sets the default action as :write" do
29
- expect(resource.action).to eql([:write])
47
+ expect(resource.action).to eq([:write])
30
48
  end
31
49
 
32
50
  it "supports :write action" do
33
51
  expect { resource.action :write }.not_to raise_error
34
52
  end
53
+
54
+ describe "#defaults_export_cmd" do
55
+ it "exports NSGlobalDomain if no domain is set" do
56
+ expect(provider.defaults_export_cmd(resource)).to eq(["/usr/bin/defaults", "export", "NSGlobalDomain", "-"])
57
+ end
58
+
59
+ it "exports a provided domain" do
60
+ resource.domain "com.tim"
61
+ expect(provider.defaults_export_cmd(resource)).to eq(["/usr/bin/defaults", "export", "com.tim", "-"])
62
+ end
63
+
64
+ it "sets -currentHost if host is 'current'" do
65
+ resource.host "current"
66
+ expect(provider.defaults_export_cmd(resource)).to eq(["/usr/bin/defaults", "-currentHost", "export", "NSGlobalDomain", "-"])
67
+ end
68
+
69
+ it "sets -host 'tim-laptop if host is 'tim-laptop'" do
70
+ resource.host "tim-laptop"
71
+ expect(provider.defaults_export_cmd(resource)).to eq(["/usr/bin/defaults", "-host", "tim-laptop", "export", "NSGlobalDomain", "-"])
72
+ end
73
+ end
74
+
75
+ describe "#defaults_modify_cmd" do
76
+ # avoid needing to set these required values over and over. We'll overwrite them where necessary
77
+ before do
78
+ resource.key = "foo"
79
+ resource.value = "bar"
80
+ end
81
+
82
+ it "writes to NSGlobalDomain if domain isn't specified" do
83
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-string", "bar"])
84
+ end
85
+
86
+ it "uses the domain property if set" do
87
+ resource.domain = "MyCustomDomain"
88
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "MyCustomDomain", "foo", "-string", "bar"])
89
+ end
90
+
91
+ it "sets host specific values using host property" do
92
+ resource.host = "tims_laptop"
93
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "-host", "tims_laptop", "write", "NSGlobalDomain", "foo", "-string", "bar"])
94
+ end
95
+
96
+ it "if host is set to :current it passes CurrentHost" do
97
+ resource.host = :current
98
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "-currentHost", "write", "NSGlobalDomain", "foo", "-string", "bar"])
99
+ end
100
+
101
+ it "raises ArgumentError if bool is specified, but the value can't be made into a bool" do
102
+ resource.type "bool"
103
+ expect { provider.defaults_modify_cmd }.to raise_error(ArgumentError)
104
+ end
105
+
106
+ it "autodetects array type and passes individual values" do
107
+ resource.value = %w{one two three}
108
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-array", "one", "two", "three"])
109
+ end
110
+
111
+ it "autodetects string type and passes a single value" do
112
+ resource.value = "one"
113
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-string", "one"])
114
+ end
115
+
116
+ it "autodetects integer type and passes a single value" do
117
+ resource.value = 1
118
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-int", 1])
119
+ end
120
+
121
+ it "autodetects boolean type from TrueClass value and passes a 'TRUE' string" do
122
+ resource.value = true
123
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-bool", "TRUE"])
124
+ end
125
+
126
+ it "autodetects boolean type from FalseClass value and passes a 'FALSE' string" do
127
+ resource.value = false
128
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-bool", "FALSE"])
129
+ end
130
+
131
+ it "autodetects dict type from Hash value and flattens keys & values" do
132
+ resource.value = { "foo" => "bar" }
133
+ expect(provider.defaults_modify_cmd).to eq(["/usr/bin/defaults", "write", "NSGlobalDomain", "foo", "-dict", "foo", "bar"])
134
+ end
135
+ end
35
136
  end