chef 12.4.3-universal-mingw32 → 12.5.1-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 (320) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +21 -25
  3. data/Gemfile +46 -0
  4. data/README.md +4 -4
  5. data/Rakefile +4 -110
  6. data/bin/chef-service-manager +3 -1
  7. data/distro/common/html/knife_cookbook_site.html +18 -18
  8. data/distro/common/man/man1/knife-cookbook-site.1 +11 -11
  9. data/lib/chef.rb +1 -1
  10. data/lib/chef/application.rb +1 -1
  11. data/lib/chef/application/apply.rb +19 -1
  12. data/lib/chef/application/client.rb +11 -5
  13. data/lib/chef/application/knife.rb +2 -2
  14. data/lib/chef/application/solo.rb +1 -1
  15. data/lib/chef/application/windows_service_manager.rb +19 -12
  16. data/lib/chef/chef_class.rb +46 -0
  17. data/lib/chef/chef_fs/config.rb +22 -24
  18. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +3 -1
  19. data/lib/chef/chef_fs/file_pattern.rb +4 -15
  20. data/lib/chef/chef_fs/file_system/acl_dir.rb +3 -4
  21. data/lib/chef/chef_fs/file_system/acls_dir.rb +5 -1
  22. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +0 -5
  23. data/lib/chef/chef_fs/file_system/base_fs_object.rb +5 -2
  24. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +2 -9
  25. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +2 -9
  26. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +10 -17
  27. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +1 -12
  28. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +15 -11
  29. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +8 -2
  30. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +4 -4
  31. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +1 -1
  32. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -11
  33. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +3 -5
  34. data/lib/chef/chef_fs/file_system/environments_dir.rb +1 -1
  35. data/lib/chef/chef_fs/file_system/file_system_entry.rb +7 -4
  36. data/lib/chef/chef_fs/file_system/memory_dir.rb +2 -3
  37. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +15 -0
  38. data/lib/chef/chef_fs/file_system/nodes_dir.rb +1 -1
  39. data/lib/chef/chef_fs/file_system/organization_members_entry.rb +2 -2
  40. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +4 -9
  41. data/lib/chef/chef_fs/knife.rb +35 -7
  42. data/lib/chef/chef_fs/path_utils.rb +65 -34
  43. data/lib/chef/client.rb +2 -3
  44. data/lib/chef/config.rb +34 -2
  45. data/lib/chef/{mixin/wstring.rb → constants.rb} +9 -13
  46. data/lib/chef/cookbook/metadata.rb +25 -3
  47. data/lib/chef/cookbook/synchronizer.rb +1 -1
  48. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  49. data/lib/chef/cookbook_version.rb +3 -3
  50. data/lib/chef/delayed_evaluator.rb +21 -0
  51. data/lib/chef/deprecation/mixin/template.rb +1 -2
  52. data/lib/chef/deprecation/provider/cookbook_file.rb +1 -1
  53. data/lib/chef/deprecation/provider/file.rb +1 -1
  54. data/lib/chef/deprecation/provider/remote_directory.rb +52 -0
  55. data/lib/chef/deprecation/provider/remote_file.rb +1 -2
  56. data/lib/chef/deprecation/provider/template.rb +1 -1
  57. data/lib/chef/deprecation/warnings.rb +3 -4
  58. data/lib/chef/dsl/reboot_pending.rb +3 -2
  59. data/lib/chef/dsl/recipe.rb +26 -7
  60. data/lib/chef/dsl/resources.rb +2 -2
  61. data/lib/chef/event_dispatch/base.rb +51 -22
  62. data/lib/chef/event_dispatch/dispatcher.rb +21 -6
  63. data/lib/chef/event_dispatch/dsl.rb +64 -0
  64. data/lib/chef/exceptions.rb +28 -1
  65. data/lib/chef/file_content_management/tempfile.rb +1 -1
  66. data/lib/chef/formatters/base.rb +3 -0
  67. data/lib/chef/formatters/doc.rb +56 -6
  68. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +36 -0
  69. data/lib/chef/formatters/minimal.rb +2 -2
  70. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +3 -1
  71. data/lib/chef/http/http_request.rb +1 -1
  72. data/lib/chef/knife.rb +35 -55
  73. data/lib/chef/knife/bootstrap.rb +41 -0
  74. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -0
  75. data/lib/chef/knife/bootstrap/client_builder.rb +16 -0
  76. data/lib/chef/knife/bootstrap/templates/README.md +3 -4
  77. data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
  78. data/lib/chef/knife/cookbook_create.rb +1 -1
  79. data/lib/chef/knife/cookbook_site_download.rb +1 -1
  80. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  81. data/lib/chef/knife/cookbook_site_share.rb +6 -6
  82. data/lib/chef/knife/cookbook_site_unshare.rb +2 -2
  83. data/lib/chef/knife/core/bootstrap_context.rb +12 -4
  84. data/lib/chef/knife/core/custom_manifest_loader.rb +69 -0
  85. data/lib/chef/knife/core/gem_glob_loader.rb +138 -0
  86. data/lib/chef/knife/core/hashed_command_loader.rb +80 -0
  87. data/lib/chef/knife/core/node_presenter.rb +24 -1
  88. data/lib/chef/knife/core/object_loader.rb +1 -0
  89. data/lib/chef/knife/core/subcommand_loader.rb +131 -146
  90. data/lib/chef/knife/node_run_list_remove.rb +12 -1
  91. data/lib/chef/knife/null.rb +10 -0
  92. data/lib/chef/knife/rehash.rb +62 -0
  93. data/lib/chef/knife/search.rb +3 -3
  94. data/lib/chef/knife/ssh.rb +52 -30
  95. data/lib/chef/knife/ssl_check.rb +3 -2
  96. data/lib/chef/knife/user_edit.rb +1 -2
  97. data/lib/chef/local_mode.rb +5 -0
  98. data/lib/chef/log.rb +5 -1
  99. data/lib/chef/mixin/deprecation.rb +8 -8
  100. data/lib/chef/mixin/params_validate.rb +362 -135
  101. data/lib/chef/mixin/template.rb +48 -0
  102. data/lib/chef/mixin/which.rb +1 -1
  103. data/lib/chef/mixin/wide_string.rb +72 -0
  104. data/lib/chef/mixin/windows_architecture_helper.rb +15 -39
  105. data/lib/chef/mixin/windows_env_helper.rb +4 -1
  106. data/lib/chef/monkey_patches/webrick-utils.rb +51 -0
  107. data/lib/chef/monkey_patches/win32/registry.rb +72 -0
  108. data/lib/chef/node.rb +116 -3
  109. data/lib/chef/node_map.rb +2 -2
  110. data/lib/chef/platform/handler_map.rb +0 -5
  111. data/lib/chef/platform/provider_mapping.rb +5 -6
  112. data/lib/chef/platform/query_helpers.rb +46 -4
  113. data/lib/chef/platform/rebooter.rb +1 -1
  114. data/lib/chef/platform/service_helpers.rb +30 -32
  115. data/lib/chef/policy_builder.rb +1 -8
  116. data/lib/chef/policy_builder/dynamic.rb +186 -0
  117. data/lib/chef/policy_builder/expand_node_object.rb +30 -15
  118. data/lib/chef/policy_builder/policyfile.rb +155 -18
  119. data/lib/chef/property.rb +568 -0
  120. data/lib/chef/provider.rb +222 -13
  121. data/lib/chef/provider/batch.rb +8 -0
  122. data/lib/chef/provider/deploy.rb +5 -7
  123. data/lib/chef/provider/directory.rb +14 -2
  124. data/lib/chef/provider/dsc_resource.rb +5 -9
  125. data/lib/chef/provider/group/pw.rb +1 -1
  126. data/lib/chef/provider/ifconfig.rb +2 -2
  127. data/lib/chef/provider/lwrp_base.rb +1 -75
  128. data/lib/chef/provider/mount.rb +7 -3
  129. data/lib/chef/provider/package.rb +1 -1
  130. data/lib/chef/provider/package/dpkg.rb +5 -11
  131. data/lib/chef/provider/package/rpm.rb +2 -2
  132. data/lib/chef/provider/package/rubygems.rb +1 -1
  133. data/lib/chef/provider/package/windows/msi.rb +2 -2
  134. data/lib/chef/provider/package/yum.rb +17 -5
  135. data/lib/chef/provider/powershell_script.rb +59 -23
  136. data/lib/chef/provider/registry_key.rb +5 -5
  137. data/lib/chef/provider/remote_directory.rb +190 -102
  138. data/lib/chef/provider/service.rb +12 -2
  139. data/lib/chef/provider/service/aix.rb +1 -1
  140. data/lib/chef/provider/service/debian.rb +3 -5
  141. data/lib/chef/provider/service/freebsd.rb +1 -1
  142. data/lib/chef/provider/service/gentoo.rb +3 -3
  143. data/lib/chef/provider/service/init.rb +3 -3
  144. data/lib/chef/provider/service/insserv.rb +2 -4
  145. data/lib/chef/provider/service/invokercd.rb +2 -4
  146. data/lib/chef/provider/service/macosx.rb +5 -1
  147. data/lib/chef/provider/service/openbsd.rb +2 -1
  148. data/lib/chef/provider/service/redhat.rb +52 -16
  149. data/lib/chef/provider/service/simple.rb +2 -2
  150. data/lib/chef/provider/service/systemd.rb +3 -5
  151. data/lib/chef/provider/service/upstart.rb +4 -6
  152. data/lib/chef/provider/subversion.rb +13 -7
  153. data/lib/chef/provider/template/content.rb +16 -6
  154. data/lib/chef/provider/user/solaris.rb +32 -4
  155. data/lib/chef/provider/windows_script.rb +3 -5
  156. data/lib/chef/provider_resolver.rb +2 -2
  157. data/lib/chef/recipe.rb +1 -8
  158. data/lib/chef/resource.rb +563 -90
  159. data/lib/chef/resource/action_class.rb +83 -0
  160. data/lib/chef/resource/chef_gem.rb +3 -3
  161. data/lib/chef/resource/deploy.rb +8 -2
  162. data/lib/chef/resource/dsc_script.rb +2 -0
  163. data/lib/chef/resource/file/verification.rb +7 -1
  164. data/lib/chef/resource/lwrp_base.rb +1 -7
  165. data/lib/chef/resource/registry_key.rb +1 -1
  166. data/lib/chef/resource/service.rb +10 -2
  167. data/lib/chef/resource/subversion.rb +5 -0
  168. data/lib/chef/resource/windows_script.rb +6 -2
  169. data/lib/chef/resource/yum_package.rb +10 -1
  170. data/lib/chef/resource_resolver.rb +3 -3
  171. data/lib/chef/run_context.rb +402 -83
  172. data/lib/chef/run_list/versioned_recipe_list.rb +15 -0
  173. data/lib/chef/run_lock.rb +30 -21
  174. data/lib/chef/util/powershell/ps_credential.rb +4 -0
  175. data/lib/chef/util/windows.rb +0 -32
  176. data/lib/chef/util/windows/net_group.rb +85 -106
  177. data/lib/chef/util/windows/net_use.rb +35 -71
  178. data/lib/chef/util/windows/net_user.rb +0 -1
  179. data/lib/chef/util/windows/volume.rb +19 -19
  180. data/lib/chef/version.rb +3 -3
  181. data/lib/chef/win32/api.rb +1 -0
  182. data/lib/chef/win32/api/file.rb +20 -0
  183. data/lib/chef/win32/api/net.rb +163 -43
  184. data/lib/chef/win32/api/registry.rb +51 -0
  185. data/lib/chef/win32/api/system.rb +23 -0
  186. data/lib/chef/win32/api/unicode.rb +0 -43
  187. data/lib/chef/win32/crypto.rb +2 -1
  188. data/lib/chef/win32/file.rb +28 -3
  189. data/lib/chef/win32/mutex.rb +1 -2
  190. data/lib/chef/win32/net.rb +162 -8
  191. data/lib/chef/win32/process.rb +13 -0
  192. data/lib/chef/win32/registry.rb +35 -30
  193. data/lib/chef/win32/security.rb +1 -1
  194. data/lib/chef/win32/security/token.rb +1 -1
  195. data/lib/chef/win32/system.rb +62 -0
  196. data/lib/chef/win32/unicode.rb +7 -2
  197. data/lib/chef/win32/version.rb +0 -4
  198. data/lib/chef/workstation_config_loader.rb +3 -158
  199. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -0
  200. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -0
  201. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -0
  202. data/spec/data/dsc_lcm.pfx +0 -0
  203. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -0
  204. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -0
  205. data/spec/functional/dsl/reboot_pending_spec.rb +33 -43
  206. data/spec/functional/knife/cookbook_delete_spec.rb +17 -7
  207. data/spec/functional/knife/ssh_spec.rb +16 -0
  208. data/spec/functional/rebooter_spec.rb +1 -1
  209. data/spec/functional/resource/deploy_revision_spec.rb +1 -1
  210. data/spec/functional/resource/dsc_resource_spec.rb +2 -0
  211. data/spec/functional/resource/dsc_script_spec.rb +91 -2
  212. data/spec/functional/resource/group_spec.rb +67 -44
  213. data/spec/functional/resource/{powershell_spec.rb → powershell_script_spec.rb} +107 -18
  214. data/spec/functional/resource/windows_service_spec.rb +1 -1
  215. data/spec/functional/run_lock_spec.rb +368 -189
  216. data/spec/functional/win32/{registry_helper_spec.rb → registry_spec.rb} +16 -23
  217. data/spec/functional/win32/service_manager_spec.rb +2 -2
  218. data/spec/integration/client/client_spec.rb +51 -0
  219. data/spec/integration/knife/chef_repo_path_spec.rb +13 -11
  220. data/spec/integration/knife/download_spec.rb +4 -0
  221. data/spec/integration/knife/list_spec.rb +8 -0
  222. data/spec/integration/knife/upload_spec.rb +1 -1
  223. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -16
  224. data/spec/integration/recipes/remote_directory.rb +74 -0
  225. data/spec/integration/recipes/resource_action_spec.rb +363 -0
  226. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +423 -0
  227. data/spec/integration/recipes/resource_load_spec.rb +206 -0
  228. data/spec/spec_helper.rb +9 -0
  229. data/spec/support/platform_helpers.rb +13 -0
  230. data/spec/support/shared/context/win32.rb +34 -0
  231. data/spec/support/shared/functional/win32_service.rb +2 -1
  232. data/spec/support/shared/functional/windows_script.rb +63 -26
  233. data/spec/support/shared/unit/mock_shellout.rb +46 -0
  234. data/spec/support/shared/unit/provider/file.rb +10 -4
  235. data/spec/unit/application/client_spec.rb +16 -3
  236. data/spec/unit/application/knife_spec.rb +2 -2
  237. data/spec/unit/application/solo_spec.rb +4 -3
  238. data/spec/unit/chef_class_spec.rb +23 -4
  239. data/spec/unit/chef_fs/path_util_spec.rb +108 -0
  240. data/spec/unit/client_spec.rb +6 -1
  241. data/spec/unit/config_spec.rb +31 -0
  242. data/spec/unit/cookbook/metadata_spec.rb +23 -3
  243. data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
  244. data/spec/unit/deprecation_spec.rb +3 -6
  245. data/spec/unit/dsl/reboot_pending_spec.rb +12 -6
  246. data/spec/unit/event_dispatch/dispatcher_spec.rb +65 -3
  247. data/spec/unit/event_dispatch/dsl_spec.rb +83 -0
  248. data/spec/unit/formatters/doc_spec.rb +32 -0
  249. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +26 -0
  250. data/spec/unit/json_compat_spec.rb +4 -3
  251. data/spec/unit/knife/bootstrap/client_builder_spec.rb +27 -0
  252. data/spec/unit/knife/bootstrap_spec.rb +55 -3
  253. data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
  254. data/spec/unit/knife/core/bootstrap_context_spec.rb +21 -4
  255. data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -0
  256. data/spec/unit/knife/core/gem_glob_loader_spec.rb +210 -0
  257. data/spec/unit/knife/core/hashed_command_loader_spec.rb +93 -0
  258. data/spec/unit/knife/core/subcommand_loader_spec.rb +16 -192
  259. data/spec/unit/knife/node_run_list_remove_spec.rb +17 -0
  260. data/spec/unit/knife/ssl_check_spec.rb +4 -0
  261. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +10 -10
  262. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  263. data/spec/unit/mixin/template_spec.rb +5 -1
  264. data/spec/unit/mixin/windows_architecture_helper_spec.rb +13 -8
  265. data/spec/unit/node_spec.rb +220 -0
  266. data/spec/unit/platform/query_helpers_spec.rb +146 -3
  267. data/spec/unit/policy_builder/dynamic_spec.rb +275 -0
  268. data/spec/unit/policy_builder/expand_node_object_spec.rb +37 -38
  269. data/spec/unit/policy_builder/policyfile_spec.rb +260 -46
  270. data/spec/unit/property/state_spec.rb +506 -0
  271. data/spec/unit/property/validation_spec.rb +663 -0
  272. data/spec/unit/property_spec.rb +1094 -0
  273. data/spec/unit/provider/deploy_spec.rb +5 -5
  274. data/spec/unit/provider/directory_spec.rb +35 -0
  275. data/spec/unit/provider/dsc_resource_spec.rb +3 -10
  276. data/spec/unit/provider/ifconfig_spec.rb +22 -2
  277. data/spec/unit/provider/mount/aix_spec.rb +2 -1
  278. data/spec/unit/provider/mount/mount_spec.rb +6 -0
  279. data/spec/unit/provider/mount/windows_spec.rb +14 -0
  280. data/spec/unit/provider/mount_spec.rb +12 -1
  281. data/spec/unit/provider/package/dpkg_spec.rb +8 -1
  282. data/spec/unit/provider/package/rpm_spec.rb +18 -1
  283. data/spec/unit/provider/package/rubygems_spec.rb +18 -0
  284. data/spec/unit/provider/package/yum_spec.rb +97 -24
  285. data/spec/unit/provider/powershell_script_spec.rb +106 -0
  286. data/spec/unit/provider/registry_key_spec.rb +12 -0
  287. data/spec/unit/provider/remote_directory_spec.rb +1 -2
  288. data/spec/unit/provider/service/aix_service_spec.rb +3 -3
  289. data/spec/unit/provider/service/gentoo_service_spec.rb +4 -4
  290. data/spec/unit/provider/service/macosx_spec.rb +4 -4
  291. data/spec/unit/provider/service/openbsd_service_spec.rb +10 -8
  292. data/spec/unit/provider/service/redhat_spec.rb +88 -8
  293. data/spec/unit/provider/service/upstart_service_spec.rb +11 -7
  294. data/spec/unit/provider/service/windows_spec.rb +211 -200
  295. data/spec/unit/provider/subversion_spec.rb +50 -31
  296. data/spec/unit/provider/template/content_spec.rb +93 -2
  297. data/spec/unit/provider/user/solaris_spec.rb +66 -9
  298. data/spec/unit/provider_resolver_spec.rb +707 -650
  299. data/spec/unit/provider_spec.rb +1 -3
  300. data/spec/unit/recipe_spec.rb +0 -4
  301. data/spec/unit/resource/deploy_spec.rb +7 -1
  302. data/spec/unit/resource/dsc_script_spec.rb +4 -0
  303. data/spec/unit/resource/file/verification_spec.rb +33 -5
  304. data/spec/unit/resource/{powershell_spec.rb → powershell_script_spec.rb} +17 -13
  305. data/spec/unit/resource/service_spec.rb +4 -4
  306. data/spec/unit/resource/subversion_spec.rb +4 -0
  307. data/spec/unit/resource/yum_package_spec.rb +10 -1
  308. data/spec/unit/resource_spec.rb +2 -2
  309. data/spec/unit/run_context/child_run_context_spec.rb +133 -0
  310. data/spec/unit/run_context_spec.rb +7 -0
  311. data/spec/unit/run_list/versioned_recipe_list_spec.rb +5 -0
  312. data/spec/unit/win32/registry_spec.rb +394 -0
  313. data/tasks/external_tests.rb +47 -23
  314. data/tasks/maintainers.rb +155 -14
  315. metadata +64 -53
  316. data/lib/chef/knife/bootstrap/templates/archlinux-gems.erb +0 -76
  317. data/lib/chef/knife/bootstrap/templates/chef-aix.erb +0 -72
  318. data/spec/unit/provider/powershell_spec.rb +0 -80
  319. data/spec/unit/registry_helper_spec.rb +0 -376
  320. data/spec/unit/workstation_config_loader_spec.rb +0 -283
@@ -114,9 +114,7 @@ describe Chef::Provider do
114
114
  end
115
115
 
116
116
  it "does not re-load recipes when creating the temporary run context" do
117
- # we actually want to test that RunContext#load is never called, but we
118
- # can't stub all instances of an object with rspec's mocks. :/
119
- allow(Chef::RunContext).to receive(:new).and_raise("not supposed to happen")
117
+ expect_any_instance_of(Chef::RunContext).not_to receive(:load)
120
118
  snitch = Proc.new {temporary_collection = @run_context.resource_collection}
121
119
  @provider.send(:recipe_eval, &snitch)
122
120
  end
@@ -154,8 +154,6 @@ describe Chef::Recipe do
154
154
  end
155
155
 
156
156
  it "selects the first one alphabetically" do
157
- expect(Chef::Log).to receive(:warn).with("You declared a new resource TottenhamHotspur for resource football, but it comes alphabetically after Sounders and has the same filters ({:platform=>\"nbc_sports\"}), so it will not be used. Use override: true if you want to use it for football.")
158
-
159
157
  Sounders.provides :football, platform: "nbc_sports"
160
158
  TottenhamHotspur.provides :football, platform: "nbc_sports"
161
159
 
@@ -165,8 +163,6 @@ describe Chef::Recipe do
165
163
  end
166
164
 
167
165
  it "selects the first one alphabetically even if the declaration order is reversed" do
168
- expect(Chef::Log).to receive(:warn).with("You are overriding football2 on {:platform=>\"nbc_sports\"} with Sounders: used to be TottenhamHotspur. Use override: true if this is what you intended.")
169
-
170
166
  TottenhamHotspur.provides :football2, platform: "nbc_sports"
171
167
  Sounders.provides :football2, platform: "nbc_sports"
172
168
 
@@ -148,10 +148,16 @@ describe Chef::Resource::Deploy do
148
148
  expect(@resource.current_path).to eql("/my/deploy/dir/current")
149
149
  end
150
150
 
151
+ it "allows depth to be set via integer" do
152
+ expect(@resource.depth).to be_nil
153
+ @resource.depth 1
154
+ expect(@resource.depth).to eql(1)
155
+ end
156
+
151
157
  it "gives #depth as 5 if shallow clone is true, nil otherwise" do
152
158
  expect(@resource.depth).to be_nil
153
159
  @resource.shallow_clone true
154
- expect(@resource.depth).to eql("5")
160
+ expect(@resource.depth).to eql(5)
155
161
  end
156
162
 
157
163
  it "aliases repo as repository" do
@@ -70,6 +70,10 @@ describe Chef::Resource::DscScript do
70
70
  expect(dsc_test_resource.configuration_data_script).to eq(configuration_data_script)
71
71
  end
72
72
 
73
+ it "has the ps_credential helper method" do
74
+ expect(dsc_test_resource).to respond_to(:ps_credential)
75
+ end
76
+
73
77
  context "when calling imports" do
74
78
  let(:module_name) { 'FooModule' }
75
79
  let(:module_name_b) { 'BarModule' }
@@ -69,12 +69,40 @@ describe Chef::Resource::File::Verification do
69
69
  end
70
70
 
71
71
  context "with a verification command(String)" do
72
+ before(:each) do
73
+ allow(Chef::Log).to receive(:deprecation).and_return(nil)
74
+ end
75
+
76
+ def platform_specific_verify_command(variable_name)
77
+ if windows?
78
+ "if \"#{temp_path}\" == \"%{#{variable_name}}\" (exit 0) else (exit 1)"
79
+ else
80
+ "test #{temp_path} = %{#{variable_name}}"
81
+ end
82
+ end
83
+
72
84
  it "substitutes \%{file} with the path" do
73
- test_command = if windows?
74
- "if \"#{temp_path}\" == \"%{file}\" (exit 0) else (exit 1)"
75
- else
76
- "test #{temp_path} = %{file}"
77
- end
85
+ test_command = platform_specific_verify_command('file')
86
+ v = Chef::Resource::File::Verification.new(parent_resource, test_command, {})
87
+ expect(v.verify(temp_path)).to eq(true)
88
+ end
89
+
90
+ it "warns about deprecation when \%{file} is used" do
91
+ expect(Chef::Log).to receive(:deprecation).with(/%{file} is deprecated/, /verification_spec\.rb/)
92
+ test_command = platform_specific_verify_command('file')
93
+ Chef::Resource::File::Verification.new(parent_resource, test_command, {})
94
+ .verify(temp_path)
95
+ end
96
+
97
+ it "does not warn about deprecation when \%{file} is not used" do
98
+ expect(Chef::Log).to_not receive(:deprecation)
99
+ test_command = platform_specific_verify_command('path')
100
+ Chef::Resource::File::Verification.new(parent_resource, test_command, {})
101
+ .verify(temp_path)
102
+ end
103
+
104
+ it "substitutes \%{path} with the path" do
105
+ test_command = platform_specific_verify_command('path')
78
106
  v = Chef::Resource::File::Verification.new(parent_resource, test_command, {})
79
107
  expect(v.verify(temp_path)).to eq(true)
80
108
  end
@@ -30,24 +30,28 @@ describe Chef::Resource::PowershellScript do
30
30
  run_context = Chef::RunContext.new(node, nil, nil)
31
31
 
32
32
  @resource = Chef::Resource::PowershellScript.new("powershell_unit_test", run_context)
33
-
34
33
  end
35
34
 
36
- it "should create a new Chef::Resource::PowershellScript" do
35
+ it "creates a new Chef::Resource::PowershellScript" do
37
36
  expect(@resource).to be_a_kind_of(Chef::Resource::PowershellScript)
38
37
  end
39
38
 
40
- it "should set convert_boolean_return to false by default" do
39
+ it "sets convert_boolean_return to false by default" do
41
40
  expect(@resource.convert_boolean_return).to eq(false)
42
41
  end
43
42
 
44
- it "should return the value for convert_boolean_return that was set" do
43
+ it "returns the value for convert_boolean_return that was set" do
45
44
  @resource.convert_boolean_return true
46
45
  expect(@resource.convert_boolean_return).to eq(true)
47
46
  @resource.convert_boolean_return false
48
47
  expect(@resource.convert_boolean_return).to eq(false)
49
48
  end
50
49
 
50
+ it "raises an error when architecture is i386 on Windows Nano Server" do
51
+ allow(Chef::Platform).to receive(:windows_nano_server?).and_return(true)
52
+ expect{@resource.architecture(:i386)}.to raise_error(Chef::Exceptions::Win32ArchitectureIncorrect, "cannot execute script with requested architecture 'i386' on Windows Nano Server")
53
+ end
54
+
51
55
  context "when using guards" do
52
56
  let(:resource) { @resource }
53
57
  before(:each) do
@@ -62,32 +66,32 @@ describe Chef::Resource::PowershellScript do
62
66
  expect(inherited_difference).to eq([])
63
67
  end
64
68
 
65
- it "should allow guard interpreter to be set to Chef::Resource::Script" do
69
+ it "allows guard interpreter to be set to Chef::Resource::Script" do
66
70
  resource.guard_interpreter(:script)
67
71
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(false)
68
72
  resource.only_if("echo hi")
69
73
  end
70
74
 
71
- it "should allow guard interpreter to be set to Chef::Resource::Bash derived from Chef::Resource::Script" do
75
+ it "allows guard interpreter to be set to Chef::Resource::Bash derived from Chef::Resource::Script" do
72
76
  resource.guard_interpreter(:bash)
73
77
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(false)
74
78
  resource.only_if("echo hi")
75
79
  end
76
80
 
77
- it "should allow guard interpreter to be set to Chef::Resource::PowershellScript derived indirectly from Chef::Resource::Script" do
81
+ it "allows guard interpreter to be set to Chef::Resource::PowershellScript derived indirectly from Chef::Resource::Script" do
78
82
  resource.guard_interpreter(:powershell_script)
79
83
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(false)
80
84
  resource.only_if("echo hi")
81
85
  end
82
86
 
83
- it "should enable convert_boolean_return by default for guards in the context of powershell_script when no guard params are specified" do
87
+ it "enables convert_boolean_return by default for guards in the context of powershell_script when no guard params are specified" do
84
88
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(true)
85
89
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
86
90
  {:convert_boolean_return => true, :code => "$true"}).and_return(Proc.new {})
87
91
  resource.only_if("$true")
88
92
  end
89
93
 
90
- it "should enable convert_boolean_return by default for guards in non-Chef::Resource::Script derived resources when no guard params are specified" do
94
+ it "enables convert_boolean_return by default for guards in non-Chef::Resource::Script derived resources when no guard params are specified" do
91
95
  node = Chef::Node.new
92
96
  run_context = Chef::RunContext.new(node, nil, nil)
93
97
  file_resource = Chef::Resource::File.new('idontexist', run_context)
@@ -98,21 +102,21 @@ describe Chef::Resource::PowershellScript do
98
102
  resource.only_if("$true")
99
103
  end
100
104
 
101
- it "should enable convert_boolean_return by default for guards in the context of powershell_script when guard params are specified" do
105
+ it "enables convert_boolean_return by default for guards in the context of powershell_script when guard params are specified" do
102
106
  guard_parameters = {:cwd => '/etc/chef', :architecture => :x86_64}
103
107
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
104
108
  {:convert_boolean_return => true, :code => "$true"}.merge(guard_parameters)).and_return(Proc.new {})
105
109
  resource.only_if("$true", guard_parameters)
106
110
  end
107
111
 
108
- it "should pass convert_boolean_return as true if it was specified as true in a guard parameter" do
112
+ it "passes convert_boolean_return as true if it was specified as true in a guard parameter" do
109
113
  guard_parameters = {:cwd => '/etc/chef', :convert_boolean_return => true, :architecture => :x86_64}
110
114
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
111
115
  {:convert_boolean_return => true, :code => "$true"}.merge(guard_parameters)).and_return(Proc.new {})
112
116
  resource.only_if("$true", guard_parameters)
113
117
  end
114
118
 
115
- it "should pass convert_boolean_return as false if it was specified as true in a guard parameter" do
119
+ it "passes convert_boolean_return as false if it was specified as true in a guard parameter" do
116
120
  other_guard_parameters = {:cwd => '/etc/chef', :architecture => :x86_64}
117
121
  parameters_with_boolean_disabled = other_guard_parameters.merge({:convert_boolean_return => false, :code => "$true"})
118
122
  allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
@@ -127,6 +131,6 @@ describe Chef::Resource::PowershellScript do
127
131
  let(:resource_name) { :powershell_script }
128
132
  let(:interpreter_file_name) { 'powershell.exe' }
129
133
 
130
- it_should_behave_like "a Windows script resource"
134
+ it_behaves_like "a Windows script resource"
131
135
  end
132
136
  end
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # Author:: AJ Christensen (<aj@hjksolutions.com>)
3
3
  # Author:: Tyler Cloke (<tyler@opscode.com>)
4
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # Copyright:: Copyright (c) 2008-2015 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");
@@ -139,14 +139,14 @@ describe Chef::Resource::Service do
139
139
  expect { @resource.send(attrib, "poop") }.to raise_error(ArgumentError)
140
140
  end
141
141
 
142
- it "should default all the feature support to false" do
143
- support_hash = { :status => false, :restart => false, :reload=> false }
142
+ it "should default all the feature support to nil" do
143
+ support_hash = { :status => nil, :restart => nil, :reload=> nil }
144
144
  expect(@resource.supports).to eq(support_hash)
145
145
  end
146
146
 
147
147
  it "should allow you to set what features this resource supports as a array" do
148
148
  support_array = [ :status, :restart ]
149
- support_hash = { :status => true, :restart => true, :reload => false }
149
+ support_hash = { :status => true, :restart => true, :reload => nil }
150
150
  @resource.supports(support_array)
151
151
  expect(@resource.supports).to eq(support_hash)
152
152
  end
@@ -54,6 +54,10 @@ describe Chef::Resource::Subversion do
54
54
  expect(@svn.svn_arguments).to eq('--no-auth-cache')
55
55
  end
56
56
 
57
+ it "sets svn binary to nil by default" do
58
+ expect(@svn.svn_binary).to be_nil
59
+ end
60
+
57
61
  it "resets svn arguments to nil when given false in the setter" do
58
62
  @svn.svn_arguments(false)
59
63
  expect(@svn.svn_arguments).to be_nil
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: AJ Christensen (<aj@opscode.com>)
3
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
3
+ # Copyright:: Copyright (c) 2008-2015 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");
@@ -78,3 +78,12 @@ describe Chef::Resource::YumPackage, "allow_downgrade" do
78
78
  expect { @resource.allow_downgrade "monkey" }.to raise_error(ArgumentError)
79
79
  end
80
80
  end
81
+
82
+ describe Chef::Resource::YumPackage, "yum_binary" do
83
+ let(:resource) { Chef::Resource::YumPackage.new("foo") }
84
+
85
+ it "should allow you to specify the yum_binary" do
86
+ resource.yum_binary "/usr/bin/yum-something"
87
+ expect(resource.yum_binary).to eql("/usr/bin/yum-something")
88
+ end
89
+ end
@@ -59,8 +59,8 @@ describe Chef::Resource do
59
59
  end
60
60
 
61
61
  describe "when declaring the identity attribute" do
62
- it "has no identity attribute by default" do
63
- expect(Chef::Resource.identity_attr).to be_nil
62
+ it "has :name as identity attribute by default" do
63
+ expect(Chef::Resource.identity_attr).to eq(:name)
64
64
  end
65
65
 
66
66
  it "sets an identity attribute" do
@@ -0,0 +1,133 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
4
+ # Author:: Christopher Walters (<cw@opscode.com>)
5
+ # Copyright:: Copyright (c) 2008, 2010 Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'spec_helper'
22
+ require 'support/lib/library_load_order'
23
+
24
+ describe Chef::RunContext::ChildRunContext do
25
+ context "with a run context with stuff in it" do
26
+ let(:chef_repo_path) { File.expand_path(File.join(CHEF_SPEC_DATA, "run_context", "cookbooks")) }
27
+ let(:cookbook_collection) {
28
+ cl = Chef::CookbookLoader.new(chef_repo_path)
29
+ cl.load_cookbooks
30
+ Chef::CookbookCollection.new(cl)
31
+ }
32
+ let(:node) {
33
+ node = Chef::Node.new
34
+ node.run_list << "test" << "test::one" << "test::two"
35
+ node
36
+ }
37
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
38
+ let(:run_context) { Chef::RunContext.new(node, cookbook_collection, events) }
39
+
40
+ context "and a child run context" do
41
+ let(:child) { run_context.create_child }
42
+
43
+ it "parent_run_context is set to the parent" do
44
+ expect(child.parent_run_context).to eq run_context
45
+ end
46
+
47
+ it "audits is not the same as the parent" do
48
+ expect(child.audits.object_id).not_to eq run_context.audits.object_id
49
+ child.audits['hi'] = 'lo'
50
+ expect(child.audits['hi']).to eq('lo')
51
+ expect(run_context.audits['hi']).not_to eq('lo')
52
+ end
53
+
54
+ it "resource_collection is not the same as the parent" do
55
+ expect(child.resource_collection.object_id).not_to eq run_context.resource_collection.object_id
56
+ f = Chef::Resource::File.new('hi', child)
57
+ child.resource_collection.insert(f)
58
+ expect(child.resource_collection).to include f
59
+ expect(run_context.resource_collection).not_to include f
60
+ end
61
+
62
+ it "immediate_notification_collection is not the same as the parent" do
63
+ expect(child.immediate_notification_collection.object_id).not_to eq run_context.immediate_notification_collection.object_id
64
+ src = Chef::Resource::File.new('hi', child)
65
+ dest = Chef::Resource::File.new('argh', child)
66
+ notification = Chef::Resource::Notification.new(dest, :create, src)
67
+ child.notifies_immediately(notification)
68
+ expect(child.immediate_notification_collection['file[hi]']).to eq([notification])
69
+ expect(run_context.immediate_notification_collection['file[hi]']).not_to eq([notification])
70
+ end
71
+
72
+ it "immediate_notifications is not the same as the parent" do
73
+ src = Chef::Resource::File.new('hi', child)
74
+ dest = Chef::Resource::File.new('argh', child)
75
+ notification = Chef::Resource::Notification.new(dest, :create, src)
76
+ child.notifies_immediately(notification)
77
+ expect(child.immediate_notifications(src)).to eq([notification])
78
+ expect(run_context.immediate_notifications(src)).not_to eq([notification])
79
+ end
80
+
81
+ it "delayed_notification_collection is not the same as the parent" do
82
+ expect(child.delayed_notification_collection.object_id).not_to eq run_context.delayed_notification_collection.object_id
83
+ src = Chef::Resource::File.new('hi', child)
84
+ dest = Chef::Resource::File.new('argh', child)
85
+ notification = Chef::Resource::Notification.new(dest, :create, src)
86
+ child.notifies_delayed(notification)
87
+ expect(child.delayed_notification_collection['file[hi]']).to eq([notification])
88
+ expect(run_context.delayed_notification_collection['file[hi]']).not_to eq([notification])
89
+ end
90
+
91
+ it "delayed_notifications is not the same as the parent" do
92
+ src = Chef::Resource::File.new('hi', child)
93
+ dest = Chef::Resource::File.new('argh', child)
94
+ notification = Chef::Resource::Notification.new(dest, :create, src)
95
+ child.notifies_delayed(notification)
96
+ expect(child.delayed_notifications(src)).to eq([notification])
97
+ expect(run_context.delayed_notifications(src)).not_to eq([notification])
98
+ end
99
+
100
+ it "create_child creates a child-of-child" do
101
+ c = child.create_child
102
+ expect(c.parent_run_context).to eq child
103
+ end
104
+
105
+ context "after load('include::default')" do
106
+ before do
107
+ run_list = Chef::RunList.new('include::default').expand('_default')
108
+ # TODO not sure why we had to do this to get everything to work ...
109
+ node.automatic_attrs[:recipes] = []
110
+ child.load(run_list)
111
+ end
112
+
113
+ it "load_recipe loads into the child" do
114
+ expect(child.resource_collection).to be_empty
115
+ child.load_recipe("include::includee")
116
+ expect(child.resource_collection).not_to be_empty
117
+ end
118
+
119
+ it "include_recipe loads into the child" do
120
+ expect(child.resource_collection).to be_empty
121
+ child.include_recipe("include::includee")
122
+ expect(child.resource_collection).not_to be_empty
123
+ end
124
+
125
+ it "load_recipe_file loads into the child" do
126
+ expect(child.resource_collection).to be_empty
127
+ child.load_recipe_file(File.expand_path("include/recipes/includee.rb", chef_repo_path))
128
+ expect(child.resource_collection).not_to be_empty
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -68,6 +68,9 @@ describe Chef::RunContext do
68
68
  "dependency2" => {
69
69
  "version" => "0.0.0",
70
70
  },
71
+ "include" => {
72
+ "version" => "0.0.0",
73
+ },
71
74
  "no-default-attr" => {
72
75
  "version" => "0.0.0",
73
76
  },
@@ -84,6 +87,10 @@ describe Chef::RunContext do
84
87
  )
85
88
  end
86
89
 
90
+ it "has a nil parent_run_context" do
91
+ expect(run_context.parent_run_context).to be_nil
92
+ end
93
+
87
94
  describe "loading cookbooks for a run list" do
88
95
  before do
89
96
 
@@ -187,4 +187,9 @@ describe Chef::RunList::VersionedRecipeList do
187
187
  end
188
188
  end
189
189
 
190
+ context "with duplicated names", :chef_gte_13_only do
191
+ it "should fail in Chef 13" do
192
+ expect(list).to_not respond_to(:with_duplicate_names)
193
+ end
194
+ end
190
195
  end
@@ -0,0 +1,394 @@
1
+ #
2
+ # Author:: Prajakta Purohit (prajakta@opscode.com)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Chef::Win32::Registry do
22
+ include_context "Win32"
23
+
24
+ let(:value1) { { :name => "one", :type => :string, :data => "1" } }
25
+ let(:value1_upcase_name) { {:name => "ONE", :type => :string, :data => "1"} }
26
+ let(:key_path) { 'HKCU\Software\OpscodeNumbers' }
27
+ let(:key) { 'Software\OpscodeNumbers' }
28
+ let(:key_parent) { 'Software' }
29
+ let(:key_to_delete) { 'OpscodeNumbers' }
30
+ let(:sub_key) {'OpscodePrimes'}
31
+ let(:missing_key_path) {'HKCU\Software'}
32
+ let(:registry) { Chef::Win32::Registry.new() }
33
+ let(:hive_mock) { double("::Win32::Registry::KHKEY_CURRENT_USER") }
34
+ let(:reg_mock) { double("reg") }
35
+
36
+ before(:all) do
37
+ Win32::Registry = Class.new
38
+ Win32::Registry::Error = Class.new(RuntimeError)
39
+ end
40
+
41
+ before(:each) do
42
+ allow_any_instance_of(Chef::Win32::Registry).to receive(:machine_architecture).and_return(:x86_64)
43
+
44
+ #Making the values for registry constants available on unix
45
+ Win32::Registry::KEY_SET_VALUE = 0x0002
46
+ Win32::Registry::KEY_QUERY_VALUE = 0x0001
47
+ Win32::Registry::KEY_WRITE = 0x00020000 | 0x0002 | 0x0004
48
+ Win32::Registry::KEY_READ = 0x00020000 | 0x0001 | 0x0008 | 0x0010
49
+ end
50
+
51
+ after(:each) do
52
+ Win32::Registry.send(:remove_const, 'KEY_SET_VALUE') if defined?(Win32::Registry::KEY_SET_VALUE)
53
+ Win32::Registry.send(:remove_const, 'KEY_QUERY_VALUE') if defined?(Win32::Registry::KEY_QUERY_VALUE)
54
+ Win32::Registry.send(:remove_const, 'KEY_READ') if defined?(Win32::Registry::KEY_READ)
55
+ Win32::Registry.send(:remove_const, 'KEY_WRITE') if defined?(Win32::Registry::KEY_WRITE)
56
+ end
57
+
58
+ describe "get_values" do
59
+ it "gets all values for a key if the key exists" do
60
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
61
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
62
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
63
+ expect(reg_mock).to receive(:map)
64
+ registry.get_values(key_path)
65
+ end
66
+
67
+ it "throws an exception if key does not exist" do
68
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
69
+ expect(registry).to receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
70
+ expect{registry.get_values(key_path)}.to raise_error(Chef::Exceptions::Win32RegKeyMissing)
71
+ end
72
+ end
73
+
74
+ describe "set_value" do
75
+ it "does nothing if key and hive and value exist" do
76
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
77
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
78
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(true)
79
+ expect(registry).to receive(:data_exists?).with(key_path, value1).and_return(true)
80
+ registry.set_value(key_path, value1)
81
+ end
82
+ it "does nothing if case insensitive key and hive and value exist" do
83
+ expect(registry).to receive(:key_exists!).with(key_path.downcase).and_return(true)
84
+ expect(registry).to receive(:get_hive_and_key).with(key_path.downcase).and_return([hive_mock, key])
85
+ expect(registry).to receive(:value_exists?).with(key_path.downcase, value1).and_return(true)
86
+ expect(registry).to receive(:data_exists?).with(key_path.downcase, value1).and_return(true)
87
+ registry.set_value(key_path.downcase, value1)
88
+ end
89
+ it "does nothing if key and hive and value with a case insensitive name exist" do
90
+ expect(registry).to receive(:key_exists!).with(key_path.downcase).and_return(true)
91
+ expect(registry).to receive(:get_hive_and_key).with(key_path.downcase).and_return([hive_mock, key])
92
+ expect(registry).to receive(:value_exists?).with(key_path.downcase, value1_upcase_name).and_return(true)
93
+ expect(registry).to receive(:data_exists?).with(key_path.downcase, value1_upcase_name).and_return(true)
94
+ registry.set_value(key_path.downcase, value1_upcase_name)
95
+ end
96
+ it "updates value if key and hive and value exist, but data is different" do
97
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
98
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
99
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(true)
100
+ expect(registry).to receive(:data_exists?).with(key_path, value1).and_return(false)
101
+ expect(hive_mock).to receive(:open).with(key, Win32::Registry::KEY_SET_VALUE | ::Win32::Registry::KEY_QUERY_VALUE | registry.registry_system_architecture).and_yield(reg_mock)
102
+ expect(registry).to receive(:get_type_from_name).with(:string).and_return(1)
103
+ expect(reg_mock).to receive(:write).with("one", 1, "1")
104
+ registry.set_value(key_path, value1)
105
+ end
106
+
107
+ it "creates value if the key exists and the value does not exist" do
108
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
109
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
110
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(false)
111
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_SET_VALUE | ::Win32::Registry::KEY_QUERY_VALUE | registry.registry_system_architecture).and_yield(reg_mock)
112
+ expect(registry).to receive(:get_type_from_name).with(:string).and_return(1)
113
+ expect(reg_mock).to receive(:write).with("one", 1, "1")
114
+ registry.set_value(key_path, value1)
115
+ end
116
+
117
+ it "should raise an exception if the key does not exist" do
118
+ expect(registry).to receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
119
+ expect {registry.set_value(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegKeyMissing)
120
+ end
121
+ end
122
+
123
+ describe "delete_value" do
124
+ it "deletes value if value exists" do
125
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(true)
126
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
127
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_SET_VALUE | registry.registry_system_architecture).and_yield(reg_mock)
128
+ expect(reg_mock).to receive(:delete_value).with("one").and_return(true)
129
+ registry.delete_value(key_path, value1)
130
+ end
131
+
132
+ it "raises an exception if the key does not exist" do
133
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(true)
134
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
135
+ registry.delete_value(key_path, value1)
136
+ end
137
+
138
+ it "does nothing if the value does not exist" do
139
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(false)
140
+ registry.delete_value(key_path, value1)
141
+ end
142
+ end
143
+
144
+ describe "create_key" do
145
+ it "creates key if intermediate keys are missing and recursive is set to true" do
146
+ expect(registry).to receive(:keys_missing?).with(key_path).and_return(true)
147
+ expect(registry).to receive(:create_missing).with(key_path)
148
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(false)
149
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
150
+ expect(hive_mock).to receive(:create).with(key, ::Win32::Registry::KEY_WRITE | registry.registry_system_architecture)
151
+ registry.create_key(key_path, true)
152
+ end
153
+
154
+ it "raises an exception if intermediate keys are missing and recursive is set to false" do
155
+ expect(registry).to receive(:keys_missing?).with(key_path).and_return(true)
156
+ expect{registry.create_key(key_path, false)}.to raise_error(Chef::Exceptions::Win32RegNoRecursive)
157
+ end
158
+
159
+ it "does nothing if the key exists" do
160
+ expect(registry).to receive(:keys_missing?).with(key_path).and_return(true)
161
+ expect(registry).to receive(:create_missing).with(key_path)
162
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(true)
163
+ registry.create_key(key_path, true)
164
+ end
165
+
166
+ it "create key if intermediate keys not missing and recursive is set to false" do
167
+ expect(registry).to receive(:keys_missing?).with(key_path).and_return(false)
168
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(false)
169
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
170
+ expect(hive_mock).to receive(:create).with(key, ::Win32::Registry::KEY_WRITE | registry.registry_system_architecture)
171
+ registry.create_key(key_path, false)
172
+ end
173
+
174
+ it "create key if intermediate keys not missing and recursive is set to true" do
175
+ expect(registry).to receive(:keys_missing?).with(key_path).and_return(false)
176
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(false)
177
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
178
+ expect(hive_mock).to receive(:create).with(key, ::Win32::Registry::KEY_WRITE | registry.registry_system_architecture)
179
+ registry.create_key(key_path, true)
180
+ end
181
+ end
182
+
183
+ describe "delete_key", :windows_only do
184
+ it "deletes key if it has subkeys and recursive is set to true" do
185
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(true)
186
+ expect(registry).to receive(:has_subkeys?).with(key_path).and_return(true)
187
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
188
+ expect(hive_mock).to receive(:open).with(key_parent, ::Win32::Registry::KEY_WRITE | registry.registry_system_architecture).and_yield(reg_mock)
189
+ expect(reg_mock).to receive(:delete_key).with(key_to_delete, true).and_return(true)
190
+ registry.delete_key(key_path, true)
191
+ end
192
+
193
+ it "raises an exception if it has subkeys but recursive is set to false" do
194
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(true)
195
+ expect(registry).to receive(:has_subkeys?).with(key_path).and_return(true)
196
+ expect{registry.delete_key(key_path, false)}.to raise_error(Chef::Exceptions::Win32RegNoRecursive)
197
+ end
198
+
199
+ it "deletes key if the key exists and has no subkeys" do
200
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(true)
201
+ expect(registry).to receive(:has_subkeys?).with(key_path).and_return(false)
202
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
203
+ expect(hive_mock).to receive(:open).with(key_parent, ::Win32::Registry::KEY_WRITE | registry.registry_system_architecture).and_yield(reg_mock)
204
+ expect(reg_mock).to receive(:delete_key).with(key_to_delete, true).and_return(true)
205
+ registry.delete_key(key_path, true)
206
+ end
207
+ end
208
+
209
+ describe "key_exists?" do
210
+ it "returns true if key_exists" do
211
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
212
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
213
+ expect(registry.key_exists?(key_path)).to eq(true)
214
+ end
215
+
216
+ it "returns false if key does not exist" do
217
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
218
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_raise(::Win32::Registry::Error)
219
+ expect(registry.key_exists?(key_path)).to eq(false)
220
+ end
221
+ end
222
+
223
+ describe "key_exists!" do
224
+ it "throws an exception if the key_parent does not exist" do
225
+ expect(registry).to receive(:key_exists?).with(key_path).and_return(false)
226
+ expect{registry.key_exists!(key_path)}.to raise_error(Chef::Exceptions::Win32RegKeyMissing)
227
+ end
228
+ end
229
+
230
+ describe "hive_exists?" do
231
+ it "returns true if the hive exists" do
232
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
233
+ registry.hive_exists?(key_path) == true
234
+ end
235
+
236
+ it "returns false if the hive does not exist" do
237
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_raise(Chef::Exceptions::Win32RegHiveMissing)
238
+ registry.hive_exists?(key_path) == false
239
+ end
240
+ end
241
+
242
+ describe "has_subkeys?" do
243
+ it "returns true if the key has subkeys" do
244
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
245
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
246
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
247
+ expect(reg_mock).to receive(:each_key).and_yield(key)
248
+ registry.has_subkeys?(key_path) == true
249
+ end
250
+
251
+ it "returns false if the key does not have subkeys" do
252
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
253
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
254
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
255
+ expect(reg_mock).to receive(:each_key).and_return(no_args())
256
+ expect(registry.has_subkeys?(key_path)).to eq(false)
257
+ end
258
+
259
+ it "throws an exception if the key does not exist" do
260
+ expect(registry).to receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
261
+ expect {registry.set_value(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegKeyMissing)
262
+ end
263
+ end
264
+
265
+ describe "get_subkeys" do
266
+ it "returns the subkeys if they exist" do
267
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
268
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
269
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
270
+ expect(reg_mock).to receive(:each_key).and_yield(sub_key)
271
+ registry.get_subkeys(key_path)
272
+ end
273
+ end
274
+
275
+ describe "value_exists?" do
276
+ it "throws an exception if the key does not exist" do
277
+ expect(registry).to receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
278
+ expect {registry.value_exists?(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegKeyMissing)
279
+ end
280
+
281
+ it "returns true if the value exists" do
282
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
283
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
284
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
285
+ expect(reg_mock).to receive(:any?).and_yield("one")
286
+ registry.value_exists?(key_path, value1) == true
287
+ end
288
+
289
+ it "returns false if the value does not exist" do
290
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
291
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
292
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
293
+ expect(reg_mock).to receive(:any?).and_yield(no_args())
294
+ registry.value_exists?(key_path, value1) == false
295
+ end
296
+ end
297
+
298
+ describe "data_exists?" do
299
+ it "throws an exception if the key does not exist" do
300
+ expect(registry).to receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
301
+ expect {registry.data_exists?(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegKeyMissing)
302
+ end
303
+
304
+ it "returns true if the data exists" do
305
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
306
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
307
+ expect(registry).to receive(:get_type_from_name).with(:string).and_return(1)
308
+ expect(reg_mock).to receive(:each).with(no_args()).and_yield("one", 1, "1")
309
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
310
+ expect(registry.data_exists?(key_path, value1)).to eq(true)
311
+ end
312
+
313
+ it "returns false if the data does not exist" do
314
+ expect(registry).to receive(:key_exists!).with(key_path).and_return(true)
315
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
316
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
317
+ expect(registry).to receive(:get_type_from_name).with(:string).and_return(1)
318
+ expect(reg_mock).to receive(:each).with(no_args()).and_yield("one", 1, "2")
319
+ expect(registry.data_exists?(key_path, value1)).to eq(false)
320
+ end
321
+ end
322
+
323
+ describe "value_exists!" do
324
+ it "does nothing if the value exists" do
325
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(true)
326
+ registry.value_exists!(key_path, value1)
327
+ end
328
+
329
+ it "throws an exception if the value does not exist" do
330
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(false)
331
+ expect{registry.value_exists!(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegValueMissing)
332
+ end
333
+ end
334
+
335
+ describe "data_exists!" do
336
+ it "does nothing if the data exists" do
337
+ expect(registry).to receive(:data_exists?).with(key_path, value1).and_return(true)
338
+ registry.data_exists!(key_path, value1)
339
+ end
340
+
341
+ it "throws an exception if the data does not exist" do
342
+ expect(registry).to receive(:data_exists?).with(key_path, value1).and_return(false)
343
+ expect{registry.data_exists!(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegDataMissing)
344
+ end
345
+ end
346
+
347
+ describe "type_matches?" do
348
+ it "returns true if type matches" do
349
+ expect(registry).to receive(:value_exists!).with(key_path, value1).and_return(true)
350
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
351
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
352
+ expect(registry).to receive(:get_type_from_name).with(:string).and_return(1)
353
+ expect(reg_mock).to receive(:each).and_yield("one", 1)
354
+ expect(registry.type_matches?(key_path, value1)).to eq(true)
355
+ end
356
+
357
+ it "returns false if type does not match" do
358
+ expect(registry).to receive(:value_exists!).with(key_path, value1).and_return(true)
359
+ expect(registry).to receive(:get_hive_and_key).with(key_path).and_return([hive_mock, key])
360
+ expect(hive_mock).to receive(:open).with(key, ::Win32::Registry::KEY_READ | registry.registry_system_architecture).and_yield(reg_mock)
361
+ expect(reg_mock).to receive(:each).and_yield("two", 2)
362
+ expect(registry.type_matches?(key_path, value1)).to eq(false)
363
+ end
364
+
365
+ it "throws an exception if value does not exist" do
366
+ expect(registry).to receive(:value_exists?).with(key_path, value1).and_return(false)
367
+ expect{registry.type_matches?(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegValueMissing)
368
+ end
369
+ end
370
+
371
+ describe "type_matches!" do
372
+ it "does nothing if the type_matches" do
373
+ expect(registry).to receive(:type_matches?).with(key_path, value1).and_return(true)
374
+ registry.type_matches!(key_path, value1)
375
+ end
376
+
377
+ it "throws an exception if the type does not match" do
378
+ expect(registry).to receive(:type_matches?).with(key_path, value1).and_return(false)
379
+ expect{registry.type_matches!(key_path, value1)}.to raise_error(Chef::Exceptions::Win32RegTypesMismatch)
380
+ end
381
+ end
382
+
383
+ describe "keys_missing?" do
384
+ it "returns true if the keys are missing" do
385
+ expect(registry).to receive(:key_exists?).with(missing_key_path).and_return(false)
386
+ expect(registry.keys_missing?(key_path)).to eq(true)
387
+ end
388
+
389
+ it "returns false if no keys in the path are missing" do
390
+ expect(registry).to receive(:key_exists?).with(missing_key_path).and_return(true)
391
+ expect(registry.keys_missing?(key_path)).to eq(false)
392
+ end
393
+ end
394
+ end