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
@@ -19,7 +19,7 @@
19
19
  # Add it to one of the files in spec/support
20
20
 
21
21
  # Abuse ruby's constant lookup to avoid undefined constant errors
22
- module Shef
22
+ module Shell
23
23
  JUST_TESTING_MOVE_ALONG = true unless defined? JUST_TESTING_MOVE_ALONG
24
24
  IRB = nil unless defined? IRB
25
25
  end
@@ -38,10 +38,11 @@ require 'chef'
38
38
  require 'chef/knife'
39
39
  Chef::Knife.load_commands
40
40
  require 'chef/mixins'
41
+ require 'chef/dsl'
41
42
  require 'chef/application'
42
43
  require 'chef/applications'
43
44
 
44
- require 'chef/shef'
45
+ require 'chef/shell'
45
46
  require 'chef/util/file_edit'
46
47
 
47
48
  # If you want to load anything into the testing environment
@@ -51,13 +52,6 @@ require 'spec/support/local_gems.rb' if File.exists?(File.join(File.dirname(__FI
51
52
  # Explicitly require spec helpers that need to load first
52
53
  require 'spec/support/platform_helpers'
53
54
 
54
-
55
- OHAI_SYSTEM = Ohai::System.new
56
- OHAI_SYSTEM.require_plugin("os")
57
- OHAI_SYSTEM.require_plugin("platform")
58
- TEST_PLATFORM = OHAI_SYSTEM["platform"].dup.freeze
59
- TEST_PLATFORM_VERSION = OHAI_SYSTEM["platform_version"].dup.freeze
60
-
61
55
  # Autoloads support files
62
56
  # Excludes support/platforms by default
63
57
  # Do not change the gsub.
@@ -76,34 +70,16 @@ RSpec.configure do |config|
76
70
 
77
71
  # Add jruby filters here
78
72
  config.filter_run_excluding :windows_only => true unless windows?
79
- config.filter_run_excluding :not_supported_on_mac_osx_106 => true if mac_osx_106?
80
- config.filter_run_excluding :solaris_only => true unless solaris?
81
73
  config.filter_run_excluding :not_supported_on_win2k3 => true if windows_win2k3?
82
- config.filter_run_excluding :not_supported_on_solaris => true if solaris?
74
+ config.filter_run_excluding :windows64_only => true unless windows64?
75
+ config.filter_run_excluding :windows32_only => true unless windows32?
83
76
  config.filter_run_excluding :unix_only => true unless unix?
84
77
  config.filter_run_excluding :ruby_18_only => true unless ruby_18?
85
78
  config.filter_run_excluding :ruby_19_only => true unless ruby_19?
86
79
  config.filter_run_excluding :requires_root => true unless ENV['USER'] == 'root'
87
- config.filter_run_excluding :requires_root_or_running_windows => true unless (ENV['USER'] == 'root' || windows?)
88
80
  config.filter_run_excluding :requires_unprivileged_user => true if ENV['USER'] == 'root'
89
81
  config.filter_run_excluding :uses_diff => true unless has_diff?
90
82
 
91
- # Functional Resource tests that are provider-specific:
92
- # context "on platforms that use useradd", :provider => {:user => Chef::Provider::User::Useradd}} do #...
93
- config.filter_run_excluding :provider => lambda {|criteria|
94
- type, target_provider = criteria.first
95
-
96
- platform = TEST_PLATFORM.dup
97
- platform_version = TEST_PLATFORM_VERSION.dup
98
-
99
- begin
100
- provider_for_running_platform = Chef::Platform.find_provider(platform, platform_version, type)
101
- provider_for_running_platform != target_provider
102
- rescue ArgumentError # no provider for platform
103
- true
104
- end
105
- }
106
-
107
83
  config.run_all_when_everything_filtered = true
108
84
  config.treat_symbols_as_metadata_keys_with_true_values = true
109
85
  end
@@ -56,7 +56,7 @@ describe 'Chef::ReservedNames::Win32::Security', :windows_only do
56
56
  end
57
57
 
58
58
  it "should not leak when creating a new ACL and setting it on a file", :volatile do
59
- securable_object = Chef::ReservedNames::Win32::Security::SecurableObject.new(@monkeyfoo)
59
+ securable_object = Security::SecurableObject.new(@monkeyfoo)
60
60
  lambda {
61
61
  securable_object.dacl = Chef::ReservedNames::Win32::Security::ACL.create([
62
62
  Chef::ReservedNames::Win32::Security::ACE.access_allowed(Chef::ReservedNames::Win32::Security::SID.Everyone, Chef::ReservedNames::Win32::API::Security::GENERIC_READ),
@@ -17,8 +17,6 @@ CHEF_SPEC_DATA = File.expand_path(File.dirname(__FILE__) + "/../data/")
17
17
  CHEF_SPEC_BACKUP_PATH = File.join(Dir.tmpdir, 'test-backup-path')
18
18
 
19
19
  Chef::Config[:log_level] = :fatal
20
- Chef::Config[:cache_type] = "Memory"
21
- Chef::Config[:cache_options] = { }
22
20
  Chef::Config[:persistent_queue] = false
23
21
  Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
24
22
 
@@ -1,7 +1,3 @@
1
- require 'chef/mixin/shell_out'
2
-
3
- include Chef::Mixin::ShellOut
4
-
5
1
  def ruby_19?
6
2
  !!(RUBY_VERSION =~ /^1.9/)
7
3
  end
@@ -22,17 +18,14 @@ def windows_win2k3?
22
18
  (host.version && host.version.start_with?("5.2"))
23
19
  end
24
20
 
25
- def mac_osx_106?
26
- if File.exists? "/usr/bin/sw_vers"
27
- result = shell_out("/usr/bin/sw_vers")
28
- result.stdout.each_line do |line|
29
- if line =~ /^ProductVersion:\s10.6.*$/
30
- return true
31
- end
32
- end
33
- end
34
-
35
- false
21
+ # detects if the hardware is 64-bit (evaluates to true in "WOW64" mode in a 32-bit app on a 64-bit system)
22
+ def windows64?
23
+ windows? && ( ENV['PROCESSOR_ARCHITECTURE'] == 'AMD64' || ENV['PROCESSOR_ARCHITEW6432'] == 'AMD64' )
24
+ end
25
+
26
+ # detects if the hardware is 32-bit
27
+ def windows32?
28
+ windows? && !windows64?
36
29
  end
37
30
 
38
31
  # def jruby?
@@ -17,42 +17,104 @@
17
17
  #
18
18
 
19
19
  shared_examples_for "a directory resource" do
20
+
21
+ let(:expect_updated?) {true}
22
+
20
23
  context "when the target directory does not exist" do
21
- it "creates the directory when the :create action is run" do
22
- resource.run_action(:create)
23
- File.should exist(path)
24
+ before do
25
+ # assert pre-condition
26
+ File.should_not exist(path)
24
27
  end
25
28
 
26
- it "recursively creates required directories if requested" do
27
- resource.recursive(true)
28
- recursive_path = File.join(path, 'red-headed-stepchild')
29
- resource.path(recursive_path)
30
- resource.run_action(:create)
31
- File.should exist(path)
32
- File.should exist(recursive_path)
29
+ describe "when running action :create" do
30
+ context "and the recursive option is not set" do
31
+ before do
32
+ resource.run_action(:create)
33
+ end
34
+
35
+ it "creates the directory when the :create action is run" do
36
+ File.should exist(path)
37
+ end
38
+
39
+ it "is marked updated by last action" do
40
+ resource.should be_updated_by_last_action
41
+ end
42
+ end
43
+
44
+ context "and the recursive option is set" do
45
+ before do
46
+ File.should_not exist(path)
47
+
48
+ resource.recursive(true)
49
+ @recursive_path = File.join(path, 'red-headed-stepchild')
50
+ resource.path(@recursive_path)
51
+ resource.run_action(:create)
52
+ end
53
+
54
+ it "recursively creates required directories" do
55
+ File.should exist(path)
56
+ File.should exist(@recursive_path)
57
+ end
58
+
59
+ it "is marked updated by last action" do
60
+ resource.should be_updated_by_last_action
61
+ end
62
+ end
33
63
  end
34
64
  end
35
65
 
36
66
  context "when the target directory exists" do
37
67
  before(:each) do
38
- FileUtils.mkdir(path)
39
- end
68
+ # For resources such as remote_directory, simply creating the base
69
+ # directory isn't enough to test that the system is in the desired state,
70
+ # so we run the resource twice--otherwise the updated_by_last_action test
71
+ # will fail.
72
+ resource.dup.run_action(:create)
73
+ File.should exist(path)
40
74
 
41
- it "does not re-create the directory" do
42
75
  resource.run_action(:create)
43
- File.should exist(path)
44
76
  end
45
77
 
46
- it "deletes the directory when the :delete action is run" do
47
- resource.run_action(:delete)
48
- File.should_not exist(path)
78
+ describe "when running action :create" do
79
+ before do
80
+ resource.run_action(:create)
81
+ end
82
+
83
+ it "does not re-create the directory" do
84
+ File.should exist(path)
85
+ end
86
+
87
+ it "is not marked updated by last action" do
88
+ resource.should_not be_updated_by_last_action
89
+ end
49
90
  end
50
91
 
51
- it "recursively deletes directories if requested" do
52
- FileUtils.mkdir(File.join(path, 'red-headed-stepchild'))
53
- resource.recursive(true)
54
- resource.run_action(:delete)
55
- File.should_not exist(path)
92
+ describe "when running action :delete" do
93
+ context "without the recursive option" do
94
+ before do
95
+ resource.run_action(:delete)
96
+ end
97
+
98
+ it "deletes the directory" do
99
+ File.should_not exist(path)
100
+ end
101
+
102
+ it "is marked as updated by last action" do
103
+ resource.should be_updated_by_last_action
104
+ end
105
+ end
106
+
107
+ context "with the recursive option" do
108
+ before do
109
+ FileUtils.mkdir(File.join(path, 'red-headed-stepchild'))
110
+ resource.recursive(true)
111
+ resource.run_action(:delete)
112
+ end
113
+
114
+ it "recursively deletes directories" do
115
+ File.should_not exist(path)
116
+ end
117
+ end
56
118
  end
57
119
  end
58
120
 
@@ -17,67 +17,145 @@
17
17
  #
18
18
 
19
19
  shared_examples_for "a file with the wrong content" do
20
- it "overwrites the file with the updated content when the :create action is run" do
21
- Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
22
- sleep 1
23
- resource.run_action(:create)
24
- File.stat(path).mtime.should > @expected_mtime
25
- sha256_checksum(path).should_not == @expected_checksum
26
- end
27
-
28
- it "doesn't overwrite the file when the :create_if_missing action is run" do
29
- sleep 1
30
- resource.run_action(:create_if_missing)
31
- File.stat(path).mtime.should == @expected_mtime
20
+ before do
21
+ # Assert starting state is as expected
22
+ File.should exist(path)
23
+ # Kinda weird, in this case @expected_checksum is the cksum of the file
24
+ # with incorrect content.
32
25
  sha256_checksum(path).should == @expected_checksum
33
26
  end
34
27
 
35
- it "should backup the existing file" do
36
- Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
37
- resource.run_action(:create)
38
- Dir.glob(backup_glob).size.should equal(1)
28
+ context "when running action :create" do
29
+ context "with backups enabled" do
30
+ before do
31
+ Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
32
+ resource.run_action(:create)
33
+ end
34
+
35
+ it "overwrites the file with the updated content when the :create action is run" do
36
+ File.stat(path).mtime.should > @expected_mtime
37
+ sha256_checksum(path).should_not == @expected_checksum
38
+ end
39
+
40
+ it "backs up the existing file" do
41
+ Dir.glob(backup_glob).size.should equal(1)
42
+ end
43
+
44
+ it "is marked as updated by last action" do
45
+ resource.should be_updated_by_last_action
46
+ end
47
+ end
48
+
49
+ context "with backups disabled" do
50
+ before do
51
+ Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
52
+ resource.backup(0)
53
+ resource.run_action(:create)
54
+ end
55
+
56
+ it "should not attempt to backup the existing file if :backup == 0" do
57
+ Dir.glob(backup_glob).size.should equal(0)
58
+ end
59
+ end
39
60
  end
40
61
 
41
- it "should not attempt to backup the existing file if :backup == 0" do
42
- Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
43
- resource.backup(0)
44
- resource.run_action(:create)
45
- Dir.glob(backup_glob).size.should equal(0)
62
+ describe "when running action :create_if_missing" do
63
+ before do
64
+ resource.run_action(:create_if_missing)
65
+ end
66
+
67
+ it "doesn't overwrite the file when the :create_if_missing action is run" do
68
+ File.stat(path).mtime.should == @expected_mtime
69
+ sha256_checksum(path).should == @expected_checksum
70
+ end
71
+
72
+ it "is not marked as updated" do
73
+ resource.should_not be_updated_by_last_action
74
+ end
46
75
  end
47
76
 
48
- it "deletes the file when the :delete action is run" do
49
- resource.run_action(:delete)
50
- File.should_not exist(path)
77
+ describe "when running action :delete" do
78
+ before do
79
+ resource.run_action(:delete)
80
+ end
81
+
82
+ it "deletes the file" do
83
+ File.should_not exist(path)
84
+ end
85
+
86
+ it "is marked as updated by last action" do
87
+ resource.should be_updated_by_last_action
88
+ end
51
89
  end
52
90
  end
53
91
 
54
92
  shared_examples_for "a file with the correct content" do
55
- it "does not overwrite the original when the :create action is run" do
56
- resource.run_action(:create)
93
+ before do
94
+ # Assert starting state is as expected
95
+ File.should exist(path)
57
96
  sha256_checksum(path).should == @expected_checksum
58
97
  end
59
98
 
60
- it "does not update the mtime/atime of the file when the :create action is run" do
61
- sleep 1
62
- File.stat(path).mtime.should == @expected_mtime
63
- File.stat(path).atime.should be_within(2).of(@expected_atime)
99
+ describe "when running action :create" do
100
+ before do
101
+ resource.run_action(:create)
102
+ end
103
+ it "does not overwrite the original when the :create action is run" do
104
+ sha256_checksum(path).should == @expected_checksum
105
+ end
106
+
107
+ it "does not update the mtime of the file when the :create action is run" do
108
+ File.stat(path).mtime.should == @expected_mtime
109
+ end
110
+
111
+ it "is not marked as updated by last action" do
112
+ resource.should_not be_updated_by_last_action
113
+ end
64
114
  end
65
115
 
66
- it "doesn't overwrite the file when the :create_if_missing action is run" do
67
- resource.run_action(:create_if_missing)
68
- sha256_checksum(path).should == @expected_checksum
116
+ describe "when running action :create_if_missing" do
117
+ before do
118
+ resource.run_action(:create_if_missing)
119
+ end
120
+
121
+ it "doesn't overwrite the file when the :create_if_missing action is run" do
122
+ sha256_checksum(path).should == @expected_checksum
123
+ end
124
+
125
+ it "is not marked as updated by last action" do
126
+ resource.should_not be_updated_by_last_action
127
+ end
69
128
  end
70
129
 
71
- it "deletes the file when the :delete action is run" do
72
- resource.run_action(:delete)
73
- File.should_not exist(path)
130
+ describe "when running action :delete" do
131
+ before do
132
+ resource.run_action(:delete)
133
+ end
134
+
135
+ it "deletes the file when the :delete action is run" do
136
+ File.should_not exist(path)
137
+ end
138
+
139
+ it "is marked as updated by last action" do
140
+ resource.should be_updated_by_last_action
141
+ end
74
142
  end
75
143
  end
76
144
 
77
145
  shared_examples_for "a file resource" do
146
+ before do
147
+ Chef::Log.level = :info
148
+ end
78
149
  # note the stripping of the drive letter from the tmpdir on windows
79
150
  let(:backup_glob) { File.join(CHEF_SPEC_BACKUP_PATH, Dir.tmpdir.sub(/^([A-Za-z]:)/, ""), "#{file_base}*") }
80
151
 
152
+ # Most tests update the resource, but a few do not. We need to test that the
153
+ # resource is marked updated or not correctly, but the test contexts are
154
+ # composed between correct/incorrect content and correct/incorrect
155
+ # permissions. We override this "let" definition in the context where content
156
+ # and permissions are correct.
157
+ let(:expect_updated?) { true }
158
+
81
159
  def binread(file)
82
160
  content = File.open(file, "rb") do |f|
83
161
  f.read
@@ -87,27 +165,55 @@ shared_examples_for "a file resource" do
87
165
  end
88
166
 
89
167
  context "when the target file does not exist" do
90
-
91
- it_behaves_like "a securable resource"
92
-
93
- it "creates the file when the :create action is run" do
94
- resource.run_action(:create)
95
- File.should exist(path)
168
+ before do
169
+ # Assert starting state is expected
170
+ File.should_not exist(path)
96
171
  end
97
172
 
98
- it "creates the file with the correct content when the :create action is run" do
99
- resource.run_action(:create)
100
- binread(path).should == expected_content
173
+ describe "when running action :create" do
174
+ before do
175
+ resource.run_action(:create)
176
+ end
177
+
178
+ it "creates the file when the :create action is run" do
179
+ File.should exist(path)
180
+ end
181
+
182
+ it "creates the file with the correct content when the :create action is run" do
183
+ binread(path).should == expected_content
184
+ end
185
+
186
+ it "is marked as updated by last action" do
187
+ resource.should be_updated_by_last_action
188
+ end
101
189
  end
102
190
 
103
- it "creates the file with the correct content when the :create_if_missing action is run" do
104
- resource.run_action(:create_if_missing)
105
- binread(path).should == expected_content
191
+ describe "when running action :create_if_missing" do
192
+ before do
193
+ resource.run_action(:create_if_missing)
194
+ end
195
+
196
+ it "creates the file with the correct content" do
197
+ binread(path).should == expected_content
198
+ end
199
+
200
+ it "is marked as updated by last action" do
201
+ resource.should be_updated_by_last_action
202
+ end
106
203
  end
107
204
 
108
- it "deletes the file when the :delete action is run" do
109
- resource.run_action(:delete)
110
- File.should_not exist(path)
205
+ describe "when running action :delete" do
206
+ before do
207
+ resource.run_action(:delete)
208
+ end
209
+
210
+ it "deletes the file when the :delete action is run" do
211
+ File.should_not exist(path)
212
+ end
213
+
214
+ it "is not marked updated by last action" do
215
+ resource.should_not be_updated_by_last_action
216
+ end
111
217
  end
112
218
  end
113
219
 
@@ -124,6 +230,9 @@ shared_examples_for "a file resource" do
124
230
  context "when the target file has the wrong content" do
125
231
  before(:each) do
126
232
  File.open(path, "wb") { |f| f.print "This is so wrong!!!" }
233
+ now = Time.now.to_i
234
+ File.utime(now - 9000, now - 9000, path)
235
+
127
236
  @expected_mtime = File.stat(path).mtime
128
237
  @expected_checksum = sha256_checksum(path)
129
238
  end
@@ -140,7 +249,7 @@ shared_examples_for "a file resource" do
140
249
  include_context "setup broken permissions"
141
250
 
142
251
  it_behaves_like "a file with the wrong content"
143
-
252
+
144
253
  it_behaves_like "a securable resource"
145
254
  end
146
255
  end
@@ -148,12 +257,19 @@ shared_examples_for "a file resource" do
148
257
  context "when the target file has the correct content" do
149
258
  before(:each) do
150
259
  File.open(path, "wb") { |f| f.print expected_content }
260
+ now = Time.now.to_i
261
+ File.utime(now - 9000, now - 9000, path)
262
+
151
263
  @expected_mtime = File.stat(path).mtime
152
- @expected_atime = File.stat(path).atime
153
264
  @expected_checksum = sha256_checksum(path)
154
265
  end
155
266
 
156
267
  describe "and the target file has the correct permissions" do
268
+
269
+ # When permissions and content are correct, chef should do nothing and
270
+ # the resource should not be marked updated.
271
+ let(:expect_updated?) { false }
272
+
157
273
  include_context "setup correct permissions"
158
274
 
159
275
  it_behaves_like "a file with the correct content"
@@ -170,24 +286,6 @@ shared_examples_for "a file resource" do
170
286
  end
171
287
  end
172
288
 
173
- it_behaves_like "a file that inherits permissions from a parent directory"
174
-
175
- end
176
-
177
- shared_examples_for "a file that inherits permissions from a parent directory" do
178
- include_context "use Windows permissions"
179
- context "on Windows", :windows_only do
180
- it "has only inherited aces if no explicit aces were specified" do
181
- File.exist?(path).should == false
182
-
183
- resource.run_action(:create)
184
-
185
- descriptor.dacl_inherits?.should == true
186
- descriptor.dacl.each do | ace |
187
- ace.inherited?.should == true
188
- end
189
- end
190
- end
191
289
  end
192
290
 
193
291
  shared_context Chef::Resource::File do