puppet 6.17.0-x64-mingw32 → 6.21.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (401) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +38 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +20 -21
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +1 -1
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/defaults.rb +88 -38
  22. data/lib/puppet/environments.rb +84 -59
  23. data/lib/puppet/face/catalog.rb +1 -1
  24. data/lib/puppet/face/config.rb +56 -16
  25. data/lib/puppet/face/epp.rb +12 -2
  26. data/lib/puppet/face/facts.rb +60 -0
  27. data/lib/puppet/face/node.rb +3 -3
  28. data/lib/puppet/face/node/clean.rb +2 -2
  29. data/lib/puppet/face/status.rb +1 -1
  30. data/lib/puppet/feature/base.rb +1 -1
  31. data/lib/puppet/ffi/posix.rb +10 -0
  32. data/lib/puppet/ffi/posix/constants.rb +14 -0
  33. data/lib/puppet/ffi/posix/functions.rb +24 -0
  34. data/lib/puppet/file_bucket/dipper.rb +1 -1
  35. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  36. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  37. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  38. data/lib/puppet/file_system/file_impl.rb +3 -3
  39. data/lib/puppet/functions/epp.rb +1 -0
  40. data/lib/puppet/functions/inline_epp.rb +1 -0
  41. data/lib/puppet/functions/lstrip.rb +4 -4
  42. data/lib/puppet/functions/new.rb +8 -3
  43. data/lib/puppet/functions/reverse_each.rb +1 -1
  44. data/lib/puppet/functions/rstrip.rb +4 -4
  45. data/lib/puppet/functions/step.rb +1 -1
  46. data/lib/puppet/functions/strip.rb +4 -4
  47. data/lib/puppet/gettext/config.rb +5 -5
  48. data/lib/puppet/gettext/module_translations.rb +4 -4
  49. data/lib/puppet/http.rb +1 -0
  50. data/lib/puppet/http/client.rb +1 -1
  51. data/lib/puppet/http/resolver.rb +5 -8
  52. data/lib/puppet/http/resolver/server_list.rb +18 -36
  53. data/lib/puppet/http/resolver/settings.rb +4 -4
  54. data/lib/puppet/http/resolver/srv.rb +5 -5
  55. data/lib/puppet/http/service.rb +3 -1
  56. data/lib/puppet/http/service/compiler.rb +1 -1
  57. data/lib/puppet/http/service/file_server.rb +1 -1
  58. data/lib/puppet/http/service/puppetserver.rb +39 -0
  59. data/lib/puppet/http/session.rb +5 -4
  60. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  61. data/lib/puppet/indirector/exec.rb +1 -1
  62. data/lib/puppet/indirector/fact_search.rb +60 -0
  63. data/lib/puppet/indirector/facts/facter.rb +3 -3
  64. data/lib/puppet/indirector/facts/json.rb +27 -0
  65. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  66. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  67. data/lib/puppet/indirector/hiera.rb +4 -0
  68. data/lib/puppet/indirector/indirection.rb +1 -1
  69. data/lib/puppet/indirector/json.rb +5 -1
  70. data/lib/puppet/indirector/msgpack.rb +1 -1
  71. data/lib/puppet/indirector/node/json.rb +8 -0
  72. data/lib/puppet/indirector/report/json.rb +34 -0
  73. data/lib/puppet/indirector/report/processor.rb +2 -2
  74. data/lib/puppet/indirector/request.rb +4 -4
  75. data/lib/puppet/indirector/yaml.rb +1 -1
  76. data/lib/puppet/module.rb +1 -2
  77. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  78. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  79. data/lib/puppet/network/format_support.rb +2 -2
  80. data/lib/puppet/network/formats.rb +2 -1
  81. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  82. data/lib/puppet/network/http/route.rb +2 -2
  83. data/lib/puppet/node/environment.rb +12 -5
  84. data/lib/puppet/node/facts.rb +17 -0
  85. data/lib/puppet/pal/pal_impl.rb +90 -13
  86. data/lib/puppet/parameter.rb +1 -1
  87. data/lib/puppet/parser/ast/leaf.rb +3 -2
  88. data/lib/puppet/parser/functions.rb +21 -17
  89. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  90. data/lib/puppet/parser/templatewrapper.rb +1 -1
  91. data/lib/puppet/parser/type_loader.rb +2 -2
  92. data/lib/puppet/pops/adaptable.rb +7 -13
  93. data/lib/puppet/pops/adapters.rb +8 -4
  94. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  95. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  96. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  97. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  98. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  99. data/lib/puppet/pops/loaders.rb +18 -11
  100. data/lib/puppet/pops/lookup/context.rb +1 -1
  101. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  102. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  103. data/lib/puppet/pops/types/iterable.rb +34 -8
  104. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  105. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  106. data/lib/puppet/pops/validation/checker4_0.rb +19 -15
  107. data/lib/puppet/property/list.rb +1 -1
  108. data/lib/puppet/provider/file/windows.rb +1 -1
  109. data/lib/puppet/provider/group/groupadd.rb +13 -8
  110. data/lib/puppet/provider/package/apt.rb +67 -1
  111. data/lib/puppet/provider/package/aptitude.rb +6 -0
  112. data/lib/puppet/provider/package/dpkg.rb +1 -1
  113. data/lib/puppet/provider/package/gem.rb +4 -2
  114. data/lib/puppet/provider/package/pip2.rb +17 -0
  115. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  116. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  117. data/lib/puppet/provider/package/yum.rb +1 -0
  118. data/lib/puppet/provider/package/zypper.rb +3 -0
  119. data/lib/puppet/provider/service/debian.rb +2 -0
  120. data/lib/puppet/provider/user/aix.rb +3 -3
  121. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  122. data/lib/puppet/provider/user/useradd.rb +55 -8
  123. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  124. data/lib/puppet/reference/configuration.rb +6 -5
  125. data/lib/puppet/resource/type.rb +2 -1
  126. data/lib/puppet/rest/route.rb +2 -2
  127. data/lib/puppet/settings.rb +63 -21
  128. data/lib/puppet/settings/alias_setting.rb +37 -0
  129. data/lib/puppet/settings/base_setting.rb +26 -2
  130. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  131. data/lib/puppet/test/test_helper.rb +10 -3
  132. data/lib/puppet/transaction.rb +2 -2
  133. data/lib/puppet/transaction/persistence.rb +1 -1
  134. data/lib/puppet/transaction/report.rb +12 -8
  135. data/lib/puppet/trusted_external.rb +2 -2
  136. data/lib/puppet/type.rb +4 -3
  137. data/lib/puppet/type/file.rb +2 -2
  138. data/lib/puppet/type/file/source.rb +28 -8
  139. data/lib/puppet/type/filebucket.rb +1 -1
  140. data/lib/puppet/type/notify.rb +2 -2
  141. data/lib/puppet/type/package.rb +3 -3
  142. data/lib/puppet/type/service.rb +4 -0
  143. data/lib/puppet/type/user.rb +18 -3
  144. data/lib/puppet/util.rb +26 -12
  145. data/lib/puppet/util/autoload.rb +10 -15
  146. data/lib/puppet/util/character_encoding.rb +9 -5
  147. data/lib/puppet/util/connection.rb +8 -8
  148. data/lib/puppet/util/execution.rb +2 -2
  149. data/lib/puppet/util/fact_dif.rb +62 -0
  150. data/lib/puppet/util/posix.rb +54 -5
  151. data/lib/puppet/util/rubygems.rb +5 -1
  152. data/lib/puppet/util/run_mode.rb +5 -1
  153. data/lib/puppet/util/windows.rb +1 -0
  154. data/lib/puppet/util/windows/api_types.rb +15 -1
  155. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  156. data/lib/puppet/util/windows/security.rb +4 -4
  157. data/lib/puppet/util/windows/service.rb +1 -1
  158. data/lib/puppet/util/windows/user.rb +219 -0
  159. data/lib/puppet/version.rb +1 -1
  160. data/locales/puppet.pot +342 -312
  161. data/man/man5/puppet.conf.5 +53 -18
  162. data/man/man8/puppet-agent.8 +7 -4
  163. data/man/man8/puppet-apply.8 +2 -2
  164. data/man/man8/puppet-catalog.8 +1 -1
  165. data/man/man8/puppet-config.8 +6 -6
  166. data/man/man8/puppet-describe.8 +1 -1
  167. data/man/man8/puppet-device.8 +2 -2
  168. data/man/man8/puppet-doc.8 +1 -1
  169. data/man/man8/puppet-epp.8 +1 -1
  170. data/man/man8/puppet-facts.8 +32 -1
  171. data/man/man8/puppet-filebucket.8 +3 -3
  172. data/man/man8/puppet-generate.8 +1 -1
  173. data/man/man8/puppet-help.8 +1 -1
  174. data/man/man8/puppet-key.8 +1 -1
  175. data/man/man8/puppet-lookup.8 +2 -2
  176. data/man/man8/puppet-man.8 +1 -1
  177. data/man/man8/puppet-module.8 +1 -1
  178. data/man/man8/puppet-node.8 +7 -4
  179. data/man/man8/puppet-parser.8 +1 -1
  180. data/man/man8/puppet-plugin.8 +1 -1
  181. data/man/man8/puppet-report.8 +4 -1
  182. data/man/man8/puppet-resource.8 +1 -1
  183. data/man/man8/puppet-script.8 +2 -2
  184. data/man/man8/puppet-ssl.8 +1 -1
  185. data/man/man8/puppet-status.8 +2 -2
  186. data/man/man8/puppet.8 +2 -2
  187. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  188. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  189. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  190. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  191. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  192. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  193. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  194. data/spec/integration/application/agent_spec.rb +208 -55
  195. data/spec/integration/application/apply_spec.rb +168 -149
  196. data/spec/integration/application/doc_spec.rb +16 -6
  197. data/spec/integration/application/filebucket_spec.rb +70 -21
  198. data/spec/integration/application/help_spec.rb +42 -0
  199. data/spec/integration/application/lookup_spec.rb +13 -0
  200. data/spec/integration/application/module_spec.rb +68 -0
  201. data/spec/integration/application/plugin_spec.rb +53 -3
  202. data/spec/integration/configurer_spec.rb +14 -0
  203. data/spec/integration/data_binding_spec.rb +82 -0
  204. data/spec/integration/defaults_spec.rb +19 -1
  205. data/spec/integration/directory_environments_spec.rb +17 -17
  206. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  207. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  208. data/spec/integration/node/environment_spec.rb +1 -1
  209. data/spec/integration/resource/type_collection_spec.rb +2 -6
  210. data/spec/integration/transaction_spec.rb +4 -9
  211. data/spec/integration/util/execution_spec.rb +22 -0
  212. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  213. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  214. data/spec/integration/util/windows/process_spec.rb +26 -32
  215. data/spec/integration/util/windows/registry_spec.rb +0 -10
  216. data/spec/integration/util/windows/user_spec.rb +7 -0
  217. data/spec/integration/util_spec.rb +7 -33
  218. data/spec/lib/puppet_spec/matchers.rb +0 -80
  219. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  220. data/spec/lib/puppet_spec/settings.rb +6 -1
  221. data/spec/shared_contexts/types_setup.rb +2 -0
  222. data/spec/spec_helper.rb +1 -4
  223. data/spec/unit/agent_spec.rb +8 -6
  224. data/spec/unit/application/agent_spec.rb +3 -5
  225. data/spec/unit/application/config_spec.rb +224 -4
  226. data/spec/unit/application/doc_spec.rb +2 -2
  227. data/spec/unit/application/face_base_spec.rb +6 -4
  228. data/spec/unit/application/facts_spec.rb +41 -10
  229. data/spec/unit/application/filebucket_spec.rb +0 -2
  230. data/spec/unit/application/man_spec.rb +52 -0
  231. data/spec/unit/application/resource_spec.rb +3 -1
  232. data/spec/unit/application/ssl_spec.rb +15 -2
  233. data/spec/unit/application_spec.rb +60 -13
  234. data/spec/unit/configurer/downloader_spec.rb +10 -0
  235. data/spec/unit/configurer_spec.rb +86 -37
  236. data/spec/unit/confine/feature_spec.rb +1 -1
  237. data/spec/unit/confine_spec.rb +10 -3
  238. data/spec/unit/defaults_spec.rb +20 -1
  239. data/spec/unit/environments_spec.rb +176 -32
  240. data/spec/unit/face/config_spec.rb +65 -12
  241. data/spec/unit/face/node_spec.rb +2 -13
  242. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  243. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  244. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  245. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  246. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  247. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  248. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  249. data/spec/unit/file_system_spec.rb +1 -2
  250. data/spec/unit/forge/module_release_spec.rb +2 -7
  251. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  252. data/spec/unit/http/client_spec.rb +0 -1
  253. data/spec/unit/http/resolver_spec.rb +24 -5
  254. data/spec/unit/http/service/ca_spec.rb +2 -3
  255. data/spec/unit/http/service/compiler_spec.rb +51 -3
  256. data/spec/unit/http/service/file_server_spec.rb +2 -3
  257. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  258. data/spec/unit/http/service/report_spec.rb +2 -3
  259. data/spec/unit/http/service_spec.rb +1 -2
  260. data/spec/unit/http/session_spec.rb +8 -21
  261. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  262. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  263. data/spec/unit/indirector/face_spec.rb +0 -1
  264. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  265. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  266. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  267. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  268. data/spec/unit/indirector/indirection_spec.rb +8 -12
  269. data/spec/unit/indirector/json_spec.rb +8 -8
  270. data/spec/unit/indirector/key/file_spec.rb +0 -1
  271. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  272. data/spec/unit/indirector/node/json_spec.rb +33 -0
  273. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  274. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  275. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  276. data/spec/unit/indirector/request_spec.rb +4 -4
  277. data/spec/unit/indirector/rest_spec.rb +1 -1
  278. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  279. data/spec/unit/indirector/yaml_spec.rb +7 -7
  280. data/spec/unit/indirector_spec.rb +2 -2
  281. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  282. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  283. data/spec/unit/network/authconfig_spec.rb +0 -3
  284. data/spec/unit/network/format_support_spec.rb +3 -2
  285. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  286. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  287. data/spec/unit/network/http/handler_spec.rb +0 -5
  288. data/spec/unit/node/environment_spec.rb +18 -1
  289. data/spec/unit/parser/compiler_spec.rb +3 -19
  290. data/spec/unit/parser/resource_spec.rb +14 -8
  291. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  292. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  293. data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
  294. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  295. data/spec/unit/property_spec.rb +1 -0
  296. data/spec/unit/provider/exec_spec.rb +4 -3
  297. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  298. data/spec/unit/provider/nameservice_spec.rb +66 -65
  299. data/spec/unit/provider/package/apt_spec.rb +85 -3
  300. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  301. data/spec/unit/provider/package/base_spec.rb +6 -5
  302. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  303. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  304. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  305. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  306. data/spec/unit/provider/package/pip_spec.rb +6 -11
  307. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  308. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  309. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  310. data/spec/unit/provider/package/yum_spec.rb +31 -0
  311. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  312. data/spec/unit/provider/service/base_spec.rb +2 -4
  313. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  314. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  315. data/spec/unit/provider/service/debian_spec.rb +3 -5
  316. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  317. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  318. data/spec/unit/provider/service/init_spec.rb +45 -5
  319. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  320. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  321. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  322. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  323. data/spec/unit/provider/service/runit_spec.rb +2 -1
  324. data/spec/unit/provider/service/smf_spec.rb +1 -1
  325. data/spec/unit/provider/service/src_spec.rb +3 -5
  326. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  327. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  328. data/spec/unit/provider/service/windows_spec.rb +28 -0
  329. data/spec/unit/provider/user/aix_spec.rb +5 -0
  330. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  331. data/spec/unit/provider/user/pw_spec.rb +2 -0
  332. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  333. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  334. data/spec/unit/provider_spec.rb +8 -10
  335. data/spec/unit/puppet_pal_2pec.rb +40 -0
  336. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  337. data/spec/unit/reports/store_spec.rb +17 -13
  338. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  339. data/spec/unit/resource/type_spec.rb +1 -1
  340. data/spec/unit/resource_spec.rb +11 -10
  341. data/spec/unit/rest/route_spec.rb +4 -4
  342. data/spec/unit/settings_spec.rb +576 -239
  343. data/spec/unit/ssl/base_spec.rb +0 -1
  344. data/spec/unit/ssl/host_spec.rb +0 -5
  345. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  346. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  347. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  348. data/spec/unit/transaction/persistence_spec.rb +15 -0
  349. data/spec/unit/transaction/report_spec.rb +2 -0
  350. data/spec/unit/transaction_spec.rb +13 -4
  351. data/spec/unit/type/file/content_spec.rb +0 -1
  352. data/spec/unit/type/file/selinux_spec.rb +0 -2
  353. data/spec/unit/type/file/source_spec.rb +1 -1
  354. data/spec/unit/type/file_spec.rb +0 -6
  355. data/spec/unit/type/filebucket_spec.rb +1 -1
  356. data/spec/unit/type/group_spec.rb +13 -6
  357. data/spec/unit/type/resources_spec.rb +7 -7
  358. data/spec/unit/type/service_spec.rb +36 -3
  359. data/spec/unit/type/tidy_spec.rb +0 -1
  360. data/spec/unit/type/user_spec.rb +31 -2
  361. data/spec/unit/type_spec.rb +2 -2
  362. data/spec/unit/util/at_fork_spec.rb +2 -2
  363. data/spec/unit/util/autoload_spec.rb +5 -1
  364. data/spec/unit/util/backups_spec.rb +1 -2
  365. data/spec/unit/util/character_encoding_spec.rb +4 -4
  366. data/spec/unit/util/command_line_spec.rb +11 -6
  367. data/spec/unit/util/execution_spec.rb +15 -11
  368. data/spec/unit/util/inifile_spec.rb +6 -14
  369. data/spec/unit/util/log_spec.rb +8 -7
  370. data/spec/unit/util/logging_spec.rb +3 -3
  371. data/spec/unit/util/posix_spec.rb +363 -15
  372. data/spec/unit/util/rubygems_spec.rb +2 -2
  373. data/spec/unit/util/run_mode_spec.rb +6 -6
  374. data/spec/unit/util/selinux_spec.rb +76 -52
  375. data/spec/unit/util/storage_spec.rb +3 -1
  376. data/spec/unit/util/suidmanager_spec.rb +44 -41
  377. data/spec/unit/util_spec.rb +13 -6
  378. metadata +49 -50
  379. data/spec/integration/faces/config_spec.rb +0 -91
  380. data/spec/integration/faces/documentation_spec.rb +0 -57
  381. data/spec/integration/file_bucket/file_spec.rb +0 -50
  382. data/spec/integration/file_serving/content_spec.rb +0 -7
  383. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  384. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  385. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  386. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  387. data/spec/integration/module_tool/forge_spec.rb +0 -51
  388. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  389. data/spec/integration/provider/service/init_spec.rb +0 -48
  390. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  391. data/spec/integration/provider/service/windows_spec.rb +0 -50
  392. data/spec/integration/reference/providers_spec.rb +0 -21
  393. data/spec/integration/reports_spec.rb +0 -13
  394. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  395. data/spec/integration/ssl/host_spec.rb +0 -72
  396. data/spec/integration/ssl/key_spec.rb +0 -99
  397. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  398. data/spec/unit/face/catalog_spec.rb +0 -6
  399. data/spec/unit/face/man_spec.rb +0 -25
  400. data/spec/unit/face/module_spec.rb +0 -3
  401. data/spec/unit/man_spec.rb +0 -31
@@ -191,7 +191,6 @@ describe tidy do
191
191
  describe "and recursion is used" do
192
192
  before do
193
193
  @tidy[:recurse] = true
194
- allow_any_instance_of(Puppet::FileServing::Fileset).to receive(:stat).and_return(double("stat"))
195
194
  @fileset = Puppet::FileServing::Fileset.new(@basepath)
196
195
  allow(Puppet::FileServing::Fileset).to receive(:new).and_return(@fileset)
197
196
  end
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
  describe Puppet::Type.type(:user) do
5
5
  before :each do
6
6
  @provider_class = described_class.provide(:simple) do
7
- has_features :manages_expiry, :manages_password_age, :manages_passwords, :manages_solaris_rbac, :manages_shell
7
+ has_features :manages_expiry, :manages_password_age, :manages_passwords, :manages_solaris_rbac, :manages_roles, :manages_shell
8
8
  mk_resource_methods
9
9
  def create; end
10
10
  def delete; end
@@ -35,6 +35,10 @@ describe Puppet::Type.type(:user) do
35
35
  expect(described_class.provider_feature(:manages_solaris_rbac)).not_to be_nil
36
36
  end
37
37
 
38
+ it "should have a manages_roles feature" do
39
+ expect(described_class.provider_feature(:manages_roles)).not_to be_nil
40
+ end
41
+
38
42
  it "should have a manages_expiry feature" do
39
43
  expect(described_class.provider_feature(:manages_expiry)).not_to be_nil
40
44
  end
@@ -401,7 +405,7 @@ describe Puppet::Type.type(:user) do
401
405
  end
402
406
 
403
407
  describe "when user has roles" do
404
- it "should autorequire roles" do
408
+ it "should autorequire roles on non-Windows", :unless => Puppet::Util::Platform.windows? do
405
409
  testuser = described_class.new(:name => "testuser", :roles => ['testrole'] )
406
410
  testrole = described_class.new(:name => "testrole")
407
411
 
@@ -413,6 +417,31 @@ describe Puppet::Type.type(:user) do
413
417
  expect(rel.source.ref).to eq(testrole.ref)
414
418
  expect(rel.target.ref).to eq(testuser.ref)
415
419
  end
420
+
421
+ it "should not autorequire roles on Windows", :if => Puppet::Util::Platform.windows? do
422
+ testuser = described_class.new(:name => "testuser", :roles => ['testrole'] )
423
+ testrole = described_class.new(:name => "testrole")
424
+
425
+ Puppet::Resource::Catalog.new :testing do |conf|
426
+ [testuser, testrole].each { |resource| conf.add_resource resource }
427
+ end
428
+
429
+ expect(testuser.autorequire).to be_empty
430
+ end
431
+
432
+ it "should sync the user roles when changing the state of :ensure if :roles is being managed" do
433
+ user = Puppet::Type.type(:user).new(:name => "myUser", :ensure => :present)
434
+ user[:roles] = 'testRole'
435
+
436
+ allow(user.provider.class).to receive(:supports_parameter?).and_return(true)
437
+ expect(user.property(:roles)).to receive(:retrieve).and_return("other")
438
+ expect(user.property(:roles)).to receive(:insync?).and_return(false)
439
+ expect(user.property(:roles)).to receive(:sync)
440
+
441
+ allow(user.provider).to receive(:create)
442
+
443
+ user.property(:ensure).sync
444
+ end
416
445
  end
417
446
 
418
447
  describe "when setting shell" do
@@ -912,8 +912,8 @@ describe Puppet::Type, :unless => Puppet::Util::Platform.windows? do
912
912
 
913
913
  it "should always retrieve the ensure value by default" do
914
914
  @ensurable_resource = Puppet::Type.type(:file).new(:name => "/not/existent", :mode => "0644")
915
- allow(Puppet::Type::File::Ensure).to receive(:ensure).and_return(:absent)
916
- expect_any_instance_of(Puppet::Type::File::Ensure).to receive(:retrieve).once
915
+ # the ensure property is lazily metaprogrammed...
916
+ allow_any_instance_of(Puppet::Type::File::Ensure).to receive(:retrieve).and_return(:absent)
917
917
  @ensurable_resource.retrieve_resource
918
918
  end
919
919
 
@@ -50,8 +50,8 @@ describe 'Puppet::Util::AtFork' do
50
50
  const_set(:TYPE_VOID, nil)
51
51
  const_set(:TYPE_INT, nil)
52
52
  const_set(:DLError, Class.new(StandardError))
53
- const_set(:Handle, Class.new)
54
- const_set(:Function, Class.new)
53
+ const_set(:Handle, Class.new { def initialize(library = nil, flags = 0); end })
54
+ const_set(:Function, Class.new { def initialize(ptr, args, ret_type, abi = 0); end })
55
55
  end)
56
56
  end
57
57
  end
@@ -157,7 +157,7 @@ describe Puppet::Util::Autoload do
157
157
  end
158
158
 
159
159
  it "should load the first file in the searchpath" do
160
- allow(@autoload).to receive(:search_directories).and_return([make_absolute("/a"), make_absolute("/b")])
160
+ allow(@autoload.class).to receive(:search_directories).and_return([make_absolute("/a"), make_absolute("/b")])
161
161
  allow(FileTest).to receive(:directory?).and_return(true)
162
162
  allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
163
163
  expect(Kernel).to receive(:load).with(make_absolute("/a/tmp/myfile.rb"), any_args)
@@ -298,6 +298,10 @@ describe Puppet::Util::Autoload do
298
298
  it "should convert c:\ to c:/" do
299
299
  expect(Puppet::Util::Autoload.cleanpath('c:\\')).to eq('c:/')
300
300
  end
301
+
302
+ it "should convert all backslashes to forward slashes" do
303
+ expect(Puppet::Util::Autoload.cleanpath('c:\projects\ruby\bug\test.rb')).to eq('c:/projects/ruby/bug/test.rb')
304
+ end
301
305
  end
302
306
  end
303
307
 
@@ -119,8 +119,7 @@ describe Puppet::Util::Backups do
119
119
  file = Puppet::Type.type(:file).new(:name => path, :backup => 'foo', :recurse => true)
120
120
 
121
121
  expect(bucket).not_to receive(:backup)
122
- stub_file = double('file', :stat => double('stat', :ftype => 'directory'))
123
- allow(Puppet::FileSystem).to receive(:new).with(path).and_return(stub_file)
122
+ allow(Puppet::FileSystem).to receive(:stat).with(path).and_return(double('stat', :ftype => 'directory'))
124
123
  expect(Find).not_to receive(:find)
125
124
 
126
125
  file.perform_backup
@@ -21,7 +21,7 @@ describe Puppet::Util::CharacterEncoding do
21
21
  let(:invalid_utf8_string) { "\xfd\xf1".force_encoding(Encoding::UTF_8) }
22
22
 
23
23
  it "should issue a debug message" do
24
- expect(Puppet).to receive(:debug).with(/encoding is invalid/)
24
+ expect(Puppet).to receive(:debug) { |&b| expect(b.call).to match(/encoding is invalid/) }
25
25
  Puppet::Util::CharacterEncoding.convert_to_utf_8(invalid_utf8_string)
26
26
  end
27
27
 
@@ -80,7 +80,7 @@ describe Puppet::Util::CharacterEncoding do
80
80
  end
81
81
 
82
82
  it "should issue a debug message that the string was not transcodable" do
83
- expect(Puppet).to receive(:debug).with(/cannot be transcoded/)
83
+ expect(Puppet).to receive(:debug) { |&b| expect(b.call).to match(/cannot be transcoded/) }
84
84
  PuppetSpec::CharacterEncoding.with_external_encoding(Encoding::Windows_31J) do
85
85
  Puppet::Util::CharacterEncoding.convert_to_utf_8(invalid_win_31j)
86
86
  end
@@ -124,7 +124,7 @@ describe Puppet::Util::CharacterEncoding do
124
124
  let(:euc_kr) { [253, 241].pack('C*').force_encoding(Encoding::ASCII) }
125
125
 
126
126
  it "should issue a debug message" do
127
- expect(Puppet).to receive(:debug).with(/cannot be transcoded/)
127
+ expect(Puppet).to receive(:debug) { |&b| expect(b.call).to match(/cannot be transcoded/) }
128
128
  Puppet::Util::CharacterEncoding.convert_to_utf_8(euc_kr)
129
129
  end
130
130
 
@@ -168,7 +168,7 @@ describe Puppet::Util::CharacterEncoding do
168
168
  let(:foo) { 'foo' }
169
169
 
170
170
  it "should issue a debug message" do
171
- expect(Puppet).to receive(:debug).with(/not valid UTF-8/)
171
+ expect(Puppet).to receive(:debug) { |&b| expect(b.call).to match(/not valid UTF-8/) }
172
172
  Puppet::Util::CharacterEncoding.override_encoding_to_utf_8(oslash)
173
173
  end
174
174
 
@@ -62,7 +62,7 @@ describe Puppet::Util::CommandLine do
62
62
  it "should print the version and exit if #{arg} is given" do
63
63
  expect do
64
64
  described_class.new("puppet", [arg]).execute
65
- end.to have_printed(/^#{Regexp.escape(Puppet.version)}$/)
65
+ end.to output(/^#{Regexp.escape(Puppet.version)}$/).to_stdout
66
66
  end
67
67
  end
68
68
 
@@ -73,7 +73,8 @@ describe Puppet::Util::CommandLine do
73
73
 
74
74
  expect {
75
75
  commandline.execute
76
- }.to have_printed(/Usage: puppet <subcommand> \[options\] <action> \[options\]/).and_exit_with(0)
76
+ }.to exit_with(0)
77
+ .and output(/Usage: puppet <subcommand> \[options\] <action> \[options\]/).to_stdout
77
78
  end
78
79
  end
79
80
 
@@ -95,7 +96,8 @@ describe Puppet::Util::CommandLine do
95
96
 
96
97
  expect {
97
98
  commandline.execute
98
- }.to have_printed(/Usage: puppet <subcommand> \[options\] <action> \[options\]/).and_exit_with(0)
99
+ }.to exit_with(0)
100
+ .and output(/Usage: puppet <subcommand> \[options\] <action> \[options\]/).to_stdout
99
101
  end
100
102
  end
101
103
 
@@ -124,7 +126,8 @@ describe Puppet::Util::CommandLine do
124
126
 
125
127
  expect {
126
128
  commandline.execute
127
- }.to have_printed(/Unknown Puppet subcommand 'whatever'/).and_exit_with(1)
129
+ }.to exit_with(1)
130
+ .and output(/Unknown Puppet subcommand 'whatever'/).to_stdout
128
131
  end
129
132
 
130
133
  it "should abort and show the help message" do
@@ -134,7 +137,8 @@ describe Puppet::Util::CommandLine do
134
137
 
135
138
  expect {
136
139
  commandline.execute
137
- }.to have_printed(/See 'puppet help' for help on available puppet subcommands/).and_exit_with(1)
140
+ }.to exit_with(1)
141
+ .and output(/See 'puppet help' for help on available puppet subcommands/).to_stdout
138
142
  end
139
143
 
140
144
  %w{--version -V}.each do |arg|
@@ -145,7 +149,8 @@ describe Puppet::Util::CommandLine do
145
149
 
146
150
  expect {
147
151
  commandline.execute
148
- }.to have_printed(%r[^#{Regexp.escape(Puppet.version)}$]).and_exit_with(1)
152
+ }.to exit_with(1)
153
+ .and output(%r[^#{Regexp.escape(Puppet.version)}$]).to_stdout
149
154
  end
150
155
  end
151
156
  end
@@ -639,6 +639,8 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
639
639
 
640
640
  describe "#execute (debug logging)" do
641
641
  before :each do
642
+ Puppet[:log_level] = 'debug'
643
+
642
644
  stub_process_wait(0)
643
645
 
644
646
  if Puppet::Util::Platform.windows?
@@ -649,47 +651,47 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
649
651
  end
650
652
 
651
653
  it "should log if no uid or gid specified" do
652
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing: 'echo hello'")
654
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing: 'echo hello'")
653
655
  Puppet::Util::Execution.execute('echo hello')
654
656
  end
655
657
 
656
658
  it "should log numeric uid if specified" do
657
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with uid=100: 'echo hello'")
659
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100: 'echo hello'")
658
660
  Puppet::Util::Execution.execute('echo hello', {:uid => 100})
659
661
  end
660
662
 
661
663
  it "should log numeric gid if specified" do
662
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with gid=500: 'echo hello'")
664
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with gid=500: 'echo hello'")
663
665
  Puppet::Util::Execution.execute('echo hello', {:gid => 500})
664
666
  end
665
667
 
666
668
  it "should log numeric uid and gid if specified" do
667
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with uid=100 gid=500: 'echo hello'")
669
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100 gid=500: 'echo hello'")
668
670
  Puppet::Util::Execution.execute('echo hello', {:uid => 100, :gid => 500})
669
671
  end
670
672
 
671
673
  it "should log string uid if specified" do
672
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with uid=myuser: 'echo hello'")
674
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=myuser: 'echo hello'")
673
675
  Puppet::Util::Execution.execute('echo hello', {:uid => 'myuser'})
674
676
  end
675
677
 
676
678
  it "should log string gid if specified" do
677
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with gid=mygroup: 'echo hello'")
679
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with gid=mygroup: 'echo hello'")
678
680
  Puppet::Util::Execution.execute('echo hello', {:gid => 'mygroup'})
679
681
  end
680
682
 
681
683
  it "should log string uid and gid if specified" do
682
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with uid=myuser gid=mygroup: 'echo hello'")
684
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=myuser gid=mygroup: 'echo hello'")
683
685
  Puppet::Util::Execution.execute('echo hello', {:uid => 'myuser', :gid => 'mygroup'})
684
686
  end
685
687
 
686
688
  it "should log numeric uid and string gid if specified" do
687
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing with uid=100 gid=mygroup: 'echo hello'")
689
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100 gid=mygroup: 'echo hello'")
688
690
  Puppet::Util::Execution.execute('echo hello', {:uid => 100, :gid => 'mygroup'})
689
691
  end
690
692
 
691
693
  it 'should redact commands in debug output when passed sensitive option' do
692
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing: '[redacted]'")
694
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing: '[redacted]'")
693
695
  Puppet::Util::Execution.execute('echo hello', {:sensitive => true})
694
696
  end
695
697
  end
@@ -903,14 +905,16 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
903
905
  end
904
906
 
905
907
  it "should print meaningful debug message for string argument" do
906
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing 'echo hello'")
908
+ Puppet[:log_level] = 'debug'
909
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing 'echo hello'")
907
910
  expect(Puppet::Util::Execution).to receive(:open).with('| echo hello 2>&1').and_return('hello')
908
911
  expect(Puppet::Util::Execution).to receive(:exitstatus).and_return(0)
909
912
  Puppet::Util::Execution.execpipe('echo hello')
910
913
  end
911
914
 
912
915
  it "should print meaningful debug message for array argument" do
913
- expect(Puppet::Util::Execution).to receive(:debug).with("Executing 'echo hello'")
916
+ Puppet[:log_level] = 'debug'
917
+ expect(Puppet).to receive(:send_log).with(:debug, "Executing 'echo hello'")
914
918
  expect(Puppet::Util::Execution).to receive(:open).with('| echo hello 2>&1').and_return('hello')
915
919
  expect(Puppet::Util::Execution).to receive(:exitstatus).and_return(0)
916
920
  Puppet::Util::Execution.execpipe(['echo','hello'])
@@ -443,13 +443,9 @@ describe Puppet::Util::IniConfig::FileCollection do
443
443
  end
444
444
 
445
445
  it "yields every section from every file" do
446
- [sect_a1, sect_a2, sect_b1, sect_b2].each do |sect|
447
- expect(sect).to receive(:touch).once
448
- end
449
-
450
- subject.each_section do |sect|
451
- sect.touch
452
- end
446
+ expect { |b|
447
+ subject.each_section(&b)
448
+ }.to yield_successive_args(sect_a1, sect_a2, sect_b1, sect_b2)
453
449
  end
454
450
  end
455
451
 
@@ -460,13 +456,9 @@ describe Puppet::Util::IniConfig::FileCollection do
460
456
  end
461
457
 
462
458
  it "yields the path to every file in the collection" do
463
- seen = []
464
- subject.each_file do |file|
465
- seen << file
466
- end
467
-
468
- expect(seen).to include(path_a)
469
- expect(seen).to include(path_b)
459
+ expect { |b|
460
+ subject.each_file(&b)
461
+ }.to yield_successive_args(path_a, path_b)
470
462
  end
471
463
  end
472
464
 
@@ -111,16 +111,20 @@ describe Puppet::Util::Log do
111
111
  end
112
112
 
113
113
  it "should fall back to :eventlog" do
114
- allow(Puppet.features).to receive(:syslog?).and_return(false)
115
- allow(Puppet.features).to receive(:eventlog?).and_return(true)
114
+ without_partial_double_verification do
115
+ allow(Puppet.features).to receive(:syslog?).and_return(false)
116
+ allow(Puppet.features).to receive(:eventlog?).and_return(true)
117
+ end
116
118
  expect(Puppet::Util::Log).to receive(:newdestination).with(:eventlog)
117
119
 
118
120
  Puppet::Util::Log.setup_default
119
121
  end
120
122
 
121
123
  it "should fall back to :file" do
122
- allow(Puppet.features).to receive(:syslog?).and_return(false)
123
- allow(Puppet.features).to receive(:eventlog?).and_return(false)
124
+ without_partial_double_verification do
125
+ allow(Puppet.features).to receive(:syslog?).and_return(false)
126
+ allow(Puppet.features).to receive(:eventlog?).and_return(false)
127
+ end
124
128
  expect(Puppet::Util::Log).to receive(:newdestination).with(Puppet[:puppetdlog])
125
129
 
126
130
  Puppet::Util::Log.setup_default
@@ -224,9 +228,6 @@ describe Puppet::Util::Log do
224
228
  describe Puppet::Util::Log::DestEventlog, :if => Puppet.features.eventlog? do
225
229
  before :each do
226
230
  allow(Puppet::Util::Windows::EventLog).to receive(:open).and_return(double('mylog', :close => nil))
227
- allow(Puppet::Util::Windows::EventLog).to receive(:report_event)
228
- allow(Puppet::Util::Windows::EventLog).to receive(:close)
229
- allow(Puppet.features).to receive(:eventlog?).and_return(true)
230
231
  end
231
232
 
232
233
  it "should restrict its suitability to Windows" do
@@ -552,7 +552,7 @@ original
552
552
 
553
553
  describe 'does support debugging' do
554
554
  before :each do
555
- allow(Facter).to receive(:respond_to?).with(:debugging).and_return(true)
555
+ allow(Facter).to receive(:respond_to?).with(:debugging, any_args).and_return(true)
556
556
  end
557
557
 
558
558
  it 'enables Facter debugging when debug level' do
@@ -568,7 +568,7 @@ original
568
568
 
569
569
  describe 'does support trace' do
570
570
  before :each do
571
- allow(Facter).to receive(:respond_to?).with(:trace).and_return(true)
571
+ allow(Facter).to receive(:respond_to?).with(:trace, any_args).and_return(true)
572
572
  end
573
573
 
574
574
  it 'enables Facter trace when enabled' do
@@ -584,7 +584,7 @@ original
584
584
 
585
585
  describe 'does support on_message' do
586
586
  before :each do
587
- allow(Facter).to receive(:respond_to?).with(:on_message).and_return(true)
587
+ allow(Facter).to receive(:respond_to?).with(:on_message, any_args).and_return(true)
588
588
  end
589
589
 
590
590
  def setup(level, message)
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
+ require 'puppet/ffi/posix'
3
4
  require 'puppet/util/posix'
4
5
 
5
6
  class PosixTest
@@ -11,35 +12,344 @@ describe Puppet::Util::POSIX do
11
12
  @posix = PosixTest.new
12
13
  end
13
14
 
14
- describe '.groups_of' do
15
+ describe '.groups_of' do
16
+ let(:mock_user_data) { double(user, :gid => 1000) }
17
+
18
+ let(:ngroups_ptr) { double('FFI::MemoryPointer', :address => 0x0001, :size => 4) }
19
+ let(:groups_ptr) { double('FFI::MemoryPointer', :address => 0x0002, :size => Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS) }
20
+
15
21
  let(:mock_groups) do
16
22
  [
17
- ['group1', ['user1', 'user2']],
18
- ['group2', ['user2']],
19
- ['group1', ['user1', 'user2']],
20
- ['group3', ['user1']],
21
- ['group4', ['user2']]
22
- ].map do |(name, members)|
23
+ ['root', ['root'], 0],
24
+ ['nomembers', [], 5 ],
25
+ ['group1', ['user1', 'user2'], 1001],
26
+ ['group2', ['user2'], 2002],
27
+ ['group1', ['user1', 'user2'], 1001],
28
+ ['group3', ['user1'], 3003],
29
+ ['group4', ['user2'], 4004],
30
+ ['user1', [], 1111],
31
+ ['user2', [], 2222]
32
+ ].map do |(name, members, gid)|
23
33
  group_struct = double("Group #{name}")
24
34
  allow(group_struct).to receive(:name).and_return(name)
25
35
  allow(group_struct).to receive(:mem).and_return(members)
36
+ allow(group_struct).to receive(:gid).and_return(gid)
26
37
 
27
38
  group_struct
28
39
  end
29
40
  end
30
41
 
42
+ def prepare_user_and_groups_env(user, groups)
43
+ groups_gids = []
44
+ groups_and_user = []
45
+ groups_and_user.replace(groups)
46
+ groups_and_user.push(user)
47
+
48
+ groups_and_user.each do |group|
49
+ mock_group = mock_groups.find { |m| m.name == group }
50
+ groups_gids.push(mock_group.gid)
51
+
52
+ allow(Puppet::Etc).to receive(:getgrgid).with(mock_group.gid).and_return(mock_group)
53
+ end
54
+
55
+ if groups_and_user.size > Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS
56
+ allow(ngroups_ptr).to receive(:read_int).and_return(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS, groups_and_user.size)
57
+ else
58
+ allow(ngroups_ptr).to receive(:read_int).and_return(groups_and_user.size)
59
+ end
60
+
61
+ allow(groups_ptr).to receive(:get_array_of_uint).with(0, groups_and_user.size).and_return(groups_gids)
62
+ allow(Puppet::Etc).to receive(:getpwnam).with(user).and_return(mock_user_data)
63
+ end
64
+
31
65
  before(:each) do
32
- etc_stub = receive(:group)
33
- mock_groups.each do |mock_group|
34
- etc_stub = etc_stub.and_yield(mock_group)
66
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
67
+ end
68
+
69
+ describe 'when it uses FFI function getgrouplist' do
70
+ before(:each) do
71
+ allow(FFI::MemoryPointer).to receive(:new).with(:int).and_yield(ngroups_ptr)
72
+ allow(FFI::MemoryPointer).to receive(:new).with(:uint, Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_yield(groups_ptr)
73
+ allow(ngroups_ptr).to receive(:write_int).with(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_return(ngroups_ptr)
74
+ end
75
+
76
+ describe 'when there are groups' do
77
+ context 'for user1' do
78
+ let(:user) { 'user1' }
79
+ let(:expected_groups) { ['group1', 'group3'] }
80
+
81
+ before(:each) do
82
+ prepare_user_and_groups_env(user, expected_groups)
83
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
84
+ end
85
+
86
+ it "should return the groups for given user" do
87
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
88
+ end
89
+
90
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
91
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
92
+ Puppet::Util::POSIX.groups_of(user)
93
+ end
94
+ end
95
+
96
+ context 'for user2' do
97
+ let(:user) { 'user2' }
98
+ let(:expected_groups) { ['group1', 'group2', 'group4'] }
99
+
100
+ before(:each) do
101
+ prepare_user_and_groups_env(user, expected_groups)
102
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
103
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
104
+ end
105
+
106
+ it "should return the groups for given user" do
107
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
108
+ end
109
+
110
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
111
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
112
+ Puppet::Util::POSIX.groups_of(user)
113
+ end
114
+ end
115
+ end
116
+
117
+ describe 'when there are no groups' do
118
+ let(:user) { 'nomembers' }
119
+ let(:expected_groups) { [] }
120
+
121
+ before(:each) do
122
+ prepare_user_and_groups_env(user, expected_groups)
123
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
124
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
125
+ end
126
+
127
+ it "should return no groups for given user" do
128
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
129
+ end
130
+
131
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
132
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
133
+ Puppet::Util::POSIX.groups_of(user)
134
+ end
135
+ end
136
+
137
+ describe 'when primary group explicitly contains user' do
138
+ let(:user) { 'root' }
139
+ let(:expected_groups) { ['root'] }
140
+
141
+ before(:each) do
142
+ prepare_user_and_groups_env(user, expected_groups)
143
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
144
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
145
+ end
146
+
147
+ it "should return the groups, including primary group, for given user" do
148
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
149
+ end
150
+
151
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
152
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
153
+ Puppet::Util::POSIX.groups_of(user)
154
+ end
155
+ end
156
+
157
+ describe 'when primary group does not explicitly contain user' do
158
+ let(:user) { 'user1' }
159
+ let(:expected_groups) { ['group1', 'group3'] }
160
+
161
+ before(:each) do
162
+ prepare_user_and_groups_env(user, expected_groups)
163
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
164
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
165
+ end
166
+
167
+ it "should not return primary group for given user" do
168
+ expect(Puppet::Util::POSIX.groups_of(user)).not_to include(user)
169
+ end
170
+
171
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
172
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
173
+ Puppet::Util::POSIX.groups_of(user)
174
+ end
175
+ end
176
+
177
+ context 'number of groups' do
178
+ before(:each) do
179
+ stub_const("Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS", 2)
180
+ prepare_user_and_groups_env(user, expected_groups)
181
+
182
+ allow(FFI::MemoryPointer).to receive(:new).with(:uint, Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_yield(groups_ptr)
183
+ allow(ngroups_ptr).to receive(:write_int).with(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_return(ngroups_ptr)
184
+ end
185
+
186
+ describe 'when there are less than maximum expected number of groups' do
187
+ let(:user) { 'root' }
188
+ let(:expected_groups) { ['root'] }
189
+
190
+ before(:each) do
191
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
192
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
193
+ end
194
+
195
+ it "should return the groups for given user, after one 'getgrouplist' call" do
196
+ expect(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).once
197
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
198
+ end
199
+
200
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
201
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
202
+ Puppet::Util::POSIX.groups_of(user)
203
+ end
204
+ end
205
+
206
+ describe 'when there are more than maximum expected number of groups' do
207
+ let(:user) { 'user1' }
208
+ let(:expected_groups) { ['group1', 'group3'] }
209
+
210
+ before(:each) do
211
+ allow(FFI::MemoryPointer).to receive(:new).with(:uint, Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS * 2).and_yield(groups_ptr)
212
+ allow(ngroups_ptr).to receive(:write_int).with(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS * 2).and_return(ngroups_ptr)
213
+
214
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
215
+ allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(-1, 1)
216
+ end
217
+
218
+ it "should return the groups for given user, after two 'getgrouplist' calls" do
219
+ expect(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).twice
220
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
221
+ end
222
+
223
+ it 'should not print any debug message about falling back to Puppet::Etc.group' do
224
+ expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
225
+ Puppet::Util::POSIX.groups_of(user)
226
+ end
227
+ end
35
228
  end
36
- allow(Puppet::Etc).to etc_stub
37
229
  end
38
230
 
39
- it 'returns the groups of the given user' do
40
- expect(Puppet::Util::POSIX.groups_of('user1')).to eql(
41
- ['group1', 'group3']
42
- )
231
+ describe 'when it falls back to Puppet::Etc.group method' do
232
+ before(:each) do
233
+ etc_stub = receive(:group)
234
+ mock_groups.each do |mock_group|
235
+ etc_stub = etc_stub.and_yield(mock_group)
236
+ end
237
+ allow(Puppet::Etc).to etc_stub
238
+
239
+ allow(Puppet::Etc).to receive(:getpwnam).with(user).and_raise(ArgumentError, "can't find user for #{user}")
240
+ allow(Puppet).to receive(:debug)
241
+
242
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(false)
243
+ end
244
+
245
+ describe 'when there are groups' do
246
+ context 'for user1' do
247
+ let(:user) { 'user1' }
248
+ let(:expected_groups) { ['group1', 'group3'] }
249
+
250
+ it "should return the groups for given user" do
251
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
252
+ end
253
+
254
+ it 'logs a debug message' do
255
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
256
+ Puppet::Util::POSIX.groups_of(user)
257
+ end
258
+ end
259
+
260
+ context 'for user2' do
261
+ let(:user) { 'user2' }
262
+ let(:expected_groups) { ['group1', 'group2', 'group4'] }
263
+
264
+ it "should return the groups for given user" do
265
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
266
+ end
267
+
268
+ it 'logs a debug message' do
269
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
270
+ Puppet::Util::POSIX.groups_of(user)
271
+ end
272
+ end
273
+ end
274
+
275
+ describe 'when there are no groups' do
276
+ let(:user) { 'nomembers' }
277
+ let(:expected_groups) { [] }
278
+
279
+ it "should return no groups for given user" do
280
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
281
+ end
282
+
283
+ it 'logs a debug message' do
284
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
285
+ Puppet::Util::POSIX.groups_of(user)
286
+ end
287
+ end
288
+
289
+ describe 'when primary group explicitly contains user' do
290
+ let(:user) { 'root' }
291
+ let(:expected_groups) { ['root'] }
292
+
293
+ it "should return the groups, including primary group, for given user" do
294
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
295
+ end
296
+
297
+ it 'logs a debug message' do
298
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
299
+ Puppet::Util::POSIX.groups_of(user)
300
+ end
301
+ end
302
+
303
+ describe 'when primary group does not explicitly contain user' do
304
+ let(:user) { 'user1' }
305
+ let(:expected_groups) { ['group1', 'group3'] }
306
+
307
+ it "should not return primary group for given user" do
308
+ expect(Puppet::Util::POSIX.groups_of(user)).not_to include(user)
309
+ end
310
+
311
+ it 'logs a debug message' do
312
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
313
+ Puppet::Util::POSIX.groups_of(user)
314
+ end
315
+ end
316
+
317
+ describe "when the 'getgrouplist' method is not available" do
318
+ let(:user) { 'user1' }
319
+ let(:expected_groups) { ['group1', 'group3'] }
320
+
321
+ before(:each) do
322
+ allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist).and_return(false)
323
+ end
324
+
325
+ it "should return the groups" do
326
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
327
+ end
328
+
329
+ it 'logs a debug message' do
330
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
331
+ Puppet::Util::POSIX.groups_of(user)
332
+ end
333
+ end
334
+
335
+
336
+ describe "when ffi is not available on the machine" do
337
+ let(:user) { 'user1' }
338
+ let(:expected_groups) { ['group1', 'group3'] }
339
+
340
+ before(:each) do
341
+ allow(Puppet::Util::POSIX).to receive(:require).with('puppet/ffi/posix').and_raise(LoadError, 'cannot load such file -- ffi')
342
+ end
343
+
344
+ it "should return the groups" do
345
+ expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
346
+ end
347
+
348
+ it 'logs a debug message' do
349
+ expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: cannot load such file -- ffi")
350
+ Puppet::Util::POSIX.groups_of(user)
351
+ end
352
+ end
43
353
  end
44
354
  end
45
355
 
@@ -189,6 +499,25 @@ describe Puppet::Util::POSIX do
189
499
  expect(@posix.gid("asdf")).to eq(100)
190
500
  end
191
501
 
502
+ it "returns the id without full groups query if multiple groups have the same id" do
503
+ expect(@posix).to receive(:get_posix_field).with(:group, :gid, "asdf").and_return(100)
504
+ expect(@posix).to receive(:get_posix_field).with(:group, :name, 100).and_return("boo")
505
+ expect(@posix).to receive(:get_posix_field).with(:group, :gid, "boo").and_return(100)
506
+
507
+ expect(@posix).not_to receive(:search_posix_field)
508
+ expect(@posix.gid("asdf")).to eq(100)
509
+ end
510
+
511
+ it "returns the id with full groups query if name is nil" do
512
+ expect(@posix).to receive(:get_posix_field).with(:group, :gid, "asdf").and_return(100)
513
+ expect(@posix).to receive(:get_posix_field).with(:group, :name, 100).and_return(nil)
514
+ expect(@posix).not_to receive(:get_posix_field).with(:group, :gid, nil)
515
+
516
+
517
+ expect(@posix).to receive(:search_posix_field).with(:group, :gid, "asdf").and_return(100)
518
+ expect(@posix.gid("asdf")).to eq(100)
519
+ end
520
+
192
521
  it "should use :search_posix_field if the discovered name does not match the passed-in name" do
193
522
  expect(@posix).to receive(:get_posix_field).with(:group, :gid, "asdf").and_return(100)
194
523
  expect(@posix).to receive(:get_posix_field).with(:group, :name, 100).and_return("boo")
@@ -265,6 +594,25 @@ describe Puppet::Util::POSIX do
265
594
  expect(@posix.uid("asdf")).to eq(100)
266
595
  end
267
596
 
597
+ it "returns the id without full users query if multiple users have the same id" do
598
+ expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "asdf").and_return(100)
599
+ expect(@posix).to receive(:get_posix_field).with(:passwd, :name, 100).and_return("boo")
600
+ expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "boo").and_return(100)
601
+
602
+ expect(@posix).not_to receive(:search_posix_field)
603
+ expect(@posix.uid("asdf")).to eq(100)
604
+ end
605
+
606
+ it "returns the id with full users query if name is nil" do
607
+ expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "asdf").and_return(100)
608
+ expect(@posix).to receive(:get_posix_field).with(:passwd, :name, 100).and_return(nil)
609
+ expect(@posix).not_to receive(:get_posix_field).with(:passwd, :uid, nil)
610
+
611
+
612
+ expect(@posix).to receive(:search_posix_field).with(:passwd, :uid, "asdf").and_return(100)
613
+ expect(@posix.uid("asdf")).to eq(100)
614
+ end
615
+
268
616
  it "should use :search_posix_field if the discovered name does not match the passed-in name" do
269
617
  expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "asdf").and_return(100)
270
618
  expect(@posix).to receive(:get_posix_field).with(:passwd, :name, 100).and_return("boo")