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,259 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@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
+ require 'chef/mixin/shell_out'
21
+ require 'tmpdir'
22
+ require 'shellwords'
23
+
24
+ # Deploy relies heavily on symlinks, so it doesn't work on windows.
25
+ describe Chef::Resource::Git do
26
+ include Chef::Mixin::ShellOut
27
+ let(:file_cache_path) { Dir.mktmpdir }
28
+ # Some versions of git complains when the deploy directory is
29
+ # already created. Here we intentionally don't create the deploy
30
+ # directory beforehand.
31
+ let(:base_dir_path) { Dir.mktmpdir }
32
+ let(:deploy_directory) { File.join(base_dir_path, make_tmpname("git_base")) }
33
+
34
+ let(:node) do
35
+ Chef::Node.new.tap do |n|
36
+ n.name "rspec-test"
37
+ n.consume_external_attrs(@ohai.data, {})
38
+ end
39
+ end
40
+
41
+ let(:event_dispatch) { Chef::EventDispatch::Dispatcher.new }
42
+ let(:run_context) { Chef::RunContext.new(node, {}, event_dispatch) }
43
+
44
+ # These tests use git's bundle feature, which is a way to export an entire
45
+ # git repo (or subset of commits) as a single file.
46
+ #
47
+ # Generally you can treat a git bundle as a regular git remote.
48
+ #
49
+ # See also: http://git-scm.com/2010/03/10/bundles.html
50
+ #
51
+ # Beware that git bundles don't behave exactly the same as real
52
+ # remotes. To get closer to real remotes, we'll create a local clone
53
+ # of the bundle to use as a remote for the tests. This at least
54
+ # gives the expected responses for ls-remote using git version
55
+ # 1.7.12.4
56
+ let(:git_bundle_repo) { File.expand_path("git_bundles/example-repo.gitbundle", CHEF_SPEC_DATA) }
57
+ let(:origin_repo_dir) { Dir.mktmpdir }
58
+ let(:origin_repo) { "#{origin_repo_dir}/example" }
59
+
60
+ # This is the fourth version
61
+ let(:v1_commit) { "bc5ec79931ae74089aeadca6edc173527613e6d9" }
62
+ let(:v1_tag) { "9b73fb5e316bfaff7b822b0ccb3e1e08f9885085" }
63
+ let(:rev_foo) { "ed181b3419b6f489bedab282348162a110d6d3a1" }
64
+ let(:rev_testing) { "972d153654503bccec29f630c5dd369854a561e8" }
65
+ let(:rev_head) { "d294fbfd05aa7709ad9a9b8ef6343b17d355bf5f"}
66
+
67
+ let(:git_user_config) do
68
+ <<-E
69
+ [user]
70
+ name = frodoTbaggins
71
+ email = frodo@shire.org
72
+ E
73
+ end
74
+
75
+ before(:each) do
76
+ Chef::Log.level = :warn # silence git command live streams
77
+ @old_file_cache_path = Chef::Config[:file_cache_path]
78
+ shell_out!("git clone \"#{git_bundle_repo}\" example", :cwd => origin_repo_dir)
79
+ File.open("#{origin_repo}/.git/config", "a+") {|f| f.print(git_user_config) }
80
+ Chef::Config[:file_cache_path] = file_cache_path
81
+ end
82
+
83
+ after(:each) do
84
+ Chef::Config[:file_cache_path] = @old_file_cache_path
85
+ FileUtils.remove_entry_secure deploy_directory if File.exist?(deploy_directory)
86
+ FileUtils.remove_entry_secure file_cache_path
87
+ end
88
+
89
+ after(:all) do
90
+ FileUtils.remove_entry_secure origin_repo_dir
91
+ end
92
+
93
+ before(:all) do
94
+ @ohai = Ohai::System.new
95
+ @ohai.require_plugin("os")
96
+ end
97
+
98
+ context "working with pathes with special characters" do
99
+ let(:path_with_spaces) { "#{origin_repo_dir}/path with spaces" }
100
+
101
+ before(:each) do
102
+ FileUtils.mkdir(path_with_spaces)
103
+ FileUtils.cp(git_bundle_repo, path_with_spaces)
104
+ end
105
+
106
+ it "clones a repository with a space in the path" do
107
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
108
+ r.repository "#{path_with_spaces}/example-repo.gitbundle"
109
+ end.run_action(:sync)
110
+ end
111
+ end
112
+
113
+ context "when deploying from an annotated tag" do
114
+ let(:basic_git_resource) do
115
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
116
+ r.repository origin_repo
117
+ r.revision "v1.0.0"
118
+ end
119
+ end
120
+
121
+ # We create a copy of the basic_git_resource so that we can run
122
+ # the resource again and verify that it doesn't update.
123
+ let(:copy_git_resource) do
124
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
125
+ r.repository origin_repo
126
+ r.revision "v1.0.0"
127
+ end
128
+ end
129
+
130
+ it "checks out the revision pointed to by the tag commit, not the tag commit itself" do
131
+ basic_git_resource.run_action(:sync)
132
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
133
+ head_rev.should == v1_commit
134
+ # also verify the tag commit itself is what we expect as an extra sanity check
135
+ rev = shell_out!('git rev-parse v1.0.0', :cwd => deploy_directory, :returns => [0]).stdout.strip
136
+ rev.should == v1_tag
137
+ end
138
+
139
+ it "doesn't update if up-to-date" do
140
+ # this used to fail because we didn't resolve the annotated tag
141
+ # properly to the pointed to commit.
142
+ basic_git_resource.run_action(:sync)
143
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
144
+ head_rev.should == v1_commit
145
+
146
+ copy_git_resource.run_action(:sync)
147
+ copy_git_resource.should_not be_updated
148
+ end
149
+ end
150
+
151
+ context "when deploying from a SHA revision" do
152
+ let(:basic_git_resource) do
153
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
154
+ r.repository git_bundle_repo
155
+ end
156
+ end
157
+
158
+ # We create a copy of the basic_git_resource so that we can run
159
+ # the resource again and verify that it doesn't update.
160
+ let(:copy_git_resource) do
161
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
162
+ r.repository origin_repo
163
+ end
164
+ end
165
+
166
+ it "checks out the expected revision ed18" do
167
+ basic_git_resource.revision rev_foo
168
+ basic_git_resource.run_action(:sync)
169
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
170
+ head_rev.should == rev_foo
171
+ end
172
+
173
+ it "doesn't update if up-to-date" do
174
+ basic_git_resource.revision rev_foo
175
+ basic_git_resource.run_action(:sync)
176
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
177
+ head_rev.should == rev_foo
178
+
179
+ copy_git_resource.revision rev_foo
180
+ copy_git_resource.run_action(:sync)
181
+ copy_git_resource.should_not be_updated
182
+ end
183
+
184
+ it "checks out the expected revision 972d" do
185
+ basic_git_resource.revision rev_testing
186
+ basic_git_resource.run_action(:sync)
187
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
188
+ head_rev.should == rev_testing
189
+ end
190
+ end
191
+
192
+ context "when deploying from a revision named 'HEAD'" do
193
+ let(:basic_git_resource) do
194
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
195
+ r.repository origin_repo
196
+ r.revision 'HEAD'
197
+ end
198
+ end
199
+
200
+ it "checks out the expected revision" do
201
+ basic_git_resource.run_action(:sync)
202
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
203
+ head_rev.should == rev_head
204
+ end
205
+ end
206
+
207
+ context "when deploying from the default revision" do
208
+ let(:basic_git_resource) do
209
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
210
+ r.repository origin_repo
211
+ # use default
212
+ end
213
+ end
214
+
215
+ it "checks out HEAD as the default revision" do
216
+ basic_git_resource.run_action(:sync)
217
+ head_rev = shell_out!('git rev-parse HEAD', :cwd => deploy_directory, :returns => [0]).stdout.strip
218
+ head_rev.should == rev_head
219
+ end
220
+ end
221
+
222
+ context "when dealing with a repo with a degenerate tag named 'HEAD'" do
223
+ before do
224
+ shell_out!("git tag -m\"degenerate tag\" HEAD ed181b3419b6f489bedab282348162a110d6d3a1",
225
+ :cwd => origin_repo)
226
+ end
227
+
228
+ let(:basic_git_resource) do
229
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
230
+ r.repository origin_repo
231
+ r.revision 'HEAD'
232
+ end
233
+ end
234
+
235
+ let(:git_resource_default_rev) do
236
+ Chef::Resource::Git.new(deploy_directory, run_context).tap do |r|
237
+ r.repository origin_repo
238
+ # use default of revision
239
+ end
240
+ end
241
+
242
+ it "checks out the (master) HEAD revision and ignores the tag" do
243
+ basic_git_resource.run_action(:sync)
244
+ head_rev = shell_out!('git rev-parse HEAD',
245
+ :cwd => deploy_directory,
246
+ :returns => [0]).stdout.strip
247
+ head_rev.should == rev_head
248
+ end
249
+
250
+ it "checks out the (master) HEAD revision when no revision is specified (ignores tag)" do
251
+ git_resource_default_rev.run_action(:sync)
252
+ head_rev = shell_out!('git rev-parse HEAD',
253
+ :cwd => deploy_directory,
254
+ :returns => [0]).stdout.strip
255
+ head_rev.should == rev_head
256
+ end
257
+
258
+ end
259
+ end
@@ -22,35 +22,56 @@ if windows?
22
22
  require 'chef/win32/file' #probably need this in spec_helper
23
23
  end
24
24
 
25
- describe Chef::Resource::Link, :not_supported_on_win2k3 do
25
+ describe Chef::Resource::Link do
26
26
  let(:file_base) { "file_spec" }
27
27
 
28
- let(:base_dir) do
28
+ let(:expect_updated?) {true}
29
+
30
+ # We create the files in a different directory than tmp to exercise
31
+ # different file deployment strategies more completely.
32
+ let(:test_file_dir) do
29
33
  if windows?
30
- Chef::ReservedNames::Win32::File.get_long_path_name(Dir.tmpdir.gsub('/', '\\'))
34
+ File.join(ENV['systemdrive'], "test-dir")
31
35
  else
32
- Dir.tmpdir
36
+ File.join(CHEF_SPEC_DATA, "test-dir")
33
37
  end
34
38
  end
35
39
 
40
+ before do
41
+ FileUtils::mkdir_p(test_file_dir)
42
+ end
43
+
44
+ after do
45
+ FileUtils::rm_rf(test_file_dir)
46
+ end
47
+
36
48
  let(:to) do
37
- File.join(base_dir, make_tmpname("to_spec", nil))
49
+ File.join(test_file_dir, make_tmpname("to_spec"))
38
50
  end
39
51
  let(:target_file) do
40
- File.join(base_dir, make_tmpname("from_spec", nil))
52
+ File.join(test_file_dir, make_tmpname("from_spec"))
41
53
  end
42
54
 
43
55
  after(:each) do
44
- # TODO Windows fails to clean up some symlinks.
45
56
  begin
46
- FileUtils.rm_r(to) if File.exists?(to)
47
- FileUtils.rm_r(target_file) if File.exists?(target_file)
48
- FileUtils.rm_r(CHEF_SPEC_BACKUP_PATH) if File.exists?(CHEF_SPEC_BACKUP_PATH)
57
+ cleanup_link(to) if File.exists?(to)
58
+ cleanup_link(target_file) if File.exists?(target_file)
59
+ cleanup_link(CHEF_SPEC_BACKUP_PATH) if File.exists?(CHEF_SPEC_BACKUP_PATH)
49
60
  rescue
50
61
  puts "Could not remove a file: #{$!}"
51
62
  end
52
63
  end
53
64
 
65
+ def cleanup_link(path)
66
+ if windows? && File.directory?(path)
67
+ # If the link target is a directory rm_rf doesn't work all the
68
+ # time on windows.
69
+ system "rmdir '#{path}'"
70
+ else
71
+ FileUtils.rm_rf(path)
72
+ end
73
+ end
74
+
54
75
  def canonicalize(path)
55
76
  windows? ? path.gsub('/', '\\') : path
56
77
  end
@@ -95,478 +116,493 @@ describe Chef::Resource::Link, :not_supported_on_win2k3 do
95
116
  resource
96
117
  end
97
118
 
98
- let!(:resource) do
119
+ let(:resource) do
99
120
  create_resource
100
121
  end
101
122
 
102
- shared_examples_for 'delete errors out' do
103
- it 'delete errors out' do
104
- lambda { resource.run_action(:delete) }.should raise_error(Chef::Exceptions::Link)
105
- (File.exist?(target_file) || symlink?(target_file)).should be_true
123
+ describe "when supported on platform", :not_supported_on_win2k3 do
124
+ shared_examples_for 'delete errors out' do
125
+ it 'delete errors out' do
126
+ lambda { resource.run_action(:delete) }.should raise_error(Chef::Exceptions::Link)
127
+ (File.exist?(target_file) || symlink?(target_file)).should be_true
128
+ end
106
129
  end
107
- end
108
130
 
109
- shared_context 'delete is noop' do
110
- describe 'the :delete action' do
111
- before(:each) do
112
- @info = []
113
- Chef::Log.stub!(:info) { |msg| @info << msg }
114
- resource.run_action(:delete)
115
- end
131
+ shared_context 'delete is noop' do
132
+ describe 'the :delete action' do
133
+ before(:each) do
134
+ @info = []
135
+ Chef::Log.stub!(:info) { |msg| @info << msg }
136
+ resource.run_action(:delete)
137
+ end
116
138
 
117
- it 'leaves the file deleted' do
118
- File.exist?(target_file).should be_false
119
- symlink?(target_file).should be_false
120
- end
121
- it 'does not mark the resource updated' do
122
- resource.should_not be_updated
123
- end
124
- it 'does not log that it deleted' do
125
- @info.include?("link[#{target_file}] deleted").should be_false
139
+ it 'leaves the file deleted' do
140
+ File.exist?(target_file).should be_false
141
+ symlink?(target_file).should be_false
142
+ end
143
+ it 'does not mark the resource updated' do
144
+ resource.should_not be_updated
145
+ end
146
+ it 'does not log that it deleted' do
147
+ @info.include?("link[#{target_file}] deleted").should be_false
148
+ end
126
149
  end
127
150
  end
128
- end
129
151
 
130
- shared_context 'delete succeeds' do
131
- describe 'the :delete action' do
132
- before(:each) do
133
- @info = []
134
- Chef::Log.stub!(:info) { |msg| @info << msg }
135
- resource.run_action(:delete)
136
- end
152
+ shared_context 'delete succeeds' do
153
+ describe 'the :delete action' do
154
+ before(:each) do
155
+ @info = []
156
+ Chef::Log.stub!(:info) { |msg| @info << msg }
157
+ resource.run_action(:delete)
158
+ end
137
159
 
138
- it 'deletes the file' do
139
- File.exist?(target_file).should be_false
140
- symlink?(target_file).should be_false
141
- end
142
- it 'marks the resource updated' do
143
- resource.should be_updated
144
- end
145
- it 'logs that it deleted' do
146
- @info.include?("link[#{target_file}] deleted").should be_true
160
+ it 'deletes the file' do
161
+ File.exist?(target_file).should be_false
162
+ symlink?(target_file).should be_false
163
+ end
164
+ it 'marks the resource updated' do
165
+ resource.should be_updated
166
+ end
167
+ it 'logs that it deleted' do
168
+ @info.include?("link[#{target_file}] deleted").should be_true
169
+ end
147
170
  end
148
171
  end
149
- end
150
172
 
151
- shared_context 'create symbolic link succeeds' do
152
- describe 'the :create action' do
153
- before(:each) do
154
- @info = []
155
- Chef::Log.stub!(:info) { |msg| @info << msg }
156
- resource.run_action(:create)
157
- end
173
+ shared_context 'create symbolic link succeeds' do
174
+ describe 'the :create action' do
175
+ before(:each) do
176
+ @info = []
177
+ Chef::Log.stub!(:info) { |msg| @info << msg }
178
+ resource.run_action(:create)
179
+ end
158
180
 
159
- it 'links to the target file' do
160
- symlink?(target_file).should be_true
161
- readlink(target_file).should == canonicalize(to)
162
- end
163
- it 'marks the resource updated' do
164
- resource.should be_updated
165
- end
166
- it 'logs that it created' do
167
- @info.include?("link[#{target_file}] created").should be_true
181
+ it 'links to the target file' do
182
+ symlink?(target_file).should be_true
183
+ readlink(target_file).should == canonicalize(to)
184
+ end
185
+ it 'marks the resource updated' do
186
+ resource.should be_updated
187
+ end
188
+ it 'logs that it created' do
189
+ @info.include?("link[#{target_file}] created").should be_true
190
+ end
168
191
  end
169
192
  end
170
- end
171
193
 
172
- shared_context 'create symbolic link is noop' do
173
- describe 'the :create action' do
174
- before(:each) do
175
- @info = []
176
- Chef::Log.stub!(:info) { |msg| @info << msg }
177
- resource.run_action(:create)
178
- end
194
+ shared_context 'create symbolic link is noop' do
195
+ describe 'the :create action' do
196
+ before(:each) do
197
+ @info = []
198
+ Chef::Log.stub!(:info) { |msg| @info << msg }
199
+ resource.run_action(:create)
200
+ end
179
201
 
180
- it 'leaves the file linked' do
181
- symlink?(target_file).should be_true
182
- readlink(target_file).should == canonicalize(to)
183
- end
184
- it 'does not mark the resource updated' do
185
- resource.should_not be_updated
186
- end
187
- it 'does not log that it created' do
188
- @info.include?("link[#{target_file}] created").should be_false
202
+ it 'leaves the file linked' do
203
+ symlink?(target_file).should be_true
204
+ readlink(target_file).should == canonicalize(to)
205
+ end
206
+ it 'does not mark the resource updated' do
207
+ resource.should_not be_updated
208
+ end
209
+ it 'does not log that it created' do
210
+ @info.include?("link[#{target_file}] created").should be_false
211
+ end
189
212
  end
190
213
  end
191
- end
192
214
 
193
- shared_context 'create hard link succeeds' do
194
- describe 'the :create action' do
195
- before(:each) do
196
- @info = []
197
- Chef::Log.stub!(:info) { |msg| @info << msg }
198
- resource.run_action(:create)
199
- end
200
- it 'preserves the hard link' do
201
- File.exists?(target_file).should be_true
202
- symlink?(target_file).should be_false
203
- # Writing to one hardlinked file should cause both
204
- # to have the new value.
205
- IO.read(to).should == IO.read(target_file)
206
- File.open(to, "w") { |file| file.write('wowzers') }
207
- IO.read(target_file).should == 'wowzers'
208
- end
209
- it 'marks the resource updated' do
210
- resource.should be_updated
211
- end
212
- it 'logs that it created' do
213
- @info.include?("link[#{target_file}] created").should be_true
215
+ shared_context 'create hard link succeeds' do
216
+ describe 'the :create action' do
217
+ before(:each) do
218
+ @info = []
219
+ Chef::Log.stub!(:info) { |msg| @info << msg }
220
+ resource.run_action(:create)
221
+ end
222
+ it 'preserves the hard link' do
223
+ File.exists?(target_file).should be_true
224
+ symlink?(target_file).should be_false
225
+ # Writing to one hardlinked file should cause both
226
+ # to have the new value.
227
+ IO.read(to).should == IO.read(target_file)
228
+ File.open(to, "w") { |file| file.write('wowzers') }
229
+ IO.read(target_file).should == 'wowzers'
230
+ end
231
+ it 'marks the resource updated' do
232
+ resource.should be_updated
233
+ end
234
+ it 'logs that it created' do
235
+ @info.include?("link[#{target_file}] created").should be_true
236
+ end
214
237
  end
215
238
  end
216
- end
217
239
 
218
- shared_context 'create hard link is noop' do
219
- describe 'the :create action' do
220
- before(:each) do
221
- @info = []
222
- Chef::Log.stub!(:info) { |msg| @info << msg }
223
- resource.run_action(:create)
224
- end
225
- it 'links to the target file' do
226
- File.exists?(target_file).should be_true
227
- symlink?(target_file).should be_false
228
- # Writing to one hardlinked file should cause both
229
- # to have the new value.
230
- IO.read(to).should == IO.read(target_file)
231
- File.open(to, "w") { |file| file.write('wowzers') }
232
- IO.read(target_file).should == 'wowzers'
233
- end
234
- it 'does not mark the resource updated' do
235
- resource.should_not be_updated
236
- end
237
- it 'does not log that it created' do
238
- @info.include?("link[#{target_file}] created").should be_false
240
+ shared_context 'create hard link is noop' do
241
+ describe 'the :create action' do
242
+ before(:each) do
243
+ @info = []
244
+ Chef::Log.stub!(:info) { |msg| @info << msg }
245
+ resource.run_action(:create)
246
+ end
247
+ it 'links to the target file' do
248
+ File.exists?(target_file).should be_true
249
+ symlink?(target_file).should be_false
250
+ # Writing to one hardlinked file should cause both
251
+ # to have the new value.
252
+ IO.read(to).should == IO.read(target_file)
253
+ File.open(to, "w") { |file| file.write('wowzers') }
254
+ IO.read(target_file).should == 'wowzers'
255
+ end
256
+ it 'does not mark the resource updated' do
257
+ resource.should_not be_updated
258
+ end
259
+ it 'does not log that it created' do
260
+ @info.include?("link[#{target_file}] created").should be_false
261
+ end
239
262
  end
240
263
  end
241
- end
242
264
 
243
- context "is symbolic" do
265
+ context "is symbolic" do
244
266
 
245
- context 'when the link destination is a file' do
246
- before(:each) do
247
- File.open(to, "w") do |file|
248
- file.write('woohoo')
267
+ context 'when the link destination is a file' do
268
+ before(:each) do
269
+ File.open(to, "w") do |file|
270
+ file.write('woohoo')
271
+ end
249
272
  end
250
- end
251
- context 'and the link does not yet exist' do
252
- include_context 'create symbolic link succeeds'
253
- include_context 'delete is noop'
254
- end
255
- context 'and the link already exists and is a symbolic link' do
256
- context 'pointing at the target' do
257
- before(:each) do
258
- symlink(to, target_file)
259
- symlink?(target_file).should be_true
260
- readlink(target_file).should == canonicalize(to)
273
+ context 'and the link does not yet exist' do
274
+ include_context 'create symbolic link succeeds'
275
+ include_context 'delete is noop'
276
+ end
277
+ context 'and the link already exists and is a symbolic link' do
278
+ context 'pointing at the target' do
279
+ before(:each) do
280
+ symlink(to, target_file)
281
+ symlink?(target_file).should be_true
282
+ readlink(target_file).should == canonicalize(to)
283
+ end
284
+ include_context 'create symbolic link is noop'
285
+ include_context 'delete succeeds'
286
+ it 'the :delete action does not delete the target file' do
287
+ resource.run_action(:delete)
288
+ File.exists?(to).should be_true
289
+ end
261
290
  end
262
- include_context 'create symbolic link is noop'
263
- include_context 'delete succeeds'
264
- it 'the :delete action does not delete the target file' do
265
- resource.run_action(:delete)
266
- File.exists?(to).should be_true
291
+ context 'pointing somewhere else' do
292
+ before(:each) do
293
+ @other_target = File.join(test_file_dir, make_tmpname('other_spec'))
294
+ File.open(@other_target, 'w') { |file| file.write('eek') }
295
+ symlink(@other_target, target_file)
296
+ symlink?(target_file).should be_true
297
+ readlink(target_file).should == canonicalize(@other_target)
298
+ end
299
+ after(:each) do
300
+ File.delete(@other_target)
301
+ end
302
+ include_context 'create symbolic link succeeds'
303
+ include_context 'delete succeeds'
304
+ it 'the :delete action does not delete the target file' do
305
+ resource.run_action(:delete)
306
+ File.exists?(to).should be_true
307
+ end
308
+ end
309
+ context 'pointing nowhere' do
310
+ before(:each) do
311
+ nonexistent = File.join(test_file_dir, make_tmpname('nonexistent_spec'))
312
+ symlink(nonexistent, target_file)
313
+ symlink?(target_file).should be_true
314
+ readlink(target_file).should == canonicalize(nonexistent)
315
+ end
316
+ include_context 'create symbolic link succeeds'
317
+ include_context 'delete succeeds'
267
318
  end
268
319
  end
269
- context 'pointing somewhere else' do
320
+ context 'and the link already exists and is a hard link to the file' do
270
321
  before(:each) do
271
- @other_target = File.join(base_dir, make_tmpname('other_spec', nil))
272
- File.open(@other_target, 'w') { |file| file.write('eek') }
273
- symlink(@other_target, target_file)
274
- symlink?(target_file).should be_true
275
- readlink(target_file).should == @other_target
276
- end
277
- after(:each) do
278
- File.delete(@other_target)
322
+ link(to, target_file)
323
+ File.exists?(target_file).should be_true
324
+ symlink?(target_file).should be_false
279
325
  end
280
326
  include_context 'create symbolic link succeeds'
281
- include_context 'delete succeeds'
282
- it 'the :delete action does not delete the target file' do
283
- resource.run_action(:delete)
284
- File.exists?(to).should be_true
285
- end
327
+ it_behaves_like 'delete errors out'
286
328
  end
287
- context 'pointing nowhere' do
329
+ context 'and the link already exists and is a file' do
288
330
  before(:each) do
289
- nonexistent = File.join(base_dir, make_tmpname('nonexistent_spec', nil))
290
- symlink(nonexistent, target_file)
291
- symlink?(target_file).should be_true
292
- readlink(target_file).should == nonexistent
331
+ File.open(target_file, 'w') { |file| file.write('eek') }
293
332
  end
294
333
  include_context 'create symbolic link succeeds'
295
- include_context 'delete succeeds'
334
+ it_behaves_like 'delete errors out'
296
335
  end
297
- end
298
- context 'and the link already exists and is a hard link to the file' do
299
- before(:each) do
300
- link(to, target_file)
301
- File.exists?(target_file).should be_true
302
- symlink?(target_file).should be_false
336
+ context 'and the link already exists and is a directory' do
337
+ before(:each) do
338
+ Dir.mkdir(target_file)
339
+ end
340
+ it 'create errors out' do
341
+ if windows?
342
+ lambda { resource.run_action(:create) }.should raise_error(Errno::EACCES)
343
+ elsif os_x? or solaris? or freebsd?
344
+ lambda { resource.run_action(:create) }.should raise_error(Errno::EPERM)
345
+ else
346
+ lambda { resource.run_action(:create) }.should raise_error(Errno::EISDIR)
347
+ end
348
+ end
349
+ it_behaves_like 'delete errors out'
303
350
  end
304
- include_context 'create symbolic link succeeds'
305
- it_behaves_like 'delete errors out'
306
- end
307
- context 'and the link already exists and is a file' do
308
- before(:each) do
309
- File.open(target_file, 'w') { |file| file.write('eek') }
351
+ context 'and the link already exists and is not writeable to this user', :pending do
352
+ end
353
+ it_behaves_like 'a securable resource without existing target' do
354
+ let(:path) { target_file }
355
+ def allowed_acl(sid, expected_perms)
356
+ [ ACE.access_allowed(sid, expected_perms[:specific]) ]
357
+ end
358
+ def denied_acl(sid, expected_perms)
359
+ [ ACE.access_denied(sid, expected_perms[:specific]) ]
360
+ end
361
+ def parent_inheritable_acls
362
+ dummy_file_path = File.join(test_file_dir, "dummy_file")
363
+ dummy_file = FileUtils.touch(dummy_file_path)
364
+ dummy_desc = get_security_descriptor(dummy_file_path)
365
+ FileUtils.rm_rf(dummy_file_path)
366
+ dummy_desc
367
+ end
310
368
  end
311
- include_context 'create symbolic link succeeds'
312
- it_behaves_like 'delete errors out'
313
369
  end
314
- context 'and the link already exists and is a directory' do
370
+ context 'when the link destination is a directory' do
315
371
  before(:each) do
316
- Dir.mkdir(target_file)
372
+ Dir.mkdir(to)
317
373
  end
318
- it 'create errors out' do
319
- if windows?
320
- lambda { resource.run_action(:create) }.should raise_error(Errno::EACCES)
321
- elsif os_x? or solaris? or freebsd?
322
- lambda { resource.run_action(:create) }.should raise_error(Errno::EPERM)
323
- else
324
- lambda { resource.run_action(:create) }.should raise_error(Errno::EISDIR)
325
- end
374
+ # On Windows, readlink fails to open the link. FILE_FLAG_OPEN_REPARSE_POINT
375
+ # might help, from http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
376
+ context 'and the link does not yet exist' do
377
+ include_context 'create symbolic link succeeds'
378
+ include_context 'delete is noop'
326
379
  end
327
- it_behaves_like 'delete errors out'
328
380
  end
329
- context 'and the link already exists and is not writeable to this user', :pending do
330
- end
331
- it_behaves_like 'a securable resource' do
332
- let(:path) { target_file }
333
- def allowed_acl(sid, expected_perms)
334
- [ ACE.access_allowed(sid, expected_perms[:specific]) ]
381
+ context "when the link destination is a symbolic link" do
382
+ context 'to a file that exists' do
383
+ before(:each) do
384
+ @other_target = File.join(test_file_dir, make_tmpname("other_spec"))
385
+ File.open(@other_target, "w") { |file| file.write("eek") }
386
+ symlink(@other_target, to)
387
+ symlink?(to).should be_true
388
+ readlink(to).should == canonicalize(@other_target)
389
+ end
390
+ after(:each) do
391
+ File.delete(@other_target)
392
+ end
393
+ context 'and the link does not yet exist' do
394
+ include_context 'create symbolic link succeeds'
395
+ include_context 'delete is noop'
396
+ end
335
397
  end
336
- def denied_acl(sid, expected_perms)
337
- [ ACE.access_denied(sid, expected_perms[:specific]) ]
398
+ context 'to a file that does not exist' do
399
+ before(:each) do
400
+ @other_target = File.join(test_file_dir, make_tmpname("other_spec"))
401
+ symlink(@other_target, to)
402
+ symlink?(to).should be_true
403
+ readlink(to).should == canonicalize(@other_target)
404
+ end
405
+ context 'and the link does not yet exist' do
406
+ include_context 'create symbolic link succeeds'
407
+ include_context 'delete is noop'
408
+ end
338
409
  end
339
410
  end
340
- end
341
- context 'when the link destination is a directory' do
342
- before(:each) do
343
- Dir.mkdir(to)
411
+ context "when the link destination is not readable to this user", :pending do
344
412
  end
345
- # On Windows, readlink fails to open the link. FILE_FLAG_OPEN_REPARSE_POINT
346
- # might help, from http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
347
- context 'and the link does not yet exist' do
413
+ context "when the link destination does not exist" do
348
414
  include_context 'create symbolic link succeeds'
349
415
  include_context 'delete is noop'
350
416
  end
351
- end
352
- context "when the link destination is a symbolic link" do
353
- context 'to a file that exists' do
354
- before(:each) do
355
- @other_target = File.join(base_dir, make_tmpname("other_spec", nil))
356
- File.open(@other_target, "w") { |file| file.write("eek") }
357
- symlink(@other_target, to)
358
- symlink?(to).should be_true
359
- readlink(to).should == @other_target
360
- end
361
- after(:each) do
362
- File.delete(@other_target)
363
- end
364
- context 'and the link does not yet exist' do
365
- include_context 'create symbolic link succeeds'
366
- include_context 'delete is noop'
367
- end
368
- end
369
- context 'to a file that does not exist' do
370
- before(:each) do
371
- @other_target = File.join(base_dir, make_tmpname("other_spec", nil))
372
- symlink(@other_target, to)
373
- symlink?(to).should be_true
374
- readlink(to).should == @other_target
375
- end
376
- context 'and the link does not yet exist' do
377
- include_context 'create symbolic link succeeds'
378
- include_context 'delete is noop'
417
+
418
+ {
419
+ '../' => 'with a relative link destination',
420
+ '' => 'with a bare filename for the link destination'
421
+ }.each do |prefix, desc|
422
+ context desc do
423
+ let(:to) { "#{prefix}#{File.basename(absolute_to)}" }
424
+ let(:absolute_to) { File.join(test_file_dir, make_tmpname("to_spec")) }
425
+ before(:each) do
426
+ resource.to(to)
427
+ end
428
+ context 'when the link does not yet exist' do
429
+ include_context 'create symbolic link succeeds'
430
+ include_context 'delete is noop'
431
+ end
432
+ context 'when the link already exists and points at the target' do
433
+ before(:each) do
434
+ symlink(to, target_file)
435
+ symlink?(target_file).should be_true
436
+ readlink(target_file).should == canonicalize(to)
437
+ end
438
+ include_context 'create symbolic link is noop'
439
+ include_context 'delete succeeds'
440
+ end
441
+ context 'when the link already exists and points at the target with an absolute path' do
442
+ before(:each) do
443
+ symlink(absolute_to, target_file)
444
+ symlink?(target_file).should be_true
445
+ readlink(target_file).should == canonicalize(absolute_to)
446
+ end
447
+ include_context 'create symbolic link succeeds'
448
+ include_context 'delete succeeds'
449
+ end
379
450
  end
380
451
  end
381
452
  end
382
- context "when the link destination is not readable to this user", :pending do
383
- end
384
- context "when the link destination does not exist" do
385
- include_context 'create symbolic link succeeds'
386
- include_context 'delete is noop'
387
- end
388
453
 
389
- {
390
- '../' => 'with a relative link destination',
391
- '' => 'with a bare filename for the link destination'
392
- }.each do |prefix, desc|
393
- context desc do
394
- let(:to) { "#{prefix}#{File.basename(absolute_to)}" }
395
- let(:absolute_to) { File.join(base_dir, make_tmpname("to_spec", nil)) }
454
+ context "is a hard link" do
455
+ before(:each) do
456
+ resource.link_type(:hard)
457
+ end
458
+
459
+ context "when the link destination is a file" do
396
460
  before(:each) do
397
- resource.to(to)
461
+ File.open(to, "w") do |file|
462
+ file.write('woohoo')
463
+ end
398
464
  end
399
- context 'when the link does not yet exist' do
400
- include_context 'create symbolic link succeeds'
465
+ context "and the link does not yet exist" do
466
+ include_context 'create hard link succeeds'
401
467
  include_context 'delete is noop'
402
468
  end
403
- context 'when the link already exists and points at the target' do
469
+ context "and the link already exists and is a symbolic link pointing at the same file" do
404
470
  before(:each) do
405
471
  symlink(to, target_file)
406
472
  symlink?(target_file).should be_true
407
473
  readlink(target_file).should == canonicalize(to)
408
474
  end
409
- include_context 'create symbolic link is noop'
410
- include_context 'delete succeeds'
475
+ include_context 'create hard link succeeds'
476
+ it_behaves_like 'delete errors out'
411
477
  end
412
- context 'when the link already exists and points at the target with an absolute path' do
478
+ context 'and the link already exists and is a hard link to the file' do
413
479
  before(:each) do
414
- symlink(absolute_to, target_file)
415
- symlink?(target_file).should be_true
416
- readlink(target_file).should == canonicalize(absolute_to)
480
+ link(to, target_file)
481
+ File.exists?(target_file).should be_true
482
+ symlink?(target_file).should be_false
417
483
  end
418
- include_context 'create symbolic link succeeds'
484
+ include_context 'create hard link is noop'
419
485
  include_context 'delete succeeds'
486
+ it 'the :delete action does not delete the target file' do
487
+ resource.run_action(:delete)
488
+ File.exists?(to).should be_true
489
+ end
420
490
  end
421
- end
422
- end
423
- end
424
-
425
- context "is a hard link" do
426
- before(:each) do
427
- resource.link_type(:hard)
428
- end
429
-
430
- context "when the link destination is a file" do
431
- before(:each) do
432
- File.open(to, "w") do |file|
433
- file.write('woohoo')
434
- end
435
- end
436
- context "and the link does not yet exist" do
437
- include_context 'create hard link succeeds'
438
- include_context 'delete is noop'
439
- end
440
- context "and the link already exists and is a symbolic link pointing at the same file" do
441
- before(:each) do
442
- symlink(to, target_file)
443
- symlink?(target_file).should be_true
444
- readlink(target_file).should == to
445
- end
446
- include_context 'create hard link succeeds'
447
- it_behaves_like 'delete errors out'
448
- end
449
- context 'and the link already exists and is a hard link to the file' do
450
- before(:each) do
451
- link(to, target_file)
452
- File.exists?(target_file).should be_true
453
- symlink?(target_file).should be_false
454
- end
455
- include_context 'create hard link is noop'
456
- include_context 'delete succeeds'
457
- it 'the :delete action does not delete the target file' do
458
- resource.run_action(:delete)
459
- File.exists?(to).should be_true
460
- end
461
- end
462
- context "and the link already exists and is a file" do
463
- before(:each) do
464
- File.open(target_file, 'w') { |file| file.write('tomfoolery') }
465
- end
466
- include_context 'create hard link succeeds'
467
- it_behaves_like 'delete errors out'
468
- end
469
- context "and the link already exists and is a directory" do
470
- before(:each) do
471
- Dir.mkdir(target_file)
491
+ context "and the link already exists and is a file" do
492
+ before(:each) do
493
+ File.open(target_file, 'w') { |file| file.write('tomfoolery') }
494
+ end
495
+ include_context 'create hard link succeeds'
496
+ it_behaves_like 'delete errors out'
472
497
  end
473
- it 'errors out' do
474
- if windows?
475
- lambda { resource.run_action(:create) }.should raise_error(Errno::EACCES)
476
- elsif os_x? or solaris? or freebsd?
477
- lambda { resource.run_action(:create) }.should raise_error(Errno::EPERM)
478
- else
479
- lambda { resource.run_action(:create) }.should raise_error(Errno::EISDIR)
498
+ context "and the link already exists and is a directory" do
499
+ before(:each) do
500
+ Dir.mkdir(target_file)
501
+ end
502
+ it 'errors out' do
503
+ if windows?
504
+ lambda { resource.run_action(:create) }.should raise_error(Errno::EACCES)
505
+ elsif os_x? or solaris? or freebsd?
506
+ lambda { resource.run_action(:create) }.should raise_error(Errno::EPERM)
507
+ else
508
+ lambda { resource.run_action(:create) }.should raise_error(Errno::EISDIR)
509
+ end
480
510
  end
511
+ it_behaves_like 'delete errors out'
481
512
  end
482
- it_behaves_like 'delete errors out'
483
- end
484
- context "and the link already exists and is not writeable to this user", :pending do
485
- end
486
- context "and specifies security attributes" do
487
- before(:each) do
488
- resource.owner(windows? ? 'Guest' : 'nobody')
513
+ context "and the link already exists and is not writeable to this user", :pending do
489
514
  end
490
- it 'ignores them' do
491
- resource.run_action(:create)
492
- if windows?
493
- Chef::ReservedNames::Win32::Security.get_named_security_info(target_file).owner.should_not == SID.Guest
494
- else
495
- File.lstat(target_file).uid.should_not == Etc.getpwnam('nobody').uid
515
+ context "and specifies security attributes" do
516
+ before(:each) do
517
+ resource.owner(windows? ? 'Guest' : 'nobody')
518
+ end
519
+ it 'ignores them' do
520
+ resource.run_action(:create)
521
+ if windows?
522
+ Chef::ReservedNames::Win32::Security.get_named_security_info(target_file).owner.should_not == SID.Guest
523
+ else
524
+ File.lstat(target_file).uid.should_not == Etc.getpwnam('nobody').uid
525
+ end
496
526
  end
497
527
  end
498
528
  end
499
- end
500
- context "when the link destination is a directory" do
501
- before(:each) do
502
- Dir.mkdir(to)
503
- end
504
- context 'and the link does not yet exist' do
505
- it 'create errors out' do
506
- lambda { resource.run_action(:create) }.should raise_error(windows? ? Chef::Exceptions::Win32APIError : Errno::EPERM)
507
- end
508
- include_context 'delete is noop'
509
- end
510
- end
511
- context "when the link destination is a symbolic link" do
512
- context 'to a real file' do
529
+ context "when the link destination is a directory" do
513
530
  before(:each) do
514
- @other_target = File.join(base_dir, make_tmpname("other_spec", nil))
515
- File.open(@other_target, "w") { |file| file.write("eek") }
516
- symlink(@other_target, to)
517
- symlink?(to).should be_true
518
- readlink(to).should == @other_target
519
- end
520
- after(:each) do
521
- File.delete(@other_target)
531
+ Dir.mkdir(to)
522
532
  end
523
533
  context 'and the link does not yet exist' do
524
- it 'links to the target file' do
525
- resource.run_action(:create)
526
- File.exists?(target_file).should be_true
527
- # OS X gets angry about this sort of link. Bug in OS X, IMO.
528
- pending('OS X/FreeBSD symlink? and readlink working on hard links to symlinks', :if => (os_x? or freebsd?)) do
529
- symlink?(target_file).should be_true
530
- readlink(target_file).should == @other_target
531
- end
534
+ it 'create errors out' do
535
+ lambda { resource.run_action(:create) }.should raise_error(windows? ? Chef::Exceptions::Win32APIError : Errno::EPERM)
532
536
  end
533
537
  include_context 'delete is noop'
534
538
  end
535
539
  end
536
- context 'to a nonexistent file' do
537
- before(:each) do
538
- @other_target = File.join(base_dir, make_tmpname("other_spec", nil))
539
- symlink(@other_target, to)
540
- symlink?(to).should be_true
541
- readlink(to).should == @other_target
542
- end
543
- context 'and the link does not yet exist' do
544
- it 'links to the target file' do
545
- pending('OS X/FreeBSD fails to create hardlinks to broken symlinks', :if => (os_x? or freebsd?)) do
540
+ context "when the link destination is a symbolic link" do
541
+ context 'to a real file' do
542
+ before(:each) do
543
+ @other_target = File.join(test_file_dir, make_tmpname("other_spec"))
544
+ File.open(@other_target, "w") { |file| file.write("eek") }
545
+ symlink(@other_target, to)
546
+ symlink?(to).should be_true
547
+ readlink(to).should == canonicalize(@other_target)
548
+ end
549
+ after(:each) do
550
+ File.delete(@other_target)
551
+ end
552
+ context 'and the link does not yet exist' do
553
+ it 'links to the target file' do
546
554
  resource.run_action(:create)
547
- # Windows and Unix have different definitions of exists? here, and that's OK.
548
- if windows?
549
- File.exists?(target_file).should be_true
550
- else
551
- File.exists?(target_file).should be_false
555
+ File.exists?(target_file).should be_true
556
+ # OS X gets angry about this sort of link. Bug in OS X, IMO.
557
+ pending('OS X/FreeBSD symlink? and readlink working on hard links to symlinks', :if => (os_x? or freebsd?)) do
558
+ symlink?(target_file).should be_true
559
+ readlink(target_file).should == canonicalize(@other_target)
552
560
  end
553
- symlink?(target_file).should be_true
554
- readlink(target_file).should == @other_target
555
561
  end
562
+ include_context 'delete is noop'
563
+ end
564
+ end
565
+ context 'to a nonexistent file' do
566
+ before(:each) do
567
+ @other_target = File.join(test_file_dir, make_tmpname("other_spec"))
568
+ symlink(@other_target, to)
569
+ symlink?(to).should be_true
570
+ readlink(to).should == canonicalize(@other_target)
571
+ end
572
+ context 'and the link does not yet exist' do
573
+ it 'links to the target file' do
574
+ pending('OS X/FreeBSD fails to create hardlinks to broken symlinks', :if => (os_x? or freebsd?)) do
575
+ resource.run_action(:create)
576
+ # Windows and Unix have different definitions of exists? here, and that's OK.
577
+ if windows?
578
+ File.exists?(target_file).should be_true
579
+ else
580
+ File.exists?(target_file).should be_false
581
+ end
582
+ symlink?(target_file).should be_true
583
+ readlink(target_file).should == canonicalize(@other_target)
584
+ end
585
+ end
586
+ include_context 'delete is noop'
556
587
  end
557
- include_context 'delete is noop'
558
588
  end
559
589
  end
560
- end
561
- context "when the link destination is not readable to this user", :pending do
562
- end
563
- context "when the link destination does not exist" do
564
- context 'and the link does not yet exist' do
565
- it 'create errors out' do
566
- lambda { resource.run_action(:create) }.should raise_error(Errno::ENOENT)
590
+ context "when the link destination is not readable to this user", :pending do
591
+ end
592
+ context "when the link destination does not exist" do
593
+ context 'and the link does not yet exist' do
594
+ it 'create errors out' do
595
+ lambda { resource.run_action(:create) }.should raise_error(Errno::ENOENT)
596
+ end
597
+ include_context 'delete is noop'
567
598
  end
568
- include_context 'delete is noop'
569
599
  end
570
600
  end
571
601
  end
602
+
603
+ describe "when not supported on platform", :win2k3_only do
604
+ it "raises error" do
605
+ lambda {resource}.should raise_error(Chef::Exceptions::Win32APIFunctionNotImplemented)
606
+ end
607
+ end
572
608
  end