chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -0,0 +1,10 @@
1
+
2
+ shared_context "diff disabled" do
3
+ before do
4
+ Chef::Config[:diff_disabled] = true
5
+ end
6
+
7
+ after do
8
+ Chef::Config[:diff_disabled] = false
9
+ end
10
+ end
@@ -17,66 +17,157 @@
17
17
  #
18
18
 
19
19
  shared_examples_for "a directory resource" do
20
+
21
+ include_context "diff disabled"
22
+
23
+ let(:expect_updated?) {true}
24
+
20
25
  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)
26
+ before do
27
+ # assert pre-condition
28
+ File.should_not exist(path)
24
29
  end
25
30
 
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)
31
+ describe "when running action :create" do
32
+ context "and the recursive option is not set" do
33
+ before do
34
+ resource.run_action(:create)
35
+ end
36
+
37
+ it "creates the directory when the :create action is run" do
38
+ File.should exist(path)
39
+ end
40
+
41
+ it "is marked updated by last action" do
42
+ resource.should be_updated_by_last_action
43
+ end
44
+ end
45
+
46
+ context "and the recursive option is set" do
47
+ before do
48
+ File.should_not exist(path)
49
+
50
+ resource.recursive(true)
51
+ @recursive_path = File.join(path, 'red-headed-stepchild')
52
+ resource.path(@recursive_path)
53
+ resource.run_action(:create)
54
+ end
55
+
56
+ it "recursively creates required directories" do
57
+ File.should exist(path)
58
+ File.should exist(@recursive_path)
59
+ end
60
+
61
+ it "is marked updated by last action" do
62
+ resource.should be_updated_by_last_action
63
+ end
64
+ end
65
+ end
66
+
67
+ # Set up the context for security tests
68
+ def allowed_acl(sid, expected_perms)
69
+ [
70
+ ACE.access_allowed(sid, expected_perms[:specific]),
71
+ ACE.access_allowed(sid, expected_perms[:generic], (Chef::ReservedNames::Win32::API::Security::INHERIT_ONLY_ACE | Chef::ReservedNames::Win32::API::Security::CONTAINER_INHERIT_ACE | Chef::ReservedNames::Win32::API::Security::OBJECT_INHERIT_ACE))
72
+ ]
33
73
  end
74
+
75
+ def denied_acl(sid, expected_perms)
76
+ [
77
+ ACE.access_denied(sid, expected_perms[:specific]),
78
+ ACE.access_denied(sid, expected_perms[:generic], (Chef::ReservedNames::Win32::API::Security::INHERIT_ONLY_ACE | Chef::ReservedNames::Win32::API::Security::CONTAINER_INHERIT_ACE | Chef::ReservedNames::Win32::API::Security::OBJECT_INHERIT_ACE))
79
+ ]
80
+ end
81
+
82
+ def parent_inheritable_acls
83
+ dummy_directory_path = File.join(test_file_dir, "dummy_directory")
84
+ dummy_directory = FileUtils.mkdir_p(dummy_directory_path)
85
+ dummy_desc = get_security_descriptor(dummy_directory_path)
86
+ FileUtils.rm_rf(dummy_directory_path)
87
+ dummy_desc
88
+ end
89
+
90
+ it_behaves_like "a securable resource without existing target"
34
91
  end
35
92
 
36
93
  context "when the target directory exists" do
37
94
  before(:each) do
38
- FileUtils.mkdir(path)
39
- end
95
+ # For resources such as remote_directory, simply creating the base
96
+ # directory isn't enough to test that the system is in the desired state,
97
+ # so we run the resource twice--otherwise the updated_by_last_action test
98
+ # will fail.
99
+ resource.dup.run_action(:create)
100
+ File.should exist(path)
40
101
 
41
- it "does not re-create the directory" do
42
102
  resource.run_action(:create)
43
- File.should exist(path)
44
103
  end
45
104
 
46
- it "deletes the directory when the :delete action is run" do
47
- resource.run_action(:delete)
48
- File.should_not exist(path)
49
- end
105
+ describe "when running action :create" do
106
+ before do
107
+ resource.run_action(:create)
108
+ end
50
109
 
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)
110
+ it "does not re-create the directory" do
111
+ File.should exist(path)
112
+ end
113
+
114
+ it "is not marked updated by last action" do
115
+ resource.should_not be_updated_by_last_action
116
+ end
56
117
  end
57
- end
58
118
 
59
- # Set up the context for security tests
60
- def allowed_acl(sid, expected_perms)
61
- [
62
- ACE.access_allowed(sid, expected_perms[:specific]),
63
- ACE.access_allowed(sid, expected_perms[:generic], (Chef::ReservedNames::Win32::API::Security::INHERIT_ONLY_ACE | Chef::ReservedNames::Win32::API::Security::CONTAINER_INHERIT_ACE | Chef::ReservedNames::Win32::API::Security::OBJECT_INHERIT_ACE))
64
- ]
65
- end
119
+ describe "when running action :delete" do
120
+ context "without the recursive option" do
121
+ before do
122
+ resource.run_action(:delete)
123
+ end
124
+
125
+ it "deletes the directory" do
126
+ File.should_not exist(path)
127
+ end
66
128
 
67
- def denied_acl(sid, expected_perms)
68
- [
69
- ACE.access_denied(sid, expected_perms[:specific]),
70
- ACE.access_denied(sid, expected_perms[:generic], (Chef::ReservedNames::Win32::API::Security::INHERIT_ONLY_ACE | Chef::ReservedNames::Win32::API::Security::CONTAINER_INHERIT_ACE | Chef::ReservedNames::Win32::API::Security::OBJECT_INHERIT_ACE))
71
- ]
129
+ it "is marked as updated by last action" do
130
+ resource.should be_updated_by_last_action
131
+ end
132
+ end
133
+
134
+ context "with the recursive option" do
135
+ before do
136
+ FileUtils.mkdir(File.join(path, 'red-headed-stepchild'))
137
+ resource.recursive(true)
138
+ resource.run_action(:delete)
139
+ end
140
+
141
+ it "recursively deletes directories" do
142
+ File.should_not exist(path)
143
+ end
144
+ end
145
+ end
72
146
  end
73
147
 
74
- it_behaves_like "a securable resource"
75
148
  end
76
149
 
77
150
  shared_context Chef::Resource::Directory do
151
+ # We create the directory than tmp to exercise different file
152
+ # deployment strategies more completely.
153
+ let(:test_file_dir) do
154
+ if windows?
155
+ File.join(ENV['systemdrive'], "test-dir")
156
+ else
157
+ File.join(CHEF_SPEC_DATA, "test-dir")
158
+ end
159
+ end
160
+
78
161
  let(:path) do
79
- File.join(Dir.tmpdir, make_tmpname(directory_base, nil))
162
+ File.join(test_file_dir, make_tmpname(directory_base))
163
+ end
164
+
165
+ before do
166
+ FileUtils::mkdir_p(test_file_dir)
167
+ end
168
+
169
+ after do
170
+ FileUtils::rm_rf(test_file_dir)
80
171
  end
81
172
 
82
173
  after(:each) do
@@ -16,67 +16,345 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ shared_context "deploying with move" do
20
+ before do
21
+ @original_atomic_update = Chef::Config[:file_atomic_update]
22
+ Chef::Config[:file_atomic_update] = true
23
+ end
24
+
25
+ after do
26
+ Chef::Config[:file_atomic_update] = @original_atomic_update
27
+ end
28
+ end
29
+
30
+ shared_context "deploying with copy" do
31
+ before do
32
+ @original_atomic_update = Chef::Config[:file_atomic_update]
33
+ Chef::Config[:file_atomic_update] = false
34
+ end
35
+
36
+ after do
37
+ Chef::Config[:file_atomic_update] = @original_atomic_update
38
+ end
39
+ end
40
+
41
+ shared_context "deploying via tmpdir" do
42
+ before do
43
+ @original_stage_via = Chef::Config[:file_staging_uses_destdir]
44
+ Chef::Config[:file_staging_uses_destdir] = false
45
+ end
46
+
47
+ after do
48
+ Chef::Config[:file_staging_uses_destdir] = @original_stage_via
49
+ end
50
+ end
51
+
52
+ shared_context "deploying via destdir" do
53
+ before do
54
+ @original_stage_via = Chef::Config[:file_staging_uses_destdir]
55
+ Chef::Config[:file_staging_uses_destdir] = true
56
+ end
57
+
58
+ after do
59
+ Chef::Config[:file_staging_uses_destdir] = @original_stage_via
60
+ end
61
+ end
62
+
63
+
19
64
  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
65
+ before do
66
+ # Assert starting state is as expected
67
+ File.should exist(path)
68
+ # Kinda weird, in this case @expected_checksum is the cksum of the file
69
+ # with incorrect content.
32
70
  sha256_checksum(path).should == @expected_checksum
33
71
  end
34
72
 
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)
73
+ include_context "diff disabled"
74
+
75
+ context "when running action :create" do
76
+ context "with backups enabled" do
77
+ before do
78
+ Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
79
+ resource.run_action(:create)
80
+ end
81
+
82
+ it "overwrites the file with the updated content when the :create action is run" do
83
+ File.stat(path).mtime.should > @expected_mtime
84
+ sha256_checksum(path).should_not == @expected_checksum
85
+ end
86
+
87
+ it "backs up the existing file" do
88
+ Dir.glob(backup_glob).size.should equal(1)
89
+ end
90
+
91
+ it "is marked as updated by last action" do
92
+ resource.should be_updated_by_last_action
93
+ end
94
+
95
+ it "should restore the security contexts on selinux", :selinux_only do
96
+ selinux_security_context_restored?(path).should be_true
97
+ end
98
+ end
99
+
100
+ context "with backups disabled" do
101
+ before do
102
+ Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
103
+ resource.backup(0)
104
+ resource.run_action(:create)
105
+ end
106
+
107
+ it "should not attempt to backup the existing file if :backup == 0" do
108
+ Dir.glob(backup_glob).size.should equal(0)
109
+ end
110
+
111
+ it "should restore the security contexts on selinux", :selinux_only do
112
+ selinux_security_context_restored?(path).should be_true
113
+ end
114
+ end
39
115
  end
40
116
 
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)
117
+ describe "when running action :create_if_missing" do
118
+ before do
119
+ resource.run_action(:create_if_missing)
120
+ end
121
+
122
+ it "doesn't overwrite the file when the :create_if_missing action is run" do
123
+ File.stat(path).mtime.should == @expected_mtime
124
+ sha256_checksum(path).should == @expected_checksum
125
+ end
126
+
127
+ it "is not marked as updated" do
128
+ resource.should_not be_updated_by_last_action
129
+ end
130
+
131
+ it "should restore the security contexts on selinux", :selinux_only do
132
+ selinux_security_context_restored?(path).should be_true
133
+ end
46
134
  end
47
135
 
48
- it "deletes the file when the :delete action is run" do
49
- resource.run_action(:delete)
50
- File.should_not exist(path)
136
+ describe "when running action :delete" do
137
+ before do
138
+ resource.run_action(:delete)
139
+ end
140
+
141
+ it "deletes the file" do
142
+ File.should_not exist(path)
143
+ end
144
+
145
+ it "is marked as updated by last action" do
146
+ resource.should be_updated_by_last_action
147
+ end
51
148
  end
52
149
  end
53
150
 
54
151
  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)
152
+ before do
153
+ # Assert starting state is as expected
154
+ File.should exist(path)
57
155
  sha256_checksum(path).should == @expected_checksum
58
156
  end
59
157
 
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)
158
+ include_context "diff disabled"
159
+
160
+ describe "when running action :create" do
161
+ before do
162
+ resource.run_action(:create)
163
+ end
164
+ it "does not overwrite the original when the :create action is run" do
165
+ sha256_checksum(path).should == @expected_checksum
166
+ end
167
+
168
+ it "does not update the mtime of the file when the :create action is run" do
169
+ File.stat(path).mtime.should == @expected_mtime
170
+ end
171
+
172
+ it "is not marked as updated by last action" do
173
+ resource.should_not be_updated_by_last_action
174
+ end
175
+
176
+ it "should restore the security contexts on selinux", :selinux_only do
177
+ selinux_security_context_restored?(path).should be_true
178
+ end
64
179
  end
65
180
 
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
181
+ describe "when running action :create_if_missing" do
182
+ before do
183
+ resource.run_action(:create_if_missing)
184
+ end
185
+
186
+ it "doesn't overwrite the file when the :create_if_missing action is run" do
187
+ sha256_checksum(path).should == @expected_checksum
188
+ end
189
+
190
+ it "is not marked as updated by last action" do
191
+ resource.should_not be_updated_by_last_action
192
+ end
193
+
194
+ it "should restore the security contexts on selinux", :selinux_only do
195
+ selinux_security_context_restored?(path).should be_true
196
+ end
69
197
  end
70
198
 
71
- it "deletes the file when the :delete action is run" do
72
- resource.run_action(:delete)
73
- File.should_not exist(path)
199
+ describe "when running action :delete" do
200
+ before do
201
+ resource.run_action(:delete)
202
+ end
203
+
204
+ it "deletes the file when the :delete action is run" do
205
+ File.should_not exist(path)
206
+ end
207
+
208
+ it "is marked as updated by last action" do
209
+ resource.should be_updated_by_last_action
210
+ end
74
211
  end
75
212
  end
76
213
 
77
214
  shared_examples_for "a file resource" do
215
+ describe "when deploying with :move" do
216
+
217
+ include_context "deploying with move"
218
+
219
+ describe "when deploying via tmpdir" do
220
+
221
+ include_context "deploying via tmpdir"
222
+
223
+ it_behaves_like "a configured file resource"
224
+ end
225
+
226
+ describe "when deploying via destdir" do
227
+
228
+ include_context "deploying via destdir"
229
+
230
+ it_behaves_like "a configured file resource"
231
+ end
232
+ end
233
+
234
+ describe "when deploying with :copy" do
235
+
236
+ include_context "deploying with copy"
237
+
238
+ describe "when deploying via tmpdir" do
239
+
240
+ include_context "deploying via tmpdir"
241
+
242
+ it_behaves_like "a configured file resource"
243
+ end
244
+
245
+ describe "when deploying via destdir" do
246
+
247
+ include_context "deploying via destdir"
248
+
249
+ it_behaves_like "a configured file resource"
250
+ end
251
+ end
252
+
253
+ describe "when running under why run" do
254
+
255
+ before do
256
+ Chef::Config[:why_run] = true
257
+ end
258
+
259
+ after do
260
+ Chef::Config[:why_run] = false
261
+ end
262
+
263
+ context "and the resource has a path with a missing intermediate directory" do
264
+ # CHEF-3978
265
+
266
+ let(:path) do
267
+ File.join(test_file_dir, "intermediate_dir", make_tmpname(file_base))
268
+ end
269
+
270
+ it "successfully doesn't create the file" do
271
+ resource.run_action(:create) # should not raise
272
+ File.should_not exist(path)
273
+ end
274
+ end
275
+
276
+ end
277
+
278
+ describe "when setting atomic_update" do
279
+ it "booleans should work" do
280
+ lambda {resource.atomic_update(true)}.should_not raise_error
281
+ lambda {resource.atomic_update(false)}.should_not raise_error
282
+ end
283
+
284
+ it "anything else should raise an error" do
285
+ lambda {resource.atomic_update(:copy)}.should raise_error(ArgumentError)
286
+ lambda {resource.atomic_update(:move)}.should raise_error(ArgumentError)
287
+ lambda {resource.atomic_update(958)}.should raise_error(ArgumentError)
288
+ end
289
+ end
290
+
291
+ end
292
+
293
+ shared_examples_for "file resource not pointing to a real file" do
294
+ def symlink?(file_path)
295
+ if windows?
296
+ Chef::ReservedNames::Win32::File.symlink?(file_path)
297
+ else
298
+ File.symlink?(file_path)
299
+ end
300
+ end
301
+
302
+ def real_file?(file_path)
303
+ !symlink?(file_path) && File.file?(file_path)
304
+ end
305
+
306
+ describe "when force_unlink is set to true" do
307
+ it ":create unlinks the target" do
308
+ real_file?(path).should be_false
309
+ resource.force_unlink(true)
310
+ resource.run_action(:create)
311
+ real_file?(path).should be_true
312
+ binread(path).should == expected_content
313
+ resource.should be_updated_by_last_action
314
+ end
315
+ end
316
+
317
+ describe "when force_unlink is set to false" do
318
+ it ":create raises an error" do
319
+ lambda {resource.run_action(:create) }.should raise_error(Chef::Exceptions::FileTypeMismatch)
320
+ end
321
+ end
322
+
323
+ describe "when force_unlink is not set (default)" do
324
+ it ":create raises an error" do
325
+ lambda {resource.run_action(:create) }.should raise_error(Chef::Exceptions::FileTypeMismatch)
326
+ end
327
+ end
328
+ end
329
+
330
+ shared_examples_for "a configured file resource" do
331
+
332
+ include_context "diff disabled"
333
+
334
+ before do
335
+ Chef::Log.level = :info
336
+ end
337
+
78
338
  # note the stripping of the drive letter from the tmpdir on windows
79
- let(:backup_glob) { File.join(CHEF_SPEC_BACKUP_PATH, Dir.tmpdir.sub(/^([A-Za-z]:)/, ""), "#{file_base}*") }
339
+ let(:backup_glob) { File.join(CHEF_SPEC_BACKUP_PATH, test_file_dir.sub(/^([A-Za-z]:)/, ""), "#{file_base}*") }
340
+
341
+ # Most tests update the resource, but a few do not. We need to test that the
342
+ # resource is marked updated or not correctly, but the test contexts are
343
+ # composed between correct/incorrect content and correct/incorrect
344
+ # permissions. We override this "let" definition in the context where content
345
+ # and permissions are correct.
346
+ let(:expect_updated?) { true }
347
+
348
+ include Chef::Mixin::ShellOut
349
+
350
+ def selinux_security_context_restored?(path)
351
+ @restorecon_path = which("restorecon") if @restorecon_path.nil?
352
+ restorecon_test_command = "#{@restorecon_path} -n -v #{path}"
353
+ cmdresult = shell_out(restorecon_test_command)
354
+ # restorecon will print the required changes to stdout if any is
355
+ # needed
356
+ cmdresult.stdout.empty?
357
+ end
80
358
 
81
359
  def binread(file)
82
360
  content = File.open(file, "rb") do |f|
@@ -86,29 +364,457 @@ shared_examples_for "a file resource" do
86
364
  content
87
365
  end
88
366
 
89
- context "when the target file does not exist" do
367
+ context "when the target file is a symlink", :not_supported_on_win2k3 do
368
+ let(:symlink_target) {
369
+ File.join(CHEF_SPEC_DATA, "file-test-target")
370
+ }
90
371
 
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)
372
+
373
+ describe "when configured not to manage symlink's target" do
374
+ before(:each) do
375
+ # configure not to manage symlink source
376
+ resource.manage_symlink_source(false)
377
+
378
+ # create symlinks for test context
379
+ FileUtils.touch(symlink_target)
380
+
381
+ if windows?
382
+ Chef::ReservedNames::Win32::File.symlink(symlink_target, path)
383
+ else
384
+ File.symlink(symlink_target, path)
385
+ end
386
+ end
387
+
388
+ after(:each) do
389
+ FileUtils.rm_rf(symlink_target)
390
+ FileUtils.rm_rf(path)
391
+ end
392
+
393
+ describe "when symlink target has correct content" do
394
+ before(:each) do
395
+ File.open(symlink_target, "wb") { |f| f.print expected_content }
396
+ end
397
+
398
+ it_behaves_like "file resource not pointing to a real file"
399
+ end
400
+
401
+ describe "when symlink target has the wrong content" do
402
+ before(:each) do
403
+ File.open(symlink_target, "wb") { |f| f.print "This is so wrong!!!" }
404
+ end
405
+
406
+ after(:each) do
407
+ # symlink should never be followed
408
+ binread(symlink_target).should == "This is so wrong!!!"
409
+ end
410
+
411
+ it_behaves_like "file resource not pointing to a real file"
412
+ end
96
413
  end
97
414
 
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
415
+ # Unix-only for now. Windows behavior may differ because of how ACL
416
+ # management handles symlinks. Since symlinks are rare on Windows and this
417
+ # feature primarily exists to support the case where a well-known file
418
+ # (e.g., resolv.conf) has been converted to a symlink, we're okay with the
419
+ # discrepancy.
420
+ context "when configured to manage the symlink source", :unix_only do
421
+
422
+ before do
423
+ resource.manage_symlink_source(true)
424
+ end
425
+
426
+ context "but the symlink is part of a loop" do
427
+ let(:link1_path) { File.join(CHEF_SPEC_DATA, "points-to-link2") }
428
+ let(:link2_path) { File.join(CHEF_SPEC_DATA, "points-to-link1") }
429
+
430
+ before do
431
+ # point resource at link1:
432
+ resource.path(link1_path)
433
+ # create symlinks for test context
434
+ File.symlink(link1_path, link2_path)
435
+ File.symlink(link2_path, link1_path)
436
+ end
437
+
438
+ after(:each) do
439
+ FileUtils.rm_rf(link1_path)
440
+ FileUtils.rm_rf(link2_path)
441
+ end
442
+
443
+ it "raises an InvalidSymlink error" do
444
+ lambda { resource.run_action(:create) }.should raise_error(Chef::Exceptions::InvalidSymlink)
445
+ end
446
+
447
+ it "issues a warning/assumption in whyrun mode" do
448
+ begin
449
+ Chef::Config[:why_run] = true
450
+ resource.run_action(:create) # should not raise
451
+ ensure
452
+ Chef::Config[:why_run] = false
453
+ end
454
+ end
455
+ end
456
+
457
+ context "but the symlink points to a nonexistent file" do
458
+ let(:link_path) { File.join(CHEF_SPEC_DATA, "points-to-nothing") }
459
+ let(:not_existent_source) { File.join(CHEF_SPEC_DATA, "i-am-not-here") }
460
+
461
+ before do
462
+ resource.path(link_path)
463
+ # create symlinks for test context
464
+ File.symlink(not_existent_source, link_path)
465
+ FileUtils.rm_rf(not_existent_source)
466
+ end
467
+
468
+ after(:each) do
469
+ FileUtils.rm_rf(link_path)
470
+ end
471
+ it "raises an InvalidSymlink error" do
472
+ lambda { resource.run_action(:create) }.should raise_error(Chef::Exceptions::InvalidSymlink)
473
+ end
474
+
475
+ it "issues a warning/assumption in whyrun mode" do
476
+ begin
477
+ Chef::Config[:why_run] = true
478
+ resource.run_action(:create) # should not raise
479
+ ensure
480
+ Chef::Config[:why_run] = false
481
+ end
482
+ end
483
+ end
484
+
485
+ context "but the symlink is points to a non-file fs entry" do
486
+ let(:link_path) { File.join(CHEF_SPEC_DATA, "points-to-dir") }
487
+ let(:not_a_file_path) { File.join(CHEF_SPEC_DATA, "dir-at-end-of-symlink") }
488
+
489
+ before do
490
+ # point resource at link1:
491
+ resource.path(link_path)
492
+ # create symlinks for test context
493
+ File.symlink(not_a_file_path, link_path)
494
+ Dir.mkdir(not_a_file_path)
495
+ end
496
+
497
+ after(:each) do
498
+ FileUtils.rm_rf(link_path)
499
+ FileUtils.rm_rf(not_a_file_path)
500
+ end
501
+
502
+ it "raises an InvalidSymlink error" do
503
+ lambda { resource.run_action(:create) }.should raise_error(Chef::Exceptions::FileTypeMismatch)
504
+ end
505
+
506
+ it "issues a warning/assumption in whyrun mode" do
507
+ begin
508
+ Chef::Config[:why_run] = true
509
+ resource.run_action(:create) # should not raise
510
+ ensure
511
+ Chef::Config[:why_run] = false
512
+ end
513
+ end
514
+ end
515
+
516
+ context "when the symlink source is a real file" do
517
+
518
+ let(:wrong_content) { "this is the wrong content" }
519
+ let(:link_path) { File.join(CHEF_SPEC_DATA, "points-to-real-file") }
520
+
521
+ before do
522
+ # point resource at link:
523
+ resource.path(link_path)
524
+ # create symlinks for test context
525
+ File.symlink(path, link_path)
526
+ end
527
+
528
+ after(:each) do
529
+ # shared examples should not change our test setup of a file resource
530
+ # pointing at a symlink:
531
+ resource.path.should == link_path
532
+ FileUtils.rm_rf(link_path)
533
+ end
534
+
535
+ context "and the permissions are incorrect" do
536
+ before do
537
+ # Create source (real) file
538
+ File.open(path, "wb") { |f| f.write(expected_content) }
539
+ end
540
+
541
+
542
+ include_context "setup broken permissions"
543
+
544
+ include_examples "a securable resource with existing target"
545
+
546
+ it "does not replace the symlink with a real file" do
547
+ resource.run_action(:create)
548
+ File.should be_symlink(link_path)
549
+ end
550
+
551
+ end
552
+
553
+ context "and the content is incorrect" do
554
+ before do
555
+ # Create source (real) file
556
+ File.open(path, "wb") { |f| f.write(wrong_content) }
557
+ end
558
+
559
+ it "updates the source file content" do
560
+ pending
561
+ end
562
+
563
+ it "marks the resource as updated" do
564
+ resource.run_action(:create)
565
+ resource.should be_updated_by_last_action
566
+ end
567
+
568
+ it "does not replace the symlink with a real file" do
569
+ resource.run_action(:create)
570
+ File.should be_symlink(link_path)
571
+ end
572
+ end
573
+
574
+ context "and the content and permissions are correct" do
575
+ let(:expect_updated?) { false }
576
+
577
+ before do
578
+ # Create source (real) file
579
+ File.open(path, "wb") { |f| f.write(expected_content) }
580
+ end
581
+ include_context "setup correct permissions"
582
+
583
+ include_examples "a securable resource with existing target"
584
+
585
+ end
586
+
587
+ end
588
+
589
+ context "when the symlink points to a symlink which points to a real file" do
590
+
591
+ let(:wrong_content) { "this is the wrong content" }
592
+ let(:link_to_file_path) { File.join(CHEF_SPEC_DATA, "points-to-real-file") }
593
+ let(:link_to_link_path) { File.join(CHEF_SPEC_DATA, "points-to-next-link") }
594
+
595
+ before do
596
+ # point resource at link:
597
+ resource.path(link_to_link_path)
598
+ # create symlinks for test context
599
+ File.symlink(path, link_to_file_path)
600
+ File.symlink(link_to_file_path, link_to_link_path)
601
+
602
+ # Create source (real) file
603
+ File.open(path, "wb") { |f| f.write(wrong_content) }
604
+ end
605
+
606
+ include_context "setup broken permissions"
607
+
608
+ include_examples "a securable resource with existing target"
609
+
610
+ after(:each) do
611
+ # shared examples should not change our test setup of a file resource
612
+ # pointing at a symlink:
613
+ resource.path.should == link_to_link_path
614
+ FileUtils.rm_rf(link_to_file_path)
615
+ FileUtils.rm_rf(link_to_link_path)
616
+ end
617
+
618
+ it "does not replace the symlink with a real file" do
619
+ resource.run_action(:create)
620
+ File.should be_symlink(link_to_link_path)
621
+ File.should be_symlink(link_to_file_path)
622
+ end
623
+
624
+ end
101
625
  end
626
+ end
102
627
 
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
628
+ context "when the target file is a directory" do
629
+ before(:each) do
630
+ FileUtils.mkdir_p(path)
106
631
  end
107
632
 
108
- it "deletes the file when the :delete action is run" do
109
- resource.run_action(:delete)
633
+ after(:each) do
634
+ FileUtils.rm_rf(path)
635
+ end
636
+
637
+ it_behaves_like "file resource not pointing to a real file"
638
+ end
639
+
640
+ context "when the target file is a blockdev",:unix_only, :requires_root, :not_supported_on_solaris do
641
+ include Chef::Mixin::ShellOut
642
+ let(:path) do
643
+ File.join(CHEF_SPEC_DATA, "testdev")
644
+ end
645
+
646
+ before(:each) do
647
+ result = shell_out("mknod #{path} b 1 2")
648
+ result.stderr.empty?
649
+ end
650
+
651
+ after(:each) do
652
+ FileUtils.rm_rf(path)
653
+ end
654
+
655
+ it_behaves_like "file resource not pointing to a real file"
656
+ end
657
+
658
+ context "when the target file is a chardev",:unix_only, :requires_root, :not_supported_on_solaris do
659
+ include Chef::Mixin::ShellOut
660
+ let(:path) do
661
+ File.join(CHEF_SPEC_DATA, "testdev")
662
+ end
663
+
664
+ before(:each) do
665
+ result = shell_out("mknod #{path} c 1 2")
666
+ result.stderr.empty?
667
+ end
668
+
669
+ after(:each) do
670
+ FileUtils.rm_rf(path)
671
+ end
672
+
673
+ it_behaves_like "file resource not pointing to a real file"
674
+ end
675
+
676
+ context "when the target file is a pipe",:unix_only do
677
+ include Chef::Mixin::ShellOut
678
+ let(:path) do
679
+ File.join(CHEF_SPEC_DATA, "testpipe")
680
+ end
681
+
682
+ before(:each) do
683
+ result = shell_out("mkfifo #{path}")
684
+ result.stderr.empty?
685
+ end
686
+
687
+ after(:each) do
688
+ FileUtils.rm_rf(path)
689
+ end
690
+
691
+ it_behaves_like "file resource not pointing to a real file"
692
+ end
693
+
694
+ context "when the target file is a socket",:unix_only do
695
+ require 'socket'
696
+
697
+ # It turns out that the path to a socket can have at most ~104
698
+ # bytes. Therefore we are creating our sockets in tmpdir so that
699
+ # they have a shorter path.
700
+ let(:test_socket_dir) { File.join(Dir.tmpdir, "sockets") }
701
+
702
+ before do
703
+ FileUtils::mkdir_p(test_socket_dir)
704
+ end
705
+
706
+ after do
707
+ FileUtils::rm_rf(test_socket_dir)
708
+ end
709
+
710
+ let(:path) do
711
+ File.join(test_socket_dir, "testsocket")
712
+ end
713
+
714
+ before(:each) do
715
+ path.bytesize.should <= 104
716
+ UNIXServer.new(path)
717
+ end
718
+
719
+ after(:each) do
720
+ FileUtils.rm_rf(path)
721
+ end
722
+
723
+ it_behaves_like "file resource not pointing to a real file"
724
+ end
725
+
726
+ # Regression test for http://tickets.opscode.com/browse/CHEF-4082
727
+ context "when notification is configured" do
728
+ describe "when path is specified with normal seperator" do
729
+ before do
730
+ @notified_resource = Chef::Resource.new("punk", resource.run_context)
731
+ resource.notifies(:run, @notified_resource, :immediately)
732
+ resource.run_action(:create)
733
+ end
734
+
735
+ it "should notify the other resources correctly" do
736
+ resource.should be_updated_by_last_action
737
+ resource.run_context.immediate_notifications(resource).length.should == 1
738
+ end
739
+ end
740
+
741
+ describe "when path is specified with windows seperator", :windows_only do
742
+ let(:path) {
743
+ File.join(test_file_dir, make_tmpname(file_base)).gsub(::File::SEPARATOR, ::File::ALT_SEPARATOR)
744
+ }
745
+
746
+ before do
747
+ @notified_resource = Chef::Resource.new("punk", resource.run_context)
748
+ resource.notifies(:run, @notified_resource, :immediately)
749
+ resource.run_action(:create)
750
+ end
751
+
752
+ it "should notify the other resources correctly" do
753
+ resource.should be_updated_by_last_action
754
+ resource.run_context.immediate_notifications(resource).length.should == 1
755
+ end
756
+ end
757
+ end
758
+
759
+ context "when the target file does not exist" do
760
+ before do
761
+ # Assert starting state is expected
110
762
  File.should_not exist(path)
111
763
  end
764
+
765
+ describe "when running action :create" do
766
+ before do
767
+ resource.run_action(:create)
768
+ end
769
+
770
+ it "creates the file when the :create action is run" do
771
+ File.should exist(path)
772
+ end
773
+
774
+ it "creates the file with the correct content when the :create action is run" do
775
+ binread(path).should == expected_content
776
+ end
777
+
778
+ it "is marked as updated by last action" do
779
+ resource.should be_updated_by_last_action
780
+ end
781
+
782
+ it "should restore the security contexts on selinux", :selinux_only do
783
+ selinux_security_context_restored?(path).should be_true
784
+ end
785
+ end
786
+
787
+ describe "when running action :create_if_missing" do
788
+ before do
789
+ resource.run_action(:create_if_missing)
790
+ end
791
+
792
+ it "creates the file with the correct content" do
793
+ binread(path).should == expected_content
794
+ end
795
+
796
+ it "is marked as updated by last action" do
797
+ resource.should be_updated_by_last_action
798
+ end
799
+
800
+ it "should restore the security contexts on selinux", :selinux_only do
801
+ selinux_security_context_restored?(path).should be_true
802
+ end
803
+ end
804
+
805
+ describe "when running action :delete" do
806
+ before do
807
+ resource.run_action(:delete)
808
+ end
809
+
810
+ it "deletes the file when the :delete action is run" do
811
+ File.should_not exist(path)
812
+ end
813
+
814
+ it "is not marked updated by last action" do
815
+ resource.should_not be_updated_by_last_action
816
+ end
817
+ end
112
818
  end
113
819
 
114
820
  # Set up the context for security tests
@@ -120,10 +826,22 @@ shared_examples_for "a file resource" do
120
826
  [ ACE.access_denied(sid, expected_perms[:specific]) ]
121
827
  end
122
828
 
829
+ def parent_inheritable_acls
830
+ dummy_file_path = File.join(test_file_dir, "dummy_file")
831
+ FileUtils.touch(dummy_file_path)
832
+ dummy_desc = get_security_descriptor(dummy_file_path)
833
+ FileUtils.rm_rf(dummy_file_path)
834
+ dummy_desc
835
+ end
836
+
837
+ it_behaves_like "a securable resource without existing target"
123
838
 
124
839
  context "when the target file has the wrong content" do
125
840
  before(:each) do
126
841
  File.open(path, "wb") { |f| f.print "This is so wrong!!!" }
842
+ now = Time.now.to_i
843
+ File.utime(now - 9000, now - 9000, path)
844
+
127
845
  @expected_mtime = File.stat(path).mtime
128
846
  @expected_checksum = sha256_checksum(path)
129
847
  end
@@ -133,70 +851,118 @@ shared_examples_for "a file resource" do
133
851
 
134
852
  it_behaves_like "a file with the wrong content"
135
853
 
136
- it_behaves_like "a securable resource"
854
+ it_behaves_like "a securable resource with existing target"
137
855
  end
138
856
 
139
857
  context "and the target file has incorrect permissions" do
140
858
  include_context "setup broken permissions"
141
859
 
142
860
  it_behaves_like "a file with the wrong content"
143
-
144
- it_behaves_like "a securable resource"
861
+
862
+ it_behaves_like "a securable resource with existing target"
145
863
  end
146
864
  end
147
865
 
148
866
  context "when the target file has the correct content" do
149
867
  before(:each) do
150
868
  File.open(path, "wb") { |f| f.print expected_content }
869
+ now = Time.now.to_i
870
+ File.utime(now - 9000, now - 9000, path)
871
+
151
872
  @expected_mtime = File.stat(path).mtime
152
- @expected_atime = File.stat(path).atime
153
873
  @expected_checksum = sha256_checksum(path)
154
874
  end
155
875
 
156
876
  describe "and the target file has the correct permissions" do
877
+
878
+ # When permissions and content are correct, chef should do nothing and
879
+ # the resource should not be marked updated.
880
+ let(:expect_updated?) { false }
881
+
157
882
  include_context "setup correct permissions"
158
883
 
159
884
  it_behaves_like "a file with the correct content"
160
885
 
161
- it_behaves_like "a securable resource"
886
+ it_behaves_like "a securable resource with existing target"
162
887
  end
163
888
 
164
889
  context "and the target file has incorrect permissions" do
165
890
  include_context "setup broken permissions"
166
891
 
167
892
  it_behaves_like "a file with the correct content"
168
-
169
- it_behaves_like "a securable resource"
893
+
894
+ it_behaves_like "a securable resource with existing target"
170
895
  end
171
896
  end
172
897
 
173
- it_behaves_like "a file that inherits permissions from a parent directory"
174
-
175
- end
898
+ # Regression test for http://tickets.opscode.com/browse/CHEF-4419
899
+ context "when the path starts with '/' and target file exists", :windows_only do
900
+ let(:path) do
901
+ File.join(test_file_dir[2..test_file_dir.length], make_tmpname(file_base))
902
+ end
903
+
904
+ before do
905
+ File.open(path, "wb") { |f| f.print expected_content }
906
+ now = Time.now.to_i
907
+ File.utime(now - 9000, now - 9000, path)
176
908
 
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
909
+ @expected_mtime = File.stat(path).mtime
910
+ @expected_checksum = sha256_checksum(path)
911
+ end
182
912
 
183
- resource.run_action(:create)
913
+ describe ":create action should run without any updates" do
914
+ before do
915
+ # Assert starting state is as expected
916
+ File.should exist(path)
917
+ sha256_checksum(path).should == @expected_checksum
918
+ resource.run_action(:create)
919
+ end
920
+
921
+ it "does not overwrite the original when the :create action is run" do
922
+ sha256_checksum(path).should == @expected_checksum
923
+ end
924
+
925
+ it "does not update the mtime of the file when the :create action is run" do
926
+ File.stat(path).mtime.should == @expected_mtime
927
+ end
184
928
 
185
- descriptor.dacl_inherits?.should == true
186
- descriptor.dacl.each do | ace |
187
- ace.inherited?.should == true
929
+ it "is not marked as updated by last action" do
930
+ resource.should_not be_updated_by_last_action
188
931
  end
189
932
  end
190
933
  end
934
+
191
935
  end
192
936
 
193
937
  shared_context Chef::Resource::File do
938
+ if windows?
939
+ require 'chef/win32/file'
940
+ end
941
+
942
+ # We create the files in a different directory than tmp to exercise
943
+ # different file deployment strategies more completely.
944
+ let(:test_file_dir) do
945
+ if windows?
946
+ File.join(ENV['systemdrive'], "test-dir")
947
+ else
948
+ File.join(CHEF_SPEC_DATA, "test-dir")
949
+ end
950
+ end
951
+
194
952
  let(:path) do
195
- File.join(Dir.tmpdir, make_tmpname(file_base, nil))
953
+ File.join(test_file_dir, make_tmpname(file_base))
954
+ end
955
+
956
+ before do
957
+ FileUtils::mkdir_p(test_file_dir)
196
958
  end
197
959
 
198
960
  after(:each) do
199
961
  FileUtils.rm_r(path) if File.exists?(path)
200
962
  FileUtils.rm_r(CHEF_SPEC_BACKUP_PATH) if File.exists?(CHEF_SPEC_BACKUP_PATH)
201
963
  end
964
+
965
+ after do
966
+ FileUtils::rm_rf(test_file_dir)
967
+ end
202
968
  end