chef 10.34.6 → 11.0.0.beta.0

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 (506) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +4 -12
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/shef +6 -5
  7. data/distro/common/html/chef-client.8.html +4 -4
  8. data/distro/common/html/chef-expander.8.html +4 -4
  9. data/distro/common/html/chef-expanderctl.8.html +4 -4
  10. data/distro/common/html/chef-server-webui.8.html +4 -4
  11. data/distro/common/html/chef-server.8.html +4 -4
  12. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  13. data/distro/common/html/chef-solo.8.html +18 -12
  14. data/distro/common/html/chef-solr.8.html +4 -4
  15. data/distro/common/html/knife-bootstrap.1.html +4 -4
  16. data/distro/common/html/knife-client.1.html +4 -4
  17. data/distro/common/html/knife-configure.1.html +4 -4
  18. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  19. data/distro/common/html/knife-cookbook.1.html +10 -7
  20. data/distro/common/html/knife-data-bag.1.html +10 -7
  21. data/distro/common/html/knife-environment.1.html +8 -6
  22. data/distro/common/html/knife-exec.1.html +9 -9
  23. data/distro/common/html/knife-index.1.html +4 -4
  24. data/distro/common/html/knife-node.1.html +4 -4
  25. data/distro/common/html/knife-role.1.html +4 -4
  26. data/distro/common/html/knife-search.1.html +4 -4
  27. data/distro/common/html/knife-ssh.1.html +4 -4
  28. data/distro/common/html/knife-status.1.html +4 -4
  29. data/distro/common/html/knife-tag.1.html +4 -4
  30. data/distro/common/html/knife.1.html +8 -13
  31. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  32. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  33. data/distro/common/man/man1/knife-client.1 +1 -1
  34. data/distro/common/man/man1/knife-configure.1 +1 -1
  35. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  36. data/distro/common/man/man1/knife-cookbook.1 +15 -2
  37. data/distro/common/man/man1/knife-data-bag.1 +15 -2
  38. data/distro/common/man/man1/knife-environment.1 +12 -2
  39. data/distro/common/man/man1/knife-exec.1 +4 -7
  40. data/distro/common/man/man1/knife-index.1 +1 -1
  41. data/distro/common/man/man1/knife-node.1 +1 -1
  42. data/distro/common/man/man1/knife-role.1 +1 -1
  43. data/distro/common/man/man1/knife-search.1 +1 -1
  44. data/distro/common/man/man1/knife-ssh.1 +1 -1
  45. data/distro/common/man/man1/knife-status.1 +1 -1
  46. data/distro/common/man/man1/knife-tag.1 +1 -1
  47. data/distro/common/man/man1/knife.1 +3 -6
  48. data/distro/common/man/man8/chef-client.8 +1 -1
  49. data/distro/common/man/man8/chef-expander.8 +1 -1
  50. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  51. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  52. data/distro/common/man/man8/chef-server.8 +1 -1
  53. data/distro/common/man/man8/chef-solo.8 +36 -4
  54. data/distro/common/man/man8/chef-solr.8 +1 -1
  55. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  56. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  57. data/distro/common/markdown/man1/knife.mkd +4 -9
  58. data/distro/debian/etc/default/chef-client +0 -1
  59. data/distro/debian/etc/init.d/chef-client +2 -2
  60. data/lib/chef.rb +2 -5
  61. data/lib/chef/api_client.rb +20 -130
  62. data/lib/chef/api_client/registration.rb +126 -0
  63. data/lib/chef/application.rb +71 -14
  64. data/lib/chef/application/apply.rb +160 -0
  65. data/lib/chef/application/client.rb +25 -18
  66. data/lib/chef/application/knife.rb +0 -2
  67. data/lib/chef/application/solo.rb +23 -8
  68. data/lib/chef/application/windows_service.rb +5 -2
  69. data/lib/chef/applications.rb +1 -0
  70. data/lib/chef/chef_fs.rb +11 -0
  71. data/lib/chef/chef_fs/command_line.rb +232 -0
  72. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  73. data/lib/chef/chef_fs/file_system.rb +358 -0
  74. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  75. data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
  76. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
  77. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
  78. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
  79. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
  80. data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
  81. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  82. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
  83. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
  84. data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
  85. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
  86. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  87. data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
  88. data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
  89. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  90. data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
  91. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
  92. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
  94. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
  95. data/lib/chef/chef_fs/knife.rb +77 -0
  96. data/lib/chef/chef_fs/path_utils.rb +64 -0
  97. data/lib/chef/client.rb +44 -21
  98. data/lib/chef/config.rb +52 -43
  99. data/lib/chef/cookbook/synchronizer.rb +6 -8
  100. data/lib/chef/cookbook/syntax_check.rb +61 -14
  101. data/lib/chef/cookbook_loader.rb +39 -26
  102. data/lib/chef/cookbook_uploader.rb +17 -19
  103. data/lib/chef/cookbook_version.rb +3 -302
  104. data/lib/chef/daemon.rb +3 -18
  105. data/lib/chef/data_bag.rb +4 -97
  106. data/lib/chef/data_bag_item.rb +2 -65
  107. data/lib/chef/digester.rb +73 -0
  108. data/lib/chef/dsl.rb +6 -0
  109. data/lib/chef/dsl/data_query.rb +66 -0
  110. data/lib/chef/dsl/include_attribute.rb +60 -0
  111. data/lib/chef/dsl/include_recipe.rb +42 -0
  112. data/lib/chef/dsl/platform_introspection.rb +213 -0
  113. data/lib/chef/dsl/recipe.rb +84 -0
  114. data/lib/chef/dsl/registry_helper.rb +59 -0
  115. data/lib/chef/encrypted_data_bag_item.rb +74 -19
  116. data/lib/chef/environment.rb +9 -180
  117. data/lib/chef/exceptions.rb +87 -14
  118. data/lib/chef/formatters/base.rb +4 -1
  119. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
  120. data/lib/chef/json_compat.rb +1 -97
  121. data/lib/chef/knife.rb +90 -41
  122. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  123. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  124. data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
  125. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  126. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  127. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  128. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  129. data/lib/chef/knife/configure.rb +1 -2
  130. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  131. data/lib/chef/knife/cookbook_test.rb +3 -2
  132. data/lib/chef/knife/cookbook_upload.rb +12 -7
  133. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  134. data/lib/chef/knife/core/generic_presenter.rb +26 -13
  135. data/lib/chef/knife/core/node_editor.rb +36 -16
  136. data/lib/chef/knife/core/node_presenter.rb +1 -1
  137. data/lib/chef/knife/core/text_formatter.rb +23 -37
  138. data/lib/chef/knife/core/ui.rb +15 -9
  139. data/lib/chef/knife/delete.rb +39 -0
  140. data/lib/chef/knife/diff.rb +46 -0
  141. data/lib/chef/knife/download.rb +50 -0
  142. data/lib/chef/knife/environment_show.rb +7 -0
  143. data/lib/chef/knife/exec.rb +5 -5
  144. data/lib/chef/knife/help_topics.rb +1 -1
  145. data/lib/chef/knife/index_rebuild.rb +91 -7
  146. data/lib/chef/knife/list.rb +109 -0
  147. data/lib/chef/knife/raw.rb +108 -0
  148. data/lib/chef/knife/search.rb +40 -22
  149. data/lib/chef/knife/show.rb +32 -0
  150. data/lib/chef/knife/ssh.rb +6 -2
  151. data/lib/chef/knife/upload.rb +50 -0
  152. data/lib/chef/mixin/checksum.rb +3 -3
  153. data/lib/chef/mixin/deep_merge.rb +55 -197
  154. data/lib/chef/mixin/language.rb +9 -222
  155. data/lib/chef/mixin/language_include_attribute.rb +6 -38
  156. data/lib/chef/mixin/language_include_recipe.rb +3 -35
  157. data/lib/chef/mixin/params_validate.rb +6 -19
  158. data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
  159. data/lib/chef/mixin/securable.rb +32 -7
  160. data/lib/chef/mixin/template.rb +40 -0
  161. data/lib/chef/mixins.rb +0 -4
  162. data/lib/chef/monkey_patches/net_http.rb +0 -34
  163. data/lib/chef/node.rb +133 -309
  164. data/lib/chef/node/attribute.rb +333 -473
  165. data/lib/chef/node/attribute_collections.rb +199 -0
  166. data/lib/chef/node/immutable_collections.rb +186 -0
  167. data/lib/chef/platform.rb +7 -22
  168. data/lib/chef/provider.rb +2 -49
  169. data/lib/chef/provider/breakpoint.rb +6 -6
  170. data/lib/chef/provider/cookbook_file.rb +5 -33
  171. data/lib/chef/provider/deploy.rb +2 -1
  172. data/lib/chef/provider/directory.rb +14 -17
  173. data/lib/chef/provider/file.rb +19 -52
  174. data/lib/chef/provider/group.rb +31 -51
  175. data/lib/chef/provider/group/dscl.rb +13 -53
  176. data/lib/chef/provider/group/gpasswd.rb +19 -14
  177. data/lib/chef/provider/group/groupadd.rb +1 -41
  178. data/lib/chef/provider/group/groupmod.rb +36 -46
  179. data/lib/chef/provider/group/pw.rb +16 -59
  180. data/lib/chef/provider/group/suse.rb +13 -16
  181. data/lib/chef/provider/group/usermod.rb +18 -40
  182. data/lib/chef/provider/group/windows.rb +6 -13
  183. data/lib/chef/provider/http_request.rb +25 -42
  184. data/lib/chef/provider/link.rb +2 -0
  185. data/lib/chef/provider/lwrp_base.rb +150 -0
  186. data/lib/chef/provider/package/portage.rb +4 -9
  187. data/lib/chef/provider/package/rpm.rb +2 -2
  188. data/lib/chef/provider/package/rubygems.rb +9 -41
  189. data/lib/chef/provider/package/yum.rb +12 -19
  190. data/lib/chef/provider/registry_key.rb +156 -0
  191. data/lib/chef/provider/remote_directory.rb +2 -0
  192. data/lib/chef/provider/remote_file.rb +21 -12
  193. data/lib/chef/provider/ruby_block.rb +5 -2
  194. data/lib/chef/provider/service.rb +15 -0
  195. data/lib/chef/provider/service/init.rb +9 -7
  196. data/lib/chef/provider/service/macosx.rb +15 -73
  197. data/lib/chef/provider/service/simple.rb +1 -1
  198. data/lib/chef/provider/service/solaris.rb +3 -3
  199. data/lib/chef/provider/template.rb +22 -25
  200. data/lib/chef/provider/template_finder.rb +61 -0
  201. data/lib/chef/provider/user.rb +0 -1
  202. data/lib/chef/provider/user/dscl.rb +175 -568
  203. data/lib/chef/provider/user/useradd.rb +30 -47
  204. data/lib/chef/providers.rb +3 -2
  205. data/lib/chef/recipe.rb +14 -8
  206. data/lib/chef/resource.rb +13 -154
  207. data/lib/chef/resource/group.rb +1 -11
  208. data/lib/chef/resource/http_request.rb +2 -1
  209. data/lib/chef/resource/lwrp_base.rb +127 -0
  210. data/lib/chef/resource/mount.rb +10 -11
  211. data/lib/chef/resource/registry_key.rb +86 -0
  212. data/lib/chef/resource/remote_directory.rb +6 -5
  213. data/lib/chef/resource/remote_file.rb +22 -31
  214. data/lib/chef/resource/ruby_block.rb +2 -2
  215. data/lib/chef/resource/service.rb +14 -0
  216. data/lib/chef/resource/user.rb +0 -18
  217. data/lib/chef/resource_collection.rb +25 -21
  218. data/lib/chef/resources.rb +2 -1
  219. data/lib/chef/rest.rb +50 -131
  220. data/lib/chef/rest/auth_credentials.rb +4 -20
  221. data/lib/chef/rest/rest_request.rb +2 -7
  222. data/lib/chef/role.rb +1 -97
  223. data/lib/chef/run_context.rb +108 -130
  224. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  225. data/lib/chef/run_list.rb +0 -2
  226. data/lib/chef/run_list/run_list_expansion.rb +0 -15
  227. data/lib/chef/run_lock.rb +90 -0
  228. data/lib/chef/runner.rb +28 -5
  229. data/lib/chef/sandbox.rb +15 -148
  230. data/lib/chef/scan_access_control.rb +2 -4
  231. data/lib/chef/shef/ext.rb +3 -575
  232. data/lib/chef/{shef.rb → shell.rb} +35 -40
  233. data/lib/chef/shell/ext.rb +593 -0
  234. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  235. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  236. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
  237. data/lib/chef/shell_out.rb +7 -0
  238. data/lib/chef/util/windows/net_group.rb +1 -5
  239. data/lib/chef/version.rb +3 -3
  240. data/lib/chef/win32/api/process.rb +0 -1
  241. data/lib/chef/win32/handle.rb +1 -8
  242. data/lib/chef/win32/registry.rb +371 -0
  243. data/spec/data/big_json.json +1 -2
  244. data/spec/data/big_json_plus_one.json +1 -2
  245. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  246. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  247. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  248. data/spec/data/nodes/default.rb +3 -3
  249. data/spec/data/nodes/test.example.com.rb +3 -3
  250. data/spec/data/nodes/test.rb +3 -3
  251. data/spec/data/partial_one.erb +1 -0
  252. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  253. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  254. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  255. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  256. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  257. data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
  258. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  259. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  260. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  261. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  262. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  263. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  264. data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
  265. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  266. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  267. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  268. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  269. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  270. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  271. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  272. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  273. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  274. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  275. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  276. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  277. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  278. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  279. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  280. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  281. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  282. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  283. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  284. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  285. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  286. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  287. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  288. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  289. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  290. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  291. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  292. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  293. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  294. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  295. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  296. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  297. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  298. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  299. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  300. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  301. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  302. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  303. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  304. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  305. data/spec/data/shef-config.rb +7 -0
  306. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  307. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  308. data/spec/functional/knife/exec_spec.rb +2 -2
  309. data/spec/functional/knife/ssh_spec.rb +5 -1
  310. data/spec/functional/resource/cookbook_file_spec.rb +7 -19
  311. data/spec/functional/resource/directory_spec.rb +4 -0
  312. data/spec/functional/resource/file_spec.rb +56 -22
  313. data/spec/functional/resource/link_spec.rb +2 -0
  314. data/spec/functional/resource/registry_spec.rb +576 -0
  315. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  316. data/spec/functional/resource/remote_file_spec.rb +18 -0
  317. data/spec/functional/resource/template_spec.rb +23 -2
  318. data/spec/functional/run_lock_spec.rb +106 -0
  319. data/spec/functional/shell_spec.rb +100 -0
  320. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  321. data/spec/spec_helper.rb +5 -29
  322. data/spec/stress/win32/security_spec.rb +1 -1
  323. data/spec/support/chef_helpers.rb +0 -2
  324. data/spec/support/platform_helpers.rb +8 -15
  325. data/spec/support/shared/functional/directory_resource.rb +84 -22
  326. data/spec/support/shared/functional/file_resource.rb +169 -71
  327. data/spec/support/shared/functional/securable_resource.rb +143 -119
  328. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  329. data/spec/support/shared/unit/file_system_support.rb +110 -0
  330. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  331. data/spec/unit/api_client/registration_spec.rb +175 -0
  332. data/spec/unit/api_client_spec.rb +78 -156
  333. data/spec/unit/application/apply.rb +84 -0
  334. data/spec/unit/application/client_spec.rb +1 -37
  335. data/spec/unit/application/knife_spec.rb +5 -0
  336. data/spec/unit/application_spec.rb +57 -2
  337. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  338. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  339. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  340. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  341. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  342. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  343. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  344. data/spec/unit/client_spec.rb +124 -33
  345. data/spec/unit/config_spec.rb +46 -13
  346. data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
  347. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  348. data/spec/unit/cookbook_loader_spec.rb +153 -91
  349. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  350. data/spec/unit/cookbook_spec.rb +3 -20
  351. data/spec/unit/cookbook_version_spec.rb +23 -122
  352. data/spec/unit/daemon_spec.rb +3 -24
  353. data/spec/unit/data_bag_spec.rb +6 -4
  354. data/spec/unit/digester_spec.rb +50 -0
  355. data/spec/unit/dsl/data_query_spec.rb +66 -0
  356. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  357. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  358. data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
  359. data/spec/unit/environment_spec.rb +0 -130
  360. data/spec/unit/exceptions_spec.rb +2 -3
  361. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
  362. data/spec/unit/json_compat_spec.rb +15 -7
  363. data/spec/unit/knife/bootstrap_spec.rb +2 -0
  364. data/spec/unit/knife/configure_spec.rb +20 -14
  365. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  366. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  367. data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
  368. data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
  369. data/spec/unit/knife/core/ui_spec.rb +156 -125
  370. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  371. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  372. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  373. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  374. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  375. data/spec/unit/knife/knife_help.rb +7 -7
  376. data/spec/unit/knife/node_edit_spec.rb +6 -33
  377. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  378. data/spec/unit/knife/ssh_spec.rb +12 -15
  379. data/spec/unit/knife/status_spec.rb +2 -2
  380. data/spec/unit/knife_spec.rb +53 -0
  381. data/spec/unit/lwrp_spec.rb +59 -42
  382. data/spec/unit/mixin/checksum_spec.rb +2 -2
  383. data/spec/unit/mixin/deep_merge_spec.rb +101 -799
  384. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  385. data/spec/unit/mixin/params_validate_spec.rb +4 -37
  386. data/spec/unit/mixin/securable_spec.rb +5 -3
  387. data/spec/unit/mixin/template_spec.rb +119 -0
  388. data/spec/unit/node/attribute_spec.rb +195 -173
  389. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  390. data/spec/unit/node_spec.rb +366 -370
  391. data/spec/unit/platform_spec.rb +9 -10
  392. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  393. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  394. data/spec/unit/provider/directory_spec.rb +96 -64
  395. data/spec/unit/provider/env_spec.rb +2 -2
  396. data/spec/unit/provider/file_spec.rb +48 -39
  397. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  398. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  399. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  400. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  401. data/spec/unit/provider/group/pw_spec.rb +15 -12
  402. data/spec/unit/provider/group/usermod_spec.rb +6 -21
  403. data/spec/unit/provider/group/windows_spec.rb +8 -0
  404. data/spec/unit/provider/group_spec.rb +6 -28
  405. data/spec/unit/provider/http_request_spec.rb +28 -69
  406. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  407. data/spec/unit/provider/ohai_spec.rb +4 -4
  408. data/spec/unit/provider/package/apt_spec.rb +0 -1
  409. data/spec/unit/provider/package/ips_spec.rb +0 -1
  410. data/spec/unit/provider/package/portage_spec.rb +0 -44
  411. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  412. data/spec/unit/provider/package/rubygems_spec.rb +1 -44
  413. data/spec/unit/provider/package/yum_spec.rb +39 -36
  414. data/spec/unit/provider/package_spec.rb +7 -5
  415. data/spec/unit/provider/registry_key_spec.rb +269 -0
  416. data/spec/unit/provider/remote_directory_spec.rb +7 -3
  417. data/spec/unit/provider/remote_file_spec.rb +36 -0
  418. data/spec/unit/provider/route_spec.rb +4 -3
  419. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  420. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  421. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  422. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  423. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  424. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  425. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  426. data/spec/unit/provider/service/macosx_spec.rb +11 -66
  427. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  428. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  429. data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
  430. data/spec/unit/provider/subversion_spec.rb +1 -1
  431. data/spec/unit/provider/template_spec.rb +35 -11
  432. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  433. data/spec/unit/provider/user/useradd_spec.rb +1 -22
  434. data/spec/unit/provider/user_spec.rb +1 -1
  435. data/spec/unit/recipe_spec.rb +10 -8
  436. data/spec/unit/registry_helper_spec.rb +374 -0
  437. data/spec/unit/resource/mount_spec.rb +0 -11
  438. data/spec/unit/resource/registry_key_spec.rb +171 -0
  439. data/spec/unit/resource/remote_file_spec.rb +21 -23
  440. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  441. data/spec/unit/resource/service_spec.rb +11 -0
  442. data/spec/unit/resource_spec.rb +4 -19
  443. data/spec/unit/rest/auth_credentials_spec.rb +2 -19
  444. data/spec/unit/rest_spec.rb +130 -284
  445. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  446. data/spec/unit/run_context_spec.rb +18 -4
  447. data/spec/unit/run_list_spec.rb +0 -209
  448. data/spec/unit/run_lock_spec.rb +37 -0
  449. data/spec/unit/runner_spec.rb +101 -2
  450. data/spec/unit/scan_access_control_spec.rb +4 -4
  451. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  452. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  453. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
  454. data/spec/unit/shell_out_spec.rb +18 -0
  455. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  456. metadata +275 -234
  457. checksums.yaml +0 -15
  458. data/README.rdoc +0 -177
  459. data/distro/common/html/knife-recipe.1.html +0 -92
  460. data/lib/chef/certificate.rb +0 -161
  461. data/lib/chef/checksum.rb +0 -167
  462. data/lib/chef/checksum_cache.rb +0 -190
  463. data/lib/chef/cookbook_version_selector.rb +0 -168
  464. data/lib/chef/couchdb.rb +0 -246
  465. data/lib/chef/index_queue/amqp_client.rb +0 -116
  466. data/lib/chef/index_queue/consumer.rb +0 -76
  467. data/lib/chef/index_queue/indexable.rb +0 -109
  468. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  469. data/lib/chef/monkey_patches/moneta.rb +0 -50
  470. data/lib/chef/monkey_patches/uri.rb +0 -70
  471. data/lib/chef/openid_registration.rb +0 -187
  472. data/lib/chef/provider/user/solaris.rb +0 -90
  473. data/lib/chef/solr_query.rb +0 -187
  474. data/lib/chef/solr_query/lucene.treetop +0 -150
  475. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  476. data/lib/chef/solr_query/query_transform.rb +0 -65
  477. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  478. data/lib/chef/webui_user.rb +0 -231
  479. data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
  480. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
  481. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
  482. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
  483. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  484. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  485. data/spec/data/mac_users/10.7.plist.xml +0 -559
  486. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  487. data/spec/data/mac_users/10.8.plist.xml +0 -559
  488. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  489. data/spec/data/mac_users/10.9.plist.xml +0 -560
  490. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  491. data/spec/functional/resource/base.rb +0 -40
  492. data/spec/functional/resource/group_spec.rb +0 -343
  493. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  494. data/spec/unit/certificate_spec.rb +0 -76
  495. data/spec/unit/checksum_cache_spec.rb +0 -209
  496. data/spec/unit/checksum_spec.rb +0 -94
  497. data/spec/unit/couchdb_spec.rb +0 -274
  498. data/spec/unit/index_queue_spec.rb +0 -391
  499. data/spec/unit/mixin/language_spec.rb +0 -305
  500. data/spec/unit/openid_registration_spec.rb +0 -153
  501. data/spec/unit/provider/user/solaris_spec.rb +0 -414
  502. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  503. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  504. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  505. data/spec/unit/solr_query_spec.rb +0 -203
  506. data/spec/unit/webui_user_spec.rb +0 -238
@@ -177,7 +177,7 @@ describe Chef::Provider::User::Useradd do
177
177
 
178
178
  before do
179
179
  @provider.new_resource.system true
180
- # there is no public API to set attribute's value to nil
180
+ # there is no public API to set attribute's value to nil
181
181
  @provider.new_resource.instance_variable_set("@home", nil)
182
182
  end
183
183
 
@@ -315,27 +315,6 @@ describe Chef::Provider::User::Useradd do
315
315
  lambda { @provider.check_lock }.should raise_error(Chef::Exceptions::User)
316
316
  end
317
317
  end
318
-
319
- context "when in why run mode" do
320
- before do
321
- @stdout.stub!(:gets).and_return(nil)
322
- @stderr.stub!(:gets).and_return("passwd: user 'chef-test' does not exist")
323
- @provider.should_receive(:popen4).and_yield(@pid, @stdin, @stdout, @stderr).and_return(@status)
324
- Chef::Config[:why_run] = true
325
- end
326
-
327
- after do
328
- Chef::Config[:why_run] = false
329
- end
330
-
331
- it "should return false if the user does not exist" do
332
- @provider.check_lock.should eql(false)
333
- end
334
-
335
- it "should not raise an error if the user does not exist" do
336
- lambda { @provider.check_lock }.should_not raise_error
337
- end
338
- end
339
318
  end
340
319
 
341
320
  describe "when locking the user" do
@@ -261,7 +261,7 @@ describe Chef::Provider::User do
261
261
  @provider.action_create
262
262
  end
263
263
 
264
- it "should set the new_resources updated flag when it creates the user if we call manage_user" do
264
+ it "should set the the new_resources updated flag when it creates the user if we call manage_user" do
265
265
  @provider.user_exists = true
266
266
  @provider.stub!(:compare_user).and_return(true)
267
267
  @provider.stub!(:manage_user).and_return(true)
@@ -24,14 +24,16 @@ require 'spec_helper'
24
24
  describe Chef::Recipe do
25
25
  before(:each) do
26
26
  @cookbook_repo = File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "cookbooks"))
27
- @cookbook_collection = Chef::CookbookCollection.new(Chef::CookbookLoader.new(@cookbook_repo))
27
+ cl = Chef::CookbookLoader.new(@cookbook_repo)
28
+ cl.load_cookbooks
29
+ @cookbook_collection = Chef::CookbookCollection.new(cl)
28
30
  @node = Chef::Node.new
29
- @node[:tags] = Array.new
31
+ @node.normal[:tags] = Array.new
30
32
  @events = Chef::EventDispatch::Dispatcher.new
31
33
  @run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
32
34
  @recipe = Chef::Recipe.new("hjk", "test", @run_context)
33
35
 
34
- # Shef/ext.rb is on the run path, and it defines
36
+ # Shell/ext.rb is on the run path, and it defines
35
37
  # Chef::Recipe#resources to call pp, which we don't want when
36
38
  # we're running tests.
37
39
  @recipe.stub!(:pp)
@@ -108,8 +110,8 @@ describe Chef::Recipe do
108
110
 
109
111
  it "locate resource for particular platform" do
110
112
  Object.const_set('ShaunTheSheep', Class.new(Chef::Resource){ provides :laughter, :on_platforms => ["television"] })
111
- @node.platform("television")
112
- @node.platform_version("123")
113
+ @node.automatic[:platform] = "television"
114
+ @node.automatic[:platform_version] = "123"
113
115
  res = @recipe.laughter "timmy"
114
116
  res.name.should eql("timmy")
115
117
  res.kind_of?(ShaunTheSheep)
@@ -151,7 +153,7 @@ describe Chef::Recipe do
151
153
  end
152
154
  end
153
155
  @run_context.definitions[:crow] = crow_define
154
- @node[:foo] = false
156
+ @node.normal[:foo] = false
155
157
  @recipe.crow "mine" do
156
158
  something node[:foo]
157
159
  end
@@ -204,9 +206,9 @@ describe Chef::Recipe do
204
206
  res.pretty_kitty.should eql(true)
205
207
  end
206
208
 
207
- it "should store that it has seen a recipe in node.run_state[:seen_recipes]" do
209
+ it "should store that it has seen a recipe in the run_context" do
208
210
  @run_context.include_recipe "openldap"
209
- @node.run_state[:seen_recipes].should have_key("openldap")
211
+ @run_context.loaded_recipe?("openldap").should be_true
210
212
  end
211
213
 
212
214
  it "should not include the same recipe twice" do
@@ -0,0 +1,374 @@
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::Provider::RegistryKey do
22
+
23
+ let(:value1) { { :name => "one", :type => :string, :data => "1" } }
24
+ let(:key_path) { 'HKCU\Software\OpscodeNumbers' }
25
+ let(:key) { 'Software\OpscodeNumbers' }
26
+ let(:key_parent) { 'Software' }
27
+ let(:key_to_delete) { 'OpscodeNumbers' }
28
+ let(:sub_key) {'OpscodePrimes'}
29
+ let(:missing_key_path) {'HKCU\Software'}
30
+
31
+ before(:each) do
32
+ Chef::Win32::Registry.any_instance.stub(:machine_architecture).and_return(:x86_64)
33
+ @registry = Chef::Win32::Registry.new()
34
+
35
+ #Making the values for registry constants available on unix
36
+ Object.send(:remove_const, 'Win32') if defined?(Win32)
37
+ Win32 = Module.new
38
+ Win32::Registry = Class.new
39
+ Win32::Registry::KEY_SET_VALUE = 0x0002
40
+ Win32::Registry::KEY_QUERY_VALUE = 0x0001
41
+ Win32::Registry::KEY_WRITE = 0x00020000 | 0x0002 | 0x0004
42
+ Win32::Registry::KEY_READ = 0x00020000 | 0x0001 | 0x0008 | 0x0010
43
+
44
+ Win32::Registry::Error = Class.new(RuntimeError)
45
+
46
+ @hive_mock = mock("::Win32::Registry::HKEY_CURRENT_USER")
47
+ @reg_mock = mock("reg")
48
+ end
49
+
50
+ describe "get_values" do
51
+ it "gets all values for a key if the key exists" do
52
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
53
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
54
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
55
+ @reg_mock.should_receive(:map)
56
+ @registry.get_values(key_path)
57
+ end
58
+
59
+ it "throws an exception if key does not exist" do
60
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
61
+ @registry.should_receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
62
+ lambda{@registry.get_values(key_path)}.should raise_error(Chef::Exceptions::Win32RegKeyMissing)
63
+ end
64
+ end
65
+
66
+ describe "set_value" do
67
+ it "does nothing if key and hive and value exist" do
68
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
69
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
70
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(true)
71
+ @registry.should_receive(:data_exists?).with(key_path, value1).and_return(true)
72
+ @registry.set_value(key_path, value1)
73
+ end
74
+
75
+ it "updates value if key and hive and value exist, but data is different" do
76
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
77
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
78
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(true)
79
+ @registry.should_receive(:data_exists?).with(key_path, value1).and_return(false)
80
+ @hive_mock.should_receive(:open).with(key, Win32::Registry::KEY_SET_VALUE | ::Win32::Registry::KEY_QUERY_VALUE | @registry.registry_system_architecture).and_yield(@reg_mock)
81
+ @registry.should_receive(:get_type_from_name).with(:string).and_return(1)
82
+ @reg_mock.should_receive(:write).with("one", 1, "1")
83
+ @registry.set_value(key_path, value1)
84
+ end
85
+
86
+ it "creates value if the key exists and the value does not exist" do
87
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
88
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
89
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(false)
90
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_SET_VALUE | ::Win32::Registry::KEY_QUERY_VALUE | @registry.registry_system_architecture).and_yield(@reg_mock)
91
+ @registry.should_receive(:get_type_from_name).with(:string).and_return(1)
92
+ @reg_mock.should_receive(:write).with("one", 1, "1")
93
+ @registry.set_value(key_path, value1)
94
+ end
95
+
96
+ it "should raise an exception if the key does not exist" do
97
+ @registry.should_receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
98
+ lambda {@registry.set_value(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegKeyMissing)
99
+ end
100
+ end
101
+
102
+ describe "delete_value" do
103
+ it "deletes value if value exists" do
104
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(true)
105
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
106
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_SET_VALUE | @registry.registry_system_architecture).and_yield(@reg_mock)
107
+ @reg_mock.should_receive(:delete_value).with("one").and_return(true)
108
+ @registry.delete_value(key_path, value1)
109
+ end
110
+
111
+ it "raises an exception if the key does not exist" do
112
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(true)
113
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
114
+ @registry.delete_value(key_path, value1)
115
+ end
116
+
117
+ it "does nothing if the value does not exist" do
118
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(false)
119
+ @registry.delete_value(key_path, value1)
120
+ end
121
+ end
122
+
123
+ describe "create_key" do
124
+ it "creates key if intermediate keys are missing and recursive is set to true" do
125
+ @registry.should_receive(:keys_missing?).with(key_path).and_return(true)
126
+ @registry.should_receive(:create_missing).with(key_path)
127
+ @registry.should_receive(:key_exists?).with(key_path).and_return(false)
128
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
129
+ @hive_mock.should_receive(:create).with(key, ::Win32::Registry::KEY_WRITE | @registry.registry_system_architecture)
130
+ @registry.create_key(key_path, true)
131
+ end
132
+
133
+ it "raises an exception if intermediate keys are missing and recursive is set to false" do
134
+ @registry.should_receive(:keys_missing?).with(key_path).and_return(true)
135
+ lambda{@registry.create_key(key_path, false)}.should raise_error(Chef::Exceptions::Win32RegNoRecursive)
136
+ end
137
+
138
+ it "does nothing if the key exists" do
139
+ @registry.should_receive(:keys_missing?).with(key_path).and_return(true)
140
+ @registry.should_receive(:create_missing).with(key_path)
141
+ @registry.should_receive(:key_exists?).with(key_path).and_return(true)
142
+ @registry.create_key(key_path, true)
143
+ end
144
+
145
+ it "create key if intermediate keys not missing and recursive is set to false" do
146
+ @registry.should_receive(:keys_missing?).with(key_path).and_return(false)
147
+ @registry.should_receive(:key_exists?).with(key_path).and_return(false)
148
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
149
+ @hive_mock.should_receive(:create).with(key, ::Win32::Registry::KEY_WRITE | @registry.registry_system_architecture)
150
+ @registry.create_key(key_path, false)
151
+ end
152
+
153
+ it "create key if intermediate keys not missing and recursive is set to true" do
154
+ @registry.should_receive(:keys_missing?).with(key_path).and_return(false)
155
+ @registry.should_receive(:key_exists?).with(key_path).and_return(false)
156
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
157
+ @hive_mock.should_receive(:create).with(key, ::Win32::Registry::KEY_WRITE | @registry.registry_system_architecture)
158
+ @registry.create_key(key_path, true)
159
+ end
160
+ end
161
+
162
+ describe "delete_key" do
163
+ it "deletes key if it has subkeys and recursive is set to true" do
164
+ @registry.should_receive(:key_exists?).with(key_path).and_return(true)
165
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
166
+ @registry.should_receive(:has_subkeys?).with(key_path).and_return(true)
167
+ @hive_mock.should_receive(:open).with(key_parent, ::Win32::Registry::KEY_WRITE | @registry.registry_system_architecture).and_yield(@reg_mock)
168
+ @reg_mock.should_receive(:delete_key).with(key_to_delete, true)
169
+ @registry.delete_key(key_path, true)
170
+ end
171
+
172
+ it "raises an exception if it has subkeys but recursive is set to false" do
173
+ @registry.should_receive(:key_exists?).with(key_path).and_return(true)
174
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
175
+ @registry.should_receive(:has_subkeys?).with(key_path).and_return(true)
176
+ lambda{@registry.delete_key(key_path, false)}.should raise_error(Chef::Exceptions::Win32RegNoRecursive)
177
+ end
178
+
179
+ it "deletes key if the key exists and has no subkeys" do
180
+ @registry.should_receive(:key_exists?).with(key_path).and_return(true)
181
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
182
+ @registry.should_receive(:has_subkeys?).with(key_path).and_return(false)
183
+ @hive_mock.should_receive(:open).with(key_parent, ::Win32::Registry::KEY_WRITE | @registry.registry_system_architecture).and_yield(@reg_mock)
184
+ @reg_mock.should_receive(:delete_key).with(key_to_delete)
185
+ @registry.delete_key(key_path, true)
186
+ end
187
+ end
188
+
189
+ describe "key_exists?" do
190
+ it "returns true if key_exists" do
191
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
192
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
193
+ @registry.key_exists?(key_path).should == true
194
+ end
195
+
196
+ it "returns false if key does not exist" do
197
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
198
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_raise(::Win32::Registry::Error)
199
+ @registry.key_exists?(key_path).should == false
200
+ end
201
+ end
202
+
203
+ describe "key_exists!" do
204
+ it "throws an exception if the key_parent does not exist" do
205
+ @registry.should_receive(:key_exists?).with(key_path).and_return(false)
206
+ lambda{@registry.key_exists!(key_path)}.should raise_error(Chef::Exceptions::Win32RegKeyMissing)
207
+ end
208
+ end
209
+
210
+ describe "hive_exists?" do
211
+ it "returns true if the hive exists" do
212
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
213
+ @registry.hive_exists?(key_path) == true
214
+ end
215
+
216
+ it "returns false if the hive does not exist" do
217
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_raise(Chef::Exceptions::Win32RegHiveMissing)
218
+ @registry.hive_exists?(key_path) == false
219
+ end
220
+ end
221
+
222
+ describe "has_subkeys?" do
223
+ it "returns true if the key has subkeys" do
224
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
225
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
226
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
227
+ @reg_mock.should_receive(:each_key).and_yield(key)
228
+ @registry.has_subkeys?(key_path) == true
229
+ end
230
+
231
+ it "returns false if the key does not have subkeys" do
232
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
233
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
234
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
235
+ @reg_mock.should_receive(:each_key).and_return(no_args())
236
+ @registry.has_subkeys?(key_path).should == false
237
+ end
238
+
239
+ it "throws an exception if the key does not exist" do
240
+ @registry.should_receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
241
+ lambda {@registry.set_value(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegKeyMissing)
242
+ end
243
+ end
244
+
245
+ describe "get_subkeys" do
246
+ it "returns the subkeys if they exist" do
247
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
248
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
249
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
250
+ @reg_mock.should_receive(:each_key).and_yield(sub_key)
251
+ @registry.get_subkeys(key_path)
252
+ end
253
+ end
254
+
255
+ describe "value_exists?" do
256
+ it "throws an exception if the key does not exist" do
257
+ @registry.should_receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
258
+ lambda {@registry.value_exists?(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegKeyMissing)
259
+ end
260
+
261
+ it "returns true if the value exists" do
262
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
263
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
264
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
265
+ @reg_mock.should_receive(:any?).and_yield("one")
266
+ @registry.value_exists?(key_path, value1) == true
267
+ end
268
+
269
+ it "returns false if the value does not exist" do
270
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
271
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
272
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
273
+ @reg_mock.should_receive(:any?).and_yield(no_args())
274
+ @registry.value_exists?(key_path, value1) == false
275
+ end
276
+ end
277
+
278
+ describe "data_exists?" do
279
+ it "throws an exception if the key does not exist" do
280
+ @registry.should_receive(:key_exists!).with(key_path).and_raise(Chef::Exceptions::Win32RegKeyMissing)
281
+ lambda {@registry.data_exists?(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegKeyMissing)
282
+ end
283
+
284
+ it "returns true if the data exists" do
285
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
286
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
287
+ @registry.should_receive(:get_type_from_name).with(:string).and_return(1)
288
+ @reg_mock.should_receive(:each).with(no_args()).and_yield("one", 1, "1")
289
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
290
+ @registry.data_exists?(key_path, value1).should == true
291
+ end
292
+
293
+ it "returns false if the data does not exist" do
294
+ @registry.should_receive(:key_exists!).with(key_path).and_return(true)
295
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
296
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
297
+ @registry.should_receive(:get_type_from_name).with(:string).and_return(1)
298
+ @reg_mock.should_receive(:each).with(no_args()).and_yield("one", 1, "2")
299
+ @registry.data_exists?(key_path, value1).should == false
300
+ end
301
+ end
302
+
303
+ describe "value_exists!" do
304
+ it "does nothing if the value exists" do
305
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(true)
306
+ @registry.value_exists!(key_path, value1)
307
+ end
308
+
309
+ it "throws an exception if the value does not exist" do
310
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(false)
311
+ lambda{@registry.value_exists!(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegValueMissing)
312
+ end
313
+ end
314
+
315
+ describe "data_exists!" do
316
+ it "does nothing if the data exists" do
317
+ @registry.should_receive(:data_exists?).with(key_path, value1).and_return(true)
318
+ @registry.data_exists!(key_path, value1)
319
+ end
320
+
321
+ it "throws an exception if the data does not exist" do
322
+ @registry.should_receive(:data_exists?).with(key_path, value1).and_return(false)
323
+ lambda{@registry.data_exists!(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegDataMissing)
324
+ end
325
+ end
326
+
327
+ describe "type_matches?" do
328
+ it "returns true if type matches" do
329
+ @registry.should_receive(:value_exists!).with(key_path, value1).and_return(true)
330
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
331
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
332
+ @registry.should_receive(:get_type_from_name).with(:string).and_return(1)
333
+ @reg_mock.should_receive(:each).and_yield("one", 1)
334
+ @registry.type_matches?(key_path, value1).should == true
335
+ end
336
+
337
+ it "returns false if type does not match" do
338
+ @registry.should_receive(:value_exists!).with(key_path, value1).and_return(true)
339
+ @registry.should_receive(:get_hive_and_key).with(key_path).and_return([@hive_mock, key])
340
+ @hive_mock.should_receive(:open).with(key, ::Win32::Registry::KEY_READ | @registry.registry_system_architecture).and_yield(@reg_mock)
341
+ @reg_mock.should_receive(:each).and_yield("two", 2)
342
+ @registry.type_matches?(key_path, value1).should == false
343
+ end
344
+
345
+ it "throws an exception if value does not exist" do
346
+ @registry.should_receive(:value_exists?).with(key_path, value1).and_return(false)
347
+ lambda{@registry.type_matches?(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegValueMissing)
348
+ end
349
+ end
350
+
351
+ describe "type_matches!" do
352
+ it "does nothing if the type_matches" do
353
+ @registry.should_receive(:type_matches?).with(key_path, value1).and_return(true)
354
+ @registry.type_matches!(key_path, value1)
355
+ end
356
+
357
+ it "throws an exception if the type does not match" do
358
+ @registry.should_receive(:type_matches?).with(key_path, value1).and_return(false)
359
+ lambda{@registry.type_matches!(key_path, value1)}.should raise_error(Chef::Exceptions::Win32RegTypesMismatch)
360
+ end
361
+ end
362
+
363
+ describe "keys_missing?" do
364
+ it "returns true if the keys are missing" do
365
+ @registry.should_receive(:key_exists?).with(missing_key_path).and_return(false)
366
+ @registry.keys_missing?(key_path).should == true
367
+ end
368
+
369
+ it "returns false if no keys in the path are missing" do
370
+ @registry.should_receive(:key_exists?).with(missing_key_path).and_return(true)
371
+ @registry.keys_missing?(key_path).should == false
372
+ end
373
+ end
374
+ end