puppet 6.16.0-x64-mingw32 → 6.20.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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +6 -2
  4. data/Gemfile.lock +40 -36
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent.rb +2 -2
  8. data/lib/puppet/agent/locker.rb +0 -7
  9. data/lib/puppet/application.rb +10 -6
  10. data/lib/puppet/application/agent.rb +23 -6
  11. data/lib/puppet/application/apply.rb +20 -21
  12. data/lib/puppet/application/device.rb +1 -0
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/filebucket.rb +2 -2
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/script.rb +1 -0
  17. data/lib/puppet/application_support.rb +7 -0
  18. data/lib/puppet/configurer.rb +70 -20
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/confine.rb +2 -2
  21. data/lib/puppet/confine/any.rb +1 -1
  22. data/lib/puppet/defaults.rb +113 -46
  23. data/lib/puppet/environments.rb +84 -59
  24. data/lib/puppet/face/catalog.rb +1 -1
  25. data/lib/puppet/face/config.rb +56 -16
  26. data/lib/puppet/face/epp.rb +12 -2
  27. data/lib/puppet/face/facts.rb +60 -0
  28. data/lib/puppet/face/node.rb +3 -3
  29. data/lib/puppet/face/node/clean.rb +2 -2
  30. data/lib/puppet/face/status.rb +1 -1
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/ffi/posix.rb +10 -0
  33. data/lib/puppet/ffi/posix/constants.rb +14 -0
  34. data/lib/puppet/ffi/posix/functions.rb +24 -0
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +13 -1
  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 +8 -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 +3 -7
  47. data/lib/puppet/functions/epp.rb +1 -0
  48. data/lib/puppet/functions/inline_epp.rb +1 -0
  49. data/lib/puppet/functions/lstrip.rb +4 -4
  50. data/lib/puppet/functions/new.rb +8 -3
  51. data/lib/puppet/functions/reverse_each.rb +1 -1
  52. data/lib/puppet/functions/rstrip.rb +4 -4
  53. data/lib/puppet/functions/step.rb +1 -1
  54. data/lib/puppet/functions/strip.rb +4 -4
  55. data/lib/puppet/gettext/config.rb +5 -5
  56. data/lib/puppet/gettext/module_translations.rb +4 -4
  57. data/lib/puppet/http.rb +1 -0
  58. data/lib/puppet/http/client.rb +6 -1
  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/fact_search.rb +60 -0
  74. data/lib/puppet/indirector/facts/facter.rb +3 -3
  75. data/lib/puppet/indirector/facts/json.rb +27 -0
  76. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  77. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  78. data/lib/puppet/indirector/file_metadata/http.rb +25 -5
  79. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/json.rb +5 -1
  83. data/lib/puppet/indirector/msgpack.rb +1 -1
  84. data/lib/puppet/indirector/node/json.rb +8 -0
  85. data/lib/puppet/indirector/report/json.rb +34 -0
  86. data/lib/puppet/indirector/report/processor.rb +2 -2
  87. data/lib/puppet/indirector/request.rb +5 -5
  88. data/lib/puppet/indirector/yaml.rb +1 -1
  89. data/lib/puppet/module.rb +1 -2
  90. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  91. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/formats.rb +2 -1
  94. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  95. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  96. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  97. data/lib/puppet/network/http/connection_adapter.rb +6 -4
  98. data/lib/puppet/network/http/route.rb +2 -2
  99. data/lib/puppet/node/environment.rb +12 -5
  100. data/lib/puppet/node/facts.rb +17 -0
  101. data/lib/puppet/pal/pal_impl.rb +90 -13
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +7 -6
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +1 -1
  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/resource.rb +3 -2
  112. data/lib/puppet/parser/resource/param.rb +6 -0
  113. data/lib/puppet/parser/templatewrapper.rb +1 -1
  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/deferred_resolver.rb +5 -3
  119. data/lib/puppet/pops/evaluator/evaluator_impl.rb +27 -8
  120. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  121. data/lib/puppet/pops/issues.rb +5 -0
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  123. data/lib/puppet/pops/loaders.rb +18 -11
  124. data/lib/puppet/pops/lookup/context.rb +1 -1
  125. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  126. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  130. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  131. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  132. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  133. data/lib/puppet/provider/file/windows.rb +1 -1
  134. data/lib/puppet/provider/package/apt.rb +38 -0
  135. data/lib/puppet/provider/package/aptitude.rb +1 -1
  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/pip2.rb +17 -0
  139. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  140. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  141. data/lib/puppet/provider/package/yum.rb +2 -1
  142. data/lib/puppet/provider/package/zypper.rb +3 -0
  143. data/lib/puppet/provider/service/windows.rb +23 -7
  144. data/lib/puppet/provider/user/aix.rb +3 -3
  145. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  146. data/lib/puppet/provider/user/useradd.rb +11 -4
  147. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  148. data/lib/puppet/reference/configuration.rb +6 -5
  149. data/lib/puppet/reports/http.rb +2 -0
  150. data/lib/puppet/resource.rb +2 -1
  151. data/lib/puppet/resource/type.rb +10 -1
  152. data/lib/puppet/rest/route.rb +2 -2
  153. data/lib/puppet/settings.rb +63 -21
  154. data/lib/puppet/settings/alias_setting.rb +37 -0
  155. data/lib/puppet/settings/base_setting.rb +26 -2
  156. data/lib/puppet/ssl/ssl_context.rb +2 -2
  157. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  158. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  159. data/lib/puppet/test/test_helper.rb +18 -13
  160. data/lib/puppet/transaction.rb +2 -2
  161. data/lib/puppet/transaction/persistence.rb +1 -1
  162. data/lib/puppet/transaction/report.rb +12 -8
  163. data/lib/puppet/trusted_external.rb +29 -1
  164. data/lib/puppet/type.rb +15 -7
  165. data/lib/puppet/type/file.rb +40 -15
  166. data/lib/puppet/type/file/checksum.rb +4 -4
  167. data/lib/puppet/type/file/source.rb +32 -12
  168. data/lib/puppet/type/filebucket.rb +1 -1
  169. data/lib/puppet/type/notify.rb +2 -2
  170. data/lib/puppet/type/service.rb +53 -0
  171. data/lib/puppet/type/user.rb +18 -3
  172. data/lib/puppet/util.rb +41 -3
  173. data/lib/puppet/util/autoload.rb +10 -15
  174. data/lib/puppet/util/character_encoding.rb +9 -5
  175. data/lib/puppet/util/checksums.rb +19 -4
  176. data/lib/puppet/util/connection.rb +8 -8
  177. data/lib/puppet/util/execution.rb +2 -2
  178. data/lib/puppet/util/fact_dif.rb +62 -0
  179. data/lib/puppet/util/fileparsing.rb +2 -2
  180. data/lib/puppet/util/posix.rb +54 -5
  181. data/lib/puppet/util/provider_features.rb +1 -1
  182. data/lib/puppet/util/reference.rb +1 -1
  183. data/lib/puppet/util/rubygems.rb +5 -1
  184. data/lib/puppet/util/run_mode.rb +5 -1
  185. data/lib/puppet/util/windows.rb +1 -0
  186. data/lib/puppet/util/windows/api_types.rb +60 -33
  187. data/lib/puppet/util/windows/eventlog.rb +1 -6
  188. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  189. data/lib/puppet/util/windows/principal.rb +8 -6
  190. data/lib/puppet/util/windows/registry.rb +11 -11
  191. data/lib/puppet/util/windows/security.rb +4 -4
  192. data/lib/puppet/util/windows/service.rb +43 -26
  193. data/lib/puppet/util/windows/user.rb +242 -8
  194. data/lib/puppet/version.rb +1 -1
  195. data/locales/puppet.pot +501 -443
  196. data/man/man5/puppet.conf.5 +70 -24
  197. data/man/man8/puppet-agent.8 +8 -5
  198. data/man/man8/puppet-apply.8 +2 -2
  199. data/man/man8/puppet-catalog.8 +1 -1
  200. data/man/man8/puppet-config.8 +6 -6
  201. data/man/man8/puppet-describe.8 +1 -1
  202. data/man/man8/puppet-device.8 +2 -2
  203. data/man/man8/puppet-doc.8 +1 -1
  204. data/man/man8/puppet-epp.8 +1 -1
  205. data/man/man8/puppet-facts.8 +32 -1
  206. data/man/man8/puppet-filebucket.8 +3 -3
  207. data/man/man8/puppet-generate.8 +1 -1
  208. data/man/man8/puppet-help.8 +1 -1
  209. data/man/man8/puppet-key.8 +1 -1
  210. data/man/man8/puppet-lookup.8 +2 -2
  211. data/man/man8/puppet-man.8 +1 -1
  212. data/man/man8/puppet-module.8 +1 -1
  213. data/man/man8/puppet-node.8 +7 -4
  214. data/man/man8/puppet-parser.8 +1 -1
  215. data/man/man8/puppet-plugin.8 +1 -1
  216. data/man/man8/puppet-report.8 +4 -1
  217. data/man/man8/puppet-resource.8 +1 -1
  218. data/man/man8/puppet-script.8 +2 -2
  219. data/man/man8/puppet-ssl.8 +1 -1
  220. data/man/man8/puppet-status.8 +2 -2
  221. data/man/man8/puppet.8 +2 -2
  222. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  223. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  224. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  225. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  226. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  227. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  228. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  229. data/spec/integration/application/agent_spec.rb +263 -54
  230. data/spec/integration/application/apply_spec.rb +168 -149
  231. data/spec/integration/application/doc_spec.rb +16 -6
  232. data/spec/integration/application/filebucket_spec.rb +70 -21
  233. data/spec/integration/application/help_spec.rb +42 -0
  234. data/spec/integration/application/lookup_spec.rb +13 -0
  235. data/spec/integration/application/module_spec.rb +68 -0
  236. data/spec/integration/application/plugin_spec.rb +53 -3
  237. data/spec/integration/configurer_spec.rb +14 -0
  238. data/spec/integration/data_binding_spec.rb +82 -0
  239. data/spec/integration/defaults_spec.rb +20 -3
  240. data/spec/integration/directory_environments_spec.rb +17 -17
  241. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  242. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  243. data/spec/integration/network/http_pool_spec.rb +26 -9
  244. data/spec/integration/node/environment_spec.rb +1 -1
  245. data/spec/integration/parser/compiler_spec.rb +11 -0
  246. data/spec/integration/resource/type_collection_spec.rb +2 -6
  247. data/spec/integration/transaction_spec.rb +4 -9
  248. data/spec/integration/type/file_spec.rb +1 -1
  249. data/spec/integration/util/execution_spec.rb +22 -0
  250. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  251. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  252. data/spec/integration/util/windows/process_spec.rb +26 -32
  253. data/spec/integration/util/windows/registry_spec.rb +7 -17
  254. data/spec/integration/util/windows/user_spec.rb +47 -5
  255. data/spec/integration/util_spec.rb +7 -33
  256. data/spec/lib/puppet_spec/matchers.rb +0 -80
  257. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  258. data/spec/lib/puppet_spec/settings.rb +6 -1
  259. data/spec/shared_contexts/types_setup.rb +2 -0
  260. data/spec/spec_helper.rb +1 -4
  261. data/spec/unit/agent_spec.rb +8 -6
  262. data/spec/unit/application/agent_spec.rb +3 -5
  263. data/spec/unit/application/config_spec.rb +224 -4
  264. data/spec/unit/application/doc_spec.rb +2 -2
  265. data/spec/unit/application/face_base_spec.rb +6 -4
  266. data/spec/unit/application/facts_spec.rb +41 -10
  267. data/spec/unit/application/filebucket_spec.rb +0 -2
  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 +60 -13
  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/feature_spec.rb +1 -1
  276. data/spec/unit/confine_spec.rb +10 -3
  277. data/spec/unit/context/trusted_information_spec.rb +10 -4
  278. data/spec/unit/defaults_spec.rb +20 -1
  279. data/spec/unit/environments_spec.rb +176 -32
  280. data/spec/unit/face/config_spec.rb +65 -12
  281. data/spec/unit/face/node_spec.rb +2 -13
  282. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  283. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  284. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  285. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  286. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  287. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  288. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  289. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  290. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  291. data/spec/unit/file_system_spec.rb +1 -2
  292. data/spec/unit/forge/module_release_spec.rb +2 -7
  293. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  294. data/spec/unit/http/client_spec.rb +64 -9
  295. data/spec/unit/http/resolver_spec.rb +24 -5
  296. data/spec/unit/http/response_spec.rb +6 -0
  297. data/spec/unit/http/service/ca_spec.rb +2 -3
  298. data/spec/unit/http/service/compiler_spec.rb +51 -3
  299. data/spec/unit/http/service/file_server_spec.rb +2 -3
  300. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  301. data/spec/unit/http/service/report_spec.rb +2 -3
  302. data/spec/unit/http/service_spec.rb +1 -2
  303. data/spec/unit/http/session_spec.rb +8 -21
  304. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  305. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  306. data/spec/unit/indirector/face_spec.rb +0 -1
  307. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  308. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  309. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  310. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  311. data/spec/unit/indirector/file_metadata/http_spec.rb +27 -0
  312. data/spec/unit/indirector/indirection_spec.rb +8 -12
  313. data/spec/unit/indirector/json_spec.rb +8 -8
  314. data/spec/unit/indirector/key/file_spec.rb +0 -1
  315. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  316. data/spec/unit/indirector/node/json_spec.rb +33 -0
  317. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  318. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  319. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  320. data/spec/unit/indirector/request_spec.rb +5 -5
  321. data/spec/unit/indirector/rest_spec.rb +1 -1
  322. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  323. data/spec/unit/indirector/yaml_spec.rb +7 -7
  324. data/spec/unit/indirector_spec.rb +2 -2
  325. data/spec/unit/interface_spec.rb +3 -3
  326. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  327. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  328. data/spec/unit/network/authconfig_spec.rb +0 -3
  329. data/spec/unit/network/format_support_spec.rb +3 -2
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -10
  331. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  332. data/spec/unit/network/http/connection_spec.rb +42 -32
  333. data/spec/unit/network/http/handler_spec.rb +0 -5
  334. data/spec/unit/node/environment_spec.rb +18 -1
  335. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  336. data/spec/unit/parser/compiler_spec.rb +3 -19
  337. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  338. data/spec/unit/parser/resource_spec.rb +14 -8
  339. data/spec/unit/parser/scope_spec.rb +1 -1
  340. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  341. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  342. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  344. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  345. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  346. data/spec/unit/property_spec.rb +1 -0
  347. data/spec/unit/provider/exec_spec.rb +4 -3
  348. data/spec/unit/provider/nameservice_spec.rb +66 -65
  349. data/spec/unit/provider/package/apt_spec.rb +76 -3
  350. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  351. data/spec/unit/provider/package/base_spec.rb +6 -5
  352. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  353. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  354. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  355. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  356. data/spec/unit/provider/package/pip_spec.rb +6 -11
  357. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  358. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  359. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  360. data/spec/unit/provider/package/yum_spec.rb +31 -0
  361. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  362. data/spec/unit/provider/service/base_spec.rb +2 -4
  363. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  364. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  365. data/spec/unit/provider/service/debian_spec.rb +3 -5
  366. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  367. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  368. data/spec/unit/provider/service/init_spec.rb +45 -5
  369. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  370. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  371. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  372. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  373. data/spec/unit/provider/service/runit_spec.rb +2 -1
  374. data/spec/unit/provider/service/smf_spec.rb +1 -1
  375. data/spec/unit/provider/service/src_spec.rb +3 -5
  376. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  377. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  378. data/spec/unit/provider/service/windows_spec.rb +50 -14
  379. data/spec/unit/provider/user/aix_spec.rb +5 -0
  380. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  381. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  382. data/spec/unit/provider/user/pw_spec.rb +2 -0
  383. data/spec/unit/provider/user/useradd_spec.rb +23 -16
  384. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  385. data/spec/unit/provider_spec.rb +8 -10
  386. data/spec/unit/puppet_pal_2pec.rb +40 -0
  387. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  388. data/spec/unit/reports/store_spec.rb +17 -13
  389. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  390. data/spec/unit/resource/type_spec.rb +1 -1
  391. data/spec/unit/resource_spec.rb +14 -13
  392. data/spec/unit/rest/route_spec.rb +4 -4
  393. data/spec/unit/settings_spec.rb +576 -239
  394. data/spec/unit/ssl/base_spec.rb +0 -1
  395. data/spec/unit/ssl/host_spec.rb +0 -5
  396. data/spec/unit/ssl/ssl_provider_spec.rb +82 -50
  397. data/spec/unit/test/test_helper_spec.rb +17 -0
  398. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  399. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  400. data/spec/unit/transaction/persistence_spec.rb +15 -0
  401. data/spec/unit/transaction/report_spec.rb +3 -1
  402. data/spec/unit/transaction_spec.rb +13 -4
  403. data/spec/unit/type/file/content_spec.rb +0 -1
  404. data/spec/unit/type/file/selinux_spec.rb +0 -2
  405. data/spec/unit/type/file/source_spec.rb +4 -4
  406. data/spec/unit/type/file_spec.rb +122 -102
  407. data/spec/unit/type/filebucket_spec.rb +1 -1
  408. data/spec/unit/type/group_spec.rb +13 -6
  409. data/spec/unit/type/resources_spec.rb +7 -7
  410. data/spec/unit/type/service_spec.rb +210 -1
  411. data/spec/unit/type/tidy_spec.rb +0 -1
  412. data/spec/unit/type/user_spec.rb +31 -2
  413. data/spec/unit/type_spec.rb +52 -2
  414. data/spec/unit/util/at_fork_spec.rb +2 -2
  415. data/spec/unit/util/autoload_spec.rb +5 -1
  416. data/spec/unit/util/backups_spec.rb +1 -2
  417. data/spec/unit/util/character_encoding_spec.rb +4 -4
  418. data/spec/unit/util/checksums_spec.rb +16 -0
  419. data/spec/unit/util/command_line_spec.rb +11 -6
  420. data/spec/unit/util/execution_spec.rb +15 -11
  421. data/spec/unit/util/inifile_spec.rb +6 -14
  422. data/spec/unit/util/log_spec.rb +8 -7
  423. data/spec/unit/util/logging_spec.rb +3 -3
  424. data/spec/unit/util/posix_spec.rb +363 -15
  425. data/spec/unit/util/rubygems_spec.rb +2 -2
  426. data/spec/unit/util/run_mode_spec.rb +6 -6
  427. data/spec/unit/util/selinux_spec.rb +76 -52
  428. data/spec/unit/util/storage_spec.rb +3 -1
  429. data/spec/unit/util/suidmanager_spec.rb +44 -41
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util_spec.rb +16 -9
  433. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  434. metadata +52 -53
  435. data/spec/integration/faces/config_spec.rb +0 -91
  436. data/spec/integration/faces/documentation_spec.rb +0 -57
  437. data/spec/integration/file_bucket/file_spec.rb +0 -50
  438. data/spec/integration/file_serving/content_spec.rb +0 -7
  439. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  440. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  441. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  442. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  443. data/spec/integration/module_tool/forge_spec.rb +0 -51
  444. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  445. data/spec/integration/provider/service/init_spec.rb +0 -48
  446. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  447. data/spec/integration/provider/service/windows_spec.rb +0 -50
  448. data/spec/integration/reference/providers_spec.rb +0 -21
  449. data/spec/integration/reports_spec.rb +0 -13
  450. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  451. data/spec/integration/ssl/host_spec.rb +0 -72
  452. data/spec/integration/ssl/key_spec.rb +0 -99
  453. data/spec/integration/test/test_helper_spec.rb +0 -31
  454. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  455. data/spec/unit/face/catalog_spec.rb +0 -6
  456. data/spec/unit/face/man_spec.rb +0 -25
  457. data/spec/unit/face/module_spec.rb +0 -3
  458. data/spec/unit/man_spec.rb +0 -31
@@ -146,16 +146,6 @@ describe Puppet::Util::Windows::Registry do
146
146
  utf_8_bytes = ENDASH_UTF_8 + TM_UTF_8
147
147
  utf_8_str = utf_8_bytes.pack('c*').force_encoding(Encoding::UTF_8)
148
148
 
149
- # this problematic Ruby codepath triggers a conversion of UTF-16LE to
150
- # a local codepage which can totally break when that codepage has no
151
- # conversion from the given UTF-16LE characters to local codepage
152
- # a prime example is that IBM437 has no conversion from a Unicode en-dash
153
- expect(Win32::Registry).not_to receive(:export_string)
154
-
155
- # also, expect that we're using our variants of keys / values, not Rubys
156
- expect(Win32::Registry).not_to receive(:each_key)
157
- expect(Win32::Registry).not_to receive(:each_value)
158
-
159
149
  hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS | regsam) do |reg|
160
150
  reg.write("#{guid}", Win32::Registry::REG_SZ, utf_16_str)
161
151
 
@@ -259,23 +249,23 @@ describe Puppet::Util::Windows::Registry do
259
249
  {
260
250
  name: 'REG_SZ',
261
251
  type: Win32::Registry::REG_SZ,
262
- value: "reg sz\u0000 string",
263
- expected_value: "reg sz string"
252
+ value: "reg sz\u0000\u0000 string",
253
+ expected_value: "reg sz"
264
254
  },
265
255
  {
266
256
  name: 'REG_SZ_2',
267
257
  type: Win32::Registry::REG_SZ,
268
- value: "reg sz\x00 string",
269
- expected_value: "reg sz string"
258
+ value: "reg sz 2\x00\x00 string",
259
+ expected_value: "reg sz 2"
270
260
  },
271
261
  {
272
262
  name: 'REG_EXPAND_SZ',
273
263
  type: Win32::Registry::REG_EXPAND_SZ,
274
- value: "\0reg expand string",
275
- expected_value: " reg expand string"
264
+ value: "\0\0\0reg expand string",
265
+ expected_value: ""
276
266
  }
277
267
  ].each do |pair|
278
- it 'replaces null bytes with spaces' do
268
+ it 'reads up to the first wide null' do
279
269
  hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
280
270
  reg.write(value_name, pair[:type], pair[:value])
281
271
  end
@@ -125,19 +125,16 @@ describe "Puppet::Util::Windows::User", :if => Puppet::Util::Platform.windows? d
125
125
  end
126
126
 
127
127
  it 'should raise error given that logon returns false' do
128
-
129
128
  allow(Puppet::Util::Windows::User).to receive(:logon_user_by_logon_type).with(
130
- user, passwd, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, anything).and_return (0)
129
+ user, '.', passwd, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, anything).and_return (0)
131
130
  allow(Puppet::Util::Windows::User).to receive(:logon_user_by_logon_type).with(
132
- user, passwd, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, anything).and_return(0)
131
+ user, '.', passwd, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, anything).and_return(0)
133
132
 
134
133
  expect {Puppet::Util::Windows::User.logon_user(user, passwd) {}}
135
134
  .to raise_error(Puppet::Util::Windows::Error, /Failed to logon user/)
136
-
137
135
  end
138
136
  end
139
137
 
140
-
141
138
  describe "password_is?" do
142
139
  it "should return false given an incorrect username and password" do
143
140
  expect(Puppet::Util::Windows::User.password_is?(username, bad_password)).to be_falsey
@@ -180,5 +177,50 @@ describe "Puppet::Util::Windows::User", :if => Puppet::Util::Platform.windows? d
180
177
  expect { Puppet::Util::Windows::User.check_token_membership }.not_to raise_error
181
178
  end
182
179
  end
180
+
181
+ describe "default_system_account?" do
182
+ it "should succesfully identify 'SYSTEM' user as a default system account" do
183
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('SYSTEM').and_return(Puppet::Util::Windows::SID::LocalSystem)
184
+ expect(Puppet::Util::Windows::User.default_system_account?('SYSTEM')).to eq(true)
185
+ end
186
+
187
+ it "should succesfully identify 'NETWORK SERVICE' user as a default system account" do
188
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('NETWORK SERVICE').and_return(Puppet::Util::Windows::SID::NtNetwork)
189
+ expect(Puppet::Util::Windows::User.default_system_account?('NETWORK SERVICE')).to eq(true)
190
+ end
191
+
192
+ it "should succesfully identify 'LOCAL SERVICE' user as a default system account" do
193
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('LOCAL SERVICE').and_return(Puppet::Util::Windows::SID::NtLocal)
194
+ expect(Puppet::Util::Windows::User.default_system_account?('LOCAL SERVICE')).to eq(true)
195
+ end
196
+
197
+ it "should not identify user with unknown sid as a default system account" do
198
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('UnknownUser').and_return(Puppet::Util::Windows::SID::Null)
199
+ expect(Puppet::Util::Windows::User.default_system_account?('UnknownUser')).to eq(false)
200
+ end
201
+ end
202
+
203
+ describe "localsystem?" do
204
+ before do
205
+ allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
206
+ end
207
+
208
+ ['LocalSystem', '.\LocalSystem', 'myPC\LocalSystem', 'lOcALsysTem'].each do |input|
209
+ it "should succesfully identify #{input} as the 'LocalSystem' account" do
210
+ expect(Puppet::Util::Windows::User.localsystem?(input)).to eq(true)
211
+ end
212
+ end
213
+
214
+ it "should not identify any other user as the 'LocalSystem' account" do
215
+ expect(Puppet::Util::Windows::User.localsystem?('OtherUser')).to eq(false)
216
+ end
217
+ end
218
+
219
+ describe "get_rights" do
220
+ it "should be empty when given user does not exist" do
221
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('NonExistingUser').and_return(nil)
222
+ expect(Puppet::Util::Windows::User.get_rights('NonExistingUser')).to eq("")
223
+ end
224
+ end
183
225
  end
184
226
  end
@@ -1,32 +1,9 @@
1
+ # coding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Puppet::Util do
4
5
  include PuppetSpec::Files
5
6
 
6
- describe "#execute", unless: Puppet::Util::Platform.jruby? do
7
- it "should properly allow stdout and stderr to share a file" do
8
- command = "ruby -e '(1..10).each {|i| (i%2==0) ? $stdout.puts(i) : $stderr.puts(i)}'"
9
-
10
- expect(Puppet::Util::Execution.execute(command, :combine => true).split).to match_array([*'1'..'10'])
11
- end
12
-
13
- it "should return output and set $CHILD_STATUS" do
14
- command = "ruby -e 'puts \"foo\"; exit 42'"
15
-
16
- output = Puppet::Util::Execution.execute(command, {:failonfail => false})
17
-
18
- expect(output).to eq("foo\n")
19
- expect($CHILD_STATUS.exitstatus).to eq(42)
20
- end
21
-
22
- it "should raise an error if non-zero exit status is returned" do
23
- command = "ruby -e 'exit 43'"
24
-
25
- expect { Puppet::Util::Execution.execute(command) }.to raise_error(Puppet::ExecutionFailure, /Execution of '#{command}' returned 43: /)
26
- expect($CHILD_STATUS.exitstatus).to eq(43)
27
- end
28
- end
29
-
30
7
  describe "#replace_file on Windows", :if => Puppet::Util::Platform.windows? do
31
8
  it "replace_file should preserve original ACEs from existing replaced file on Windows" do
32
9
 
@@ -110,18 +87,15 @@ describe Puppet::Util do
110
87
  describe "#which on Windows", :if => Puppet::Util::Platform.windows? do
111
88
  let (:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
112
89
  let (:filename) { 'foo.exe' }
113
- let (:filepath) { File.expand_path('C:\\' + rune_utf8 + '\\' + filename) }
114
90
 
115
- before :each do
116
- allow(FileTest).to receive(:file?).and_return(false)
117
- allow(FileTest).to receive(:file?).with(filepath).and_return(true)
91
+ it "should be able to use UTF8 characters in the path" do
92
+ utf8 = tmpdir(rune_utf8)
93
+ Puppet::FileSystem.mkpath(utf8)
118
94
 
119
- allow(FileTest).to receive(:executable?).and_return(false)
120
- allow(FileTest).to receive(:executable?).with(filepath).and_return(true)
121
- end
95
+ filepath = File.join(utf8, filename)
96
+ Puppet::FileSystem.touch(filepath)
122
97
 
123
- it "should be able to use UTF8 characters in the path" do
124
- path = "C:\\" + rune_utf8 + "#{File::PATH_SEPARATOR}c:\\windows\\system32#{File::PATH_SEPARATOR}c:\\windows"
98
+ path = [utf8, "c:\\windows\\system32", "c:\\windows"].join(File::PATH_SEPARATOR)
125
99
  Puppet::Util.withenv( { "PATH" => path } , :windows) do
126
100
  expect(Puppet::Util.which(filename)).to eq(filepath)
127
101
  end
@@ -41,86 +41,6 @@ RSpec::Matchers.define :exit_with do |expected|
41
41
  end
42
42
  end
43
43
 
44
-
45
- RSpec::Matchers.define :have_printed do |expected|
46
-
47
- case expected
48
- when String, Regexp, Proc
49
- expected = expected
50
- else
51
- expected = expected.to_s
52
- end
53
-
54
- chain :and_exit_with do |code|
55
- @expected_exit_code = code
56
- end
57
-
58
- define_method :matches_exit_code? do |actual|
59
- @expected_exit_code.nil? || @expected_exit_code == actual
60
- end
61
-
62
- define_method :matches_output? do |actual|
63
- return false unless actual
64
- case expected
65
- when String
66
- actual.include?(expected)
67
- when Regexp
68
- expected.match(actual)
69
- when Proc
70
- expected.call(actual)
71
- else
72
- raise ArgumentError, "No idea how to match a #{actual.class.name}"
73
- end
74
- end
75
-
76
- match do |block|
77
- $stderr = $stdout = StringIO.new
78
- $stdout.set_encoding('UTF-8') if $stdout.respond_to?(:set_encoding)
79
-
80
- begin
81
- block.call
82
- rescue SystemExit => e
83
- raise unless @expected_exit_code
84
- @actual_exit_code = e.status
85
- ensure
86
- $stdout.rewind
87
- @actual = $stdout.read
88
-
89
- $stdout = STDOUT
90
- $stderr = STDERR
91
- end
92
-
93
- matches_output?(@actual) && matches_exit_code?(@actual_exit_code)
94
- end
95
-
96
- supports_block_expectations
97
-
98
- failure_message do |actual|
99
- if actual.nil? then
100
- "expected #{expected.inspect}, but nothing was printed"
101
- else
102
- if !@expected_exit_code.nil? && matches_output?(actual)
103
- "expected exit with code #{@expected_exit_code} but " +
104
- (@actual_exit_code.nil? ? " exit was not called" : "exited with #{@actual_exit_code} instead")
105
- else
106
- "expected #{expected.inspect} to be printed; got:\n#{actual}"
107
- end
108
- end
109
- end
110
-
111
- failure_message_when_negated do |actual|
112
- if @expected_exit_code && matches_exit_code?(@actual_exit_code)
113
- "expected exit code to not be #{@actual_exit_code}"
114
- else
115
- "expected #{expected.inspect} to not be printed; got:\n#{actual}"
116
- end
117
- end
118
-
119
- description do
120
- "expect #{expected.inspect} to be printed" + (@expected_exit_code.nil ? '' : " with exit code #{@expected_exit_code}")
121
- end
122
- end
123
-
124
44
  RSpec::Matchers.define :equal_attributes_of do |expected|
125
45
  match do |actual|
126
46
  actual.instance_variables.all? do |attr|
@@ -47,9 +47,13 @@ class PuppetSpec::Puppetserver
47
47
  class FilebucketServlet < WEBrick::HTTPServlet::AbstractServlet
48
48
  def do_GET request, response
49
49
  end
50
+
50
51
  def do_PUT request, response
52
+ upload = File.join(@config.config[:TempDir], 'filebucket')
53
+ File.open(upload, 'wb') { |f| f.write(request.body) }
51
54
  response['Content-Type'] = 'application/octet-stream'
52
55
  end
56
+
53
57
  def do_HEAD request, response
54
58
  response.status = 404
55
59
  end
@@ -116,4 +120,8 @@ class PuppetSpec::Puppetserver
116
120
  end
117
121
  @https.mount(path, handler)
118
122
  end
123
+
124
+ def upload_directory
125
+ @https.config[:TempDir]
126
+ end
119
127
  end
@@ -12,7 +12,12 @@ module PuppetSpec::Settings
12
12
  :codedir => { :type => :directory, :default => "test", :desc => "codedir" },
13
13
  :vardir => { :type => :directory, :default => "test", :desc => "vardir" },
14
14
  :rundir => { :type => :directory, :default => "test", :desc => "rundir" },
15
- }
15
+ }.freeze
16
+
17
+ TEST_APP_DEFAULT_VALUES = TEST_APP_DEFAULT_DEFINITIONS.inject({}) do |memo, (key, value)|
18
+ memo[key] = value[:default]
19
+ memo
20
+ end.freeze
16
21
 
17
22
  def set_puppet_conf(confdir, settings)
18
23
  write_file(File.join(confdir, "puppet.conf"), settings)
@@ -187,6 +187,8 @@ shared_context 'types_setup' do
187
187
  result << Puppet::Pops::Types::PURIType
188
188
  result << Puppet::Pops::Types::PTupleType.new([tf.rich_data])
189
189
  result << Puppet::Pops::Types::PObjectType
190
+ result << Puppet::Pops::Types::PTypeType
191
+ result << Puppet::Pops::Types::PTypeSetType
190
192
  result
191
193
  end
192
194
  def rich_data_compatible_types
@@ -84,10 +84,7 @@ RSpec.configure do |config|
84
84
  config.filter_run_when_matching :focus
85
85
 
86
86
  config.mock_with :rspec do |mocks|
87
- # We really should have this on, but it breaks a _lot_ of tests. We'll
88
- # need to go through and fix those tests first before it can be enabled
89
- # for real.
90
- mocks.verify_partial_doubles = false
87
+ mocks.verify_partial_doubles = true
91
88
  end
92
89
 
93
90
  tmpdir = Puppet::FileSystem.expand_path(Dir.mktmpdir("rspecrun"))
@@ -3,9 +3,13 @@ require 'puppet/agent'
3
3
  require 'puppet/configurer'
4
4
 
5
5
  class AgentTestClient
6
- def run
6
+ def initialize(transaction_uuid = nil, job_id = nil)
7
+ end
8
+
9
+ def run(client_args)
7
10
  # no-op
8
11
  end
12
+
9
13
  def stop
10
14
  # no-op
11
15
  end
@@ -51,11 +55,10 @@ describe Puppet::Agent do
51
55
 
52
56
  it "should create an instance of its client class and run it when asked to run" do
53
57
  client = double('client')
54
- expect(AgentTestClient).to receive(:new).and_return(client)
55
-
56
- expect(client).to receive(:run)
58
+ allow(AgentTestClient).to receive(:new).with(nil, nil).and_return(client)
57
59
 
58
60
  allow(@agent).to receive(:disabled?).and_return(false)
61
+ expect(client).to receive(:run)
59
62
  @agent.run
60
63
  end
61
64
 
@@ -92,7 +95,6 @@ describe Puppet::Agent do
92
95
 
93
96
  describe "when being run" do
94
97
  before do
95
- allow(AgentTestClient).to receive(:lockfile_path).and_return("/my/lock")
96
98
  allow(@agent).to receive(:disabled?).and_return(false)
97
99
  end
98
100
 
@@ -188,7 +190,7 @@ describe Puppet::Agent do
188
190
  allow(lockfile).to receive(:lock).and_return(false)
189
191
  end
190
192
 
191
- it "should notify that a run is already in progres" do
193
+ it "should notify that a run is already in progress" do
192
194
  client = AgentTestClient.new
193
195
  expect(AgentTestClient).to receive(:new).and_return(client)
194
196
  expect(Puppet).to receive(:notice).with(/Run of .* already in progress; skipping .* exists/)
@@ -202,7 +202,6 @@ describe Puppet::Application::Agent do
202
202
  allow(Puppet::Resource::Catalog.indirection).to receive(:terminus_class=)
203
203
  allow(Puppet::Resource::Catalog.indirection).to receive(:cache_class=)
204
204
  allow(Puppet::Node::Facts.indirection).to receive(:terminus_class=)
205
- allow(Puppet).to receive(:settraps)
206
205
  end
207
206
 
208
207
  it "should not run with extra arguments" do
@@ -571,10 +570,9 @@ describe Puppet::Application::Agent do
571
570
  allow_any_instance_of(Puppet::X509::CertProvider).to receive(:load_request).and_return(nil)
572
571
 
573
572
  expect {
574
- expect {
575
- @puppetd.fingerprint
576
- }.to exit_with(1)
577
- }.to output(/Fingerprint asked but neither the certificate, nor the certificate request have been issued/).to_stderr
573
+ @puppetd.fingerprint
574
+ }.to exit_with(1)
575
+ .and output(/Fingerprint asked but neither the certificate, nor the certificate request have been issued/).to_stderr
578
576
  end
579
577
 
580
578
  it "should log an error if an exception occurs" do
@@ -1,12 +1,232 @@
1
+ # coding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'puppet/application/config'
3
4
 
4
5
  describe Puppet::Application::Config do
5
- it "should be a subclass of Puppet::Application::FaceBase" do
6
- expect(Puppet::Application::Config.superclass).to equal(Puppet::Application::FaceBase)
6
+ include PuppetSpec::Files
7
+
8
+ # different UTF-8 widths
9
+ # 1-byte A
10
+ # 2-byte ۿ - http://www.fileformat.info/info/unicode/char/06ff/index.htm - 0xDB 0xBF / 219 191
11
+ # 3-byte ᚠ - http://www.fileformat.info/info/unicode/char/16A0/index.htm - 0xE1 0x9A 0xA0 / 225 154 160
12
+ # 4-byte 𠜎 - http://www.fileformat.info/info/unicode/char/2070E/index.htm - 0xF0 0xA0 0x9C 0x8E / 240 160 156 142
13
+ MIXED_UTF8 = "A\u06FF\u16A0\u{2070E}" # Aۿᚠ𠜎
14
+
15
+ let(:app) { Puppet::Application[:config] }
16
+
17
+ before :each do
18
+ Puppet[:config] = tmpfile('config')
19
+ end
20
+
21
+ def initialize_app(args)
22
+ app.command_line.args = args
23
+ # ensure global defaults are initialized prior to app defaults
24
+ Puppet.initialize_settings(args)
25
+ end
26
+
27
+ def read_utf8(path)
28
+ File.read(path, :encoding => 'UTF-8')
29
+ end
30
+
31
+ def write_utf8(path, content)
32
+ File.write(path, content, 0, :encoding => 'UTF-8')
33
+ end
34
+
35
+ context "when printing" do
36
+ it "prints a value" do
37
+ initialize_app(%w[print certname])
38
+
39
+ expect {
40
+ app.run
41
+ }.to exit_with(0)
42
+ .and output(a_string_matching(Puppet[:certname])).to_stdout
43
+ end
44
+
45
+ it "prints a value from a section" do
46
+ File.write(Puppet[:config], <<~END)
47
+ [main]
48
+ external_nodes=none
49
+ [server]
50
+ external_nodes=exec
51
+ END
52
+
53
+ initialize_app(%w[print external_nodes --section server])
54
+
55
+ expect {
56
+ app.run
57
+ }.to exit_with(0)
58
+ .and output(a_string_matching('exec')).to_stdout
59
+ end
60
+
61
+ it "doesn't require the environment to exist" do
62
+ initialize_app(%w[print certname --environment doesntexist])
63
+
64
+ expect {
65
+ app.run
66
+ }.to exit_with(0)
67
+ .and output(a_string_matching(Puppet[:certname])).to_stdout
68
+ end
7
69
  end
8
70
 
9
- it "should set `environment_mode` to :not_required" do
10
- expect(Puppet::Application::Config.get_environment_mode).to equal(:not_required)
71
+ context "when setting" do
72
+ it "sets a value in its config file" do
73
+ initialize_app(%w[set certname www.example.com])
74
+
75
+ expect {
76
+ app.run
77
+ }.to exit_with(0)
78
+
79
+ expect(File.read(Puppet[:config])).to eq("[main]\ncertname = www.example.com\n")
80
+ end
81
+
82
+ it "sets a value in the server section" do
83
+ initialize_app(%w[set external_nodes exec --section server])
84
+
85
+ expect {
86
+ app.run
87
+ }.to exit_with(0)
88
+
89
+ expect(File.read(Puppet[:config])).to eq("[server]\nexternal_nodes = exec\n")
90
+ end
91
+
92
+ {
93
+ %w[certname WWW.EXAMPLE.COM] => /Certificate names must be lower case/,
94
+ %w[log_level all] => /Invalid loglevel all/,
95
+ %w[disable_warnings true] => /Cannot disable unrecognized warning types 'true'/,
96
+ %w[strict on] => /Invalid value 'on' for parameter strict/,
97
+ %w[digest_algorithm rot13] => /Invalid value 'rot13' for parameter digest_algorithm/,
98
+ %w[http_proxy_password a#b] => /Passwords set in the http_proxy_password setting must be valid as part of a URL/,
99
+ }.each_pair do |args, message|
100
+ it "rejects #{args.join(' ')}" do
101
+ initialize_app(['set', *args])
102
+
103
+ expect {
104
+ app.run
105
+ }.to exit_with(1)
106
+ .and output(message).to_stderr
107
+ end
108
+ end
109
+
110
+ it 'sets unknown settings' do
111
+ initialize_app(['set', 'notarealsetting', 'true'])
112
+
113
+ expect {
114
+ app.run
115
+ }.to exit_with(0)
116
+
117
+ expect(File.read(Puppet[:config])).to eq("[main]\nnotarealsetting = true\n")
118
+ end
119
+ end
120
+
121
+ context "when deleting" do
122
+ it "deletes a value" do
123
+ initialize_app(%w[delete external_nodes])
124
+
125
+ File.write(Puppet[:config], <<~END)
126
+ [main]
127
+ external_nodes=none
128
+ END
129
+
130
+ expect {
131
+ app.run
132
+ }.to exit_with(0)
133
+ .and output(/Deleted setting from 'main': 'external_nodes=none'/).to_stdout
134
+
135
+ expect(File.read(Puppet[:config])).to eq("[main]\n")
136
+ end
137
+
138
+ it "warns when deleting a value that isn't set" do
139
+ initialize_app(%w[delete external_nodes])
140
+
141
+ File.write(Puppet[:config], "")
142
+
143
+ expect {
144
+ app.run
145
+ }.to exit_with(0)
146
+ .and output(a_string_matching("Warning: No setting found in configuration file for section 'main' setting name 'external_nodes'")).to_stderr
147
+
148
+ expect(File.read(Puppet[:config])).to eq("")
149
+ end
150
+
151
+ it "deletes a value from main" do
152
+ initialize_app(%w[delete external_nodes])
153
+
154
+ File.write(Puppet[:config], <<~END)
155
+ [main]
156
+ external_nodes=none
157
+ END
158
+
159
+ expect {
160
+ app.run
161
+ }.to exit_with(0)
162
+ .and output(/Deleted setting from 'main': 'external_nodes=none'/).to_stdout
163
+
164
+ expect(File.read(Puppet[:config])).to eq("[main]\n")
165
+ end
166
+
167
+ it "deletes a value from main a section" do
168
+ initialize_app(%w[delete external_nodes --section server])
169
+
170
+ File.write(Puppet[:config], <<~END)
171
+ [main]
172
+ external_nodes=none
173
+ [server]
174
+ external_nodes=exec
175
+ END
176
+
177
+ expect {
178
+ app.run
179
+ }.to exit_with(0)
180
+ .and output(/Deleted setting from 'server': 'external_nodes'/).to_stdout
181
+
182
+ expect(File.read(Puppet[:config])).to eq("[main]\nexternal_nodes=none\n[server]\n")
183
+ end
184
+ end
185
+
186
+ context "when managing UTF-8 values" do
187
+ it "reads a UTF-8 value" do
188
+ write_utf8(Puppet[:config], <<~EOF)
189
+ [main]
190
+ tags=#{MIXED_UTF8}
191
+ EOF
192
+
193
+ initialize_app(%w[print tags])
194
+
195
+ expect {
196
+ app.run
197
+ }.to exit_with(0)
198
+ .and output("#{MIXED_UTF8}\n").to_stdout
199
+ end
200
+
201
+ it "sets a UTF-8 value" do
202
+ initialize_app(['set', 'tags', MIXED_UTF8])
203
+
204
+ expect {
205
+ app.run
206
+ }.to exit_with(0)
207
+
208
+ expect(read_utf8(Puppet[:config])).to eq(<<~EOF)
209
+ [main]
210
+ tags = #{MIXED_UTF8}
211
+ EOF
212
+ end
213
+
214
+ it "deletes a UTF-8 value" do
215
+ initialize_app(%w[delete tags])
216
+
217
+ write_utf8(Puppet[:config], <<~EOF)
218
+ [main]
219
+ tags=#{MIXED_UTF8}
220
+ EOF
221
+
222
+ expect {
223
+ app.run
224
+ }.to exit_with(0)
225
+ .and output(/Deleted setting from 'main': 'tags=#{MIXED_UTF8}'/).to_stdout
226
+
227
+ expect(read_utf8(Puppet[:config])).to eq(<<~EOF)
228
+ [main]
229
+ EOF
230
+ end
11
231
  end
12
232
  end