puppet 6.15.0-x86-mingw32 → 6.19.1-x86-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 (418) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +29 -27
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet.rb +32 -8
  8. data/lib/puppet/agent.rb +18 -4
  9. data/lib/puppet/agent/locker.rb +0 -7
  10. data/lib/puppet/application/agent.rb +23 -8
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/device.rb +1 -1
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +61 -21
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +2 -2
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +119 -39
  24. data/lib/puppet/environments.rb +51 -10
  25. data/lib/puppet/face/catalog.rb +1 -1
  26. data/lib/puppet/face/config.rb +46 -16
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/node.rb +3 -3
  31. data/lib/puppet/face/node/clean.rb +2 -2
  32. data/lib/puppet/face/plugin.rb +1 -1
  33. data/lib/puppet/face/status.rb +1 -1
  34. data/lib/puppet/feature/base.rb +1 -1
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  37. data/lib/puppet/file_serving/metadata.rb +4 -1
  38. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  39. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  40. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  41. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  42. data/lib/puppet/file_system/file_impl.rb +4 -4
  43. data/lib/puppet/file_system/uniquefile.rb +12 -16
  44. data/lib/puppet/forge.rb +1 -1
  45. data/lib/puppet/forge/cache.rb +1 -1
  46. data/lib/puppet/forge/repository.rb +4 -7
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/lstrip.rb +4 -4
  49. data/lib/puppet/functions/new.rb +8 -3
  50. data/lib/puppet/functions/reverse_each.rb +1 -1
  51. data/lib/puppet/functions/rstrip.rb +4 -4
  52. data/lib/puppet/functions/step.rb +1 -1
  53. data/lib/puppet/functions/strip.rb +4 -4
  54. data/lib/puppet/gettext/config.rb +5 -5
  55. data/lib/puppet/gettext/module_translations.rb +4 -4
  56. data/lib/puppet/http.rb +1 -0
  57. data/lib/puppet/http/client.rb +28 -12
  58. data/lib/puppet/http/external_client.rb +0 -6
  59. data/lib/puppet/http/redirector.rb +9 -7
  60. data/lib/puppet/http/resolver.rb +5 -8
  61. data/lib/puppet/http/resolver/server_list.rb +18 -36
  62. data/lib/puppet/http/resolver/settings.rb +4 -4
  63. data/lib/puppet/http/resolver/srv.rb +5 -5
  64. data/lib/puppet/http/response.rb +19 -0
  65. data/lib/puppet/http/service.rb +3 -1
  66. data/lib/puppet/http/service/compiler.rb +1 -1
  67. data/lib/puppet/http/service/file_server.rb +1 -1
  68. data/lib/puppet/http/service/puppetserver.rb +39 -0
  69. data/lib/puppet/http/session.rb +5 -4
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  75. data/lib/puppet/indirector/file_content/http.rb +5 -0
  76. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  77. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  78. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  79. data/lib/puppet/indirector/hiera.rb +4 -0
  80. data/lib/puppet/indirector/indirection.rb +1 -1
  81. data/lib/puppet/indirector/json.rb +1 -1
  82. data/lib/puppet/indirector/msgpack.rb +1 -1
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/request.rb +5 -5
  85. data/lib/puppet/indirector/rest.rb +7 -1
  86. data/lib/puppet/indirector/yaml.rb +1 -1
  87. data/lib/puppet/module.rb +1 -2
  88. data/lib/puppet/network/format_support.rb +2 -2
  89. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  90. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  91. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  92. data/lib/puppet/network/http/compression.rb +7 -0
  93. data/lib/puppet/network/http/connection.rb +2 -0
  94. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  95. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  96. data/lib/puppet/network/http/route.rb +2 -2
  97. data/lib/puppet/network/http_pool.rb +2 -2
  98. data/lib/puppet/node/environment.rb +12 -5
  99. data/lib/puppet/node/facts.rb +17 -0
  100. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  101. data/lib/puppet/pal/pal_impl.rb +31 -4
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +5 -5
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +29 -26
  106. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  107. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  108. data/lib/puppet/parser/environment_compiler.rb +4 -1
  109. data/lib/puppet/parser/functions.rb +21 -17
  110. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  111. data/lib/puppet/parser/functions/filter.rb +1 -0
  112. data/lib/puppet/parser/resource.rb +3 -2
  113. data/lib/puppet/parser/resource/param.rb +6 -0
  114. data/lib/puppet/parser/type_loader.rb +2 -2
  115. data/lib/puppet/pops/adaptable.rb +7 -13
  116. data/lib/puppet/pops/adapters.rb +8 -4
  117. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  118. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  119. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  120. data/lib/puppet/pops/issues.rb +5 -0
  121. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  122. data/lib/puppet/pops/loaders.rb +18 -11
  123. data/lib/puppet/pops/lookup/context.rb +1 -1
  124. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  125. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  126. data/lib/puppet/pops/types/iterable.rb +34 -8
  127. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  128. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/package/aix.rb +17 -2
  133. data/lib/puppet/provider/package/apt.rb +38 -1
  134. data/lib/puppet/provider/package/aptitude.rb +1 -1
  135. data/lib/puppet/provider/package/dnfmodule.rb +24 -4
  136. data/lib/puppet/provider/package/dpkg.rb +1 -1
  137. data/lib/puppet/provider/package/gem.rb +4 -2
  138. data/lib/puppet/provider/package/pip.rb +60 -37
  139. data/lib/puppet/provider/package/pip2.rb +17 -0
  140. data/lib/puppet/provider/package/portage.rb +2 -2
  141. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  142. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  143. data/lib/puppet/provider/package/yum.rb +9 -1
  144. data/lib/puppet/provider/package/zypper.rb +62 -1
  145. data/lib/puppet/provider/service/systemd.rb +21 -4
  146. data/lib/puppet/provider/service/windows.rb +23 -7
  147. data/lib/puppet/provider/user/aix.rb +1 -1
  148. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  149. data/lib/puppet/provider/user/useradd.rb +16 -5
  150. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  151. data/lib/puppet/reports/http.rb +7 -3
  152. data/lib/puppet/resource.rb +2 -1
  153. data/lib/puppet/resource/type.rb +10 -1
  154. data/lib/puppet/rest/route.rb +2 -2
  155. data/lib/puppet/runtime.rb +25 -2
  156. data/lib/puppet/settings.rb +43 -6
  157. data/lib/puppet/ssl/ssl_context.rb +2 -2
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  159. data/lib/puppet/ssl/state_machine.rb +33 -8
  160. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  161. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  162. data/lib/puppet/test/test_helper.rb +19 -14
  163. data/lib/puppet/transaction.rb +2 -2
  164. data/lib/puppet/transaction/persistence.rb +1 -1
  165. data/lib/puppet/transaction/report.rb +12 -8
  166. data/lib/puppet/trusted_external.rb +29 -1
  167. data/lib/puppet/type.rb +15 -7
  168. data/lib/puppet/type/file.rb +40 -15
  169. data/lib/puppet/type/file/checksum.rb +4 -4
  170. data/lib/puppet/type/file/source.rb +33 -13
  171. data/lib/puppet/type/filebucket.rb +1 -1
  172. data/lib/puppet/type/notify.rb +2 -2
  173. data/lib/puppet/type/package.rb +16 -1
  174. data/lib/puppet/type/service.rb +59 -8
  175. data/lib/puppet/type/user.rb +19 -10
  176. data/lib/puppet/util.rb +41 -3
  177. data/lib/puppet/util/autoload.rb +10 -25
  178. data/lib/puppet/util/character_encoding.rb +9 -5
  179. data/lib/puppet/util/checksums.rb +19 -4
  180. data/lib/puppet/util/connection.rb +8 -8
  181. data/lib/puppet/util/execution.rb +2 -2
  182. data/lib/puppet/util/fileparsing.rb +2 -2
  183. data/lib/puppet/util/log/destinations.rb +1 -10
  184. data/lib/puppet/util/package/version/range.rb +4 -1
  185. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  186. data/lib/puppet/util/provider_features.rb +1 -1
  187. data/lib/puppet/util/reference.rb +1 -1
  188. data/lib/puppet/util/run_mode.rb +5 -1
  189. data/lib/puppet/util/windows.rb +1 -0
  190. data/lib/puppet/util/windows/api_types.rb +60 -33
  191. data/lib/puppet/util/windows/eventlog.rb +1 -6
  192. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  193. data/lib/puppet/util/windows/principal.rb +8 -6
  194. data/lib/puppet/util/windows/registry.rb +11 -11
  195. data/lib/puppet/util/windows/security.rb +4 -4
  196. data/lib/puppet/util/windows/service.rb +43 -26
  197. data/lib/puppet/util/windows/user.rb +242 -8
  198. data/lib/puppet/version.rb +1 -1
  199. data/locales/puppet.pot +541 -427
  200. data/man/man5/puppet.conf.5 +84 -19
  201. data/man/man8/puppet-agent.8 +7 -4
  202. data/man/man8/puppet-apply.8 +1 -1
  203. data/man/man8/puppet-catalog.8 +1 -1
  204. data/man/man8/puppet-config.8 +6 -6
  205. data/man/man8/puppet-describe.8 +1 -1
  206. data/man/man8/puppet-device.8 +1 -1
  207. data/man/man8/puppet-doc.8 +1 -1
  208. data/man/man8/puppet-epp.8 +1 -1
  209. data/man/man8/puppet-facts.8 +1 -1
  210. data/man/man8/puppet-filebucket.8 +1 -1
  211. data/man/man8/puppet-generate.8 +1 -1
  212. data/man/man8/puppet-help.8 +6 -3
  213. data/man/man8/puppet-key.8 +1 -1
  214. data/man/man8/puppet-lookup.8 +2 -2
  215. data/man/man8/puppet-man.8 +1 -1
  216. data/man/man8/puppet-module.8 +4 -1
  217. data/man/man8/puppet-node.8 +4 -4
  218. data/man/man8/puppet-parser.8 +1 -1
  219. data/man/man8/puppet-plugin.8 +1 -1
  220. data/man/man8/puppet-report.8 +1 -1
  221. data/man/man8/puppet-resource.8 +1 -1
  222. data/man/man8/puppet-script.8 +1 -1
  223. data/man/man8/puppet-ssl.8 +1 -1
  224. data/man/man8/puppet-status.8 +2 -2
  225. data/man/man8/puppet.8 +2 -2
  226. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  227. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  228. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  229. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  230. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
  231. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  232. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  233. data/spec/integration/application/agent_spec.rb +202 -52
  234. data/spec/integration/application/apply_spec.rb +149 -149
  235. data/spec/integration/application/config_spec.rb +74 -0
  236. data/spec/integration/application/doc_spec.rb +16 -6
  237. data/spec/integration/application/filebucket_spec.rb +70 -21
  238. data/spec/integration/application/help_spec.rb +42 -0
  239. data/spec/integration/application/lookup_spec.rb +13 -0
  240. data/spec/integration/application/module_spec.rb +68 -0
  241. data/spec/integration/application/plugin_spec.rb +75 -2
  242. data/spec/integration/configurer_spec.rb +14 -0
  243. data/spec/integration/data_binding_spec.rb +82 -0
  244. data/spec/integration/defaults_spec.rb +27 -3
  245. data/spec/integration/directory_environments_spec.rb +17 -17
  246. data/spec/integration/http/client_spec.rb +6 -1
  247. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  248. data/spec/integration/network/http_pool_spec.rb +73 -0
  249. data/spec/integration/node/environment_spec.rb +1 -1
  250. data/spec/integration/parser/compiler_spec.rb +11 -0
  251. data/spec/integration/type/file_spec.rb +1 -1
  252. data/spec/integration/util/execution_spec.rb +22 -0
  253. data/spec/integration/util/windows/adsi_spec.rb +7 -2
  254. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  255. data/spec/integration/util/windows/process_spec.rb +26 -32
  256. data/spec/integration/util/windows/registry_spec.rb +7 -7
  257. data/spec/integration/util/windows/user_spec.rb +47 -5
  258. data/spec/integration/util_spec.rb +7 -33
  259. data/spec/lib/puppet_spec/https.rb +6 -0
  260. data/spec/lib/puppet_spec/matchers.rb +0 -80
  261. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  262. data/spec/shared_contexts/types_setup.rb +2 -0
  263. data/spec/unit/agent_spec.rb +47 -1
  264. data/spec/unit/application/agent_spec.rb +7 -8
  265. data/spec/unit/application/doc_spec.rb +2 -2
  266. data/spec/unit/application/face_base_spec.rb +6 -4
  267. data/spec/unit/application/facts_spec.rb +41 -10
  268. data/spec/unit/application/man_spec.rb +52 -0
  269. data/spec/unit/application/resource_spec.rb +3 -1
  270. data/spec/unit/application/ssl_spec.rb +15 -2
  271. data/spec/unit/application_spec.rb +9 -4
  272. data/spec/unit/configurer/downloader_spec.rb +10 -0
  273. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  274. data/spec/unit/configurer_spec.rb +86 -37
  275. data/spec/unit/confine_spec.rb +2 -1
  276. data/spec/unit/context/trusted_information_spec.rb +25 -2
  277. data/spec/unit/daemon_spec.rb +5 -64
  278. data/spec/unit/environments_spec.rb +99 -32
  279. data/spec/unit/face/config_spec.rb +59 -1
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/node_spec.rb +2 -2
  282. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  283. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  284. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  285. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  286. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  287. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  288. data/spec/unit/file_system_spec.rb +1 -2
  289. data/spec/unit/http/client_spec.rb +74 -19
  290. data/spec/unit/http/external_client_spec.rb +9 -9
  291. data/spec/unit/http/resolver_spec.rb +24 -5
  292. data/spec/unit/http/response_spec.rb +6 -0
  293. data/spec/unit/http/service/ca_spec.rb +2 -3
  294. data/spec/unit/http/service/compiler_spec.rb +2 -3
  295. data/spec/unit/http/service/file_server_spec.rb +2 -3
  296. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  297. data/spec/unit/http/service/report_spec.rb +2 -3
  298. data/spec/unit/http/service_spec.rb +0 -1
  299. data/spec/unit/http/session_spec.rb +8 -21
  300. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  301. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  302. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  303. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  304. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  305. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  306. data/spec/unit/indirector/json_spec.rb +8 -8
  307. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  308. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  309. data/spec/unit/indirector/request_spec.rb +5 -5
  310. data/spec/unit/indirector/rest_spec.rb +14 -1
  311. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  312. data/spec/unit/indirector/yaml_spec.rb +7 -7
  313. data/spec/unit/interface_spec.rb +3 -3
  314. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  315. data/spec/unit/network/format_support_spec.rb +3 -2
  316. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  317. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  318. data/spec/unit/network/http/connection_spec.rb +552 -190
  319. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  320. data/spec/unit/network/http_pool_spec.rb +63 -57
  321. data/spec/unit/network/http_spec.rb +1 -1
  322. data/spec/unit/node/environment_spec.rb +18 -1
  323. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  324. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  325. data/spec/unit/parser/scope_spec.rb +1 -1
  326. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  327. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  328. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  329. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  330. data/spec/unit/provider/exec_spec.rb +4 -3
  331. data/spec/unit/provider/package/aix_spec.rb +29 -0
  332. data/spec/unit/provider/package/apt_spec.rb +77 -0
  333. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  334. data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
  335. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  336. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  337. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  338. data/spec/unit/provider/package/pip_spec.rb +42 -16
  339. data/spec/unit/provider/package/portage_spec.rb +5 -0
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  341. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  342. data/spec/unit/provider/package/yum_spec.rb +47 -8
  343. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  344. data/spec/unit/provider/service/base_spec.rb +2 -4
  345. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  346. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  347. data/spec/unit/provider/service/debian_spec.rb +3 -5
  348. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  349. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  350. data/spec/unit/provider/service/init_spec.rb +46 -5
  351. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  352. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  353. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  354. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  355. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  356. data/spec/unit/provider/service/runit_spec.rb +2 -1
  357. data/spec/unit/provider/service/smf_spec.rb +1 -1
  358. data/spec/unit/provider/service/src_spec.rb +3 -5
  359. data/spec/unit/provider/service/systemd_spec.rb +87 -19
  360. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  361. data/spec/unit/provider/service/windows_spec.rb +50 -14
  362. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  363. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  364. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  365. data/spec/unit/puppet_pal_2pec.rb +40 -0
  366. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  367. data/spec/unit/puppet_spec.rb +33 -0
  368. data/spec/unit/reports/http_spec.rb +1 -1
  369. data/spec/unit/reports/store_spec.rb +17 -13
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/rest/route_spec.rb +4 -4
  372. data/spec/unit/settings_spec.rb +182 -22
  373. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  374. data/spec/unit/ssl/state_machine_spec.rb +52 -8
  375. data/spec/unit/test/test_helper_spec.rb +17 -0
  376. data/spec/unit/transaction/persistence_spec.rb +15 -0
  377. data/spec/unit/transaction/report_spec.rb +3 -1
  378. data/spec/unit/type/file/source_spec.rb +4 -4
  379. data/spec/unit/type/file_spec.rb +122 -96
  380. data/spec/unit/type/filebucket_spec.rb +1 -1
  381. data/spec/unit/type/service_spec.rb +218 -8
  382. data/spec/unit/type/user_spec.rb +32 -3
  383. data/spec/unit/type_spec.rb +50 -0
  384. data/spec/unit/util/autoload_spec.rb +2 -1
  385. data/spec/unit/util/character_encoding_spec.rb +4 -4
  386. data/spec/unit/util/checksums_spec.rb +16 -0
  387. data/spec/unit/util/command_line_spec.rb +11 -6
  388. data/spec/unit/util/log/destinations_spec.rb +1 -29
  389. data/spec/unit/util/package/version/range_spec.rb +22 -1
  390. data/spec/unit/util/run_mode_spec.rb +6 -6
  391. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  392. data/spec/unit/util/windows/service_spec.rb +4 -4
  393. data/spec/unit/util_spec.rb +3 -3
  394. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  395. data/tasks/manpages.rake +5 -35
  396. metadata +43 -49
  397. data/spec/integration/faces/config_spec.rb +0 -91
  398. data/spec/integration/faces/documentation_spec.rb +0 -57
  399. data/spec/integration/file_bucket/file_spec.rb +0 -50
  400. data/spec/integration/file_serving/content_spec.rb +0 -7
  401. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  402. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  403. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  404. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  405. data/spec/integration/module_tool/forge_spec.rb +0 -51
  406. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  407. data/spec/integration/provider/service/init_spec.rb +0 -48
  408. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  409. data/spec/integration/provider/service/windows_spec.rb +0 -50
  410. data/spec/integration/reference/providers_spec.rb +0 -21
  411. data/spec/integration/reports_spec.rb +0 -13
  412. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  413. data/spec/integration/ssl/host_spec.rb +0 -72
  414. data/spec/integration/ssl/key_spec.rb +0 -99
  415. data/spec/integration/test/test_helper_spec.rb +0 -31
  416. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  417. data/spec/unit/face/man_spec.rb +0 -25
  418. data/spec/unit/man_spec.rb +0 -31
@@ -228,13 +228,6 @@ describe Puppet::SSL::StateMachine, unless: Puppet::Util::Platform.jruby? do
228
228
  expect(File).to_not be_exist(Puppet[:ssl_lockfile])
229
229
  end
230
230
 
231
- it 'raises an exception when locking fails' do
232
- allow(lockfile).to receive(:lock).and_return(false)
233
- expect {
234
- machine.ensure_ca_certificates
235
- }.to raise_error(Puppet::Error, /Another puppet instance is already running; exiting/)
236
- end
237
-
238
231
  it 'acquires an empty lockfile' do
239
232
  Puppet::FileSystem.touch(Puppet[:ssl_lockfile])
240
233
 
@@ -262,6 +255,57 @@ describe Puppet::SSL::StateMachine, unless: Puppet::Util::Platform.jruby? do
262
255
  machine = described_class.new(cert_provider: cert_provider, ssl_provider: ssl_provider)
263
256
  machine.ensure_ca_certificates
264
257
  end
258
+
259
+ context 'and another puppet process is running' do
260
+ let(:now) { Time.now }
261
+ let(:future) { now + (5 * 60)} # 5 mins in the future
262
+
263
+ before :each do
264
+ allow(lockfile).to receive(:lock).and_return(false)
265
+ end
266
+
267
+ it 'raises a puppet exception' do
268
+ expect {
269
+ machine.ensure_ca_certificates
270
+ }.to raise_error(Puppet::Error, /Another puppet instance is already running and the waitforlock setting is set to 0; exiting/)
271
+ end
272
+
273
+ it 'sleeps and retries successfully' do
274
+ machine = described_class.new(lockfile: lockfile, cert_provider: cert_provider, waitforlock: 1, maxwaitforlock: 10)
275
+ allow(cert_provider).to receive(:load_cacerts).and_return(cacerts)
276
+ allow(cert_provider).to receive(:load_crls).and_return(crls)
277
+ allow(Time).to receive(:now).and_return(now, future)
278
+
279
+ expect(Kernel).to receive(:sleep).with(1)
280
+ expect(Puppet).to receive(:info).with("Another puppet instance is already running; waiting for it to finish")
281
+ expect(Puppet).to receive(:info).with("Will try again in 1 seconds.")
282
+
283
+ allow(lockfile).to receive(:lock).and_return(false, true)
284
+
285
+ expect(machine.ensure_ca_certificates).to be_an_instance_of(Puppet::SSL::SSLContext)
286
+ end
287
+
288
+ it 'sleeps and retries unsuccessfully until the deadline is exceeded' do
289
+ machine = described_class.new(lockfile: lockfile, waitforlock: 1, maxwaitforlock: 10)
290
+ allow(Time).to receive(:now).and_return(now, future)
291
+
292
+ expect(Kernel).to receive(:sleep).with(1)
293
+ expect(Puppet).to receive(:info).with("Another puppet instance is already running; waiting for it to finish")
294
+ expect(Puppet).to receive(:info).with("Will try again in 1 seconds.")
295
+
296
+ allow(lockfile).to receive(:lock).and_return(false)
297
+ expect {
298
+ machine.ensure_ca_certificates
299
+ }.to raise_error(Puppet::Error, /Another puppet instance is already running and the maxwaitforlock timeout has been exceeded; exiting/)
300
+ end
301
+
302
+ it 'defaults the waitlock deadline to 60 seconds' do
303
+ allow(Time).to receive(:now).and_return(now)
304
+
305
+ machine = described_class.new
306
+ expect(machine.waitlock_deadline).to eq(now.to_i + 60)
307
+ end
308
+ end
265
309
  end
266
310
 
267
311
  context 'NeedCACerts' do
@@ -882,7 +926,7 @@ describe Puppet::SSL::StateMachine, unless: Puppet::Util::Platform.jruby? do
882
926
  machine = described_class.new(waitforcert: 15)
883
927
 
884
928
  state = Puppet::SSL::StateMachine::Wait.new(machine)
885
- expect(Puppet.runtime['http'].pool).to receive(:close).and_call_original
929
+ expect(Puppet.runtime[:http].pool).to receive(:close).and_call_original
886
930
  expect(Kernel).to receive(:sleep).with(15).ordered
887
931
 
888
932
  state.next_state
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe "TestHelper" do
4
+ context "#after_each_test" do
5
+ it "restores the original environment" do
6
+ varname = 'test_helper_spec-test_variable'
7
+ Puppet::Util.set_env(varname, "\u16A0")
8
+
9
+ expect(Puppet::Util.get_env(varname)).to eq("\u16A0")
10
+
11
+ # Prematurely trigger the after_each_test method
12
+ Puppet::Test::TestHelper.after_each_test
13
+
14
+ expect(Puppet::Util::get_env(varname)).to be_nil
15
+ end
16
+ end
17
+ end
@@ -123,6 +123,21 @@ describe Puppet::Transaction::Persistence do
123
123
  persistence = Puppet::Transaction::Persistence.new
124
124
  persistence.load
125
125
  end
126
+
127
+ it 'should load Time and Symbols' do
128
+ write_state_file(<<~END)
129
+ File[/tmp/audit]:
130
+ parameters:
131
+ mtime:
132
+ system_value:
133
+ - 2020-07-15 05:38:12.427678398 +00:00
134
+ ensure:
135
+ system_value:
136
+ END
137
+
138
+ persistence = Puppet::Transaction::Persistence.new
139
+ expect(persistence.load.dig("File[/tmp/audit]", "parameters", "mtime", "system_value")).to contain_exactly(be_a(Time))
140
+ end
126
141
  end
127
142
  end
128
143
 
@@ -663,7 +663,7 @@ Version:
663
663
  :status => stringifier.convert('success'),
664
664
  }
665
665
 
666
- event = Puppet::Transaction::Event.new(event_hash)
666
+ event = Puppet::Transaction::Event.new(**event_hash)
667
667
 
668
668
  status = Puppet::Resource::Status.new(Puppet::Type.type(:notify).new(:title => "a resource"))
669
669
  status.changed = true
@@ -676,6 +676,7 @@ Version:
676
676
  report.catalog_uuid = "some catalog uuid"
677
677
  report.cached_catalog_status = "not_used"
678
678
  report.master_used = "test:000"
679
+ report.server_used = "test:000"
679
680
  report.add_resource_status(status)
680
681
  report.transaction_completed = true
681
682
  report.finalize_report
@@ -694,6 +695,7 @@ Version:
694
695
  report.catalog_uuid = "some catalog uuid"
695
696
  report.cached_catalog_status = "not_used"
696
697
  report.master_used = "test:000"
698
+ report.server_used = "test:000"
697
699
  report.add_resource_status(status)
698
700
  report.transaction_completed = true
699
701
  report.finalize_report
@@ -22,8 +22,8 @@ describe Puppet::Type.type(:file).attrclass(:source), :uses_checksums => true do
22
22
  @foobar = make_absolute("/foo/bar baz")
23
23
  @feebooz = make_absolute("/fee/booz baz")
24
24
 
25
- @foobar_uri = URI.unescape(Puppet::Util.path_to_uri(@foobar).to_s)
26
- @feebooz_uri = URI.unescape(Puppet::Util.path_to_uri(@feebooz).to_s)
25
+ @foobar_uri = Puppet::Util.uri_unescape(Puppet::Util.path_to_uri(@foobar).to_s)
26
+ @feebooz_uri = Puppet::Util.uri_unescape(Puppet::Util.path_to_uri(@feebooz).to_s)
27
27
  end
28
28
 
29
29
  it "should be a subclass of Parameter" do
@@ -82,7 +82,7 @@ describe Puppet::Type.type(:file).attrclass(:source), :uses_checksums => true do
82
82
  describe "#munge" do
83
83
  it "should prefix file scheme to absolute paths" do
84
84
  resource[:source] = filename
85
- expect(resource[:source]).to eq([URI.unescape(Puppet::Util.path_to_uri(filename).to_s)])
85
+ expect(resource[:source]).to eq([Puppet::Util.uri_unescape(Puppet::Util.path_to_uri(filename).to_s)])
86
86
  end
87
87
 
88
88
  %w[file puppet].each do |scheme|
@@ -521,7 +521,7 @@ describe Puppet::Type.type(:file).attrclass(:source), :uses_checksums => true do
521
521
  end
522
522
 
523
523
  it "should return the default source port" do
524
- Puppet[:masterport] = 1234
524
+ Puppet[:serverport] = 1234
525
525
  expect(resource.parameter(:source).port).to eq(1234)
526
526
  end
527
527
  end
@@ -3,6 +3,34 @@ require 'spec_helper'
3
3
  describe Puppet::Type.type(:file) do
4
4
  include PuppetSpec::Files
5
5
 
6
+ # precomputed checksum values for FILE_CONTENT
7
+ FILE_CONTENT = 'file content'.freeze
8
+ CHECKSUM_VALUES = {
9
+ md5: 'd10b4c3ff123b26dc068d43a8bef2d23',
10
+ md5lite: 'd10b4c3ff123b26dc068d43a8bef2d23',
11
+ sha256: 'e0ac3601005dfa1864f5392aabaf7d898b1b5bab854f1acb4491bcd806b76b0c',
12
+ sha256lite: 'e0ac3601005dfa1864f5392aabaf7d898b1b5bab854f1acb4491bcd806b76b0c',
13
+ sha1: '87758871f598e1a3b4679953589ae2f57a0bb43c',
14
+ sha1lite: '87758871f598e1a3b4679953589ae2f57a0bb43c',
15
+ sha224: '2aefaaa5f4d8f17f82f3e1bb407e190cede9aa1311fa4533ce505531',
16
+ sha384: '61c7783501ebd90233650357fefbe5a141b7618f907b8f043bbaa92c0f610c785a641ddd479fa81d650cd86e29aa6858',
17
+ sha512: '2fb1877301854ac92dd518018f97407a0a88bb696bfef0a51e9efbd39917353500009e15bd72c3f0e4bf690115870bfab926565d5ad97269d922dbbb41261221',
18
+ mtime: 'Jan 26 13:59:49 2016',
19
+ ctime: 'Jan 26 13:59:49 2016'
20
+ }.freeze
21
+
22
+ INVALID_CHECKSUM_VALUES = {
23
+ md5: '00000000000000000000000000000000',
24
+ md5lite: '00000000000000000000000000000000',
25
+ sha256: '0000000000000000000000000000000000000000000000000000000000000000',
26
+ sha256lite: '0000000000000000000000000000000000000000000000000000000000000000',
27
+ sha1: '0000000000000000000000000000000000000000',
28
+ sha1lite: '0000000000000000000000000000000000000000',
29
+ sha224: '00000000000000000000000000000000000000000000000000000000',
30
+ sha384: '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
31
+ sha512: '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
32
+ }.freeze
33
+
6
34
  let(:path) { tmpfile('file_testing') }
7
35
  let(:file) { described_class.new(:path => path, :catalog => catalog) }
8
36
  let(:provider) { file.provider }
@@ -791,7 +819,7 @@ describe Puppet::Type.type(:file) do
791
819
  let(:sources) do
792
820
  h = {}
793
821
  %w{/a /b /c /d}.each do |key|
794
- h[key] = URI.unescape(Puppet::Util.path_to_uri(File.expand_path(key)).to_s)
822
+ h[key] = Puppet::Util.uri_unescape(Puppet::Util.path_to_uri(File.expand_path(key)).to_s)
795
823
  end
796
824
  h
797
825
  end
@@ -1108,38 +1136,6 @@ describe Puppet::Type.type(:file) do
1108
1136
  end
1109
1137
 
1110
1138
  describe "#write" do
1111
- describe "when validating the checksum" do
1112
- before { allow(file).to receive(:validate_checksum?).and_return(true) }
1113
-
1114
- it "should fail if the checksum parameter and content checksums do not match" do
1115
- checksum = double('checksum_parameter', :sum => 'checksum_b', :sum_file => 'checksum_b')
1116
- allow(file).to receive(:parameter).with(:checksum).and_return(checksum)
1117
- allow(file).to receive(:parameter).with(:source).and_return(nil)
1118
-
1119
-
1120
- property = double('content_property', :actual_content => "something", :length => "something".length, :write => 'checksum_a')
1121
- allow(file).to receive(:property).with(:content).and_return(property)
1122
-
1123
- expect { file.write property }.to raise_error(Puppet::Error) end
1124
- end
1125
-
1126
- describe "when not validating the checksum" do
1127
- before do
1128
- allow(file).to receive(:validate_checksum?).and_return(false)
1129
- end
1130
-
1131
- it "should not fail if the checksum property and content checksums do not match" do
1132
- checksum = double('checksum_parameter', :sum => 'checksum_b')
1133
- allow(file).to receive(:parameter).with(:checksum).and_return(checksum)
1134
- allow(file).to receive(:parameter).with(:source).and_return(nil)
1135
-
1136
- property = double('content_property', :actual_content => "something", :length => "something".length, :write => 'checksum_a')
1137
- allow(file).to receive(:property).with(:content).and_return(property)
1138
-
1139
- expect { file.write property }.to_not raise_error
1140
- end
1141
- end
1142
-
1143
1139
  describe "when resource mode is supplied" do
1144
1140
  before do
1145
1141
  allow(file).to receive(:property_fix)
@@ -1191,7 +1187,7 @@ describe Puppet::Type.type(:file) do
1191
1187
  describe "when resource mode is not supplied" do
1192
1188
  context "and content is supplied" do
1193
1189
  it "should default to 0644 mode" do
1194
- file = described_class.new(:path => path, :content => "file content")
1190
+ file = described_class.new(:path => path, :content => FILE_CONTENT)
1195
1191
 
1196
1192
  file.write file.parameter(:content)
1197
1193
 
@@ -1214,35 +1210,6 @@ describe Puppet::Type.type(:file) do
1214
1210
  end
1215
1211
  end
1216
1212
 
1217
- describe "#fail_if_checksum_is_wrong" do
1218
- it "should fail if the checksum of the file doesn't match the expected one" do
1219
- expect do
1220
- allow(file.parameter(:checksum)).to receive(:sum_file).and_return('wrong!!')
1221
- file.instance_eval do
1222
- fail_if_checksum_is_wrong(self[:path], 'anything!')
1223
- end
1224
- end.to raise_error(Puppet::Error, /File written to disk did not match checksum/)
1225
- end
1226
-
1227
- it "should not fail if the checksum is correct" do
1228
- expect do
1229
- allow(file.parameter(:checksum)).to receive(:sum_file).and_return('anything!')
1230
- file.instance_eval do
1231
- fail_if_checksum_is_wrong(self[:path], 'anything!')
1232
- end
1233
- end.not_to raise_error
1234
- end
1235
-
1236
- it "should not fail if the checksum is absent" do
1237
- expect do
1238
- allow(file.parameter(:checksum)).to receive(:sum_file).and_return(nil)
1239
- file.instance_eval do
1240
- fail_if_checksum_is_wrong(self[:path], 'anything!')
1241
- end
1242
- end.not_to raise_error
1243
- end
1244
- end
1245
-
1246
1213
  describe "#write_temporary_file?" do
1247
1214
  it "should be true if the file has specified content" do
1248
1215
  file[:content] = 'some content'
@@ -1462,7 +1429,7 @@ describe Puppet::Type.type(:file) do
1462
1429
  expect(Puppet::FileServing::Metadata.indirection).to receive(:find).with(source, anything).and_return(metadata)
1463
1430
 
1464
1431
  uri = file.parameters[:source].uri
1465
- expect(URI.unescape(uri.path)).to eq(filename)
1432
+ expect(Puppet::Util.uri_unescape(uri.path)).to eq(filename)
1466
1433
  expect(uri.path.encoding).to eq(Encoding::UTF_8)
1467
1434
  end
1468
1435
 
@@ -1486,29 +1453,16 @@ describe Puppet::Type.type(:file) do
1486
1453
  expect_any_instance_of(Puppet::Indirector::FileMetadata::Rest).to receive(:find).with(request_key(filename[1..-1])).and_return(metadata)
1487
1454
 
1488
1455
  uri = file.parameters[:source].uri
1489
- expect(URI.unescape(uri.path)).to eq(filename)
1456
+ expect(Puppet::Util.uri_unescape(uri.path)).to eq(filename)
1490
1457
  expect(uri.path.encoding).to eq(Encoding::UTF_8)
1491
1458
  end
1492
1459
  end
1493
1460
 
1494
1461
  describe "when using source" do
1462
+ let(:source) { tmpfile('file_source') }
1463
+
1495
1464
  before do
1496
- file[:source] = File.expand_path('/one')
1497
- # Contents of an empty file generate the below hash values
1498
- # in case you need to add support for additional algorithms in future
1499
- @checksum_values = {
1500
- :md5 => 'd41d8cd98f00b204e9800998ecf8427e',
1501
- :md5lite => 'd41d8cd98f00b204e9800998ecf8427e',
1502
- :sha256 => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
1503
- :sha256lite => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
1504
- :sha1 => 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
1505
- :sha1lite => 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
1506
- :sha224 => 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f',
1507
- :sha384 => '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b',
1508
- :sha512 => 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e',
1509
- :mtime => 'Jan 26 13:59:49 2016',
1510
- :ctime => 'Jan 26 13:59:49 2016'
1511
- }
1465
+ file[:source] = source
1512
1466
  end
1513
1467
 
1514
1468
  Puppet::Type::File::ParameterChecksum.value_collection.values.reject {|v| v == :none}.each do |checksum_type|
@@ -1527,9 +1481,51 @@ describe Puppet::Type.type(:file) do
1527
1481
  end
1528
1482
 
1529
1483
  it 'should validate a valid checksum_value' do
1530
- file[:checksum_value] = @checksum_values[checksum_type]
1484
+ file[:checksum_value] = CHECKSUM_VALUES[checksum_type]
1531
1485
  expect { file.validate }.to_not raise_error
1532
1486
  end
1487
+
1488
+ it 'fails if the checksum_value parameter and written file do not match' do
1489
+ skip if checksum_type =~ /^(ctime|mtime)/
1490
+
1491
+ File.write(source, FILE_CONTENT)
1492
+ file[:checksum_value] = INVALID_CHECKSUM_VALUES[checksum_type]
1493
+
1494
+ expect {
1495
+ file.property(:checksum_value).sync
1496
+ }.to raise_error(Puppet::Error, /File written to disk did not match desired checksum/)
1497
+
1498
+ expect(Puppet::FileSystem).to_not be_exist(file[:path])
1499
+ end
1500
+
1501
+ it 'fails if the checksum_value parameter does not match, but the metadata does' do
1502
+ skip if checksum_type =~ /^(ctime|mtime)/
1503
+
1504
+ File.write(source, FILE_CONTENT)
1505
+ file[:checksum_value] = INVALID_CHECKSUM_VALUES[checksum_type]
1506
+ allow(file.parameter(:source).metadata).to receive(:checksum).and_return(file[:checksum_value])
1507
+
1508
+ expect {
1509
+ file.property(:checksum_value).sync
1510
+ }.to raise_error(Puppet::Error, /File written to disk did not match desired checksum/)
1511
+
1512
+ expect(Puppet::FileSystem).to_not be_exist(file[:path])
1513
+ end
1514
+
1515
+ it 'replaces a file from a source when the checksum matches' do
1516
+ File.write(source, FILE_CONTENT)
1517
+ file[:checksum_value] = CHECKSUM_VALUES[checksum_type]
1518
+
1519
+ file.property(:checksum_value).sync
1520
+ checksum = file.parameter(:checksum).sum_file(file[:path])
1521
+
1522
+ if checksum_type =~ /^(ctime|mtime)/
1523
+ # file on disk ctime/mtime will be later than expected time
1524
+ expect(checksum).to match(/{#{checksum_type}}/)
1525
+ else
1526
+ expect(checksum).to eq("{#{checksum_type}}#{file[:checksum_value]}")
1527
+ end
1528
+ end
1533
1529
  end
1534
1530
  end
1535
1531
 
@@ -1591,19 +1587,8 @@ describe Puppet::Type.type(:file) do
1591
1587
  end
1592
1588
 
1593
1589
  describe "when using content" do
1594
- before do
1595
- file[:content] = 'file contents'
1596
- @checksum_values = {
1597
- :md5 => 'd41d8cd98f00b204e9800998ecf8427e',
1598
- :md5lite => 'd41d8cd98f00b204e9800998ecf8427e',
1599
- :sha256 => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
1600
- :sha256lite => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
1601
- :sha1 => 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
1602
- :sha1lite => 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
1603
- :sha224 => 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f',
1604
- :sha384 => '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b',
1605
- :sha512 => 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e',
1606
- }
1590
+ before :each do
1591
+ file[:content] = FILE_CONTENT
1607
1592
  end
1608
1593
 
1609
1594
  (Puppet::Type::File::ParameterChecksum.value_collection.values - SOURCE_ONLY_CHECKSUMS).each do |checksum_type|
@@ -1622,9 +1607,43 @@ describe Puppet::Type.type(:file) do
1622
1607
  end
1623
1608
 
1624
1609
  it 'should validate a valid checksum_value' do
1625
- file[:checksum_value] = @checksum_values[checksum_type]
1610
+ file[:checksum_value] = CHECKSUM_VALUES[checksum_type]
1626
1611
  expect { file.validate }.to_not raise_error
1627
1612
  end
1613
+
1614
+ it 'fails if the checksum_value parameter and written file do not match' do
1615
+ file[:checksum_value] = INVALID_CHECKSUM_VALUES[checksum_type]
1616
+
1617
+ expect {
1618
+ file.property(:content).sync
1619
+ }.to raise_error(Puppet::Error, /File written to disk did not match desired checksum/)
1620
+
1621
+ expect(Puppet::FileSystem).to_not be_exist(file[:path])
1622
+ end
1623
+
1624
+ it 'fails if the calculated checksum for the content and written file do not match' do
1625
+ allow(file.parameter(:checksum)).to receive(:sum).and_return(INVALID_CHECKSUM_VALUES[checksum_type])
1626
+
1627
+ expect {
1628
+ file.property(:content).sync
1629
+ }.to raise_error(Puppet::Error, /File written to disk did not match desired checksum/)
1630
+
1631
+ expect(Puppet::FileSystem).to_not be_exist(file[:path])
1632
+ end
1633
+
1634
+ it 'replaces a file from content when the checksum matches' do
1635
+ file[:checksum_value] = CHECKSUM_VALUES[checksum_type]
1636
+
1637
+ file.property(:content).sync
1638
+ checksum = file.parameter(:checksum).sum_file(file[:path])
1639
+
1640
+ if checksum_type =~ /^(ctime|mtime)/
1641
+ # file on disk ctime/mtime will be later than expected time
1642
+ expect(checksum).to match(/{#{checksum_type}}/)
1643
+ else
1644
+ expect(checksum).to eq("{#{checksum_type}}#{file[:checksum_value]}")
1645
+ end
1646
+ end
1628
1647
  end
1629
1648
  end
1630
1649
 
@@ -1657,6 +1676,13 @@ describe Puppet::Type.type(:file) do
1657
1676
  file[:checksum_value] = ''
1658
1677
  expect { file.validate }.to_not raise_error
1659
1678
  end
1679
+
1680
+ it 'writes a file' do
1681
+ file[:ensure] = :file
1682
+ file.property(:ensure).sync
1683
+
1684
+ expect(file.parameter(:checksum).sum_file(file[:path])).to eq('{none}')
1685
+ end
1660
1686
  end
1661
1687
 
1662
1688
  describe "when auditing" do