chef 17.6.18 → 17.7.22

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/chef.gemspec +1 -0
  4. data/lib/chef/chef_fs/file_pattern.rb +1 -1
  5. data/lib/chef/chef_fs/path_utils.rb +1 -1
  6. data/lib/chef/data_collector/run_end_message.rb +1 -1
  7. data/lib/chef/dsl/reboot_pending.rb +1 -1
  8. data/lib/chef/exceptions.rb +10 -0
  9. data/lib/chef/provider/cron.rb +4 -1
  10. data/lib/chef/provider/git.rb +1 -1
  11. data/lib/chef/provider/ifconfig/debian.rb +1 -1
  12. data/lib/chef/provider/subversion.rb +5 -5
  13. data/lib/chef/resource/chocolatey_config.rb +1 -1
  14. data/lib/chef/resource/chocolatey_feature.rb +1 -1
  15. data/lib/chef/resource/chocolatey_source.rb +24 -2
  16. data/lib/chef/resource/directory.rb +1 -1
  17. data/lib/chef/resource/habitat_install.rb +3 -3
  18. data/lib/chef/resource/inspec_waiver.rb +1 -1
  19. data/lib/chef/resource/inspec_waiver_file_entry.rb +1 -1
  20. data/lib/chef/resource/kernel_module.rb +27 -2
  21. data/lib/chef/resource/macos_userdefaults.rb +43 -128
  22. data/lib/chef/resource/windows_auto_run.rb +1 -1
  23. data/lib/chef/resource/windows_dfs_namespace.rb +2 -2
  24. data/lib/chef/resource/windows_update_settings.rb +3 -3
  25. data/lib/chef/resource.rb +1 -1
  26. data/lib/chef/resource_reporter.rb +1 -1
  27. data/lib/chef/secret_fetcher/azure_key_vault.rb +62 -8
  28. data/lib/chef/secret_fetcher.rb +0 -1
  29. data/lib/chef/version.rb +1 -1
  30. data/spec/functional/dsl/reboot_pending_spec.rb +3 -3
  31. data/spec/functional/dsl/registry_helper_spec.rb +1 -1
  32. data/spec/functional/resource/dsc_script_spec.rb +2 -2
  33. data/spec/functional/resource/macos_userdefaults_spec.rb +119 -0
  34. data/spec/functional/resource/registry_spec.rb +81 -81
  35. data/spec/functional/win32/registry_spec.rb +8 -8
  36. data/spec/unit/data_collector_spec.rb +24 -1
  37. data/spec/unit/dsl/reboot_pending_spec.rb +1 -1
  38. data/spec/unit/mixin/default_paths_spec.rb +1 -1
  39. data/spec/unit/mixin/securable_spec.rb +3 -3
  40. data/spec/unit/provider/cron_spec.rb +45 -0
  41. data/spec/unit/provider/package/rubygems_spec.rb +5 -5
  42. data/spec/unit/provider/package/windows_spec.rb +1 -1
  43. data/spec/unit/provider/registry_key_spec.rb +4 -4
  44. data/spec/unit/provider/service/windows_spec.rb +5 -5
  45. data/spec/unit/provider/subversion_spec.rb +4 -4
  46. data/spec/unit/provider/windows_env_spec.rb +1 -1
  47. data/spec/unit/provider/zypper_repository_spec.rb +1 -1
  48. data/spec/unit/resource/chocolatey_config_spec.rb +1 -1
  49. data/spec/unit/resource/chocolatey_feature_spec.rb +1 -1
  50. data/spec/unit/resource/chocolatey_source_spec.rb +1 -1
  51. data/spec/unit/resource/kernel_module_spec.rb +2 -1
  52. data/spec/unit/resource/macos_user_defaults_spec.rb +36 -96
  53. data/spec/unit/resource/registry_key_spec.rb +10 -10
  54. data/spec/unit/resource/windows_auto_run_spec.rb +1 -1
  55. data/spec/unit/resource/windows_feature_powershell_spec.rb +1 -1
  56. data/spec/unit/resource/windows_firewall_rule_spec.rb +2 -2
  57. data/spec/unit/resource/windows_task_spec.rb +3 -3
  58. data/spec/unit/resource_reporter_spec.rb +2 -2
  59. data/spec/unit/resource_spec.rb +5 -0
  60. data/spec/unit/secret_fetcher/azure_key_vault_spec.rb +99 -20
  61. data/spec/unit/util/backup_spec.rb +1 -1
  62. data/spec/unit/win32/registry_spec.rb +3 -3
  63. metadata +21 -6
@@ -75,19 +75,19 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
75
75
  def create_deletable_keys
76
76
  # create them both 32-bit and 64-bit
77
77
  [ 0x0100, 0x0200 ].each do |flag|
78
- hive_class.create(key_parent + '\Opscode', Win32::Registry::KEY_WRITE | flag)
79
- hive_class.open(key_parent + '\Opscode', Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
78
+ hive_class.create(key_parent + "\\Opscode", Win32::Registry::KEY_WRITE | flag)
79
+ hive_class.open(key_parent + "\\Opscode", Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
80
80
  reg["Color", Win32::Registry::REG_SZ] = "Orange"
81
81
  reg.write("Opscode", Win32::Registry::REG_MULTI_SZ, %w{Seattle Washington})
82
82
  reg["AKA", Win32::Registry::REG_SZ] = "OC"
83
83
  end
84
- hive_class.create(key_parent + '\ReportKey', Win32::Registry::KEY_WRITE | flag)
85
- hive_class.open(key_parent + '\ReportKey', Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
84
+ hive_class.create(key_parent + "\\ReportKey", Win32::Registry::KEY_WRITE | flag)
85
+ hive_class.open(key_parent + "\\ReportKey", Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
86
86
  reg["ReportVal4", Win32::Registry::REG_SZ] = "report4"
87
87
  reg["ReportVal5", Win32::Registry::REG_SZ] = "report5"
88
88
  end
89
- hive_class.create(key_parent + '\OpscodeWhyRun', Win32::Registry::KEY_WRITE | flag)
90
- hive_class.open(key_parent + '\OpscodeWhyRun', Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
89
+ hive_class.create(key_parent + "\\OpscodeWhyRun", Win32::Registry::KEY_WRITE | flag)
90
+ hive_class.open(key_parent + "\\OpscodeWhyRun", Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
91
91
  reg["BriskWalk", Win32::Registry::REG_SZ] = "is good for health"
92
92
  end
93
93
  end
@@ -188,13 +188,13 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
188
188
  end
189
189
 
190
190
  it "creates subkey if parent exists" do
191
- @new_resource.key(reg_child + '\OpscodeTest')
191
+ @new_resource.key(reg_child + "\\OpscodeTest")
192
192
  @new_resource.values([{ name: "Chef", type: :multi_string, data: %w{OpscodeOrange Rules} }])
193
193
  @new_resource.recursive(false)
194
194
  @new_resource.run_action(:create)
195
195
 
196
- expect(@registry.key_exists?(reg_child + '\OpscodeTest')).to eq(true)
197
- expect(@registry.value_exists?(reg_child + '\OpscodeTest', { name: "Chef", type: :multi_string, data: %w{OpscodeOrange Rules} })).to eq(true)
196
+ expect(@registry.key_exists?(reg_child + "\\OpscodeTest")).to eq(true)
197
+ expect(@registry.value_exists?(reg_child + "\\OpscodeTest", { name: "Chef", type: :multi_string, data: %w{OpscodeOrange Rules} })).to eq(true)
198
198
  end
199
199
 
200
200
  it "raises an error if action create and parent does not exist and recursive is set to false" do
@@ -258,20 +258,20 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
258
258
  @registry.architecture = :machine
259
259
  end
260
260
  it "creates a key in a 32-bit registry that is not viewable in 64-bit" do
261
- @new_resource.key(reg_child + '\Atraxi' )
261
+ @new_resource.key(reg_child + "\\Atraxi" )
262
262
  @new_resource.values([{ name: "OC", type: :string, data: "Data" }])
263
263
  @new_resource.recursive(true)
264
264
  @new_resource.architecture(:i386)
265
265
  @new_resource.run_action(:create)
266
266
  @registry.architecture = :i386
267
- expect(@registry.data_exists?(reg_child + '\Atraxi', { name: "OC", type: :string, data: "Data" })).to eq(true)
267
+ expect(@registry.data_exists?(reg_child + "\\Atraxi", { name: "OC", type: :string, data: "Data" })).to eq(true)
268
268
  @registry.architecture = :x86_64
269
- expect(@registry.key_exists?(reg_child + '\Atraxi')).to eq(false)
269
+ expect(@registry.key_exists?(reg_child + "\\Atraxi")).to eq(false)
270
270
  end
271
271
  end
272
272
 
273
273
  it "prepares the reporting data for action :create" do
274
- @new_resource.key(reg_child + '\Ood')
274
+ @new_resource.key(reg_child + "\\Ood")
275
275
  @new_resource.values([{ name: "ReportingVal1", type: :string, data: "report1" }, { name: "ReportingVal2", type: :string, data: "report2" }])
276
276
  @new_resource.recursive(true)
277
277
  @new_resource.run_action(:create)
@@ -280,7 +280,7 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
280
280
  expect(@report["action"]).to eq("end")
281
281
  expect(@report["resources"][0]["type"]).to eq("registry_key")
282
282
  expect(@report["resources"][0]["name"]).to eq(resource_name)
283
- expect(@report["resources"][0]["id"]).to eq(reg_child + '\Ood')
283
+ expect(@report["resources"][0]["id"]).to eq(reg_child + "\\Ood")
284
284
  expect(@report["resources"][0]["after"][:values]).to eq([{ name: "ReportingVal1", type: :string, data: "report1" },
285
285
  { name: "ReportingVal2", type: :string, data: "report2" }])
286
286
  expect(@report["resources"][0]["before"][:values]).to eq([])
@@ -295,48 +295,48 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
295
295
  end
296
296
 
297
297
  it "does not raise an exception if the keys do not exist but recursive is set to false" do
298
- @new_resource.key(reg_child + '\Slitheen\Raxicoricofallapatorius')
298
+ @new_resource.key(reg_child + "\\Slitheen\\Raxicoricofallapatorius")
299
299
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
300
300
  @new_resource.recursive(false)
301
301
  @new_resource.run_action(:create) # should not raise_error
302
- expect(@registry.key_exists?(reg_child + '\Slitheen')).to eq(false)
303
- expect(@registry.key_exists?(reg_child + '\Slitheen\Raxicoricofallapatorius')).to eq(false)
302
+ expect(@registry.key_exists?(reg_child + "\\Slitheen")).to eq(false)
303
+ expect(@registry.key_exists?(reg_child + "\\Slitheen\\Raxicoricofallapatorius")).to eq(false)
304
304
  end
305
305
 
306
306
  it "does not create key if the action is create" do
307
- @new_resource.key(reg_child + '\Slitheen')
307
+ @new_resource.key(reg_child + "\\Slitheen")
308
308
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
309
309
  @new_resource.recursive(false)
310
310
  @new_resource.run_action(:create)
311
- expect(@registry.key_exists?(reg_child + '\Slitheen')).to eq(false)
311
+ expect(@registry.key_exists?(reg_child + "\\Slitheen")).to eq(false)
312
312
  end
313
313
 
314
314
  it "does not raise an exception if the action create and type key missing in values hash" do
315
- @new_resource.key(reg_child + '\Slitheen')
315
+ @new_resource.key(reg_child + "\\Slitheen")
316
316
  @new_resource.values([{ name: "BriskWalk", data: "my_data" }])
317
317
  @new_resource.run_action(:create) # should not raise_error
318
- expect(@registry.key_exists?(reg_child + '\Slitheen')).to eq(false)
318
+ expect(@registry.key_exists?(reg_child + "\\Slitheen")).to eq(false)
319
319
  end
320
320
 
321
321
  it "does not raise an exception if the action create and data key missing in values hash" do
322
- @new_resource.key(reg_child + '\Slitheen')
322
+ @new_resource.key(reg_child + "\\Slitheen")
323
323
  @new_resource.values([{ name: "BriskWalk", type: :string }])
324
324
  @new_resource.run_action(:create) # should not raise_error
325
- expect(@registry.key_exists?(reg_child + '\Slitheen')).to eq(false)
325
+ expect(@registry.key_exists?(reg_child + "\\Slitheen")).to eq(false)
326
326
  end
327
327
 
328
328
  it "does not raise an exception if the action create and only name key present in values hash" do
329
- @new_resource.key(reg_child + '\Slitheen')
329
+ @new_resource.key(reg_child + "\\Slitheen")
330
330
  @new_resource.values([{ name: "BriskWalk" }])
331
331
  @new_resource.run_action(:create) # should not raise_error
332
- expect(@registry.key_exists?(reg_child + '\Slitheen')).to eq(false)
332
+ expect(@registry.key_exists?(reg_child + "\\Slitheen")).to eq(false)
333
333
  end
334
334
 
335
335
  it "does not raise an exception if the action create and all keys are present in values hash" do
336
- @new_resource.key(reg_child + '\Slitheen')
336
+ @new_resource.key(reg_child + "\\Slitheen")
337
337
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "my_data" }])
338
338
  @new_resource.run_action(:create) # should not raise_error
339
- expect(@registry.key_exists?(reg_child + '\Slitheen')).to eq(false)
339
+ expect(@registry.key_exists?(reg_child + "\\Slitheen")).to eq(false)
340
340
  end
341
341
  end
342
342
  end
@@ -374,17 +374,17 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
374
374
  end
375
375
 
376
376
  it "creates subkey if parent exists" do
377
- @new_resource.key(reg_child + '\Pyrovile')
377
+ @new_resource.key(reg_child + "\\Pyrovile")
378
378
  @new_resource.values([{ name: "Chef", type: :multi_string, data: %w{OpscodeOrange Rules} }])
379
379
  @new_resource.recursive(false)
380
380
  @new_resource.run_action(:create_if_missing)
381
381
 
382
- expect(@registry.key_exists?(reg_child + '\Pyrovile')).to eq(true)
383
- expect(@registry.value_exists?(reg_child + '\Pyrovile', { name: "Chef", type: :multi_string, data: %w{OpscodeOrange Rules} })).to eq(true)
382
+ expect(@registry.key_exists?(reg_child + "\\Pyrovile")).to eq(true)
383
+ expect(@registry.value_exists?(reg_child + "\\Pyrovile", { name: "Chef", type: :multi_string, data: %w{OpscodeOrange Rules} })).to eq(true)
384
384
  end
385
385
 
386
386
  it "raises an error if action create and parent does not exist and recursive is set to false" do
387
- @new_resource.key(reg_child + '\Sontaran\Sontar')
387
+ @new_resource.key(reg_child + "\\Sontaran\\Sontar")
388
388
  @new_resource.values([{ name: "OC", type: :string, data: "MissingData" }])
389
389
  @new_resource.recursive(false)
390
390
  expect { @new_resource.run_action(:create_if_missing) }.to raise_error(Chef::Exceptions::Win32RegNoRecursive)
@@ -415,28 +415,28 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
415
415
  end
416
416
 
417
417
  it "creates missing keys if action create and parent does not exist and recursive is set to true" do
418
- @new_resource.key(reg_child + '\Sontaran\Sontar')
418
+ @new_resource.key(reg_child + "\\Sontaran\\Sontar")
419
419
  @new_resource.values([{ name: "OC", type: :string, data: "MissingData" }])
420
420
  @new_resource.recursive(true)
421
421
  @new_resource.run_action(:create_if_missing)
422
422
 
423
- expect(@registry.key_exists?(reg_child + '\Sontaran\Sontar')).to eq(true)
424
- expect(@registry.value_exists?(reg_child + '\Sontaran\Sontar', { name: "OC", type: :string, data: "MissingData" })).to eq(true)
423
+ expect(@registry.key_exists?(reg_child + "\\Sontaran\\Sontar")).to eq(true)
424
+ expect(@registry.value_exists?(reg_child + "\\Sontaran\\Sontar", { name: "OC", type: :string, data: "MissingData" })).to eq(true)
425
425
  end
426
426
 
427
427
  it "creates key with multiple value as specified" do
428
- @new_resource.key(reg_child + '\Adipose')
428
+ @new_resource.key(reg_child + "\\Adipose")
429
429
  @new_resource.values([{ name: "one", type: :string, data: "1" }, { name: "two", type: :string, data: "2" }, { name: "three", type: :string, data: "3" }])
430
430
  @new_resource.recursive(true)
431
431
  @new_resource.run_action(:create_if_missing)
432
432
 
433
433
  @new_resource.each_value do |value|
434
- expect(@registry.value_exists?(reg_child + '\Adipose', value)).to eq(true)
434
+ expect(@registry.value_exists?(reg_child + "\\Adipose", value)).to eq(true)
435
435
  end
436
436
  end
437
437
 
438
438
  it "prepares the reporting data for :create_if_missing" do
439
- @new_resource.key(reg_child + '\Judoon')
439
+ @new_resource.key(reg_child + "\\Judoon")
440
440
  @new_resource.values([{ name: "ReportingVal3", type: :string, data: "report3" }])
441
441
  @new_resource.recursive(true)
442
442
  @new_resource.run_action(:create_if_missing)
@@ -445,7 +445,7 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
445
445
  expect(@report["action"]).to eq("end")
446
446
  expect(@report["resources"][0]["type"]).to eq("registry_key")
447
447
  expect(@report["resources"][0]["name"]).to eq(resource_name)
448
- expect(@report["resources"][0]["id"]).to eq(reg_child + '\Judoon')
448
+ expect(@report["resources"][0]["id"]).to eq(reg_child + "\\Judoon")
449
449
  expect(@report["resources"][0]["after"][:values]).to eq([{ name: "ReportingVal3", type: :string, data: "report3" }])
450
450
  expect(@report["resources"][0]["before"][:values]).to eq([])
451
451
  expect(@report["resources"][0]["result"]).to eq("create_if_missing")
@@ -459,48 +459,48 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
459
459
  end
460
460
 
461
461
  it "does not raise an exception if the keys do not exist but recursive is set to false" do
462
- @new_resource.key(reg_child + '\Zygons\Zygor')
462
+ @new_resource.key(reg_child + "\\Zygons\\Zygor")
463
463
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
464
464
  @new_resource.recursive(false)
465
465
  @new_resource.run_action(:create_if_missing) # should not raise_error
466
- expect(@registry.key_exists?(reg_child + '\Zygons')).to eq(false)
467
- expect(@registry.key_exists?(reg_child + '\Zygons\Zygor')).to eq(false)
466
+ expect(@registry.key_exists?(reg_child + "\\Zygons")).to eq(false)
467
+ expect(@registry.key_exists?(reg_child + "\\Zygons\\Zygor")).to eq(false)
468
468
  end
469
469
 
470
470
  it "does nothing if the action is create_if_missing" do
471
- @new_resource.key(reg_child + '\Zygons')
471
+ @new_resource.key(reg_child + "\\Zygons")
472
472
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
473
473
  @new_resource.recursive(false)
474
474
  @new_resource.run_action(:create_if_missing)
475
- expect(@registry.key_exists?(reg_child + '\Zygons')).to eq(false)
475
+ expect(@registry.key_exists?(reg_child + "\\Zygons")).to eq(false)
476
476
  end
477
477
 
478
478
  it "does not raise an exception if the action create_if_missing and type key missing in values hash" do
479
- @new_resource.key(reg_child + '\Zygons')
479
+ @new_resource.key(reg_child + "\\Zygons")
480
480
  @new_resource.values([{ name: "BriskWalk", data: "my_data" }])
481
481
  @new_resource.run_action(:create_if_missing) # should not raise_error
482
- expect(@registry.key_exists?(reg_child + '\Zygons')).to eq(false)
482
+ expect(@registry.key_exists?(reg_child + "\\Zygons")).to eq(false)
483
483
  end
484
484
 
485
485
  it "does not raise an exception if the action create_if_missing and data key missing in values hash" do
486
- @new_resource.key(reg_child + '\Zygons')
486
+ @new_resource.key(reg_child + "\\Zygons")
487
487
  @new_resource.values([{ name: "BriskWalk", type: :string }])
488
488
  @new_resource.run_action(:create_if_missing) # should not raise_error
489
- expect(@registry.key_exists?(reg_child + '\Zygons')).to eq(false)
489
+ expect(@registry.key_exists?(reg_child + "\\Zygons")).to eq(false)
490
490
  end
491
491
 
492
492
  it "does not raise an exception if the action create_if_missing and only name key present in values hash" do
493
- @new_resource.key(reg_child + '\Zygons')
493
+ @new_resource.key(reg_child + "\\Zygons")
494
494
  @new_resource.values([{ name: "BriskWalk" }])
495
495
  @new_resource.run_action(:create_if_missing) # should not raise_error
496
- expect(@registry.key_exists?(reg_child + '\Zygons')).to eq(false)
496
+ expect(@registry.key_exists?(reg_child + "\\Zygons")).to eq(false)
497
497
  end
498
498
 
499
499
  it "does not raise an exception if the action create_if_missing and all keys are present in values hash" do
500
- @new_resource.key(reg_child + '\Zygons')
500
+ @new_resource.key(reg_child + "\\Zygons")
501
501
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "my_data" }])
502
502
  @new_resource.run_action(:create_if_missing) # should not raise_error
503
- expect(@registry.key_exists?(reg_child + '\Zygons')).to eq(false)
503
+ expect(@registry.key_exists?(reg_child + "\\Zygons")).to eq(false)
504
504
  end
505
505
  end
506
506
  end
@@ -512,61 +512,61 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
512
512
  end
513
513
 
514
514
  it "takes no action if the specified key path does not exist in the system" do
515
- expect(@registry.key_exists?(reg_parent + '\Osirian')).to eq(false)
515
+ expect(@registry.key_exists?(reg_parent + "\\Osirian")).to eq(false)
516
516
 
517
- @new_resource.key(reg_parent + '\Osirian')
517
+ @new_resource.key(reg_parent + "\\Osirian")
518
518
  @new_resource.recursive(false)
519
519
  @new_resource.run_action(:delete)
520
520
 
521
- expect(@registry.key_exists?(reg_parent + '\Osirian')).to eq(false)
521
+ expect(@registry.key_exists?(reg_parent + "\\Osirian")).to eq(false)
522
522
  end
523
523
 
524
524
  it "takes no action if the key exists but the value does not" do
525
- expect(@registry.data_exists?(reg_parent + '\Opscode', { name: "Color", type: :string, data: "Orange" })).to eq(true)
525
+ expect(@registry.data_exists?(reg_parent + "\\Opscode", { name: "Color", type: :string, data: "Orange" })).to eq(true)
526
526
 
527
- @new_resource.key(reg_parent + '\Opscode')
527
+ @new_resource.key(reg_parent + "\\Opscode")
528
528
  @new_resource.values([{ name: "LooksLike", type: :multi_string, data: %w{SeattleGrey OCOrange} }])
529
529
  @new_resource.recursive(false)
530
530
  @new_resource.run_action(:delete)
531
531
 
532
- expect(@registry.data_exists?(reg_parent + '\Opscode', { name: "Color", type: :string, data: "Orange" })).to eq(true)
532
+ expect(@registry.data_exists?(reg_parent + "\\Opscode", { name: "Color", type: :string, data: "Orange" })).to eq(true)
533
533
  end
534
534
 
535
535
  it "deletes only specified values under a key path" do
536
- @new_resource.key(reg_parent + '\Opscode')
536
+ @new_resource.key(reg_parent + "\\Opscode")
537
537
  @new_resource.values([{ name: "Opscode", type: :multi_string, data: %w{Seattle Washington} }, { name: "AKA", type: :string, data: "OC" }])
538
538
  @new_resource.recursive(false)
539
539
  @new_resource.run_action(:delete)
540
540
 
541
- expect(@registry.data_exists?(reg_parent + '\Opscode', { name: "Color", type: :string, data: "Orange" })).to eq(true)
542
- expect(@registry.value_exists?(reg_parent + '\Opscode', { name: "AKA", type: :string, data: "OC" })).to eq(false)
543
- expect(@registry.value_exists?(reg_parent + '\Opscode', { name: "Opscode", type: :multi_string, data: %w{Seattle Washington} })).to eq(false)
541
+ expect(@registry.data_exists?(reg_parent + "\\Opscode", { name: "Color", type: :string, data: "Orange" })).to eq(true)
542
+ expect(@registry.value_exists?(reg_parent + "\\Opscode", { name: "AKA", type: :string, data: "OC" })).to eq(false)
543
+ expect(@registry.value_exists?(reg_parent + "\\Opscode", { name: "Opscode", type: :multi_string, data: %w{Seattle Washington} })).to eq(false)
544
544
  end
545
545
 
546
546
  it "it deletes the values with the same name irrespective of it type and data" do
547
- @new_resource.key(reg_parent + '\Opscode')
547
+ @new_resource.key(reg_parent + "\\Opscode")
548
548
  @new_resource.values([{ name: "Color", type: :multi_string, data: %w{Black Orange} }])
549
549
  @new_resource.recursive(false)
550
550
  @new_resource.run_action(:delete)
551
551
 
552
- expect(@registry.value_exists?(reg_parent + '\Opscode', { name: "Color", type: :string, data: "Orange" })).to eq(false)
552
+ expect(@registry.value_exists?(reg_parent + "\\Opscode", { name: "Color", type: :string, data: "Orange" })).to eq(false)
553
553
  end
554
554
 
555
555
  it "prepares the reporting data for action :delete" do
556
- @new_resource.key(reg_parent + '\ReportKey')
556
+ @new_resource.key(reg_parent + "\\ReportKey")
557
557
  @new_resource.values([{ name: "ReportVal4", type: :string, data: "report4" }, { name: "ReportVal5", type: :string, data: "report5" }])
558
558
  @new_resource.recursive(true)
559
559
  @new_resource.run_action(:delete)
560
560
 
561
561
  @report = @resource_reporter.prepare_run_data
562
562
 
563
- expect(@registry.value_exists?(reg_parent + '\ReportKey', [{ name: "ReportVal4", type: :string, data: "report4" }, { name: "ReportVal5", type: :string, data: "report5" }])).to eq(false)
563
+ expect(@registry.value_exists?(reg_parent + "\\ReportKey", [{ name: "ReportVal4", type: :string, data: "report4" }, { name: "ReportVal5", type: :string, data: "report5" }])).to eq(false)
564
564
 
565
565
  expect(@report["action"]).to eq("end")
566
566
  expect(@report["resources"].count).to eq(1)
567
567
  expect(@report["resources"][0]["type"]).to eq("registry_key")
568
568
  expect(@report["resources"][0]["name"]).to eq(resource_name)
569
- expect(@report["resources"][0]["id"]).to eq(reg_parent + '\ReportKey')
569
+ expect(@report["resources"][0]["id"]).to eq(reg_parent + "\\ReportKey")
570
570
  expect(@report["resources"][0]["before"][:values]).to eq([{ name: "ReportVal4", type: :string, data: "report4" },
571
571
  { name: "ReportVal5", type: :string, data: "report5" }])
572
572
  # Not testing for after values to match since after -> new_resource values.
@@ -580,12 +580,12 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
580
580
  Chef::Config[:why_run] = true
581
581
  end
582
582
  it "does nothing if the action is delete" do
583
- @new_resource.key(reg_parent + '\OpscodeWhyRun')
583
+ @new_resource.key(reg_parent + "\\OpscodeWhyRun")
584
584
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
585
585
  @new_resource.recursive(false)
586
586
  @new_resource.run_action(:delete)
587
587
 
588
- expect(@registry.key_exists?(reg_parent + '\OpscodeWhyRun')).to eq(true)
588
+ expect(@registry.key_exists?(reg_parent + "\\OpscodeWhyRun")).to eq(true)
589
589
  end
590
590
  end
591
591
  end
@@ -597,21 +597,21 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
597
597
  end
598
598
 
599
599
  it "takes no action if the specified key path does not exist in the system" do
600
- expect(@registry.key_exists?(reg_parent + '\Osirian')).to eq(false)
600
+ expect(@registry.key_exists?(reg_parent + "\\Osirian")).to eq(false)
601
601
 
602
- @new_resource.key(reg_parent + '\Osirian')
602
+ @new_resource.key(reg_parent + "\\Osirian")
603
603
  @new_resource.recursive(false)
604
604
  @new_resource.run_action(:delete_key)
605
605
 
606
- expect(@registry.key_exists?(reg_parent + '\Osirian')).to eq(false)
606
+ expect(@registry.key_exists?(reg_parent + "\\Osirian")).to eq(false)
607
607
  end
608
608
 
609
609
  it "deletes key if it has no subkeys and recursive == false" do
610
- @new_resource.key(reg_parent + '\OpscodeTest')
610
+ @new_resource.key(reg_parent + "\\OpscodeTest")
611
611
  @new_resource.recursive(false)
612
612
  @new_resource.run_action(:delete_key)
613
613
 
614
- expect(@registry.key_exists?(reg_parent + '\OpscodeTest')).to eq(false)
614
+ expect(@registry.key_exists?(reg_parent + "\\OpscodeTest")).to eq(false)
615
615
  end
616
616
 
617
617
  it "raises an exception if the key has subkeys and recursive == false" do
@@ -621,22 +621,22 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
621
621
  end
622
622
 
623
623
  it "ignores the values under a key" do
624
- @new_resource.key(reg_parent + '\OpscodeIgnoredValues')
624
+ @new_resource.key(reg_parent + "\\OpscodeIgnoredValues")
625
625
  # @new_resource.values([{:name=>"DontExist", :type=>:string, :data=>"These will be ignored anyways"}])
626
626
  @new_resource.recursive(true)
627
627
  @new_resource.run_action(:delete_key)
628
628
  end
629
629
 
630
630
  it "deletes the key if it has subkeys and recursive == true" do
631
- @new_resource.key(reg_parent + '\Opscode')
631
+ @new_resource.key(reg_parent + "\\Opscode")
632
632
  @new_resource.recursive(true)
633
633
  @new_resource.run_action(:delete_key)
634
634
 
635
- expect(@registry.key_exists?(reg_parent + '\Opscode')).to eq(false)
635
+ expect(@registry.key_exists?(reg_parent + "\\Opscode")).to eq(false)
636
636
  end
637
637
 
638
638
  it "prepares the reporting data for action :delete_key" do
639
- @new_resource.key(reg_parent + '\ReportKey')
639
+ @new_resource.key(reg_parent + "\\ReportKey")
640
640
  @new_resource.recursive(true)
641
641
  @new_resource.run_action(:delete_key)
642
642
 
@@ -644,7 +644,7 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
644
644
  expect(@report["action"]).to eq("end")
645
645
  expect(@report["resources"][0]["type"]).to eq("registry_key")
646
646
  expect(@report["resources"][0]["name"]).to eq(resource_name)
647
- expect(@report["resources"][0]["id"]).to eq(reg_parent + '\ReportKey')
647
+ expect(@report["resources"][0]["id"]).to eq(reg_parent + "\\ReportKey")
648
648
  # Not testing for before or after values to match since
649
649
  # after -> new_resource.values and
650
650
  # before -> current_resource.values
@@ -658,18 +658,18 @@ describe Chef::Resource::RegistryKey, :windows_only, broken: true do
658
658
  end
659
659
 
660
660
  it "does not throw an exception if the key has subkeys but recursive is set to false" do
661
- @new_resource.key(reg_parent + '\OpscodeWhyRun')
661
+ @new_resource.key(reg_parent + "\\OpscodeWhyRun")
662
662
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
663
663
  @new_resource.recursive(false)
664
664
  @new_resource.run_action(:delete_key)
665
665
  end
666
666
  it "does nothing if the action is delete_key" do
667
- @new_resource.key(reg_parent + '\OpscodeWhyRun')
667
+ @new_resource.key(reg_parent + "\\OpscodeWhyRun")
668
668
  @new_resource.values([{ name: "BriskWalk", type: :string, data: "is good for health" }])
669
669
  @new_resource.recursive(false)
670
670
  @new_resource.run_action(:delete_key)
671
671
 
672
- expect(@registry.key_exists?(reg_parent + '\OpscodeWhyRun')).to eq(true)
672
+ expect(@registry.key_exists?(reg_parent + "\\OpscodeWhyRun")).to eq(true)
673
673
  end
674
674
  end
675
675
  end
@@ -28,14 +28,14 @@ describe "Chef::Win32::Registry", :windows_only do
28
28
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\Branch"
29
29
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\B®anch"
30
30
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\Branch\\Flower"
31
- ::Win32::Registry::HKEY_CURRENT_USER.open('Software\\Root', Win32::Registry::KEY_ALL_ACCESS) do |reg|
31
+ ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root", Win32::Registry::KEY_ALL_ACCESS) do |reg|
32
32
  reg["RootType1", Win32::Registry::REG_SZ] = "fibrous"
33
33
  reg.write("Roots", Win32::Registry::REG_MULTI_SZ, ["strong roots", "healthy tree"])
34
34
  end
35
- ::Win32::Registry::HKEY_CURRENT_USER.open('Software\\Root\\Branch', Win32::Registry::KEY_ALL_ACCESS) do |reg|
35
+ ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root\\Branch", Win32::Registry::KEY_ALL_ACCESS) do |reg|
36
36
  reg["Strong", Win32::Registry::REG_SZ] = "bird nest"
37
37
  end
38
- ::Win32::Registry::HKEY_CURRENT_USER.open('Software\\Root\\Branch\\Flower', Win32::Registry::KEY_ALL_ACCESS) do |reg|
38
+ ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root\\Branch\\Flower", Win32::Registry::KEY_ALL_ACCESS) do |reg|
39
39
  reg["Petals", Win32::Registry::REG_MULTI_SZ] = %w{Pink Delicate}
40
40
  end
41
41
 
@@ -297,7 +297,7 @@ describe "Chef::Win32::Registry", :windows_only do
297
297
  describe "delete_value" do
298
298
  before(:all) do
299
299
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\Trunk\\Peck\\Woodpecker"
300
- ::Win32::Registry::HKEY_CURRENT_USER.open('Software\\Root\\Trunk\\Peck\\Woodpecker', Win32::Registry::KEY_ALL_ACCESS) do |reg|
300
+ ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root\\Trunk\\Peck\\Woodpecker", Win32::Registry::KEY_ALL_ACCESS) do |reg|
301
301
  reg["Peter", Win32::Registry::REG_SZ] = "Tiny"
302
302
  end
303
303
  end
@@ -324,11 +324,11 @@ describe "Chef::Win32::Registry", :windows_only do
324
324
  describe "delete_key" do
325
325
  before(:all) do
326
326
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\Branch\\Fruit"
327
- ::Win32::Registry::HKEY_CURRENT_USER.open('Software\\Root\\Branch\\Fruit', Win32::Registry::KEY_ALL_ACCESS) do |reg|
327
+ ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root\\Branch\\Fruit", Win32::Registry::KEY_ALL_ACCESS) do |reg|
328
328
  reg["Apple", Win32::Registry::REG_MULTI_SZ] = %w{Red Juicy}
329
329
  end
330
330
  ::Win32::Registry::HKEY_CURRENT_USER.create "Software\\Root\\Trunk\\Peck\\Woodpecker"
331
- ::Win32::Registry::HKEY_CURRENT_USER.open('Software\\Root\\Trunk\\Peck\\Woodpecker', Win32::Registry::KEY_ALL_ACCESS) do |reg|
331
+ ::Win32::Registry::HKEY_CURRENT_USER.open("Software\\Root\\Trunk\\Peck\\Woodpecker", Win32::Registry::KEY_ALL_ACCESS) do |reg|
332
332
  reg["Peter", Win32::Registry::REG_SZ] = "Tiny"
333
333
  end
334
334
  end
@@ -519,12 +519,12 @@ describe "Chef::Win32::Registry", :windows_only do
519
519
  end
520
520
  # 64-bit
521
521
  ::Win32::Registry::HKEY_LOCAL_MACHINE.create("Software\\Root\\Mauve", ::Win32::Registry::KEY_ALL_ACCESS | 0x0100)
522
- ::Win32::Registry::HKEY_LOCAL_MACHINE.open('Software\\Root\\Mauve', Win32::Registry::KEY_ALL_ACCESS | 0x0100) do |reg|
522
+ ::Win32::Registry::HKEY_LOCAL_MACHINE.open("Software\\Root\\Mauve", Win32::Registry::KEY_ALL_ACCESS | 0x0100) do |reg|
523
523
  reg["Alert", Win32::Registry::REG_SZ] = "Universal"
524
524
  end
525
525
  # 32-bit
526
526
  ::Win32::Registry::HKEY_LOCAL_MACHINE.create("Software\\Root\\Poosh", ::Win32::Registry::KEY_ALL_ACCESS | 0x0200)
527
- ::Win32::Registry::HKEY_LOCAL_MACHINE.open('Software\\Root\\Poosh', Win32::Registry::KEY_ALL_ACCESS | 0x0200) do |reg|
527
+ ::Win32::Registry::HKEY_LOCAL_MACHINE.open("Software\\Root\\Poosh", Win32::Registry::KEY_ALL_ACCESS | 0x0200) do |reg|
528
528
  reg["Status", Win32::Registry::REG_SZ] = "Lost"
529
529
  end
530
530
  end
@@ -164,7 +164,7 @@ describe Chef::DataCollector do
164
164
  "after" => after_resource&.state_for_resource_reporter || {},
165
165
  "before" => before_resource&.state_for_resource_reporter || {},
166
166
  "cookbook_name" => cookbook_name,
167
- "cookbook_version" => cookbook_version.version,
167
+ "cookbook_version" => cookbook_version&.version,
168
168
  "delta" => resource_has_diff(new_resource, status) ? new_resource.diff : "",
169
169
  "duration" => duration,
170
170
  "id" => new_resource.identity,
@@ -567,6 +567,29 @@ describe Chef::DataCollector do
567
567
  it_behaves_like "sends a converge message"
568
568
  end
569
569
 
570
+ context "when the run contains a file resource that is up-to-date from a @recipe_files, returns nil for the version" do
571
+ let(:total_resource_count) { 1 }
572
+ let(:updated_resource_count) { 0 }
573
+ let(:cookbook_name) { "@recipe_files" }
574
+ let(:resource_record) { [ resource_record_for(new_resource, current_resource, after_resource, :create, "up-to-date", "1234") ] }
575
+ let(:status) { "success" }
576
+ let(:cookbook_version) { nil }
577
+
578
+ before do
579
+ allow(new_resource).to receive(:cookbook_version).and_call_original
580
+ events.resource_action_start(new_resource, :create)
581
+ events.resource_current_state_loaded(new_resource, :create, current_resource)
582
+ events.resource_up_to_date(new_resource, :create)
583
+ events.resource_after_state_loaded(new_resource, :create, after_resource)
584
+ new_resource.instance_variable_set(:@elapsed_time, 1.2345)
585
+ events.resource_completed(new_resource)
586
+ events.converge_complete
587
+ run_status.stop_clock
588
+ end
589
+
590
+ it_behaves_like "sends a converge message"
591
+ end
592
+
570
593
  context "when the run contains a file resource that is updated" do
571
594
  let(:total_resource_count) { 1 }
572
595
  let(:updated_resource_count) { 1 }
@@ -36,7 +36,7 @@ describe Chef::DSL::RebootPending do
36
36
  end
37
37
 
38
38
  it 'should return true if "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations" exists' do
39
- allow(recipe).to receive(:registry_value_exists?).with('HKLM\SYSTEM\CurrentControlSet\Control\Session Manager', { name: "PendingFileRenameOperations" }).and_return(true)
39
+ allow(recipe).to receive(:registry_value_exists?).with("HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager", { name: "PendingFileRenameOperations" }).and_return(true)
40
40
  expect(recipe.reboot_pending?).to be_truthy
41
41
  end
42
42
 
@@ -84,7 +84,7 @@ describe Chef::Mixin::DefaultPaths do
84
84
  allow(Gem).to receive(:bindir).and_return(gem_bindir)
85
85
  allow(RbConfig::CONFIG).to receive(:[]).with("bindir").and_return(ruby_bindir)
86
86
  allow(ChefUtils).to receive(:windows?).and_return(true)
87
- env = { "PATH" => 'C:\Windows\system32;C:\mr\softie' }
87
+ env = { "PATH" => "C:\\Windows\\system32;C:\\mr\\softie" }
88
88
  @default_paths.enforce_default_paths(env)
89
89
  expect(env["PATH"]).to eq("#{gem_bindir};#{ruby_bindir};C:\\Windows\\system32;C:\\mr\\softie")
90
90
  end
@@ -53,8 +53,8 @@ describe Chef::Mixin::Securable do
53
53
  end
54
54
 
55
55
  it "should accept group/owner names with spaces and backslashes" do
56
- expect { @securable.group 'test\ group' }.not_to raise_error
57
- expect { @securable.owner 'test\ group' }.not_to raise_error
56
+ expect { @securable.group "test\\ group" }.not_to raise_error
57
+ expect { @securable.owner "test\\ group" }.not_to raise_error
58
58
  end
59
59
 
60
60
  it "should accept group/owner names that are a single character or digit" do
@@ -186,7 +186,7 @@ describe Chef::Mixin::Securable do
186
186
  end
187
187
 
188
188
  it "should not accept a group name or id for group with spaces and multiple backslashes" do
189
- expect { @securable.group 'test\ \group' }.to raise_error(ArgumentError)
189
+ expect { @securable.group "test\\ \\group" }.to raise_error(ArgumentError)
190
190
  end
191
191
 
192
192
  it "should accept a unix file mode in string form as an octal number" do
@@ -392,6 +392,27 @@ describe Chef::Provider::Cron do
392
392
  expect(cron.command).to eq("/bin/true")
393
393
  end
394
394
  end
395
+
396
+ context "with a matching entry with a commented crontab line" do
397
+ it "should set cron_exists" do
398
+ allow(@provider).to receive(:read_crontab).and_return(<<~CRONTAB)
399
+ 0 2 * * * /some/other/command
400
+
401
+ # Chef Name: cronhole some stuff
402
+ #* * * * * /bin/true
403
+ CRONTAB
404
+ cron = @provider.load_current_resource
405
+ expect(@provider.cron_exists).to eq(true)
406
+ expect(@provider.cron_empty).to eq(false)
407
+ expect(cron.minute).to eq("*")
408
+ expect(cron.hour).to eq("*")
409
+ expect(cron.day).to eq("*")
410
+ expect(cron.month).to eq("*")
411
+ expect(cron.weekday).to eq("*")
412
+ expect(cron.time).to eq(nil)
413
+ expect(cron.property_is_set?(:command)).to eq(false)
414
+ end
415
+ end
395
416
  end
396
417
 
397
418
  describe "cron_different?" do
@@ -691,6 +712,30 @@ describe Chef::Provider::Cron do
691
712
  end
692
713
  end
693
714
 
715
+ context "when there is a crontab with a matching section with a commented crontab line in it" do
716
+ before :each do
717
+ @provider.cron_exists = true
718
+ end
719
+
720
+ it "should add the crontab to the entry" do
721
+ allow(@provider).to receive(:read_crontab).and_return(<<~CRONTAB)
722
+ 0 2 * * * /some/other/command
723
+
724
+ # Chef Name: cronhole some stuff
725
+ # * * * * * /bin/true
726
+ CRONTAB
727
+ expect(@provider).to receive(:write_crontab).with(<<~ENDCRON)
728
+ 0 2 * * * /some/other/command
729
+
730
+ # Chef Name: cronhole some stuff
731
+ * * * * * /bin/true
732
+ # * * * * * /bin/true
733
+ ENDCRON
734
+ @new_resource.minute "*"
735
+ @provider.run_action(:create)
736
+ end
737
+ end
738
+
694
739
  context "when there is a crontab with a matching and identical section" do
695
740
  context "when environment variable is not used" do
696
741
  before :each do