chef 15.11.3-universal-mingw32 → 16.1.16-universal-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 (513) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -7
  3. data/README.md +1 -1
  4. data/Rakefile +44 -16
  5. data/chef.gemspec +6 -4
  6. data/distro/powershell/chef/chef.psm1 +3 -3
  7. data/distro/templates/powershell/chef/chef.psm1.erb +3 -3
  8. data/lib/chef/action_collection.rb +16 -5
  9. data/lib/chef/application.rb +33 -54
  10. data/lib/chef/application/apply.rb +18 -1
  11. data/lib/chef/application/base.rb +8 -3
  12. data/lib/chef/application/knife.rb +1 -1
  13. data/lib/chef/chef_class.rb +4 -4
  14. data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +1 -1
  15. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +6 -2
  17. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +3 -3
  18. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  19. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
  20. data/lib/chef/chef_fs/path_utils.rb +3 -3
  21. data/lib/chef/client.rb +16 -14
  22. data/lib/chef/config.rb +1 -1
  23. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  24. data/lib/chef/cookbook/gem_installer.rb +1 -1
  25. data/lib/chef/cookbook/metadata.rb +45 -22
  26. data/lib/chef/cookbook_loader.rb +1 -1
  27. data/lib/chef/cookbook_manifest.rb +1 -1
  28. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  29. data/lib/chef/cookbook_version.rb +38 -3
  30. data/lib/chef/data_collector.rb +1 -1
  31. data/lib/chef/data_collector/error_handlers.rb +1 -1
  32. data/lib/chef/data_collector/run_end_message.rb +7 -1
  33. data/lib/chef/decorator/lazy_array.rb +2 -2
  34. data/lib/chef/deprecated.rb +4 -0
  35. data/lib/chef/digester.rb +4 -4
  36. data/lib/chef/dist.rb +8 -0
  37. data/lib/chef/dsl/chef_vault.rb +84 -0
  38. data/lib/chef/dsl/declare_resource.rb +7 -5
  39. data/lib/chef/dsl/platform_introspection.rb +3 -2
  40. data/lib/chef/dsl/recipe.rb +7 -12
  41. data/lib/chef/dsl/universal.rb +3 -7
  42. data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
  43. data/lib/chef/encrypted_data_bag_item/encryptor.rb +1 -1
  44. data/lib/chef/event_dispatch/base.rb +3 -0
  45. data/lib/chef/formatters/base.rb +1 -1
  46. data/lib/chef/formatters/doc.rb +1 -1
  47. data/lib/chef/formatters/indentable_output_stream.rb +7 -16
  48. data/lib/chef/http.rb +1 -1
  49. data/lib/chef/http/decompressor.rb +1 -1
  50. data/lib/chef/http/http_request.rb +3 -2
  51. data/lib/chef/json_compat.rb +1 -1
  52. data/lib/chef/key.rb +1 -1
  53. data/lib/chef/knife.rb +2 -4
  54. data/lib/chef/knife/acl_add.rb +57 -0
  55. data/lib/chef/knife/acl_base.rb +183 -0
  56. data/lib/chef/knife/acl_bulk_add.rb +78 -0
  57. data/lib/chef/knife/acl_bulk_remove.rb +83 -0
  58. data/lib/chef/knife/acl_remove.rb +62 -0
  59. data/lib/chef/knife/acl_show.rb +56 -0
  60. data/lib/chef/knife/bootstrap.rb +84 -90
  61. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +2 -2
  62. data/lib/chef/knife/bootstrap/client_builder.rb +2 -2
  63. data/lib/chef/knife/bootstrap/templates/chef-full.erb +11 -11
  64. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +12 -12
  65. data/lib/chef/knife/core/bootstrap_context.rb +63 -60
  66. data/lib/chef/knife/core/generic_presenter.rb +4 -3
  67. data/lib/chef/knife/core/hashed_command_loader.rb +1 -1
  68. data/lib/chef/knife/core/node_presenter.rb +2 -2
  69. data/lib/chef/knife/core/status_presenter.rb +5 -5
  70. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  71. data/lib/chef/knife/core/ui.rb +17 -1
  72. data/lib/chef/knife/core/windows_bootstrap_context.rb +44 -42
  73. data/lib/chef/knife/data_bag_secret_options.rb +18 -45
  74. data/lib/chef/knife/group_add.rb +55 -0
  75. data/lib/chef/knife/{cookbook_site_download.rb → group_create.rb} +21 -12
  76. data/lib/chef/knife/group_destroy.rb +53 -0
  77. data/lib/chef/knife/{cookbook_site_list.rb → group_list.rb} +14 -11
  78. data/lib/chef/knife/group_remove.rb +56 -0
  79. data/lib/chef/knife/{cookbook_site_install.rb → group_show.rb} +21 -12
  80. data/lib/chef/knife/key_create_base.rb +1 -1
  81. data/lib/chef/knife/key_edit_base.rb +1 -1
  82. data/lib/chef/knife/ssh.rb +12 -31
  83. data/lib/chef/knife/status.rb +3 -3
  84. data/lib/chef/knife/supermarket_download.rb +1 -2
  85. data/lib/chef/knife/supermarket_install.rb +2 -3
  86. data/lib/chef/knife/supermarket_list.rb +1 -2
  87. data/lib/chef/knife/supermarket_search.rb +1 -2
  88. data/lib/chef/knife/supermarket_share.rb +1 -2
  89. data/lib/chef/knife/supermarket_show.rb +1 -2
  90. data/lib/chef/knife/supermarket_unshare.rb +1 -2
  91. data/lib/chef/knife/{cookbook_site_show.rb → user_dissociate.rb} +15 -13
  92. data/lib/chef/knife/{cookbook_site_search.rb → user_invite_add.rb} +16 -13
  93. data/lib/chef/knife/user_invite_list.rb +34 -0
  94. data/lib/chef/knife/user_invite_rescind.rb +63 -0
  95. data/lib/chef/knife/yaml_convert.rb +91 -0
  96. data/lib/chef/mixin/api_version_request_handling.rb +1 -1
  97. data/lib/chef/mixin/checksum.rb +0 -1
  98. data/lib/chef/mixin/openssl_helper.rb +4 -4
  99. data/lib/chef/mixin/powershell_exec.rb +10 -1
  100. data/lib/chef/mixin/powershell_out.rb +1 -1
  101. data/lib/chef/mixin/properties.rb +16 -2
  102. data/lib/chef/mixin/shell_out.rb +1 -5
  103. data/lib/chef/monkey_patches/net_http.rb +0 -4
  104. data/lib/chef/node.rb +18 -6
  105. data/lib/chef/node/attribute.rb +2 -2
  106. data/lib/chef/node/immutable_collections.rb +1 -1
  107. data/lib/chef/node/mixin/immutablize_array.rb +4 -0
  108. data/lib/chef/node/mixin/immutablize_hash.rb +3 -0
  109. data/lib/chef/node_map.rb +5 -31
  110. data/lib/chef/platform/priority_map.rb +4 -4
  111. data/lib/chef/platform/query_helpers.rb +6 -34
  112. data/lib/chef/policy_builder/policyfile.rb +1 -1
  113. data/lib/chef/powershell.rb +14 -0
  114. data/lib/chef/property.rb +24 -6
  115. data/lib/chef/provider.rb +40 -6
  116. data/lib/chef/provider/cron.rb +2 -2
  117. data/lib/chef/provider/directory.rb +3 -3
  118. data/lib/chef/provider/dsc_resource.rb +1 -1
  119. data/lib/chef/provider/dsc_script.rb +1 -1
  120. data/lib/chef/provider/execute.rb +3 -9
  121. data/lib/chef/provider/file.rb +6 -6
  122. data/lib/chef/provider/git.rb +84 -27
  123. data/lib/chef/provider/group.rb +4 -4
  124. data/lib/chef/provider/http_request.rb +6 -6
  125. data/lib/chef/provider/ifconfig.rb +4 -4
  126. data/lib/chef/provider/launchd.rb +45 -64
  127. data/lib/chef/provider/link.rb +2 -2
  128. data/lib/chef/provider/mount.rb +5 -5
  129. data/lib/chef/provider/osx_profile.rb +7 -3
  130. data/lib/chef/provider/package.rb +2 -2
  131. data/lib/chef/provider/package/cab.rb +5 -6
  132. data/lib/chef/provider/package/chocolatey.rb +1 -3
  133. data/lib/chef/provider/package/dnf.rb +66 -10
  134. data/lib/chef/provider/package/dnf/dnf_helper.py +85 -26
  135. data/lib/chef/provider/package/dnf/python_helper.rb +79 -36
  136. data/lib/chef/provider/package/dnf/version.rb +5 -1
  137. data/lib/chef/provider/package/dpkg.rb +1 -1
  138. data/lib/chef/provider/package/freebsd/base.rb +2 -1
  139. data/lib/chef/provider/package/homebrew.rb +107 -43
  140. data/lib/chef/provider/package/macports.rb +0 -2
  141. data/lib/chef/provider/package/msu.rb +4 -1
  142. data/lib/chef/provider/package/pacman.rb +25 -34
  143. data/lib/chef/provider/package/portage.rb +1 -0
  144. data/lib/chef/provider/package/powershell.rb +1 -1
  145. data/lib/chef/provider/package/rubygems.rb +30 -3
  146. data/lib/chef/provider/package/windows.rb +29 -53
  147. data/lib/chef/provider/package/windows/msi.rb +2 -2
  148. data/lib/chef/provider/package/yum.rb +1 -9
  149. data/lib/chef/provider/package/yum/yum_cache.rb +1 -1
  150. data/lib/chef/provider/package/zypper.rb +0 -1
  151. data/lib/chef/provider/powershell_script.rb +5 -11
  152. data/lib/chef/provider/registry_key.rb +4 -4
  153. data/lib/chef/provider/remote_directory.rb +5 -5
  154. data/lib/chef/provider/remote_file/ftp.rb +3 -2
  155. data/lib/chef/provider/remote_file/local_file.rb +2 -1
  156. data/lib/chef/provider/remote_file/sftp.rb +3 -2
  157. data/lib/chef/provider/route.rb +5 -3
  158. data/lib/chef/provider/ruby_block.rb +1 -1
  159. data/lib/chef/provider/script.rb +2 -2
  160. data/lib/chef/provider/service.rb +8 -8
  161. data/lib/chef/provider/service/aixinit.rb +1 -1
  162. data/lib/chef/provider/service/arch.rb +1 -1
  163. data/lib/chef/provider/service/debian.rb +30 -28
  164. data/lib/chef/provider/service/macosx.rb +16 -10
  165. data/lib/chef/provider/service/systemd.rb +12 -12
  166. data/lib/chef/provider/service/upstart.rb +1 -1
  167. data/lib/chef/provider/service/windows.rb +5 -11
  168. data/lib/chef/provider/subversion.rb +25 -5
  169. data/lib/chef/provider/systemd_unit.rb +26 -25
  170. data/lib/chef/provider/user.rb +6 -6
  171. data/lib/chef/provider/user/aix.rb +1 -1
  172. data/lib/chef/provider/user/dscl.rb +6 -6
  173. data/lib/chef/provider/user/mac.rb +20 -15
  174. data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
  175. data/lib/chef/provider/windows_env.rb +3 -3
  176. data/lib/chef/provider/windows_script.rb +2 -2
  177. data/lib/chef/provider/windows_task.rb +10 -10
  178. data/lib/chef/providers.rb +0 -6
  179. data/lib/chef/recipe.rb +36 -0
  180. data/lib/chef/resource.rb +44 -57
  181. data/lib/chef/resource/action_class.rb +24 -22
  182. data/lib/chef/resource/alternatives.rb +210 -0
  183. data/lib/chef/resource/apt_package.rb +33 -3
  184. data/lib/chef/resource/apt_preference.rb +103 -7
  185. data/lib/chef/resource/apt_repository.rb +357 -18
  186. data/lib/chef/resource/apt_update.rb +58 -5
  187. data/lib/chef/resource/archive_file.rb +6 -5
  188. data/lib/chef/resource/bash.rb +3 -1
  189. data/lib/chef/resource/batch.rb +1 -1
  190. data/lib/chef/resource/bff_package.rb +10 -2
  191. data/lib/chef/resource/breakpoint.rb +1 -2
  192. data/lib/chef/resource/build_essential.rb +49 -51
  193. data/lib/chef/resource/cab_package.rb +9 -2
  194. data/lib/chef/resource/chef_client_cron.rb +228 -0
  195. data/lib/chef/resource/chef_client_scheduled_task.rb +201 -0
  196. data/lib/chef/resource/chef_client_systemd_timer.rb +180 -0
  197. data/lib/chef/resource/chef_gem.rb +15 -18
  198. data/lib/chef/resource/chef_handler.rb +5 -4
  199. data/lib/chef/resource/chef_sleep.rb +7 -5
  200. data/lib/chef/resource/chef_vault_secret.rb +135 -0
  201. data/lib/chef/resource/chocolatey_config.rb +8 -4
  202. data/lib/chef/resource/chocolatey_feature.rb +7 -4
  203. data/lib/chef/resource/chocolatey_package.rb +7 -4
  204. data/lib/chef/resource/chocolatey_source.rb +7 -4
  205. data/lib/chef/resource/cookbook_file.rb +4 -3
  206. data/lib/chef/resource/cron.rb +34 -80
  207. data/lib/chef/resource/cron_access.rb +10 -6
  208. data/lib/chef/resource/cron_d.rb +44 -95
  209. data/lib/chef/resource/csh.rb +3 -1
  210. data/lib/chef/resource/directory.rb +3 -3
  211. data/lib/chef/resource/dmg_package.rb +22 -19
  212. data/lib/chef/resource/dnf_package.rb +3 -4
  213. data/lib/chef/resource/dpkg_package.rb +3 -2
  214. data/lib/chef/resource/dsc_resource.rb +6 -4
  215. data/lib/chef/resource/dsc_script.rb +3 -2
  216. data/lib/chef/resource/execute.rb +15 -14
  217. data/lib/chef/resource/file.rb +14 -9
  218. data/lib/chef/resource/freebsd_package.rb +3 -2
  219. data/lib/chef/resource/gem_package.rb +19 -11
  220. data/lib/chef/resource/group.rb +5 -2
  221. data/lib/chef/resource/helpers/cron_validations.rb +98 -0
  222. data/lib/chef/resource/homebrew_cask.rb +3 -2
  223. data/lib/chef/resource/homebrew_package.rb +5 -3
  224. data/lib/chef/resource/homebrew_tap.rb +3 -2
  225. data/lib/chef/resource/hostname.rb +26 -20
  226. data/lib/chef/resource/http_request.rb +1 -2
  227. data/lib/chef/resource/ifconfig.rb +8 -8
  228. data/lib/chef/resource/ips_package.rb +11 -3
  229. data/lib/chef/resource/kernel_module.rb +30 -30
  230. data/lib/chef/resource/ksh.rb +3 -1
  231. data/lib/chef/resource/launchd.rb +3 -3
  232. data/lib/chef/resource/link.rb +5 -27
  233. data/lib/chef/resource/locale.rb +60 -26
  234. data/lib/chef/resource/log.rb +13 -2
  235. data/lib/chef/resource/lwrp_base.rb +1 -1
  236. data/lib/chef/resource/macos_userdefaults.rb +18 -10
  237. data/lib/chef/resource/macosx_service.rb +3 -2
  238. data/lib/chef/resource/macports_package.rb +10 -2
  239. data/lib/chef/resource/mdadm.rb +63 -3
  240. data/lib/chef/resource/mount.rb +4 -1
  241. data/lib/chef/resource/msu_package.rb +19 -2
  242. data/lib/chef/resource/notify_group.rb +8 -3
  243. data/lib/chef/resource/ohai.rb +20 -4
  244. data/lib/chef/resource/ohai_hint.rb +4 -13
  245. data/lib/chef/resource/openbsd_package.rb +10 -2
  246. data/lib/chef/resource/openssl_dhparam.rb +11 -2
  247. data/lib/chef/resource/openssl_ec_private_key.rb +24 -2
  248. data/lib/chef/resource/openssl_ec_public_key.rb +22 -2
  249. data/lib/chef/resource/openssl_rsa_private_key.rb +21 -2
  250. data/lib/chef/resource/openssl_rsa_public_key.rb +23 -2
  251. data/lib/chef/resource/openssl_x509_certificate.rb +38 -2
  252. data/lib/chef/resource/openssl_x509_crl.rb +13 -2
  253. data/lib/chef/resource/openssl_x509_request.rb +38 -2
  254. data/lib/chef/resource/osx_profile.rb +4 -3
  255. data/lib/chef/resource/package.rb +3 -2
  256. data/lib/chef/resource/pacman_package.rb +3 -2
  257. data/lib/chef/resource/paludis_package.rb +13 -4
  258. data/lib/chef/resource/perl.rb +3 -1
  259. data/lib/chef/resource/plist.rb +207 -0
  260. data/lib/chef/resource/portage_package.rb +14 -4
  261. data/lib/chef/resource/powershell_package.rb +2 -4
  262. data/lib/chef/resource/powershell_package_source.rb +4 -2
  263. data/lib/chef/resource/powershell_script.rb +8 -18
  264. data/lib/chef/resource/python.rb +3 -1
  265. data/lib/chef/resource/reboot.rb +1 -2
  266. data/lib/chef/resource/registry_key.rb +2 -3
  267. data/lib/chef/resource/remote_directory.rb +3 -1
  268. data/lib/chef/resource/remote_file.rb +3 -2
  269. data/lib/chef/resource/rhsm_errata.rb +1 -4
  270. data/lib/chef/resource/rhsm_errata_level.rb +1 -2
  271. data/lib/chef/resource/rhsm_register.rb +3 -3
  272. data/lib/chef/resource/rhsm_repo.rb +4 -3
  273. data/lib/chef/resource/rhsm_subscription.rb +5 -4
  274. data/lib/chef/resource/route.rb +6 -2
  275. data/lib/chef/resource/rpm_package.rb +13 -3
  276. data/lib/chef/resource/ruby.rb +3 -1
  277. data/lib/chef/resource/ruby_block.rb +2 -5
  278. data/lib/chef/resource/scm/_scm.rb +49 -0
  279. data/lib/chef/resource/{scm.rb → scm/git.rb} +16 -30
  280. data/lib/chef/resource/{subversion.rb → scm/subversion.rb} +10 -7
  281. data/lib/chef/resource/script.rb +7 -4
  282. data/lib/chef/resource/service.rb +7 -8
  283. data/lib/chef/resource/smartos_package.rb +10 -2
  284. data/lib/chef/resource/snap_package.rb +4 -2
  285. data/lib/chef/resource/solaris_package.rb +10 -2
  286. data/lib/chef/resource/ssh_known_hosts_entry.rb +6 -3
  287. data/lib/chef/resource/sudo.rb +11 -11
  288. data/lib/chef/resource/support/cron.d.erb +1 -1
  289. data/lib/chef/resource/support/cron_access.erb +1 -1
  290. data/lib/chef/resource/support/sudoer.erb +1 -2
  291. data/lib/chef/resource/support/ulimit.erb +41 -0
  292. data/lib/chef/resource/swap_file.rb +7 -5
  293. data/lib/chef/resource/sysctl.rb +63 -4
  294. data/lib/chef/resource/systemd_unit.rb +6 -4
  295. data/lib/chef/resource/template.rb +0 -1
  296. data/lib/chef/resource/timezone.rb +8 -19
  297. data/lib/chef/resource/user.rb +3 -5
  298. data/lib/chef/resource/user/aix_user.rb +0 -2
  299. data/lib/chef/resource/user/dscl_user.rb +1 -1
  300. data/lib/chef/resource/user/linux_user.rb +0 -2
  301. data/lib/chef/resource/user/mac_user.rb +1 -1
  302. data/lib/chef/resource/user/pw_user.rb +0 -2
  303. data/lib/chef/resource/user/solaris_user.rb +0 -2
  304. data/lib/chef/resource/user/windows_user.rb +0 -2
  305. data/lib/chef/resource/user_ulimit.rb +116 -0
  306. data/lib/chef/resource/whyrun_safe_ruby_block.rb +1 -0
  307. data/lib/chef/resource/windows_ad_join.rb +20 -7
  308. data/lib/chef/resource/windows_auto_run.rb +2 -3
  309. data/lib/chef/resource/windows_certificate.rb +3 -3
  310. data/lib/chef/resource/windows_dfs_folder.rb +1 -2
  311. data/lib/chef/resource/windows_dfs_namespace.rb +1 -2
  312. data/lib/chef/resource/windows_dfs_server.rb +2 -3
  313. data/lib/chef/resource/windows_dns_record.rb +0 -1
  314. data/lib/chef/resource/windows_dns_zone.rb +0 -1
  315. data/lib/chef/resource/windows_env.rb +12 -4
  316. data/lib/chef/resource/windows_feature.rb +59 -4
  317. data/lib/chef/resource/windows_feature_dism.rb +24 -24
  318. data/lib/chef/resource/windows_feature_powershell.rb +44 -78
  319. data/lib/chef/resource/windows_firewall_rule.rb +121 -8
  320. data/lib/chef/resource/windows_font.rb +10 -2
  321. data/lib/chef/resource/windows_package.rb +76 -7
  322. data/lib/chef/resource/windows_pagefile.rb +31 -4
  323. data/lib/chef/resource/windows_path.rb +18 -2
  324. data/lib/chef/resource/windows_printer.rb +26 -7
  325. data/lib/chef/resource/windows_printer_port.rb +29 -2
  326. data/lib/chef/resource/windows_script.rb +3 -4
  327. data/lib/chef/resource/windows_security_policy.rb +119 -0
  328. data/lib/chef/resource/windows_service.rb +46 -32
  329. data/lib/chef/resource/windows_share.rb +22 -6
  330. data/lib/chef/resource/windows_shortcut.rb +13 -3
  331. data/lib/chef/resource/windows_task.rb +129 -16
  332. data/lib/chef/resource/windows_uac.rb +20 -2
  333. data/lib/chef/resource/windows_user_privilege.rb +199 -0
  334. data/lib/chef/resource/windows_workgroup.rb +19 -4
  335. data/lib/chef/resource/yum_package.rb +91 -7
  336. data/lib/chef/resource/yum_repository.rb +30 -12
  337. data/lib/chef/resource/zypper_package.rb +32 -5
  338. data/lib/chef/resource/zypper_repository.rb +19 -6
  339. data/lib/chef/resource_builder.rb +8 -0
  340. data/lib/chef/resource_inspector.rb +3 -2
  341. data/lib/chef/resource_resolver.rb +7 -14
  342. data/lib/chef/resources.rb +11 -3
  343. data/lib/chef/run_context/cookbook_compiler.rb +29 -5
  344. data/lib/chef/scan_access_control.rb +1 -1
  345. data/lib/chef/shell.rb +22 -0
  346. data/lib/chef/shell/ext.rb +1 -1
  347. data/lib/chef/version.rb +1 -1
  348. data/lib/chef/win32/api.rb +2 -2
  349. data/lib/chef/win32/api/error.rb +3 -1
  350. data/lib/chef/win32/api/file.rb +1 -1
  351. data/lib/chef/win32/api/net.rb +1 -0
  352. data/lib/chef/win32/api/security.rb +6 -0
  353. data/lib/chef/win32/file.rb +1 -9
  354. data/lib/chef/win32/mutex.rb +1 -1
  355. data/lib/chef/win32/net.rb +1 -0
  356. data/lib/chef/win32/security.rb +40 -2
  357. data/lib/chef/win32/security/sid.rb +4 -4
  358. data/spec/functional/assets/inittest +8 -7
  359. data/spec/functional/knife/ssh_spec.rb +23 -19
  360. data/spec/functional/resource/cron_spec.rb +10 -29
  361. data/spec/functional/resource/dnf_package_spec.rb +441 -156
  362. data/spec/functional/resource/git_spec.rb +184 -134
  363. data/spec/functional/resource/insserv_spec.rb +1 -1
  364. data/spec/functional/resource/launchd_spec.rb +232 -0
  365. data/spec/functional/resource/link_spec.rb +3 -3
  366. data/spec/functional/resource/locale_spec.rb +13 -2
  367. data/spec/functional/resource/msu_package_spec.rb +5 -2
  368. data/spec/functional/resource/powershell_script_spec.rb +7 -68
  369. data/spec/functional/resource/remote_file_spec.rb +1 -1
  370. data/spec/functional/resource/windows_security_policy_spec.rb +90 -0
  371. data/spec/functional/resource/windows_task_spec.rb +4 -4
  372. data/spec/functional/resource/windows_user_privilege_spec.rb +193 -0
  373. data/spec/functional/run_lock_spec.rb +1 -1
  374. data/spec/functional/shell_spec.rb +1 -1
  375. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  376. data/spec/functional/version_spec.rb +1 -1
  377. data/spec/functional/win32/registry_spec.rb +0 -6
  378. data/spec/functional/win32/security_spec.rb +22 -0
  379. data/spec/integration/client/client_spec.rb +123 -2
  380. data/spec/integration/knife/cookbook_show_spec.rb +28 -26
  381. data/spec/integration/knife/data_bag_show_spec.rb +1 -1
  382. data/spec/integration/knife/raw_spec.rb +34 -6
  383. data/spec/integration/knife/redirection_spec.rb +2 -2
  384. data/spec/integration/knife/show_spec.rb +32 -3
  385. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +3 -3
  386. data/spec/integration/recipes/noop_resource_spec.rb +1 -1
  387. data/spec/integration/recipes/notifies_spec.rb +49 -20
  388. data/spec/integration/recipes/notifying_block_spec.rb +8 -5
  389. data/spec/integration/recipes/provider_choice.rb +2 -0
  390. data/spec/integration/recipes/recipe_dsl_spec.rb +45 -143
  391. data/spec/integration/recipes/resource_action_spec.rb +16 -11
  392. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +1 -1
  393. data/spec/integration/recipes/resource_load_spec.rb +133 -12
  394. data/spec/integration/recipes/use_partial_spec.rb +112 -0
  395. data/spec/integration/solo/solo_spec.rb +3 -3
  396. data/spec/spec_helper.rb +18 -3
  397. data/spec/support/chef_helpers.rb +2 -2
  398. data/spec/support/lib/chef/resource/zen_follower.rb +2 -0
  399. data/spec/support/platform_helpers.rb +2 -20
  400. data/spec/support/recipe_dsl_helper.rb +83 -0
  401. data/spec/support/shared/functional/http.rb +2 -2
  402. data/spec/support/shared/functional/windows_script.rb +3 -16
  403. data/spec/support/shared/integration/knife_support.rb +9 -6
  404. data/spec/support/shared/unit/mock_shellout.rb +1 -1
  405. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +4 -4
  406. data/spec/unit/application/apply_spec.rb +3 -0
  407. data/spec/unit/application/client_spec.rb +5 -1
  408. data/spec/unit/application_spec.rb +1 -2
  409. data/spec/unit/client_spec.rb +7 -5
  410. data/spec/unit/cookbook/gem_installer_spec.rb +2 -2
  411. data/spec/unit/cookbook/metadata_spec.rb +38 -19
  412. data/spec/unit/data_collector_spec.rb +39 -18
  413. data/spec/unit/file_access_control_spec.rb +1 -1
  414. data/spec/unit/json_compat_spec.rb +1 -1
  415. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +15 -15
  416. data/spec/unit/knife/bootstrap/client_builder_spec.rb +9 -9
  417. data/spec/unit/knife/bootstrap_spec.rb +20 -38
  418. data/spec/unit/knife/cookbook_show_spec.rb +1 -0
  419. data/spec/unit/knife/core/bootstrap_context_spec.rb +23 -43
  420. data/spec/unit/knife/core/ui_spec.rb +16 -0
  421. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +9 -63
  422. data/spec/unit/knife/data_bag_secret_options_spec.rb +22 -14
  423. data/spec/unit/knife/ssh_spec.rb +8 -111
  424. data/spec/unit/knife/status_spec.rb +1 -1
  425. data/spec/unit/knife_spec.rb +18 -0
  426. data/spec/unit/mixin/openssl_helper_spec.rb +4 -4
  427. data/spec/unit/mixin/powershell_exec_spec.rb +10 -0
  428. data/spec/unit/mixin/shell_out_spec.rb +25 -31
  429. data/spec/unit/node/attribute_spec.rb +3 -3
  430. data/spec/unit/node_spec.rb +24 -0
  431. data/spec/unit/platform/query_helpers_spec.rb +0 -143
  432. data/spec/unit/property/state_spec.rb +12 -7
  433. data/spec/unit/property/validation_spec.rb +25 -1
  434. data/spec/unit/property_spec.rb +12 -9
  435. data/spec/unit/provider/apt_preference_spec.rb +14 -10
  436. data/spec/unit/provider/apt_repository_spec.rb +34 -36
  437. data/spec/unit/provider/apt_update_spec.rb +12 -11
  438. data/spec/unit/provider/cookbook_file_spec.rb +4 -4
  439. data/spec/unit/provider/cron_spec.rb +2 -2
  440. data/spec/unit/provider/directory_spec.rb +4 -15
  441. data/spec/unit/provider/file_spec.rb +4 -4
  442. data/spec/unit/provider/git_spec.rb +41 -1
  443. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  444. data/spec/unit/provider/launchd_spec.rb +8 -50
  445. data/spec/unit/provider/link_spec.rb +0 -1
  446. data/spec/unit/provider/log_spec.rb +3 -3
  447. data/spec/unit/provider/mdadm_spec.rb +3 -3
  448. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  449. data/spec/unit/provider/package/homebrew_spec.rb +280 -174
  450. data/spec/unit/provider/package/pacman_spec.rb +65 -147
  451. data/spec/unit/provider/package/portage_spec.rb +2 -2
  452. data/spec/unit/provider/package/powershell_spec.rb +3 -2
  453. data/spec/unit/provider/package/rubygems_spec.rb +211 -26
  454. data/spec/unit/provider/package/windows/exe_spec.rb +1 -1
  455. data/spec/unit/provider/powershell_script_spec.rb +21 -61
  456. data/spec/unit/provider/remote_file_spec.rb +3 -4
  457. data/spec/unit/provider/service/debian_service_spec.rb +34 -13
  458. data/spec/unit/provider/service/macosx_spec.rb +210 -214
  459. data/spec/unit/provider/service/systemd_service_spec.rb +23 -23
  460. data/spec/unit/provider/subversion_spec.rb +4 -2
  461. data/spec/unit/provider/template_spec.rb +3 -4
  462. data/spec/unit/provider/zypper_repository_spec.rb +17 -17
  463. data/spec/unit/provider_resolver_spec.rb +4 -4
  464. data/spec/unit/recipe_spec.rb +68 -0
  465. data/spec/unit/resource/alternatives_spec.rb +120 -0
  466. data/spec/unit/resource/apt_preference_spec.rb +0 -18
  467. data/spec/unit/resource/apt_repository_spec.rb +0 -18
  468. data/spec/unit/resource/apt_update_spec.rb +0 -18
  469. data/spec/unit/resource/chef_client_cron_spec.rb +119 -0
  470. data/spec/unit/resource/chef_client_scheduled_task_spec.rb +102 -0
  471. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +70 -0
  472. data/spec/unit/resource/chef_vault_secret_spec.rb +40 -0
  473. data/spec/unit/resource/chocolatey_source_spec.rb +2 -1
  474. data/spec/unit/resource/cron_d_spec.rb +6 -48
  475. data/spec/unit/resource/cron_spec.rb +4 -10
  476. data/spec/unit/resource/gem_package_spec.rb +3 -3
  477. data/spec/unit/resource/helpers/cron_validations_spec.rb +77 -0
  478. data/spec/unit/resource/link_spec.rb +0 -4
  479. data/spec/unit/resource/locale_spec.rb +0 -34
  480. data/spec/unit/resource/msu_package_spec.rb +4 -0
  481. data/spec/unit/resource/ohai_spec.rb +56 -2
  482. data/spec/unit/resource/plist_spec.rb +130 -0
  483. data/spec/unit/resource/powershell_script_spec.rb +0 -5
  484. data/spec/unit/resource/{git_spec.rb → scm/git_spec.rb} +50 -2
  485. data/spec/unit/resource/{scm_spec.rb → scm/scm.rb} +1 -52
  486. data/spec/unit/resource/{subversion_spec.rb → scm/subversion_spec.rb} +2 -3
  487. data/spec/unit/resource/service_spec.rb +4 -0
  488. data/spec/unit/resource/user_spec.rb +2 -2
  489. data/spec/unit/resource/user_ulimit_spec.rb +53 -0
  490. data/spec/unit/resource/windows_feature_dism_spec.rb +2 -17
  491. data/spec/unit/resource/windows_feature_powershell_spec.rb +2 -17
  492. data/spec/unit/resource/windows_firewall_rule_spec.rb +88 -41
  493. data/spec/unit/resource/windows_package_spec.rb +14 -0
  494. data/spec/unit/resource/windows_service_spec.rb +9 -0
  495. data/spec/unit/resource_reporter_spec.rb +2 -6
  496. data/spec/unit/resource_spec.rb +10 -3
  497. data/spec/unit/run_lock_spec.rb +1 -1
  498. data/spec/unit/scan_access_control_spec.rb +1 -1
  499. data/spec/unit/search/query_spec.rb +1 -1
  500. data/spec/unit/win32/registry_spec.rb +1 -1
  501. data/tasks/rspec.rb +6 -14
  502. metadata +92 -37
  503. data/lib/chef/dsl/core.rb +0 -52
  504. data/lib/chef/knife/cookbook_site_share.rb +0 -41
  505. data/lib/chef/knife/cookbook_site_unshare.rb +0 -41
  506. data/lib/chef/provider/apt_preference.rb +0 -93
  507. data/lib/chef/provider/apt_repository.rb +0 -358
  508. data/lib/chef/provider/apt_update.rb +0 -79
  509. data/lib/chef/provider/log.rb +0 -43
  510. data/lib/chef/provider/mdadm.rb +0 -85
  511. data/lib/chef/provider/ohai.rb +0 -45
  512. data/lib/chef/resource/git.rb +0 -37
  513. data/spec/unit/provider/ohai_spec.rb +0 -84
@@ -18,23 +18,24 @@
18
18
 
19
19
  require "spec_helper"
20
20
 
21
- describe Chef::Provider::AptUpdate do
22
- let(:new_resource) { Chef::Resource::AptUpdate.new("update") }
21
+ describe "Chef::Provider::AptUpdate" do
22
+ let(:node) { Chef::Node.new }
23
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
24
+ let(:run_context) { Chef::RunContext.new(node, {}, events) }
25
+ let(:collection) { double("resource collection") }
26
+ let(:new_resource) { Chef::Resource::AptUpdate.new("update", run_context) }
27
+ let(:provider) { new_resource.provider_for_action(:update) }
23
28
 
24
29
  let(:config_dir) { Dir.mktmpdir("apt_update_apt_conf_d") }
25
30
  let(:config_file) { File.join(config_dir, "15update-stamp") }
26
31
  let(:stamp_dir) { Dir.mktmpdir("apt_update_periodic") }
27
32
 
28
33
  before do
29
- stub_const("Chef::Provider::AptUpdate::APT_CONF_DIR", config_dir)
30
- stub_const("Chef::Provider::AptUpdate::STAMP_DIR", stamp_dir)
31
- end
32
-
33
- let(:provider) do
34
- node = Chef::Node.new
35
- events = Chef::EventDispatch::Dispatcher.new
36
- run_context = Chef::RunContext.new(node, {}, events)
37
- Chef::Provider::AptUpdate.new(new_resource, run_context)
34
+ new_resource.class.send(:remove_const, :APT_CONF_DIR)
35
+ new_resource.class.send(:const_set, :APT_CONF_DIR, config_dir)
36
+ new_resource.class.send(:remove_const, :STAMP_DIR)
37
+ new_resource.class.send(:const_set, :STAMP_DIR, stamp_dir)
38
+ node.automatic["platform_family"] = "debian"
38
39
  end
39
40
 
40
41
  let(:apt_update_cmd) { %w{apt-get -q update} }
@@ -23,10 +23,10 @@ require "ostruct"
23
23
  require "support/shared/unit/provider/file"
24
24
 
25
25
  describe Chef::Provider::CookbookFile do
26
- let(:node) { double("Chef::Node") }
27
- let(:events) { double("Chef::Events").as_null_object } # mock all the methods
28
- let(:logger) { double("Mixlib::Log::Child").as_null_object }
29
- let(:run_context) { double("Chef::RunContext", node: node, events: events, logger: logger) }
26
+ let(:node) { Chef::Node.new }
27
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
28
+ let(:run_context) { Chef::RunContext.new(node, {}, events) }
29
+
30
30
  let(:enclosing_directory) do
31
31
  canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
32
32
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Bryan McLellan (btm@loftninjas.org)
3
- # Copyright:: Copyright 2009-2016, Bryan McLellan
3
+ # Copyright:: Copyright 2009-2020, Bryan McLellan
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -403,7 +403,7 @@ describe Chef::Provider::Cron do
403
403
 
404
404
  %i{minute hour day month weekday command mailto path shell home}.each do |property|
405
405
  it "should return true if #{property} doesn't match" do
406
- @new_resource.send(property, "something_else")
406
+ @new_resource.send(property, "1") # we use 1 in order to pass resource validation. We're just using a value that's different.
407
407
  expect(@provider.cron_different?).to eql(true)
408
408
  end
409
409
  end
@@ -201,33 +201,22 @@ describe Chef::Provider::Directory do
201
201
  end
202
202
  end
203
203
 
204
- describe "on OS X" do
204
+ describe "on macOS" do
205
205
  before do
206
- allow(node).to receive(:[]).with("platform").and_return("mac_os_x")
206
+ allow(ChefUtils).to receive(:macos?).and_return(true)
207
207
  new_resource.path "/usr/bin/chef_test"
208
208
  new_resource.recursive false
209
209
  allow_any_instance_of(Chef::Provider::File).to receive(:do_selinux)
210
210
  end
211
211
 
212
- it "os x 10.10 can write to sip locations" do
213
- allow(node).to receive(:[]).with("platform_version").and_return("10.10")
214
- allow(Dir).to receive(:mkdir).and_return([true], [])
215
- allow(::File).to receive(:directory?).and_return(true)
216
- allow(Chef::FileAccessControl).to receive(:writable?).and_return(true)
217
- directory.run_action(:create)
218
- expect(new_resource).to be_updated
219
- end
220
-
221
- it "os x 10.11 cannot write to sip locations" do
222
- allow(node).to receive(:[]).with("platform_version").and_return("10.11")
212
+ it "macOS cannot write to sip locations" do
223
213
  allow(::File).to receive(:directory?).and_return(true)
224
214
  allow(Chef::FileAccessControl).to receive(:writable?).and_return(false)
225
215
  expect { directory.run_action(:create) }.to raise_error(Chef::Exceptions::InsufficientPermissions)
226
216
  end
227
217
 
228
- it "os x 10.11 can write to sip exlcusions" do
218
+ it "macOS can write to sip exclusions" do
229
219
  new_resource.path "/usr/local/chef_test"
230
- allow(node).to receive(:[]).with("platform_version").and_return("10.11")
231
220
  allow(::File).to receive(:directory?).and_return(true)
232
221
  allow(Dir).to receive(:mkdir).and_return([true], [])
233
222
  allow(Chef::FileAccessControl).to receive(:writable?).and_return(false)
@@ -33,10 +33,10 @@ describe Chef::Provider::File do
33
33
  content = double("Chef::Provider::File::Content")
34
34
  end
35
35
 
36
- let(:node) { double("Chef::Node") }
37
- let(:events) { double("Chef::Events").as_null_object } # mock all the methods
38
- let(:logger) { double("Mixlib::Log::Child").as_null_object }
39
- let(:run_context) { double("Chef::RunContext", node: node, events: events, logger: logger) }
36
+ let(:node) { Chef::Node.new }
37
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
38
+ let(:run_context) { Chef::RunContext.new(node, {}, events) }
39
+
40
40
  let(:enclosing_directory) do
41
41
  canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
42
42
  end
@@ -400,7 +400,8 @@ describe Chef::Provider::Git do
400
400
  @provider.clone
401
401
  end
402
402
 
403
- it "runs a checkout command with default options" do
403
+ it "runs a checkout command when the local branch is set" do
404
+ @resource.checkout_branch "deploy"
404
405
  expect(@provider).to receive(:shell_out!).with("git branch -f deploy d35af14d41ae22b19da05d7d03a0bafc321b244c", cwd: "/my/deploy/dir",
405
406
  log_tag: "git[web2.0 app]").ordered
406
407
  expect(@provider).to receive(:shell_out!).with("git checkout deploy", cwd: "/my/deploy/dir",
@@ -590,6 +591,45 @@ describe Chef::Provider::Git do
590
591
  end
591
592
  end
592
593
 
594
+ context "with why-run mode" do
595
+ before do
596
+ Chef::Config[:why_run] = true
597
+ @resource.user "test"
598
+ end
599
+
600
+ after do
601
+ Chef::Config[:why_run] = false
602
+ end
603
+
604
+ it "does not raise an error if user does not exist" do
605
+ allow(@provider).to receive(:get_homedir).with(@resource.user).and_return(nil)
606
+ expect { @provider.run_action(:sync) }.not_to raise_error
607
+ end
608
+
609
+ it "does not raise an error if user exists" do
610
+ allow(@provider).to receive(:get_homedir).with(@resource.user).and_return("/home/test")
611
+ expect { @provider.run_action(:sync) }.not_to raise_error
612
+ end
613
+ end
614
+
615
+ context "without why-run mode" do
616
+ before do
617
+ @resource.user "test"
618
+ end
619
+
620
+ it "raises an error if user does not exist" do
621
+ allow(@provider).to receive(:get_homedir).with(@resource.user).and_return(nil)
622
+ expect { @provider.run_action(:sync) }.to raise_error(Chef::Exceptions::User)
623
+ end
624
+
625
+ it "does not raise an error if user exists" do
626
+ allow(@provider).to receive(:action_sync) # stub the entire action
627
+ allow(::File).to receive(:directory?).with("/my/deploy").and_return(true)
628
+ allow(@provider).to receive(:get_homedir).with(@resource.user).and_return("/home/test")
629
+ expect { @provider.run_action(:sync) }.not_to raise_error
630
+ end
631
+ end
632
+
593
633
  it "raises an error if the git clone command would fail because the enclosing directory doesn't exist" do
594
634
  allow(@provider).to receive(:shell_out!)
595
635
  expect { @provider.run_action(:sync) }.to raise_error(Chef::Exceptions::MissingParentDirectory)
@@ -57,7 +57,7 @@ describe Chef::Provider::Group::Groupadd do
57
57
  end
58
58
 
59
59
  it "should set the option for #{property} if the new resources #{property} is not null" do
60
- allow(new_resource).to receive(property).and_return("wowaweea")
60
+ allow(new_resource).to receive(property).and_return("cactus")
61
61
  expect(provider.set_options).to eql([ option, new_resource.send(property), new_resource.group_name])
62
62
  end
63
63
  end
@@ -131,8 +131,8 @@ describe Chef::Provider::Launchd do
131
131
  new_resource.program "/Library/scripts/call_mom.sh"
132
132
  new_resource.time_out 300
133
133
  new_resource.start_calendar_interval "Hour" => 10, "Weekday" => 7
134
- expect(provider.content?).to be_truthy
135
- expect(provider.content).to eql(test_plist)
134
+ expect(provider.file_content?).to be_truthy
135
+ expect(provider.file_content).to eql(test_plist)
136
136
  end
137
137
  end
138
138
 
@@ -147,8 +147,8 @@ describe Chef::Provider::Launchd do
147
147
  new_resource.program "/Library/scripts/call_mom.sh"
148
148
  new_resource.time_out 300
149
149
  new_resource.start_calendar_interval allowed
150
- expect(provider.content?).to be_truthy
151
- expect(provider.content).to eql(test_plist_multiple_intervals)
150
+ expect(provider.file_content?).to be_truthy
151
+ expect(provider.file_content).to eql(test_plist_multiple_intervals)
152
152
  end
153
153
 
154
154
  it "should allow all StartCalendarInterval keys" do
@@ -162,9 +162,9 @@ describe Chef::Provider::Launchd do
162
162
  new_resource.program "/Library/scripts/call_mom.sh"
163
163
  new_resource.time_out 300
164
164
  new_resource.start_calendar_interval allowed
165
- expect(provider.content?).to be_truthy
165
+ expect(provider.file_content?).to be_truthy
166
166
  %w{Minute Hour Day Weekday Month}.each do |key|
167
- expect(provider.content).to include("<key>#{key}</key>")
167
+ expect(provider.file_content).to include("<key>#{key}</key>")
168
168
  end
169
169
  end
170
170
 
@@ -188,50 +188,8 @@ describe Chef::Provider::Launchd do
188
188
  describe "hash is passed" do
189
189
  it "should produce the test_plist content from the plist_hash property" do
190
190
  new_resource.plist_hash test_hash
191
- expect(provider.content?).to be_truthy
192
- expect(provider.content).to eql(test_plist)
193
- end
194
- end
195
- end
196
-
197
- describe "with an :enable action" do
198
- describe "and the file has been updated" do
199
- before(:each) do
200
- allow(provider).to receive(
201
- :manage_plist
202
- ).with(:create).and_return(true)
203
- allow(provider).to receive(
204
- :manage_service
205
- ).with(:restart).and_return(true)
206
- end
207
-
208
- it "should call manage_service with a :restart action" do
209
- expect(provider.manage_service(:restart)).to be_truthy
210
- end
211
-
212
- it "works with action enable" do
213
- expect(run_resource_setup_for_action(:enable)).to be_truthy
214
- provider.action_enable
215
- end
216
- end
217
-
218
- describe "and the file has not been updated" do
219
- before(:each) do
220
- allow(provider).to receive(
221
- :manage_plist
222
- ).with(:create).and_return(nil)
223
- allow(provider).to receive(
224
- :manage_service
225
- ).with(:enable).and_return(true)
226
- end
227
-
228
- it "should call manage_service with a :enable action" do
229
- expect(provider.manage_service(:enable)).to be_truthy
230
- end
231
-
232
- it "works with action enable" do
233
- expect(run_resource_setup_for_action(:enable)).to be_truthy
234
- provider.action_enable
191
+ expect(provider.file_content?).to be_truthy
192
+ expect(provider.file_content).to eql(test_plist)
235
193
  end
236
194
  end
237
195
  end
@@ -358,7 +358,6 @@ describe Chef::Resource::Link do
358
358
  allow(Chef::Resource::Link).to receive(:new).with(
359
359
  provider.new_resource.name
360
360
  ).and_return(resource_link)
361
- allow(resource_link).to receive(:verify_links_supported!)
362
361
  allow(ChefUtils).to receive(:windows?).and_return(true)
363
362
  end
364
363
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  require "spec_helper"
20
20
 
21
- describe Chef::Provider::Log::ChefLog do
21
+ describe Chef::Resource::Log do
22
22
 
23
23
  let(:log_str) { "this is my test string to log" }
24
24
 
@@ -28,9 +28,9 @@ describe Chef::Provider::Log::ChefLog do
28
28
 
29
29
  let(:run_context) { Chef::RunContext.new(node, {}, events) }
30
30
 
31
- let(:new_resource) { Chef::Resource::Log.new(log_str) }
31
+ let(:new_resource) { Chef::Resource::Log.new(log_str, run_context) }
32
32
 
33
- let(:provider) { Chef::Provider::Log::ChefLog.new(new_resource, run_context) }
33
+ let(:provider) { new_resource.provider_for_action(:run) }
34
34
 
35
35
  let(:logger) { double("Mixlib::Log::Child").as_null_object }
36
36
  before do
@@ -19,15 +19,15 @@
19
19
  require "spec_helper"
20
20
  require "ostruct"
21
21
 
22
- describe Chef::Provider::Mdadm do
22
+ describe Chef::Resource::Mdadm do
23
23
 
24
24
  before(:each) do
25
25
  @node = Chef::Node.new
26
26
  @events = Chef::EventDispatch::Dispatcher.new
27
27
  @run_context = Chef::RunContext.new(@node, {}, @events)
28
- @new_resource = Chef::Resource::Mdadm.new("/dev/md1")
28
+ @new_resource = Chef::Resource::Mdadm.new("/dev/md1", run_context)
29
29
  @new_resource.devices ["/dev/sdz1", "/dev/sdz2", "/dev/sdz3"]
30
- @provider = Chef::Provider::Mdadm.new(@new_resource, @run_context)
30
+ @provider = @new_resource.provider_for_action(:create)
31
31
  end
32
32
 
33
33
  describe "when determining the current metadevice status" do
@@ -24,6 +24,6 @@ describe Chef::Provider::Package::Dnf::PythonHelper do
24
24
 
25
25
  it "propagates stacktraces on stderr from the forked subprocess" do
26
26
  allow(helper).to receive(:dnf_command).and_return("ruby -e 'raise \"your hands in the air\"'")
27
- expect { helper.query(:whatprovides, "tcpdump") }.to raise_error(/your hands in the air/)
27
+ expect { helper.package_query(:whatprovides, "tcpdump") }.to raise_error(/your hands in the air/)
28
28
  end
29
29
  end
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Joshua Timberman (<joshua@chef.io>)
3
3
  # Copyright:: Copyright (c) Chef Software Inc.
4
+ # License:: Apache License, Version 2.0
4
5
  #
5
6
  # Licensed under the Apache License, Version 2.0 (the "License");
6
7
  # you may not use this file except in compliance with the License.
@@ -19,171 +20,289 @@ require "spec_helper"
19
20
 
20
21
  describe Chef::Provider::Package::Homebrew do
21
22
  let(:node) { Chef::Node.new }
22
- let(:events) { double("Chef::Events").as_null_object }
23
- let(:logger) { double("Mixlib::Log::Child").as_null_object }
24
- let(:run_context) { double("Chef::RunContext", node: node, events: events, logger: logger) }
25
- let(:new_resource) { Chef::Resource::HomebrewPackage.new("emacs") }
26
- let(:current_resource) { Chef::Resource::HomebrewPackage.new("emacs") }
27
-
23
+ let(:new_resource) { Chef::Resource::HomebrewPackage.new(%w{emacs vim}) }
24
+ let(:current_resource) { Chef::Resource::HomebrewPackage.new("emacs, vim") }
28
25
  let(:provider) do
26
+ node = Chef::Node.new
27
+ events = Chef::EventDispatch::Dispatcher.new
28
+ run_context = Chef::RunContext.new(node, {}, events)
29
29
  Chef::Provider::Package::Homebrew.new(new_resource, run_context)
30
30
  end
31
31
 
32
32
  let(:homebrew_uid) { 1001 }
33
33
 
34
- let(:uninstalled_brew_info) do
35
- {
36
- "name" => "emacs",
37
- "homepage" => "http://www.gnu.org/software/emacs",
38
- "versions" => {
39
- "stable" => "24.3",
40
- "bottle" => false,
41
- "devel" => nil,
42
- "head" => nil,
43
- },
44
- "revision" => 0,
45
- "installed" => [],
46
- "linked_keg" => nil,
47
- "keg_only" => nil,
48
- "dependencies" => [],
49
- "conflicts_with" => [],
50
- "caveats" => nil,
51
- "options" => [],
52
- }
53
- end
54
-
55
- let(:installed_brew_info) do
56
- {
57
- "name" => "emacs",
58
- "homepage" => "http://www.gnu.org/software/emacs/",
59
- "versions" => {
60
- "stable" => "24.3",
61
- "bottle" => false,
62
- "devel" => nil,
63
- "head" => "HEAD",
64
- },
65
- "revision" => 0,
66
- "installed" => [{ "version" => "24.3" }],
67
- "linked_keg" => "24.3",
68
- "keg_only" => nil,
69
- "dependencies" => [],
70
- "conflicts_with" => [],
71
- "caveats" => "",
72
- "options" => [],
73
- }
74
- end
75
-
76
- let(:keg_only_brew_info) do
77
- {
78
- "name" => "emacs-kegger",
79
- "homepage" => "http://www.gnu.org/software/emacs/",
80
- "versions" => {
81
- "stable" => "24.3-keggy",
82
- "bottle" => false,
83
- "devel" => nil,
84
- "head" => "HEAD",
85
- },
86
- "revision" => 0,
87
- "installed" => [{ "version" => "24.3-keggy" }],
88
- "linked_keg" => nil,
89
- "keg_only" => true,
90
- "dependencies" => [],
91
- "conflicts_with" => [],
92
- "caveats" => "",
93
- "options" => [],
94
- }
95
- end
96
-
97
- let(:keg_only_uninstalled_brew_info) do
98
- {
99
- "name" => "emacs-kegger",
100
- "homepage" => "http://www.gnu.org/software/emacs/",
101
- "versions" => {
102
- "stable" => "24.3-keggy",
103
- "bottle" => false,
104
- "devel" => nil,
105
- "head" => "HEAD",
106
- },
107
- "revision" => 0,
108
- "installed" => [],
109
- "linked_keg" => nil,
110
- "keg_only" => true,
111
- "dependencies" => [],
112
- "conflicts_with" => [],
113
- "caveats" => "",
114
- "options" => [],
115
- }
34
+ let(:brew_cmd_output_data) { '[{"name":"emacs","full_name":"emacs","oldname":null,"aliases":[],"versioned_formulae":[],"desc":"GNU Emacs text editor","homepage":"https://www.gnu.org/software/emacs/","versions":{"stable":"26.3","devel":null,"head":"HEAD","bottle":true},"urls":{"stable":{"url":"https://ftp.gnu.org/gnu/emacs/emacs-26.3.tar.xz","tag":null,"revision":null}},"revision":0,"version_scheme":0,"bottle":{"stable":{"rebuild":0,"cellar":"/usr/local/Cellar","prefix":"/usr/local","root_url":"https://homebrew.bintray.com/bottles","files":{"catalina":{"url":"https://homebrew.bintray.com/bottles/emacs-26.3.catalina.bottle.tar.gz","sha256":"9ab33f4386ca5f7326a8c28da1324556ec990f682a7ca88641203da0b42dbdae"},"mojave":{"url":"https://homebrew.bintray.com/bottles/emacs-26.3.mojave.bottle.tar.gz","sha256":"8162a26246de7db44c53ea0d0ef0a806140318d19c69e8e5e33aa88ce7e823a8"},"high_sierra":{"url":"https://homebrew.bintray.com/bottles/emacs-26.3.high_sierra.bottle.tar.gz","sha256":"6a2629b6deddf99f81abb1990ecd6c87f0242a0eecbb6b6c2e4c3540e421d4c4"},"sierra":{"url":"https://homebrew.bintray.com/bottles/emacs-26.3.sierra.bottle.tar.gz","sha256":"2a47477e71766d7dd6b16c29ad5ba71817ed80d06212e3261ef3c776e7e9f5a2"}}}},"keg_only":false,"bottle_disabled":false,"options":[],"build_dependencies":["pkg-config"],"dependencies":["gnutls"],"recommended_dependencies":[],"optional_dependencies":[],"uses_from_macos":["libxml2","ncurses"],"requirements":[],"conflicts_with":[],"caveats":null,"installed":[],"linked_keg":null,"pinned":false,"outdated":false},{"name":"vim","full_name":"vim","oldname":null,"aliases":[],"versioned_formulae":[],"desc":"Vi \'workalike\' with many additional features","homepage":"https://www.vim.org/","versions":{"stable":"8.2.0550","devel":null,"head":"HEAD","bottle":true},"urls":{"stable":{"url":"https://github.com/vim/vim/archive/v8.2.0550.tar.gz","tag":null,"revision":null}},"revision":0,"version_scheme":0,"bottle":{"stable":{"rebuild":0,"cellar":"/usr/local/Cellar","prefix":"/usr/local","root_url":"https://homebrew.bintray.com/bottles","files":{"catalina":{"url":"https://homebrew.bintray.com/bottles/vim-8.2.0550.catalina.bottle.tar.gz","sha256":"8f9252500775aa85d8f826af30ca9e1118a56145fc2f961c37abed48bf78cf6b"},"mojave":{"url":"https://homebrew.bintray.com/bottles/vim-8.2.0550.mojave.bottle.tar.gz","sha256":"7566c83b770f3e8c4d4b462a39e5eb26609b37a8f8db6690a2560a3e22ded6b6"},"high_sierra":{"url":"https://homebrew.bintray.com/bottles/vim-8.2.0550.high_sierra.bottle.tar.gz","sha256":"a76e517fc69bf67b6903cb82295bc085c5eb4b46b4659f034c694dd97d2ee2d9"}}}},"keg_only":false,"bottle_disabled":false,"options":[],"build_dependencies":[],"dependencies":["gettext","lua","perl","python","ruby"],"recommended_dependencies":[],"optional_dependencies":[],"uses_from_macos":["ncurses"],"requirements":[],"conflicts_with":["ex-vi","macvim"],"caveats":null,"installed":[{"version":"8.2.0550","used_options":[],"built_as_bottle":true,"poured_from_bottle":true,"runtime_dependencies":[{"full_name":"gettext","version":"0.20.1"},{"full_name":"lua","version":"5.3.5"},{"full_name":"perl","version":"5.30.2"},{"full_name":"gdbm","version":"1.18.1"},{"full_name":"openssl@1.1","version":"1.1.1f"},{"full_name":"readline","version":"8.0.4"},{"full_name":"sqlite","version":"3.31.1"},{"full_name":"xz","version":"5.2.5"},{"full_name":"python","version":"3.7.7"},{"full_name":"libyaml","version":"0.2.2"},{"full_name":"ruby","version":"2.7.1"}],"installed_as_dependency":false,"installed_on_request":true}],"linked_keg":"8.2.0550","pinned":false,"outdated":false}]' }
35
+
36
+ let(:brew_info_data) do
37
+ { "openssl@1.1" =>
38
+ { "name" => "openssl@1.1",
39
+ "full_name" => "openssl@1.1",
40
+ "oldname" => nil,
41
+ "aliases" => ["openssl"],
42
+ "versioned_formulae" => [],
43
+ "desc" => "Cryptography and SSL/TLS Toolkit",
44
+ "homepage" => "https://openssl.org/",
45
+ "versions" => { "stable" => "1.1.1f", "devel" => nil, "head" => nil, "bottle" => true },
46
+ "urls" => { "stable" => { "url" => "https://www.openssl.org/source/openssl-1.1.1f.tar.gz", "tag" => nil, "revision" => nil } },
47
+ "revision" => 0,
48
+ "version_scheme" => 1,
49
+ "bottle" =>
50
+ { "stable" =>
51
+ { "rebuild" => 0,
52
+ "cellar" => "/usr/local/Cellar",
53
+ "prefix" => "/usr/local",
54
+ "root_url" => "https://homebrew.bintray.com/bottles",
55
+ "files" =>
56
+ { "catalina" => { "url" => "https://homebrew.bintray.com/bottles/openssl@1.1-1.1.1f.catalina.bottle.tar.gz", "sha256" => "724cd97c269952cdc28e24798e350fcf520a32c5985aeb26053ce006a09d8179" },
57
+ "mojave" => { "url" => "https://homebrew.bintray.com/bottles/openssl@1.1-1.1.1f.mojave.bottle.tar.gz", "sha256" => "25ab844d2f14fc85c7f52958b4b89bdd2965bbd9c557445829eff6473f238744" },
58
+ "high_sierra" => { "url" => "https://homebrew.bintray.com/bottles/openssl@1.1-1.1.1f.high_sierra.bottle.tar.gz", "sha256" => "27f26e2442222ac0565193fe0b86d8719559d776bcdd070d6113c16bb13accf6" } } } },
59
+ "keg_only" => true,
60
+ "bottle_disabled" => false,
61
+ "options" => [],
62
+ "build_dependencies" => [],
63
+ "dependencies" => [],
64
+ "recommended_dependencies" => [],
65
+ "optional_dependencies" => [],
66
+ "uses_from_macos" => [],
67
+ "requirements" => [],
68
+ "conflicts_with" => [],
69
+ "caveats" =>
70
+ "A CA file has been bootstrapped using certificates from the system\nkeychain. To add additional certificates, place .pem files in\n $(brew --prefix)/etc/openssl@1.1/certs\n\nand run\n $(brew --prefix)/opt/openssl@1.1/bin/c_rehash\n",
71
+ "installed" => [{ "version" => "1.1.1a", "used_options" => [], "built_as_bottle" => true, "poured_from_bottle" => true, "runtime_dependencies" => [], "installed_as_dependency" => true, "installed_on_request" => false }],
72
+ "linked_keg" => nil,
73
+ "pinned" => false,
74
+ "outdated" => false },
75
+ "kubernetes-cli" =>
76
+ { "name" => "kubernetes-cli",
77
+ "full_name" => "kubernetes-cli",
78
+ "oldname" => nil,
79
+ "aliases" => ["kubectl"],
80
+ "versioned_formulae" => [],
81
+ "desc" => "Kubernetes command-line interface",
82
+ "homepage" => "https://kubernetes.io/",
83
+ "versions" => { "stable" => "1.18.1", "devel" => nil, "head" => "HEAD", "bottle" => true },
84
+ "urls" => { "stable" => { "url" => "https://github.com/kubernetes/kubernetes.git", "tag" => "v1.18.1", "revision" => "7879fc12a63337efff607952a323df90cdc7a335" } },
85
+ "revision" => 0,
86
+ "version_scheme" => 0,
87
+ "bottle" =>
88
+ { "stable" =>
89
+ { "rebuild" => 0,
90
+ "cellar" => ":any_skip_relocation",
91
+ "prefix" => "/usr/local",
92
+ "root_url" => "https://homebrew.bintray.com/bottles",
93
+ "files" =>
94
+ { "catalina" => { "url" => "https://homebrew.bintray.com/bottles/kubernetes-cli-1.18.1.catalina.bottle.tar.gz", "sha256" => "0b3d688ee458b70b914a37a4ba867e202c6e71190d0c40a27f84628aec744749" },
95
+ "mojave" => { "url" => "https://homebrew.bintray.com/bottles/kubernetes-cli-1.18.1.mojave.bottle.tar.gz", "sha256" => "21fddfc86ec6d3e4f7ea787310b0fafd845d368de37524569bbe45938b18ba09" },
96
+ "high_sierra" => { "url" => "https://homebrew.bintray.com/bottles/kubernetes-cli-1.18.1.high_sierra.bottle.tar.gz", "sha256" => "1e20dcd177fd16b862b2432950984807b048cca5879c27bec59e85590f40eece" } } } },
97
+ "keg_only" => false,
98
+ "bottle_disabled" => false,
99
+ "options" => [],
100
+ "build_dependencies" => ["go"],
101
+ "dependencies" => [],
102
+ "recommended_dependencies" => [],
103
+ "optional_dependencies" => [],
104
+ "uses_from_macos" => [],
105
+ "requirements" => [],
106
+ "conflicts_with" => [],
107
+ "caveats" => nil,
108
+ "installed" => [],
109
+ "linked_keg" => nil,
110
+ "pinned" => false,
111
+ "outdated" => false },
112
+ "vim" =>
113
+ { "name" => "vim",
114
+ "full_name" => "vim",
115
+ "oldname" => nil,
116
+ "aliases" => [],
117
+ "versioned_formulae" => [],
118
+ "desc" => "Vi 'workalike' with many additional features",
119
+ "homepage" => "https://www.vim.org/",
120
+ "versions" => { "stable" => "8.2.0550", "devel" => nil, "head" => "HEAD", "bottle" => true },
121
+ "urls" => { "stable" => { "url" => "https://github.com/vim/vim/archive/v8.2.0550.tar.gz", "tag" => nil, "revision" => nil } },
122
+ "revision" => 0,
123
+ "version_scheme" => 0,
124
+ "bottle" =>
125
+ { "stable" =>
126
+ { "rebuild" => 0,
127
+ "cellar" => "/usr/local/Cellar",
128
+ "prefix" => "/usr/local",
129
+ "root_url" => "https://homebrew.bintray.com/bottles",
130
+ "files" =>
131
+ { "catalina" => { "url" => "https://homebrew.bintray.com/bottles/vim-8.2.0550.catalina.bottle.tar.gz", "sha256" => "8f9252500775aa85d8f826af30ca9e1118a56145fc2f961c37abed48bf78cf6b" },
132
+ "mojave" => { "url" => "https://homebrew.bintray.com/bottles/vim-8.2.0550.mojave.bottle.tar.gz", "sha256" => "7566c83b770f3e8c4d4b462a39e5eb26609b37a8f8db6690a2560a3e22ded6b6" },
133
+ "high_sierra" => { "url" => "https://homebrew.bintray.com/bottles/vim-8.2.0550.high_sierra.bottle.tar.gz", "sha256" => "a76e517fc69bf67b6903cb82295bc085c5eb4b46b4659f034c694dd97d2ee2d9" } } } },
134
+ "keg_only" => false,
135
+ "bottle_disabled" => false,
136
+ "options" => [],
137
+ "build_dependencies" => [],
138
+ "dependencies" => %w{gettext lua perl python ruby},
139
+ "recommended_dependencies" => [],
140
+ "optional_dependencies" => [],
141
+ "uses_from_macos" => ["ncurses"],
142
+ "requirements" => [],
143
+ "conflicts_with" => %w{ex-vi macvim},
144
+ "caveats" => nil,
145
+ "installed" =>
146
+ [{ "version" => "8.2.0550",
147
+ "used_options" => [],
148
+ "built_as_bottle" => true,
149
+ "poured_from_bottle" => true,
150
+ "runtime_dependencies" =>
151
+ [{ "full_name" => "gettext", "version" => "0.20.1" },
152
+ { "full_name" => "lua", "version" => "5.3.5" },
153
+ { "full_name" => "perl", "version" => "5.30.2" },
154
+ { "full_name" => "gdbm", "version" => "1.18.1" },
155
+ { "full_name" => "openssl@1.1", "version" => "1.1.1f" },
156
+ { "full_name" => "readline", "version" => "8.0.4" },
157
+ { "full_name" => "sqlite", "version" => "3.31.1" },
158
+ { "full_name" => "xz", "version" => "5.2.5" },
159
+ { "full_name" => "python", "version" => "3.7.7" },
160
+ { "full_name" => "libyaml", "version" => "0.2.2" },
161
+ { "full_name" => "ruby", "version" => "2.7.1" }],
162
+ "installed_as_dependency" => false,
163
+ "installed_on_request" => true }],
164
+ "linked_keg" => "8.2.0550",
165
+ "pinned" => false,
166
+ "outdated" => false },
167
+ "curl" =>
168
+ { "name" => "curl",
169
+ "full_name" => "curl",
170
+ "oldname" => nil,
171
+ "aliases" => [],
172
+ "versioned_formulae" => [],
173
+ "desc" => "Get a file from an HTTP, HTTPS or FTP server",
174
+ "homepage" => "https://curl.haxx.se/",
175
+ "versions" => { "stable" => "7.69.1", "devel" => nil, "head" => "HEAD", "bottle" => true },
176
+ "urls" => { "stable" => { "url" => "https://curl.haxx.se/download/curl-7.69.1.tar.bz2", "tag" => nil, "revision" => nil } },
177
+ "revision" => 0,
178
+ "version_scheme" => 0,
179
+ "bottle" =>
180
+ { "stable" =>
181
+ { "rebuild" => 0,
182
+ "cellar" => ":any",
183
+ "prefix" => "/usr/local",
184
+ "root_url" => "https://homebrew.bintray.com/bottles",
185
+ "files" =>
186
+ { "catalina" => { "url" => "https://homebrew.bintray.com/bottles/curl-7.69.1.catalina.bottle.tar.gz", "sha256" => "400500fede02f9335bd38c16786b2bbf5e601e358dfac8c21e363d2a8fdd8fac" },
187
+ "mojave" => { "url" => "https://homebrew.bintray.com/bottles/curl-7.69.1.mojave.bottle.tar.gz", "sha256" => "f082c275f9af1e8e93be12b63a1aff659ba6efa48c8528a97e26c9858a6f95b6" },
188
+ "high_sierra" => { "url" => "https://homebrew.bintray.com/bottles/curl-7.69.1.high_sierra.bottle.tar.gz", "sha256" => "ad023093c252799a4c60646a149bfe14ffa6984817cf463a6f0e98f6551057fe" } } } },
189
+ "keg_only" => true,
190
+ "bottle_disabled" => false,
191
+ "options" => [],
192
+ "build_dependencies" => ["pkg-config"],
193
+ "dependencies" => [],
194
+ "recommended_dependencies" => [],
195
+ "optional_dependencies" => [],
196
+ "uses_from_macos" => ["openssl@1.1", "zlib"],
197
+ "requirements" => [],
198
+ "conflicts_with" => [],
199
+ "caveats" => nil,
200
+ "installed" => [],
201
+ "linked_keg" => nil,
202
+ "pinned" => false,
203
+ "outdated" => false } }
116
204
  end
117
205
 
118
- before(:each) do
119
-
120
- end
121
-
122
- describe "load_current_resource" do
206
+ describe "#load_current_resource" do
123
207
  before(:each) do
124
- allow(provider).to receive(:current_installed_version).and_return(nil)
125
- allow(provider).to receive(:candidate_version).and_return("24.3")
208
+ allow(provider).to receive(:installed_version).and_return(nil)
209
+ allow(provider).to receive(:available_version).and_return("1.0")
126
210
  end
127
211
 
128
212
  it "creates a current resource with the name of the new resource" do
129
213
  provider.load_current_resource
130
214
  expect(provider.current_resource).to be_a(Chef::Resource::Package)
131
- expect(provider.current_resource.name).to eql("emacs")
215
+ expect(provider.current_resource.name).to eql("emacs, vim")
132
216
  end
133
217
 
134
218
  it "creates a current resource with the version if the package is installed" do
135
- expect(provider).to receive(:current_installed_version).and_return("24.3")
219
+ expect(provider).to receive(:get_current_versions).and_return(["1.0", "2.0"])
136
220
  provider.load_current_resource
137
- expect(provider.current_resource.version).to eql("24.3")
221
+ expect(provider.current_resource.version).to eql(["1.0", "2.0"])
138
222
  end
139
223
 
140
224
  it "creates a current resource with a nil version if the package is not installed" do
141
225
  provider.load_current_resource
142
- expect(provider.current_resource.version).to be_nil
226
+ expect(provider.current_resource.version).to eq([nil, nil])
143
227
  end
144
228
 
145
229
  it "sets a candidate version if one exists" do
146
230
  provider.load_current_resource
147
- expect(provider.candidate_version).to eql("24.3")
231
+ expect(provider.candidate_version).to eql(["1.0", "1.0"])
232
+ end
233
+ end
234
+
235
+ describe "#brew_info" do
236
+ it "returns a hash of data per package" do
237
+ allow(provider).to receive(:brew_cmd_output).and_return(brew_cmd_output_data)
238
+ expect(provider.brew_info).to have_key("vim")
239
+ end
240
+
241
+ it "returns empty hash for packages if they lack data" do
242
+ new_resource.package_name %w{bogus}
243
+ allow(provider).to receive(:brew_cmd_output).and_return("")
244
+ expect(provider.brew_info).to eq("bogus" => {})
148
245
  end
149
246
  end
150
247
 
151
- describe "current_installed_version" do
248
+ describe "#installed_version" do
152
249
  it "returns the latest version from brew info if the package is keg only" do
153
- allow(provider).to receive(:brew_info).and_return(keg_only_brew_info)
154
- expect(provider.current_installed_version).to eql("24.3-keggy")
250
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
251
+ expect(provider.installed_version("openssl@1.1")).to eql("1.1.1a")
155
252
  end
156
253
 
157
254
  it "returns the linked keg version if the package is not keg only" do
158
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
159
- expect(provider.current_installed_version).to eql("24.3")
255
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
256
+ expect(provider.installed_version("vim")).to eql("8.2.0550")
160
257
  end
161
258
 
162
259
  it "returns nil if the package is not installed" do
163
- allow(provider).to receive(:brew_info).and_return(uninstalled_brew_info)
164
- expect(provider.current_installed_version).to be_nil
260
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
261
+ expect(provider.installed_version("kubernetes-cli")).to be_nil
165
262
  end
166
263
 
167
264
  it "returns nil if the package is keg only and not installed" do
168
- allow(provider).to receive(:brew_info).and_return(keg_only_uninstalled_brew_info)
169
- expect(provider.current_installed_version).to be_nil
265
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
266
+ expect(provider.installed_version("curl")).to be_nil
267
+ end
268
+
269
+ it "returns the version if a package alias is given" do
270
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
271
+ expect(provider.installed_version("openssl")).to eql("1.1.1a")
272
+ end
273
+ end
274
+
275
+ describe "#available_version" do
276
+ it "returns version of package when exact name given" do
277
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
278
+ expect(provider.available_version("openssl@1.1")).to eql("1.1.1f")
279
+ end
280
+
281
+ it "returns version of package when alias is given" do
282
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
283
+ expect(provider.available_version("openssl")).to eql("1.1.1f")
284
+ end
285
+
286
+ it "returns nil if the package is not installed" do
287
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
288
+ expect(provider.available_version("bogus")).to be_nil
170
289
  end
171
290
  end
172
291
 
173
- describe "brew" do
292
+ describe "#brew_cmd_output" do
174
293
  before do
175
294
  expect(provider).to receive(:find_homebrew_uid).and_return(homebrew_uid)
176
295
  expect(Etc).to receive(:getpwuid).with(homebrew_uid).and_return(OpenStruct.new(name: "name", dir: "/"))
177
296
  end
178
297
 
179
- it "passes a single to the brew command and return stdout" do
298
+ it "passes a single pkg to the brew command and return stdout" do
180
299
  allow(provider).to receive(:shell_out!).and_return(OpenStruct.new(stdout: "zombo"))
181
- expect(provider.brew).to eql("zombo")
300
+ expect(provider.brew_cmd_output).to eql("zombo")
182
301
  end
183
302
 
184
303
  it "takes multiple arguments as an array" do
185
304
  allow(provider).to receive(:shell_out!).and_return(OpenStruct.new(stdout: "homestarrunner"))
186
- expect(provider.brew("info", "opts", "bananas")).to eql("homestarrunner")
305
+ expect(provider.brew_cmd_output("info", "opts", "bananas")).to eql("homestarrunner")
187
306
  end
188
307
 
189
308
  context "when new_resource is Package" do
@@ -191,102 +310,89 @@ describe Chef::Provider::Package::Homebrew do
191
310
 
192
311
  it "does not try to read homebrew_user from Package, which does not have it" do
193
312
  allow(provider).to receive(:shell_out!).and_return(OpenStruct.new(stdout: "zombo"))
194
- expect(provider.brew).to eql("zombo")
313
+ expect(provider.brew_cmd_output).to eql("zombo")
195
314
  end
196
315
  end
197
316
  end
198
317
 
199
- context "when testing actions" do
318
+ describe "resource actions" do
200
319
  before(:each) do
201
320
  provider.current_resource = current_resource
321
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
202
322
  end
203
323
 
204
- describe "install_package" do
205
- before(:each) do
206
- allow(provider).to receive(:candidate_version).and_return("24.3")
324
+ describe "install" do
325
+ it "calls brew_cmd_output to install only the necessary packages" do
326
+ new_resource.package_name %w{curl openssl}
327
+ expect(provider).to receive(:brew_cmd_output).with("install", nil, ["curl"])
328
+ provider.run_action(:install)
207
329
  end
208
330
 
209
- it "installs the named package with brew install" do
210
- allow(provider.new_resource).to receive(:version).and_return("24.3")
211
- allow(provider.current_resource).to receive(:version).and_return(nil)
212
- allow(provider).to receive(:brew_info).and_return(uninstalled_brew_info)
213
- expect(provider).to receive(:get_response_from_command).with("brew", "install", nil, "emacs")
214
- provider.install_package("emacs", "24.3")
215
- end
216
-
217
- it "does not do anything if the package is installed" do
218
- allow(provider.current_resource).to receive(:version).and_return("24.3")
219
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
220
- expect(provider).not_to receive(:get_response_from_command)
221
- provider.install_package("emacs", "24.3")
331
+ it "does not do anything if all the packages are already installed" do
332
+ new_resource.package_name %w{vim openssl}
333
+ expect(provider).not_to receive(:brew_cmd_output)
334
+ provider.run_action(:install)
222
335
  end
223
336
 
224
337
  it "uses options to the brew command if specified" do
338
+ new_resource.package_name "curl"
225
339
  new_resource.options "--cocoa"
226
- allow(provider.current_resource).to receive(:version).and_return("24.3")
227
- allow(provider).to receive(:get_response_from_command).with("brew", "install", "--cocoa", "emacs")
228
- provider.install_package("emacs", "24.3")
340
+ expect(provider).to receive(:brew_cmd_output).with("install", ["--cocoa"], ["curl"])
341
+ provider.run_action(:install)
229
342
  end
230
343
  end
231
344
 
232
- describe "upgrade_package" do
233
- it "uses brew upgrade to upgrade the package if it is installed" do
234
- allow(provider.current_resource).to receive(:version).and_return("24")
235
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
236
- expect(provider).to receive(:get_response_from_command).with("brew", "upgrade", nil, "emacs")
237
- provider.upgrade_package("emacs", "24.3")
238
- end
239
-
240
- it "does not do anything if the package version is already installed" do
241
- allow(provider.current_resource).to receive(:version).and_return("24.3")
242
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
243
- expect(provider).not_to receive(:get_response_from_command)
244
- provider.install_package("emacs", "24.3")
345
+ describe "upgrade" do
346
+ it "calls #brew_cmd_output to upgrade the packages" do
347
+ new_resource.package_name %w{openssl}
348
+ allow(provider.current_resource).to receive(:version).and_return(["1.0.1a"])
349
+ expect(provider).to receive(:brew_cmd_output).with("upgrade", nil, ["openssl"])
350
+ provider.run_action(:upgrade)
245
351
  end
246
352
 
247
- it "uses brew install to install the package if it is not installed" do
248
- allow(provider.current_resource).to receive(:version).and_return(nil)
249
- allow(provider).to receive(:brew_info).and_return(uninstalled_brew_info)
250
- expect(provider).to receive(:get_response_from_command).with("brew", "install", nil, "emacs")
251
- provider.upgrade_package("emacs", "24.3")
353
+ it "calls #brew_cmd_output to both upgrade and install the packages as necessary" do
354
+ new_resource.package_name %w{openssl kubernetes-cli}
355
+ allow(provider.current_resource).to receive(:version).and_return(["1.0.1a", nil])
356
+ expect(provider).to receive(:brew_cmd_output).with("upgrade", nil, ["openssl"])
357
+ expect(provider).to receive(:brew_cmd_output).with("install", nil, ["kubernetes-cli"])
358
+ provider.run_action(:upgrade)
252
359
  end
253
360
 
254
361
  it "uses options to the brew command if specified" do
255
- allow(provider.current_resource).to receive(:version).and_return("24")
256
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
362
+ new_resource.package_name %w{openssl}
363
+ allow(provider.current_resource).to receive(:version).and_return(["1.0.1a"])
364
+ allow(provider).to receive(:brew_info).and_return(brew_info_data)
257
365
  new_resource.options "--cocoa"
258
- expect(provider).to receive(:get_response_from_command).with("brew", "upgrade", [ "--cocoa" ], "emacs")
259
- provider.upgrade_package("emacs", "24.3")
366
+ expect(provider).to receive(:brew_cmd_output).with("upgrade", [ "--cocoa" ], ["openssl"])
367
+ provider.run_action(:upgrade)
260
368
  end
261
369
  end
262
370
 
263
- describe "remove_package" do
264
- it "uninstalls the package with brew uninstall" do
265
- allow(provider.current_resource).to receive(:version).and_return("24.3")
266
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
267
- expect(provider).to receive(:get_response_from_command).with("brew", "uninstall", nil, "emacs")
268
- provider.remove_package("emacs", "24.3")
371
+ describe "remove" do
372
+ it "calls #brew_cmd_output to uninstall the packages" do
373
+ new_resource.package_name %w{curl openssl}
374
+ expect(provider).to receive(:brew_cmd_output).with("uninstall", nil, %w{curl openssl})
375
+ provider.run_action(:remove)
269
376
  end
270
377
 
271
378
  it "does not do anything if the package is not installed" do
272
- allow(provider).to receive(:brew_info).and_return(uninstalled_brew_info)
273
- expect(provider).not_to receive(:get_response_from_command)
274
- provider.remove_package("emacs", "24.3")
379
+ new_resource.package_name %w{kubernetes-cli}
380
+ expect(provider).not_to receive(:brew_cmd_output)
381
+ provider.run_action(:remove)
275
382
  end
276
383
  end
277
384
 
278
- describe "purge_package" do
279
- it "uninstalls the package with brew uninstall --force" do
280
- allow(provider.current_resource).to receive(:version).and_return("24.3")
281
- allow(provider).to receive(:brew_info).and_return(installed_brew_info)
282
- expect(provider).to receive(:get_response_from_command).with("brew", "uninstall", "--force", nil, "emacs")
283
- provider.purge_package("emacs", "24.3")
385
+ describe "purge" do
386
+ it "call #brew_cmd_output to uninstall --force the packages" do
387
+ new_resource.package_name %w{curl openssl}
388
+ expect(provider).to receive(:brew_cmd_output).with("uninstall", "--force", nil, %w{curl openssl})
389
+ provider.run_action(:purge)
284
390
  end
285
391
 
286
392
  it "does not do anything if the package is not installed" do
287
- allow(provider).to receive(:brew_info).and_return(uninstalled_brew_info)
288
- expect(provider).not_to receive(:get_response_from_command)
289
- provider.purge_package("emacs", "24.3")
393
+ new_resource.package_name %w{kubernetes-cli}
394
+ expect(provider).not_to receive(:brew_cmd_output)
395
+ provider.run_action(:purge)
290
396
  end
291
397
  end
292
398
  end