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
@@ -324,11 +324,11 @@ describe Chef::Provider::Deploy do
324
324
  @provider.copy_cached_repo
325
325
  end
326
326
 
327
- it "calls the internal callback :release_created when copying the cached repo" do
327
+ it "calls the internal callback :release_created when cleaning up the releases" do
328
328
  FileUtils.stub!(:mkdir_p)
329
329
  FileUtils.stub!(:cp_r)
330
330
  @provider.should_receive(:release_created)
331
- @provider.copy_cached_repo
331
+ @provider.cleanup!
332
332
  end
333
333
 
334
334
  it "chowns the whole release dir to user and group specified in the resource" do
@@ -36,80 +36,112 @@ describe Chef::Provider::Directory do
36
36
  @directory = Chef::Provider::Directory.new(@new_resource, @run_context)
37
37
  end
38
38
 
39
- context "load_current_resource_attrs", :unix_only do
40
- it "should load the current resource based on the new resource" do
41
- File.stub!(:exist?).and_return(true)
39
+
40
+ describe "scanning file security metadata on windows" do
41
+ before do
42
+ end
43
+
44
+ it "describes the directory's access rights" do
45
+ pending
46
+ end
47
+ end
48
+
49
+ describe "scanning file security metadata on unix" do
50
+ before do
51
+ Chef::Platform.stub!(:windows?).and_return(false)
52
+ end
53
+ let(:mock_stat) do
42
54
  cstats = mock("stats")
43
55
  cstats.stub!(:uid).and_return(500)
44
56
  cstats.stub!(:gid).and_return(500)
45
57
  cstats.stub!(:mode).and_return(0755)
46
- File.should_receive(:stat).twice.and_return(cstats)
47
- @directory.load_current_resource
48
- @directory.current_resource.path.should eql(@new_resource.path)
49
- @directory.current_resource.owner.should eql(500)
50
- @directory.current_resource.group.should eql(500)
51
- @directory.current_resource.mode.should == 00755
58
+ cstats
52
59
  end
53
-
54
- it "should create a new directory on create, setting updated to true" do
55
- @new_resource.path "/tmp/foo"
56
-
57
- File.should_receive(:exist?).exactly(3).and_return(false)
58
- Dir.should_receive(:mkdir).with(@new_resource.path).once.and_return(true)
59
-
60
- @directory.should_receive(:set_all_access_controls)
61
- @directory.stub!(:update_new_file_state)
62
- @directory.run_action(:create)
63
- @directory.new_resource.should be_updated
64
- end
65
-
66
- it "should raise an exception if the parent directory does not exist and recursive is false" do
67
- @new_resource.path "/tmp/some/dir"
68
- @new_resource.recursive false
69
- lambda { @directory.run_action(:create) }.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
70
- end
71
-
72
- it "should create a new directory when parent directory does not exist if recursive is true and permissions are correct" do
73
- @new_resource.path "/path/to/dir"
74
- @new_resource.recursive true
75
- File.should_receive(:exist?).with(@new_resource.path).ordered.and_return(false)
76
- File.should_receive(:exist?).with(@new_resource.path).ordered.and_return(false)
77
-
78
- File.should_receive(:exist?).with('/path/to').ordered.and_return(false)
79
- File.should_receive(:exist?).with('/path').ordered.and_return(true)
80
- File.should_receive(:writable?).with('/path').ordered.and_return(true)
81
- File.should_receive(:exist?).with(@new_resource.path).ordered.and_return(false)
82
-
83
- FileUtils.should_receive(:mkdir_p).with(@new_resource.path).and_return(true)
84
- @directory.should_receive(:set_all_access_controls)
85
- @directory.stub!(:update_new_file_state)
86
- @directory.run_action(:create)
87
- @new_resource.should be_updated
60
+
61
+ it "describes the access mode as a String of octal integers" do
62
+ File.stub!(:exists?).and_return(true)
63
+ File.should_receive(:stat).and_return(mock_stat)
64
+ @directory.load_current_resource
65
+ @directory.current_resource.mode.should == "0755"
88
66
  end
89
-
90
- # it "should raise an error when creating a directory recursively and permissions do not allow creation" do
91
-
92
- # end
93
-
94
- it "should raise an error when creating a directory when parent directory is a file" do
95
- File.should_receive(:directory?).and_return(false)
96
- Dir.should_not_receive(:mkdir).with(@new_resource.path)
97
- lambda { @directory.run_action(:create) }.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
98
- @directory.new_resource.should_not be_updated
67
+
68
+ context "when user and group are specified with UID/GID" do
69
+ it "describes the current owner and group as UID and GID" do
70
+ File.stub!(:exists?).and_return(true)
71
+ File.should_receive(:stat).and_return(mock_stat)
72
+ @directory.load_current_resource
73
+ @directory.current_resource.path.should eql(@new_resource.path)
74
+ @directory.current_resource.owner.should eql(500)
75
+ @directory.current_resource.group.should eql(500)
76
+ end
99
77
  end
100
-
101
- it "should not create the directory if it already exists" do
102
- stub_file_cstats
103
- @new_resource.path "/tmp/foo"
104
- File.should_receive(:exist?).exactly(3).and_return(true)
105
- Dir.should_not_receive(:mkdir).with(@new_resource.path)
106
- @directory.should_receive(:set_all_access_controls)
107
- @directory.run_action(:create)
78
+
79
+ context "when user/group are specified with user/group names" do
108
80
  end
109
81
  end
110
82
 
111
- context "load_current_resource_attrs", :windows_only do
112
- pending "CHEF-3557: Fix implicit resource change collection on Windows"
83
+ # Unix only for now. While file security attribute reporting for windows is
84
+ # disabled, unix and windows differ in the number of exists? calls that are
85
+ # made by the provider.
86
+ it "should create a new directory on create, setting updated to true", :unix_only do
87
+ @new_resource.path "/tmp/foo"
88
+
89
+ File.should_receive(:exists?).at_least(:once).and_return(false)
90
+ File.should_receive(:directory?).with("/tmp").and_return(true)
91
+ Dir.should_receive(:mkdir).with(@new_resource.path).once.and_return(true)
92
+
93
+ @directory.should_receive(:do_acl_changes)
94
+ @directory.stub!(:do_selinux)
95
+ @directory.run_action(:create)
96
+ @directory.new_resource.should be_updated
97
+ end
98
+
99
+ it "should raise an exception if the parent directory does not exist and recursive is false" do
100
+ @new_resource.path "/tmp/some/dir"
101
+ @new_resource.recursive false
102
+ lambda { @directory.run_action(:create) }.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
103
+ end
104
+
105
+ # Unix only for now. While file security attribute reporting for windows is
106
+ # disabled, unix and windows differ in the number of exists? calls that are
107
+ # made by the provider.
108
+ it "should create a new directory when parent directory does not exist if recursive is true and permissions are correct", :unix_only do
109
+ @new_resource.path "/path/to/dir"
110
+ @new_resource.recursive true
111
+ File.should_receive(:exists?).with(@new_resource.path).ordered.and_return(false)
112
+
113
+ File.should_receive(:exists?).with('/path/to').ordered.and_return(false)
114
+ File.should_receive(:exists?).with('/path').ordered.and_return(true)
115
+ File.should_receive(:writable?).with('/path').ordered.and_return(true)
116
+ File.should_receive(:exists?).with(@new_resource.path).ordered.and_return(false)
117
+
118
+ FileUtils.should_receive(:mkdir_p).with(@new_resource.path).and_return(true)
119
+ @directory.should_receive(:do_acl_changes)
120
+ @directory.stub!(:do_selinux)
121
+ @directory.run_action(:create)
122
+ @new_resource.should be_updated
123
+ end
124
+
125
+
126
+ it "should raise an error when creating a directory when parent directory is a file" do
127
+ File.should_receive(:directory?).and_return(false)
128
+ Dir.should_not_receive(:mkdir).with(@new_resource.path)
129
+ lambda { @directory.run_action(:create) }.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
130
+ @directory.new_resource.should_not be_updated
131
+ end
132
+
133
+ # Unix only for now. While file security attribute reporting for windows is
134
+ # disabled, unix and windows differ in the number of exists? calls that are
135
+ # made by the provider.
136
+ it "should not create the directory if it already exists", :unix_only do
137
+ stub_file_cstats
138
+ @new_resource.path "/tmp/foo"
139
+ File.should_receive(:directory?).at_least(:once).and_return(true)
140
+ File.should_receive(:writable?).with("/tmp").and_return(true)
141
+ File.should_receive(:exists?).at_least(:once).and_return(true)
142
+ Dir.should_not_receive(:mkdir).with(@new_resource.path)
143
+ @directory.should_receive(:do_acl_changes)
144
+ @directory.run_action(:create)
113
145
  end
114
146
 
115
147
  it "should delete the directory if it exists, and is writable with action_delete" do
@@ -120,14 +152,14 @@ describe Chef::Provider::Directory do
120
152
  end
121
153
 
122
154
  it "should raise an exception if it cannot delete the directory due to bad permissions" do
123
- File.stub!(:exist?).and_return(true)
155
+ File.stub!(:exists?).and_return(true)
124
156
  File.stub!(:writable?).and_return(false)
125
157
  lambda { @directory.run_action(:delete) }.should raise_error(RuntimeError)
126
158
  end
127
159
 
128
160
  it "should take no action when deleting a target directory that does not exist" do
129
161
  @new_resource.path "/an/invalid/path"
130
- File.stub!(:exist?).and_return(false)
162
+ File.stub!(:exists?).and_return(false)
131
163
  Dir.should_not_receive(:delete).with(@new_resource.path)
132
164
  @directory.run_action(:delete)
133
165
  @directory.new_resource.should_not be_updated
@@ -136,7 +168,7 @@ describe Chef::Provider::Directory do
136
168
  it "should raise an exception when deleting a directory when target directory is a file" do
137
169
  stub_file_cstats
138
170
  @new_resource.path "/an/invalid/path"
139
- File.stub!(:exist?).and_return(true)
171
+ File.stub!(:exists?).and_return(true)
140
172
  File.should_receive(:directory?).and_return(false)
141
173
  Dir.should_not_receive(:delete).with(@new_resource.path)
142
174
  lambda { @directory.run_action(:delete) }.should raise_error(RuntimeError)
@@ -81,7 +81,7 @@ describe Chef::Provider::Env do
81
81
  @provider.action_create
82
82
  end
83
83
 
84
- it "should set the new_resources updated flag when it creates the key" do
84
+ it "should set the the new_resources updated flag when it creates the key" do
85
85
  @provider.action_create
86
86
  @new_resource.should be_updated
87
87
  end
@@ -99,7 +99,7 @@ describe Chef::Provider::Env do
99
99
  @provider.action_create
100
100
  end
101
101
 
102
- it "should set the new_resources updated flag when it updates an existing value" do
102
+ it "should set the the new_resources updated flag when it updates an existing value" do
103
103
  @provider.key_exists = true
104
104
  @provider.stub!(:compare_value).and_return(true)
105
105
  @provider.stub!(:modify_env).and_return(true)
@@ -27,7 +27,7 @@ describe Chef::Provider::Execute do
27
27
  @new_resource = Chef::Resource::Execute.new("foo_resource", @run_context)
28
28
  @new_resource.timeout 3600
29
29
  @new_resource.returns 0
30
- @new_resource.creates "foo_resource"
30
+ @new_resource.creates "/foo_resource"
31
31
  @provider = Chef::Provider::Execute.new(@new_resource, @run_context)
32
32
  @current_resource = Chef::Resource::Ifconfig.new("foo_resource", @run_context)
33
33
  @provider.current_resource = @current_resource
@@ -46,6 +46,7 @@ describe Chef::Provider::Execute do
46
46
  opts[:log_tag] = @new_resource.to_s
47
47
  opts[:live_stream] = STDOUT
48
48
  @provider.should_receive(:shell_out!).with(@new_resource.command, opts)
49
+ Chef::Log.should_not_receive(:warn)
49
50
 
50
51
  @provider.run_action(:run)
51
52
  @new_resource.should be_updated
@@ -55,6 +56,31 @@ describe Chef::Provider::Execute do
55
56
  @provider.stub!(:load_current_resource)
56
57
  File.should_receive(:exists?).with(@new_resource.creates).and_return(true)
57
58
  @provider.should_not_receive(:shell_out!)
59
+ Chef::Log.should_not_receive(:warn)
60
+
61
+ @provider.run_action(:run)
62
+ @new_resource.should_not be_updated
63
+ end
64
+
65
+ it "should respect cwd options for 'creates'" do
66
+ @new_resource.cwd "/tmp"
67
+ @new_resource.creates "foo_resource"
68
+ @provider.stub!(:load_current_resource)
69
+ File.should_receive(:exists?).with(@new_resource.creates).and_return(false)
70
+ File.should_receive(:exists?).with(File.join("/tmp", @new_resource.creates)).and_return(true)
71
+ Chef::Log.should_not_receive(:warn)
72
+ @provider.should_not_receive(:shell_out!)
73
+
74
+ @provider.run_action(:run)
75
+ @new_resource.should_not be_updated
76
+ end
77
+
78
+ it "should warn if user specified relative path without cwd" do
79
+ @new_resource.creates "foo_resource"
80
+ @provider.stub!(:load_current_resource)
81
+ Chef::Log.should_receive(:warn).with(/relative path/)
82
+ File.should_receive(:exists?).with(@new_resource.creates).and_return(true)
83
+ @provider.should_not_receive(:shell_out!)
58
84
 
59
85
  @provider.run_action(:run)
60
86
  @new_resource.should_not be_updated
@@ -0,0 +1,101 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Chef::Provider::File::Content do
22
+
23
+ before(:all) do
24
+ @original_config = Chef::Config.configuration
25
+ end
26
+
27
+ after(:all) do
28
+ Chef::Config.configuration.replace(@original_config)
29
+ end
30
+
31
+ #
32
+ # mock setup
33
+ #
34
+
35
+ let(:current_resource) do
36
+ mock("Chef::Provider::File::Resource (current)")
37
+ end
38
+
39
+ let(:enclosing_directory) {
40
+ canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
41
+ }
42
+ let(:resource_path) {
43
+ canonicalize_path(File.expand_path(File.join(enclosing_directory, "seattle.txt")))
44
+ }
45
+
46
+ let(:new_resource) do
47
+ mock("Chef::Provider::File::Resource (new)", :name => "seattle.txt", :path => resource_path)
48
+ end
49
+
50
+ let(:run_context) do
51
+ mock("Chef::RunContext")
52
+ end
53
+
54
+ #
55
+ # subject
56
+ #
57
+ let(:content) do
58
+ Chef::Provider::File::Content.new(new_resource, current_resource, run_context)
59
+ end
60
+
61
+ describe "when the resource has a content attribute set" do
62
+
63
+ before do
64
+ new_resource.stub!(:content).and_return("Do do do do, do do do do, do do do do, do do do do")
65
+ end
66
+
67
+ it "returns a tempfile" do
68
+ content.tempfile.should be_a_kind_of(Tempfile)
69
+ end
70
+
71
+ it "the tempfile contents should match the resource contents" do
72
+ IO.read(content.tempfile.path).should == new_resource.content
73
+ end
74
+
75
+ it "returns a tempfile in the tempdir when :file_staging_uses_destdir is not set" do
76
+ Chef::Config[:file_staging_uses_destdir] = false
77
+ content.tempfile.path.start_with?(Dir::tmpdir).should be_true
78
+ canonicalize_path(content.tempfile.path).start_with?(enclosing_directory).should be_false
79
+ end
80
+
81
+ it "returns a tempfile in the destdir when :file_desployment_uses_destdir is not set" do
82
+ Chef::Config[:file_staging_uses_destdir] = true
83
+ content.tempfile.path.start_with?(Dir::tmpdir).should be_false
84
+ canonicalize_path(content.tempfile.path).start_with?(enclosing_directory).should be_true
85
+ end
86
+
87
+ end
88
+
89
+ describe "when the resource does not have a content attribute set" do
90
+
91
+ before do
92
+ new_resource.stub!(:content).and_return(nil)
93
+ end
94
+
95
+ it "should return nil instead of a tempfile" do
96
+ content.tempfile.should be_nil
97
+ end
98
+
99
+ end
100
+ end
101
+
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
3
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008-2013 Opscode, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,490 +17,39 @@
16
17
  # limitations under the License.
17
18
  #
18
19
 
19
-
20
- require 'spec_helper'
21
- require 'tmpdir'
20
+ require 'support/shared/unit/provider/file'
22
21
 
23
22
  describe Chef::Provider::File do
24
- before(:each) do
25
- @node = Chef::Node.new
26
- @node.name "latte"
27
- @events = Chef::EventDispatch::Dispatcher.new
28
- @run_context = Chef::RunContext.new(@node, {}, @events)
29
-
30
- @resource = Chef::Resource::File.new("seattle")
31
- @resource.path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates", "seattle.txt")))
32
-
33
- @provider = Chef::Provider::File.new(@resource, @run_context)
34
- end
35
-
36
- it "should return a Chef::Provider::File" do
37
- @provider.should be_a_kind_of(Chef::Provider::File)
38
- end
39
-
40
- it "should store the resource passed to new as new_resource" do
41
- @provider.new_resource.should eql(@resource)
42
- end
43
-
44
- it "should store the node passed to new as node" do
45
- @provider.node.should eql(@node)
46
- end
47
-
48
- it "should load a current resource based on the one specified at construction" do
49
- @provider.load_current_resource
50
- @provider.current_resource.should be_a_kind_of(Chef::Resource::File)
51
- @provider.current_resource.name.should eql(@resource.name)
52
- @provider.current_resource.path.should eql(@resource.path)
53
- @provider.current_resource.content.should eql(nil)
54
- end
55
-
56
- context "load_current_resource_attrs", :unix_only do
57
- it "should collect the current state of the file on the filesystem and populate current_resource" do
58
- # test setup
59
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
60
- ::File.should_receive(:stat).exactly(2).with(@resource.path).and_return(stat_struct)
61
-
62
- # test execution
63
- @provider.load_current_resource
64
-
65
- # post-condition checks
66
- @provider.current_resource.mode.should == 0600
67
- @provider.current_resource.owner.should == 0
68
- @provider.current_resource.group.should == 0
69
- end
70
-
71
- it "should NOT update the new_resource state with the current_resourse state if new_resource state is already specified" do
72
- # test setup
73
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
74
- ::File.should_receive(:stat).exactly(2).with(@resource.path).and_return(stat_struct)
75
-
76
- @provider.new_resource.group(1)
77
- @provider.new_resource.owner(1)
78
- @provider.new_resource.mode(0644)
79
-
80
- # test execution
81
- @provider.load_current_resource
82
-
83
- # post-condition checks
84
- @provider.new_resource.group.should == 1
85
- @provider.new_resource.owner.should == 1
86
- @provider.new_resource.mode.should == 0644
87
- end
88
-
89
- it "should update the new_resource state with the current_resource state if the new_resource state is not specified." do
90
- # test setup
91
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
92
- ::File.should_receive(:stat).exactly(2).with(@resource.path).and_return(stat_struct)
93
23
 
94
- @provider.new_resource.group(nil)
95
- @provider.new_resource.owner(nil)
96
- @provider.new_resource.mode(nil)
97
-
98
- # test execution
99
- @provider.load_current_resource
100
-
101
- # post-condition checks
102
- @provider.new_resource.group.should eql(@provider.current_resource.group)
103
- @provider.new_resource.owner.should eql(@provider.current_resource.owner)
104
- @provider.new_resource.mode.should eql(@provider.current_resource.mode)
105
- end
106
-
107
- it "should update the new_resource when attempting to set the new state" do
108
- # test setup
109
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
110
- # called once in update_new_file_state and once in checksum
111
- ::File.should_receive(:stat).twice.with(@provider.new_resource.path).and_return(stat_struct)
112
- ::File.should_receive(:directory?).once.with(@provider.new_resource.path).and_return(false)
113
-
114
- @provider.new_resource.group(nil)
115
- @provider.new_resource.owner(nil)
116
- @provider.new_resource.mode(nil)
117
-
118
- # test exectution
119
- @provider.update_new_file_state
120
-
121
- # post-condition checks
122
- @provider.new_resource.group.should == 0
123
- @provider.new_resource.owner.should == 0
124
- @provider.new_resource.mode.should == 0600
125
- end
126
- end
127
-
128
- context "load_current_resource_attrs", :windows_only do
129
- pending "CHEF-3557: Fix implicit resource change collection on Windows"
130
- end
131
-
132
- it "should load a mostly blank current resource if the file specified in new_resource doesn't exist/isn't readable" do
24
+ let(:resource) do
25
+ # need to check for/against mutating state within the new_resource, so don't mock
133
26
  resource = Chef::Resource::File.new("seattle")
134
- resource.path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates", "woot.txt")))
135
- node = Chef::Node.new
136
- node.name "latte"
137
- provider = Chef::Provider::File.new(resource, @run_context)
138
- provider.load_current_resource
139
- provider.current_resource.should be_a_kind_of(Chef::Resource::File)
140
- provider.current_resource.name.should eql(resource.name)
141
- provider.current_resource.path.should eql(resource.path)
27
+ resource.path(resource_path)
28
+ resource
142
29
  end
143
30
 
144
- it "should not backup symbolic links on delete" do
145
- path = File.expand_path(File.join(CHEF_SPEC_DATA, "detroit.txt"))
146
- ::File.open(path, "w") do |file|
147
- file.write("Detroit's not so nice, so you should come to Seattle instead and buy me a beer instead.")
148
- end
149
- @resource = Chef::Resource::File.new("detroit")
150
- @resource.path(path)
151
- @node = Chef::Node.new
152
- @node.name "latte"
153
- @provider = Chef::Provider::File.new(@resource, @run_context)
154
-
155
- ::File.stub!(:symlink?).and_return(true)
156
- @provider.should_not_receive(:backup)
157
- @provider.run_action(:delete)
158
- @resource.should be_updated_by_last_action
159
- end
160
-
161
- it "should compare the current content with the requested content" do
162
- @provider.load_current_resource
163
-
164
- @provider.new_resource.content "foobar"
165
- @provider.compare_content.should eql(false)
166
-
167
- @provider.new_resource.content IO.read(@resource.path)
168
- @provider.compare_content.should eql(true)
31
+ let(:content) do
32
+ content = mock('Chef::Provider::File::Content')
169
33
  end
170
34
 
171
- it "should set the content of the file to the requested content" do
172
- io = StringIO.new
173
- @provider.load_current_resource
174
- @provider.new_resource.content "foobar"
175
- @provider.should_receive(:diff_current_from_content).and_return("")
176
- @provider.should_receive(:backup)
177
- File.should_receive(:open).with(@provider.new_resource.path, "w").and_yield(io)
178
- @provider.set_content
179
- io.string.should == "foobar"
180
- end
35
+ let(:node) { double('Chef::Node') }
36
+ let(:events) { double('Chef::Events').as_null_object } # mock all the methods
37
+ let(:run_context) { double('Chef::RunContext', :node => node, :events => events) }
38
+ let(:enclosing_directory) {
39
+ canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
40
+ }
41
+ let(:resource_path) {
42
+ canonicalize_path(File.expand_path(File.join(enclosing_directory, "seattle.txt")))
43
+ }
181
44
 
182
- it "should not set the content of the file if it already matches the requested content" do
183
- @provider.load_current_resource
184
- @provider.new_resource.content IO.read(@resource.path)
185
- File.stub!(:open).and_return(1)
186
- File.should_not_receive(:open).with(@provider.new_resource.path, "w")
187
- lambda { @provider.set_content }.should_not raise_error
188
- @resource.should_not be_updated_by_last_action
189
- end
45
+ # Subject
190
46
 
191
- it "should create the file if it is missing, then set the attributes on action_create" do
192
- @provider.load_current_resource
193
- @provider.stub!(:update_new_file_state)
194
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
195
- @provider.access_controls.should_receive(:set_all)
196
- @provider.should_receive(:diff_current_from_content).and_return("")
197
- File.stub!(:open).and_return(1)
198
- #File.should_receive(:directory?).with("/tmp").and_return(true)
199
- File.should_receive(:open).with(@provider.new_resource.path, "w+")
200
- @provider.run_action(:create)
201
- @resource.should be_updated_by_last_action
47
+ let(:provider) do
48
+ provider = described_class.new(resource, run_context)
49
+ provider.stub!(:content).and_return(content)
50
+ provider
202
51
  end
203
52
 
204
- it "should create the file with the proper content if it is missing, then set attributes on action_create" do
205
- io = StringIO.new
206
- @provider.load_current_resource
207
- @provider.new_resource.content "foobar"
208
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
209
- @provider.should_receive(:diff_current_from_content).and_return("")
210
- @provider.stub!(:update_new_file_state)
211
- File.should_receive(:open).with(@provider.new_resource.path, "w+").and_yield(io)
212
- @provider.access_controls.should_receive(:set_all)
213
- @provider.run_action(:create)
214
- io.string.should == "foobar"
215
- @resource.should be_updated_by_last_action
216
- end
217
-
218
- it "should delete the file if it exists and is writable on action_delete" do
219
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
220
- @provider.stub!(:backup).and_return(true)
221
- File.should_receive("exists?").exactly(2).times.with(@provider.new_resource.path).and_return(true)
222
- File.should_receive("writable?").with(@provider.new_resource.path).and_return(true)
223
- File.should_receive(:delete).with(@provider.new_resource.path).and_return(true)
224
- @provider.run_action(:delete)
225
- @resource.should be_updated_by_last_action
226
- end
227
-
228
- it "should not raise an error if it cannot delete the file because it does not exist" do
229
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
230
- @provider.stub!(:backup).and_return(true)
231
- File.should_receive("exists?").exactly(2).times.with(@provider.new_resource.path).and_return(false)
232
- lambda { @provider.run_action(:delete) }.should_not raise_error()
233
- @resource.should_not be_updated_by_last_action
234
- end
235
-
236
- it "should update the atime/mtime on action_touch" do
237
- @provider.load_current_resource
238
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
239
- @provider.should_receive(:diff_current_from_content).and_return("")
240
- @provider.stub!(:update_new_file_state)
241
- File.should_receive(:utime).once.and_return(1)
242
- File.stub!(:open).and_return(1)
243
- @provider.access_controls.should_receive(:set_all).once
244
- @provider.run_action(:touch)
245
- @resource.should be_updated_by_last_action
246
- end
247
-
248
- it "should keep 1 backup copy if specified" do
249
- @provider.load_current_resource
250
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
251
- @provider.new_resource.stub!(:backup).and_return(1)
252
- Dir.stub!(:[]).and_return([ "/tmp/s-20080705111233", "/tmp/s-20080705111232", "/tmp/s-20080705111223"])
253
- FileUtils.should_receive(:rm).with("/tmp/s-20080705111223").once.and_return(true)
254
- FileUtils.should_receive(:rm).with("/tmp/s-20080705111232").once.and_return(true)
255
- FileUtils.stub!(:cp).and_return(true)
256
- FileUtils.stub!(:mkdir_p).and_return(true)
257
- File.stub!(:exist?).and_return(true)
258
- @provider.backup
259
- end
260
-
261
- it "should backup a file no more than :backup times" do
262
- @provider.load_current_resource
263
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
264
- @provider.new_resource.stub!(:backup).and_return(2)
265
- Dir.stub!(:[]).and_return([ "/tmp/s-20080705111233", "/tmp/s-20080705111232", "/tmp/s-20080705111223"])
266
- FileUtils.should_receive(:rm).with("/tmp/s-20080705111223").once.and_return(true)
267
- FileUtils.stub!(:cp).and_return(true)
268
- FileUtils.stub!(:mkdir_p).and_return(true)
269
- File.stub!(:exist?).and_return(true)
270
- @provider.backup
271
- end
272
-
273
- it "should not attempt to backup a file if :backup == 0" do
274
- @provider.load_current_resource
275
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
276
- @provider.new_resource.stub!(:backup).and_return(0)
277
- FileUtils.stub!(:cp).and_return(true)
278
- File.stub!(:exist?).and_return(true)
279
- FileUtils.should_not_receive(:cp)
280
- @provider.backup
281
- end
282
-
283
- it "should put the backup backup file in the directory specified by Chef::Config[:file_backup_path]" do
284
- @provider.load_current_resource
285
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
286
- @provider.new_resource.stub!(:backup).and_return(1)
287
- Chef::Config.stub!(:[]).with(:file_backup_path).and_return("/some_prefix")
288
- Dir.stub!(:[]).and_return([ "/some_prefix/tmp/s-20080705111233", "/some_prefix/tmp/s-20080705111232", "/some_prefix/tmp/s-20080705111223"])
289
- FileUtils.should_receive(:mkdir_p).with("/some_prefix/tmp").once
290
- FileUtils.should_receive(:rm).with("/some_prefix/tmp/s-20080705111232").once.and_return(true)
291
- FileUtils.should_receive(:rm).with("/some_prefix/tmp/s-20080705111223").once.and_return(true)
292
- FileUtils.stub!(:cp).and_return(true)
293
- File.stub!(:exist?).and_return(true)
294
- @provider.backup
295
- end
296
-
297
- it "should strip the drive letter from the backup resource path (for Windows platforms)" do
298
- @provider.load_current_resource
299
- @provider.new_resource.stub!(:path).and_return("C:/tmp/s-20080705111233")
300
- @provider.new_resource.stub!(:backup).and_return(1)
301
- Chef::Config.stub!(:[]).with(:file_backup_path).and_return("C:/some_prefix")
302
- Dir.stub!(:[]).and_return([ "C:/some_prefix/tmp/s-20080705111233", "C:/some_prefix/tmp/s-20080705111232", "C:/some_prefix/tmp/s-20080705111223"])
303
- FileUtils.should_receive(:mkdir_p).with("C:/some_prefix/tmp").once
304
- FileUtils.should_receive(:rm).with("C:/some_prefix/tmp/s-20080705111232").once.and_return(true)
305
- FileUtils.should_receive(:rm).with("C:/some_prefix/tmp/s-20080705111223").once.and_return(true)
306
- FileUtils.stub!(:cp).and_return(true)
307
- File.stub!(:exist?).and_return(true)
308
- @provider.backup
309
- end
310
-
311
- it "should keep the same ownership on backed up files" do
312
- @provider.load_current_resource
313
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
314
- @provider.new_resource.stub!(:backup).and_return(1)
315
- Chef::Config.stub!(:[]).with(:file_backup_path).and_return("/some_prefix")
316
- Dir.stub!(:[]).and_return([ "/some_prefix/tmp/s-20080705111233", "/some_prefix/tmp/s-20080705111232", "/some_prefix/tmp/s-20080705111223"])
317
- FileUtils.stub!(:mkdir_p).and_return(true)
318
- FileUtils.stub!(:rm).and_return(true)
319
- File.stub!(:exist?).and_return(true)
320
- Time.stub!(:now).and_return(Time.at(1272147455).getgm)
321
- FileUtils.should_receive(:cp).with("/tmp/s-20080705111233", "/some_prefix/tmp/s-20080705111233.chef-20100424221735", {:preserve => true}).and_return(true)
322
- @provider.backup
323
- end
324
-
325
- describe "when the enclosing directory does not exist" do
326
- before do
327
- @resource.path("/tmp/no-such-path/file.txt")
328
- end
329
-
330
- it "raises a specific error describing the problem" do
331
- lambda {@provider.run_action(:create)}.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
332
- end
333
- end
334
-
335
- describe "when creating a file which may be missing" do
336
- it "should not call action create if the file exists" do
337
- @resource.path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates", "seattle.txt")))
338
- @provider = Chef::Provider::File.new(@resource, @run_context)
339
- File.should_not_receive(:open)
340
- @provider.run_action(:create_if_missing)
341
- @resource.should_not be_updated_by_last_action
342
- end
343
-
344
- it "should call action create if the does not file exist" do
345
- @resource.path("/tmp/example-dir/non_existant_file")
346
- @provider = Chef::Provider::File.new(@resource, @run_context)
347
- @provider.should_receive(:diff_current_from_content).and_return("")
348
- ::File.stub!(:exists?).with(@resource.path).and_return(false)
349
- ::File.stub!(:directory?).with("/tmp/example-dir/non_existant_file").and_return(false)
350
- ::File.stub!(:directory?).with("/tmp/example-dir").and_return(true)
351
- @provider.stub!(:update_new_file_state)
352
- io = StringIO.new
353
- File.should_receive(:open).with(@provider.new_resource.path, "w+").and_yield(io)
354
- #@provider.should_receive(:action_create).and_return(true)
355
- @provider.run_action(:create_if_missing)
356
- @resource.should be_updated_by_last_action
357
- end
358
- end
359
-
360
- describe "when a diff is requested", :uses_diff => true do
361
-
362
- before(:each) do
363
- @original_config = Chef::Config.hash_dup
364
- end
365
-
366
- after(:each) do
367
- Chef::Config.configuration = @original_config if @original_config
368
- end
369
-
370
- describe "when identifying files as binary or text" do
371
-
372
- it "should identify zero-length files as text" do
373
- Tempfile.open("some-temp") do |file|
374
- @resource.path(file.path)
375
- @provider = Chef::Provider::File.new(@resource, @run_context)
376
- @provider.is_binary?(file.path).should be_false
377
- end
378
- end
379
-
380
- it "should correctly identify text files as being text" do
381
- Tempfile.open("some-temp") do |file|
382
- @resource.path(file.path)
383
- file.puts("This is a text file.")
384
- file.puts("That has a couple of lines in it.")
385
- file.puts("And lets make sure that other printable chars work too: ~!@\#$%^&*()`:\"<>?{}|_+,./;'[]\\-=")
386
- file.close
387
- @provider = Chef::Provider::File.new(@resource, @run_context)
388
- @provider.is_binary?(file.path).should be_false
389
- end
390
- end
391
-
392
- it "should identify a null-terminated string as binary" do
393
- Tempfile.open("some-temp") do |file|
394
- @resource.path(file.path)
395
- file.write("This is a binary file.\0")
396
- file.close
397
- @provider = Chef::Provider::File.new(@resource, @run_context)
398
- @provider.is_binary?(file.path).should be_true
399
- end
400
- end
401
-
402
- end
403
-
404
- it "should not return diff output when chef config has disabled it" do
405
- Chef::Config[:diff_disabled] = true
406
- Tempfile.open("some-temp") do |file|
407
- @resource.path(file.path)
408
- @provider = Chef::Provider::File.new(@resource, @run_context)
409
- @provider.load_current_resource
410
- result = @provider.diff_current_from_content "foo baz"
411
- result.should == [ "(diff output suppressed by config)" ]
412
- @resource.diff.should be_nil
413
- end
414
- end
415
-
416
- it "should not return diff output when there is no new file to compare it to" do
417
- Tempfile.open("some-temp") do |file|
418
- Tempfile.open("other-temp") do |missing_file|
419
- missing_path = missing_file.path
420
- missing_file.close
421
- missing_file.unlink
422
- @resource.path(file.path)
423
- @provider = Chef::Provider::File.new(@resource, @run_context)
424
- @provider.load_current_resource
425
- result = @provider.diff_current missing_path
426
- result.should == [ "(no temp file with new content, diff output suppressed)" ]
427
- @resource.diff.should be_nil
428
- end
429
- end
430
- end
431
-
432
- it "should produce diff output when the file does not exist yet, but suppress reporting it" do
433
- Tempfile.open("some-temp") do |file|
434
- @resource.path(file.path)
435
- file.close
436
- file.unlink
437
- @provider = Chef::Provider::File.new(@resource, @run_context)
438
- @provider.load_current_resource
439
- result = @provider.diff_current_from_content "foo baz"
440
- result.length.should == 4
441
- @resource.diff.should be_nil
442
- end
443
- end
444
-
445
- it "should not produce a diff when the current resource file is above the filesize threshold" do
446
- Chef::Config[:diff_filesize_threshold] = 5
447
- Tempfile.open("some-temp") do |file|
448
- @resource.path(file.path)
449
- file.puts("this is a line which is longer than 5 characters")
450
- file.flush
451
- @provider = Chef::Provider::File.new(@resource, @run_context)
452
- @provider.load_current_resource
453
- result = @provider.diff_current_from_content "foo" # not longer than 5
454
- result.should == [ "(file sizes exceed 5 bytes, diff output suppressed)" ]
455
- @resource.diff.should be_nil
456
- end
457
- end
458
-
459
- it "should not produce a diff when the new content is above the filesize threshold" do
460
- Chef::Config[:diff_filesize_threshold] = 5
461
- Tempfile.open("some-temp") do |file|
462
- @resource.path(file.path)
463
- file.puts("foo")
464
- file.flush
465
- @provider = Chef::Provider::File.new(@resource, @run_context)
466
- @provider.load_current_resource
467
- result = @provider.diff_current_from_content "this is a line that is longer than 5 characters"
468
- result.should == [ "(file sizes exceed 5 bytes, diff output suppressed)" ]
469
- @resource.diff.should be_nil
470
- end
471
- end
472
-
473
- it "should not produce a diff when the generated diff size is above the diff size threshold" do
474
- Chef::Config[:diff_output_threshold] = 5
475
- Tempfile.open("some-temp") do |file|
476
- @resource.path(file.path)
477
- file.puts("some text to increase the size of the diff")
478
- file.flush
479
- @provider = Chef::Provider::File.new(@resource, @run_context)
480
- @provider.load_current_resource
481
- result = @provider.diff_current_from_content "this is a line that is longer than 5 characters"
482
- result.should == [ "(long diff of over 5 characters, diff output suppressed)" ]
483
- @resource.diff.should be_nil
484
- end
485
- end
486
-
487
- it "should return valid diff output when content does not match the string content provided" do
488
- Tempfile.open("some-temp") do |file|
489
- @resource.path file.path
490
- @provider = Chef::Provider::File.new(@resource, @run_context)
491
- @provider.load_current_resource
492
- result = @provider.diff_current_from_content "foo baz"
493
- # remove the file name info which varies.
494
- result.shift(2)
495
- # Result appearance seems to vary slightly under solaris diff
496
- # So we'll compare the second line which is common to both.
497
- # Solaris: -1,1 +1,0 @@, "+foo baz"
498
- # Linux/Mac: -1,0, +1 @@, "+foo baz"
499
- result.length.should == 2
500
- result[1].should == "+foo baz"
501
- @resource.diff.should_not be_nil
502
- end
503
- end
504
- end
53
+ it_behaves_like Chef::Provider::File
505
54
  end
55
+