puppet 6.12.0-x64-mingw32 → 6.17.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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.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 +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -30,6 +30,10 @@ describe Puppet::Type.type(:package) do
30
30
  expect(Puppet::Type.type(:package).provider_feature(:versionable)).not_to be_nil
31
31
  end
32
32
 
33
+ it "should have a :supports_flavors feature" do
34
+ expect(Puppet::Type.type(:package).provider_feature(:supports_flavors)).not_to be_nil
35
+ end
36
+
33
37
  it "should have a :package_settings feature that requires :package_settings_insync?, :package_settings and :package_settings=" do
34
38
  expect(Puppet::Type.type(:package).provider_feature(:package_settings).methods).to eq([:package_settings_insync?, :package_settings, :package_settings=])
35
39
  end
@@ -53,6 +57,10 @@ describe Puppet::Type.type(:package) do
53
57
  it "should have a package_settings property" do
54
58
  expect(Puppet::Type.type(:package).attrtype(:package_settings)).to eq(:property)
55
59
  end
60
+
61
+ it "should have a flavor property" do
62
+ expect(Puppet::Type.type(:package).attrtype(:flavor)).to eq(:property)
63
+ end
56
64
  end
57
65
 
58
66
  describe "when validating attribute values" do
@@ -145,6 +145,166 @@ describe test_title, "when validating attribute values" do
145
145
  end
146
146
  end
147
147
 
148
+ describe "the service logon credentials" do
149
+ before do
150
+ provider_class_with_logon_credentials = Puppet::Type.type(:service).provide(:simple) do
151
+ has_features :manages_logon_credentials
152
+ def logonpassword=(value) end
153
+ end
154
+ allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class_with_logon_credentials)
155
+ end
156
+
157
+ describe "the 'logonaccount' property" do
158
+ it "should not be munged nor checked when not on Windows" do
159
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
160
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'NonWindowsUser')
161
+
162
+ expect { service }.not_to raise_error
163
+ expect(service[:logonaccount]).to eq('NonWindowsUser')
164
+ end
165
+
166
+ context "when on Windows", :if => Puppet::Util::Platform.windows? do
167
+ before do
168
+ allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
169
+ allow(Puppet::Util::Windows::User).to receive(:default_system_account?).and_return(true)
170
+ end
171
+
172
+ ['LocalSystem', '.\LocalSystem', 'myPC\LocalSystem', 'lOcALsysTem'].each do |user_input|
173
+ it "should succesfully munge #{user_input} to 'LocalSystem'" do
174
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => user_input)
175
+
176
+ expect { service }.not_to raise_error
177
+ expect(service[:logonaccount]).to eq('LocalSystem')
178
+ end
179
+ end
180
+
181
+ it "should succesfully munge local account" do
182
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser))
183
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser')
184
+
185
+ expect { service }.not_to raise_error
186
+ expect(service[:logonaccount]).to eq('.\myUser')
187
+ end
188
+
189
+ it "should succesfully munge domain account" do
190
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("DomainUser", nil, nil, "myDomain", :SidTypeUser))
191
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'DomainUser')
192
+
193
+ expect { service }.not_to raise_error
194
+ expect(service[:logonaccount]).to eq('myDomain\DomainUser')
195
+ end
196
+
197
+ it "should succesfully munge well known user" do
198
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("LOCAL SERVICE", nil, nil, "NT AUTHORITY", :SidTypeWellKnownGroup))
199
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'LocalService')
200
+
201
+ expect { service }.not_to raise_error
202
+ expect(service[:logonaccount]).to eq('NT AUTHORITY\LOCAL SERVICE')
203
+ end
204
+
205
+ it "should succesfully munge a SID" do
206
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("NETWORK SERVICE", nil, nil, "NT AUTHORITY", :SidTypeUser))
207
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'S-1-5-20')
208
+
209
+ expect { service }.not_to raise_error
210
+ expect(service[:logonaccount]).to eq('NT AUTHORITY\NETWORK SERVICE')
211
+ end
212
+
213
+ it "should fail when account is invalid" do
214
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(nil)
215
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'InvalidUser') }.to raise_error(Puppet::Error, /\"InvalidUser\" is not a valid account/)
216
+ end
217
+
218
+ it "should fail when sid type is not user or well known user" do
219
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("Administrators", nil, nil, "BUILTIN", :SidTypeAlias))
220
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'Administrators') }.to raise_error(Puppet::Error, /\"Administrators\" is not a valid account/)
221
+ end
222
+ end
223
+ end
224
+
225
+ describe "the logonpassword parameter" do
226
+ it "should fail when logonaccount is not being managed as well" do
227
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonpassword => 'myPass') }.to raise_error(Puppet::Error, /The 'logonaccount' parameter is mandatory when setting 'logonpassword'./)
228
+ end
229
+
230
+ it "should default to empty string when only logonaccount is being managed" do
231
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
232
+ service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser')
233
+
234
+ expect { service }.not_to raise_error
235
+ expect(service[:logonpassword]).to eq("")
236
+ end
237
+
238
+ it "should default to nil when not even logonaccount is being managed" do
239
+ service = Puppet::Type.type(:service).new(:name => "yay")
240
+ expect(service[:logonpassword]).to eq(nil)
241
+ end
242
+
243
+ it "should fail when logonpassword includes the ':' character" do
244
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
245
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'my:Pass') }.to raise_error(Puppet::Error, /Passwords cannot include ':'/)
246
+ end
247
+
248
+ it "should not further check the password against given account when not on Windows" do
249
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
250
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'myPass') }.not_to raise_error
251
+ end
252
+
253
+ context "when on Windows", :if => Puppet::Util::Platform.windows? do
254
+ before do
255
+ allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
256
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(name_to_principal_result)
257
+ end
258
+
259
+ it "should pass validation when given account is 'LocalSystem'" do
260
+ allow(Puppet::Util::Windows::User).to receive(:localsystem?).with('LocalSystem').and_return(true)
261
+ allow(Puppet::Util::Windows::User).to receive(:default_system_account?).with('LocalSystem').and_return(false)
262
+
263
+ expect(Puppet::Util::Windows::SID).not_to receive(:name_to_principal)
264
+ expect(Puppet::Util::Windows::User).not_to receive(:password_is?)
265
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'LocalSystem') }.not_to raise_error
266
+ end
267
+
268
+ ['LOCAL SERVICE', 'NETWORK SERVICE', 'SYSTEM'].each do |predefined_local_account|
269
+ describe "when given account is #{predefined_local_account}" do
270
+ let(:name_to_principal_result) do
271
+ Puppet::Util::Windows::SID::Principal.new(predefined_local_account, nil, nil, "NT AUTHORITY", :SidTypeUser)
272
+ end
273
+
274
+ it "should pass validation" do
275
+ allow(Puppet::Util::Windows::User).to receive(:localsystem?).with(predefined_local_account).and_return(false)
276
+ expect(Puppet::Util::Windows::User).to receive(:default_system_account?).with("NT AUTHORITY\\#{predefined_local_account}").and_return(true)
277
+
278
+ expect(Puppet::Util::Windows::User).not_to receive(:password_is?)
279
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => predefined_local_account) }.not_to raise_error
280
+ end
281
+ end
282
+ end
283
+
284
+ let(:name_to_principal_result) do
285
+ Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser)
286
+ end
287
+
288
+ describe "when given logonaccount is not a predefined local account" do
289
+ before do
290
+ allow(Puppet::Util::Windows::User).to receive(:localsystem?).with('myUser').and_return(false)
291
+ allow(Puppet::Util::Windows::User).to receive(:default_system_account?).with('.\\myUser').and_return(false)
292
+ end
293
+
294
+ it "should pass validation if password is proven correct" do
295
+ allow(Puppet::Util::Windows::User).to receive(:password_is?).with('myUser', 'myPass', '.').and_return(true)
296
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'myPass') }.not_to raise_error
297
+ end
298
+
299
+ it "should not pass validation if password check fails" do
300
+ allow(Puppet::Util::Windows::User).to receive(:password_is?).with('myUser', 'myWrongPass', '.').and_return(false)
301
+ expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'myWrongPass') }.to raise_error(Puppet::Error, /The given password is invalid for user '.\\myUser'/)
302
+ end
303
+ end
304
+ end
305
+ end
306
+ end
307
+
148
308
  it "should support :true as a value to :hasstatus" do
149
309
  srv = Puppet::Type.type(:service).new(:name => "yay", :hasstatus => :true)
150
310
  expect(srv[:hasstatus]).to eq(:true)
@@ -284,20 +444,21 @@ describe test_title, "when changing the host" do
284
444
  @service.property(:enable).sync
285
445
  end
286
446
 
287
- it "should always consider the enable state of a static service to be in sync" do
447
+ it "should let superclass implementation resolve insyncness when provider does not respond to the 'enabled_insync?' method" do
288
448
  allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
289
- expect(@service.provider).to receive(:cached_enabled?).and_return('static')
290
- @service[:enable] = false
291
- expect(Puppet).to receive(:debug).with("Unable to enable or disable static service yay")
449
+ @service[:enable] = true
450
+ allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?).and_return(false)
451
+
292
452
  expect(@service.property(:enable).insync?(:true)).to eq(true)
293
453
  end
294
454
 
295
- it "should determine insyncness normally when the service is not static" do
455
+ it "insyncness should be resolved by provider instead of superclass implementation when provider responds to the 'enabled_insync?' method" do
296
456
  allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
297
- expect(@service.provider).to receive(:cached_enabled?).and_return('true')
298
457
  @service[:enable] = true
299
- expect(Puppet).not_to receive(:debug)
300
- expect(@service.property(:enable).insync?(:true)).to eq(true)
458
+ allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?).and_return(true)
459
+ allow(@service.provider).to receive(:enabled_insync?).and_return(false)
460
+
461
+ expect(@service.property(:enable).insync?(:true)).to eq(false)
301
462
  end
302
463
 
303
464
  it "should sync the service's enable state when changing the state of :ensure if :enable is being managed" do
@@ -313,6 +474,22 @@ describe test_title, "when changing the host" do
313
474
 
314
475
  @service.property(:ensure).sync
315
476
  end
477
+
478
+ it "should sync the service's logonaccount state when changing the state of :ensure if :logonaccount is being managed" do
479
+ allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
480
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
481
+
482
+ @service[:ensure] = :stopped
483
+ @service[:logonaccount] = 'LocalSystem'
484
+
485
+ expect(@service.property(:logonaccount)).to receive(:retrieve).and_return("MyUser")
486
+ expect(@service.property(:logonaccount)).to receive(:insync?).and_return(false)
487
+ expect(@service.property(:logonaccount)).to receive(:sync)
488
+
489
+ allow(@service.provider).to receive(:stop)
490
+
491
+ @service.property(:ensure).sync
492
+ end
316
493
  end
317
494
 
318
495
  describe test_title, "when refreshing the service" do
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Puppet::Type.type(:user) do
@@ -408,7 +408,6 @@ describe Puppet::Type.type(:user) do
408
408
  Puppet::Resource::Catalog.new :testing do |conf|
409
409
  [testuser, testrole].each { |resource| conf.add_resource resource }
410
410
  end
411
- allow(Puppet::Type::User::ProviderDirectoryservice).to receive(:get_macosx_version_major).and_return("10.5")
412
411
 
413
412
  rel = testuser.autorequire[0]
414
413
  expect(rel.source.ref).to eq(testrole.ref)
@@ -1099,6 +1099,56 @@ describe Puppet::Type, :unless => Puppet::Util::Platform.windows? do
1099
1099
  expect { expect(type.instances).to eq([]) }.to_not raise_error
1100
1100
  end
1101
1101
 
1102
+ context "with a composite namevar type" do
1103
+ let :type do
1104
+ Puppet::Type.newtype(:type_spec_fake_type) do
1105
+ newparam(:name) do
1106
+ isnamevar
1107
+ end
1108
+
1109
+ newparam(:path) do
1110
+ isnamevar
1111
+ end
1112
+
1113
+ def self.title_patterns
1114
+ [[%r{^(.*)@(.*)$}, [:name, :path]], [%r{^([^@]+)$}, [:name]]]
1115
+ end
1116
+
1117
+ newproperty(:prop1) {}
1118
+ end
1119
+
1120
+ Puppet::Type.type(:type_spec_fake_type)
1121
+ end
1122
+
1123
+ before :each do
1124
+ type.provide(:default) do
1125
+ defaultfor :operatingsystem => Facter.value(:operatingsystem)
1126
+ mk_resource_methods
1127
+ class << self
1128
+ attr_accessor :params
1129
+ end
1130
+
1131
+ def title
1132
+ "#{@property_hash[:name]}@#{@property_hash[:path]}"
1133
+ end
1134
+
1135
+ def self.instance(name, path)
1136
+ new(:name => name, :path => path, :ensure => :present)
1137
+ end
1138
+
1139
+ def self.instances
1140
+ @instances ||= params.collect { |param| instance(param.first.to_s, param.last.to_s) }
1141
+ end
1142
+
1143
+ @params = [[:name_one, :path_one], [:name_two, :path_two]]
1144
+ end
1145
+ end
1146
+
1147
+ it "should return composite titles for the instances" do
1148
+ expect(type.instances.map(&:title)).to eq(["name_one@path_one", "name_two@path_two"])
1149
+ end
1150
+ end
1151
+
1102
1152
  context "with a default provider" do
1103
1153
  before :each do
1104
1154
  type.provide(:default) do
@@ -5,6 +5,7 @@ describe 'Puppet::Util::AtFork' do
5
5
 
6
6
  before :each do
7
7
  Puppet::Util.class_exec do
8
+ remove_const(:AtFork) if defined?(Puppet::Util::AtFork)
8
9
  const_set(:AtFork, Module.new)
9
10
  end
10
11
  end
@@ -18,7 +19,7 @@ describe 'Puppet::Util::AtFork' do
18
19
  describe '.get_handler' do
19
20
  context 'when on Solaris' do
20
21
  before :each do
21
- expect(Facter).to receive(:value).with(:operatingsystem).and_return('Solaris')
22
+ expect(Puppet::Util::Platform).to receive(:solaris?).and_return(true)
22
23
  end
23
24
 
24
25
  after :each do
@@ -113,7 +114,7 @@ describe 'Puppet::Util::AtFork' do
113
114
 
114
115
  context 'when NOT on Solaris' do
115
116
  before :each do
116
- expect(Facter).to receive(:value).with(:operatingsystem).and_return(nil)
117
+ expect(Puppet::Util::Platform).to receive(:solaris?).and_return(false)
117
118
  end
118
119
 
119
120
  def stub_noop_handler(namespace_only = false)
@@ -23,10 +23,10 @@ describe Puppet::Util::Autoload do
23
23
 
24
24
  def with_libdir(libdir)
25
25
  begin
26
- Puppet::Util::Autoload.instance_variable_set(:@initialized, false)
27
26
  old_loadpath = $LOAD_PATH.dup
28
27
  old_libdir = Puppet[:libdir]
29
28
  Puppet[:libdir] = libdir
29
+ $LOAD_PATH.unshift(libdir)
30
30
  yield
31
31
  ensure
32
32
  Puppet[:libdir] = old_libdir
@@ -83,6 +83,7 @@ describe Puppet::Util::Autoload do
83
83
 
84
84
  libdir = File.expand_path('/libdir1')
85
85
  Puppet[:vendormoduledir] = vendor_dir
86
+ Puppet.initialize_settings
86
87
 
87
88
  with_libdir(libdir) do
88
89
  expect(@autoload.class).to receive(:gem_directories).and_return(%w{/one /two})
@@ -65,6 +65,22 @@ describe Puppet::Util::Checksums do
65
65
  expect(@summer.sumtype("asdfasdfa")).to be_nil
66
66
  end
67
67
 
68
+ it "has a list of known checksum types" do
69
+ expect(@summer.known_checksum_types).to match_array(content_sums + file_only)
70
+ end
71
+
72
+ it "returns true if the checksum is valid" do
73
+ expect(@summer).to be_valid_checksum('sha1', 'fcc1715b22278a9dae322b0a34935f10d1608b9f')
74
+ end
75
+
76
+ it "returns false if the checksum is known but invalid" do
77
+ expect(@summer).to_not be_valid_checksum('sha1', 'wronglength')
78
+ end
79
+
80
+ it "returns false if the checksum type is unknown" do
81
+ expect(@summer).to_not be_valid_checksum('rot13', 'doesntmatter')
82
+ end
83
+
68
84
  {:md5 => Digest::MD5, :sha1 => Digest::SHA1, :sha256 => Digest::SHA256, :sha512 => Digest::SHA512, :sha384 => Digest::SHA384}.each do |sum, klass|
69
85
  describe("when using #{sum}") do
70
86
  it "should use #{klass} to calculate string checksums" do
@@ -44,41 +44,13 @@ describe Puppet::Util::Log.desttypes[:file] do
44
44
  end
45
45
  end
46
46
 
47
- describe "on POSIX systems", :if => Puppet.features.posix? do
47
+ describe "on POSIX systems", :unless => Puppet::Util::Platform.windows? do
48
48
  describe "with a normal file" do
49
49
  let (:parent) { Pathname.new('/tmp') }
50
50
  let (:abspath) { '/tmp/log' }
51
51
  let (:relpath) { 'log' }
52
52
 
53
53
  it_behaves_like "file destination"
54
-
55
- it "logs an error if it can't chown the file owner & group" do
56
- allow(File).to receive(:exist?).with(parent).and_return(true)
57
- expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(false)
58
- expect(FileUtils).to receive(:chown).with(Puppet[:user], Puppet[:group], abspath).and_raise(Errno::EPERM)
59
- expect(Puppet.features).to receive(:root?).and_return(true)
60
- expect(Puppet).to receive(:err).with("Unable to set ownership to #{Puppet[:user]}:#{Puppet[:group]} for log file: #{abspath}")
61
-
62
- @class.new(abspath)
63
- end
64
-
65
- it "doesn't attempt to chown when running as non-root" do
66
- allow(File).to receive(:exist?).with(parent).and_return(true)
67
- expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(false)
68
- expect(FileUtils).not_to receive(:chown).with(Puppet[:user], Puppet[:group], abspath)
69
- expect(Puppet.features).to receive(:root?).and_return(false)
70
-
71
- @class.new(abspath)
72
- end
73
-
74
- it "doesn't attempt to chown when file already exists" do
75
- allow(File).to receive(:exist?).with(parent).and_return(true)
76
- expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(true)
77
- expect(FileUtils).not_to receive(:chown).with(Puppet[:user], Puppet[:group], abspath)
78
- expect(Puppet.features).to receive(:root?).and_return(true)
79
-
80
- @class.new(abspath)
81
- end
82
54
  end
83
55
 
84
56
  describe "with a JSON file" do
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+ require 'puppet/util/package/version/debian'
3
+
4
+ describe Puppet::Util::Package::Version::Debian do
5
+ context "when creating new version should fail" do
6
+ it "if is parsing symbols" do
7
+ expect { described_class.parse(:absent) }.to raise_error(described_class::ValidationFailure)
8
+ end
9
+ end
10
+ context "when creating new version" do
11
+ it "is parsing basic version" do
12
+ v = described_class.parse('1:20191210.1-0ubuntu0.19.04.2')
13
+ expect(v.epoch).to eql(1)
14
+ expect(v.upstream_version).to eql('20191210.1')
15
+ expect(v.debian_revision).to eql('0ubuntu0.19.04.2')
16
+ end
17
+
18
+ it "is parsing no epoch basic version" do
19
+ v = described_class.parse('20191210.1-0ubuntu0.19.04.2')
20
+ expect(v.epoch).to eql(0)
21
+ expect(v.upstream_version).to eql('20191210.1')
22
+ expect(v.debian_revision).to eql('0ubuntu0.19.04.2')
23
+ end
24
+
25
+ it "is parsing no debian revision basic version" do
26
+ v = described_class.parse('2.42.1+19.04')
27
+ expect(v.epoch).to eql(0)
28
+ expect(v.upstream_version).to eql('2.42.1+19.04')
29
+ expect(v.debian_revision).to eql(nil)
30
+ end
31
+
32
+ it "is parsing no epoch complex version" do
33
+ v = described_class.parse('3.32.2+git20190711-2ubuntu1~19.04.1')
34
+ expect(v.epoch).to eql(0)
35
+ expect(v.upstream_version).to eql('3.32.2+git20190711')
36
+ expect(v.debian_revision).to eql('2ubuntu1~19.04.1')
37
+ end
38
+
39
+ it "is parsing even more complex version" do
40
+ v = described_class.parse('5:1.0.0+git-20190109.133f4c4-0ubuntu2')
41
+ expect(v.epoch).to eql(5)
42
+ expect(v.upstream_version).to eql('1.0.0+git-20190109.133f4c4')
43
+ expect(v.debian_revision).to eql('0ubuntu2')
44
+ end
45
+ end
46
+ context "when comparing two versions" do
47
+ it "epoch has precedence" do
48
+ first = described_class.parse('9:99-99')
49
+ second = described_class.parse('10:01-01')
50
+ expect(first < second).to eql(true)
51
+ end
52
+ it "handles equals letters-only versions" do
53
+ lower = described_class.parse('abd-def')
54
+ higher = described_class.parse('abd-def')
55
+ expect(lower == higher).to eql(true)
56
+ end
57
+ it "shorter version is smaller" do
58
+ lower = described_class.parse('abd-de')
59
+ higher = described_class.parse('abd-def')
60
+ expect(lower < higher).to eql(true)
61
+ end
62
+ it "shorter version is smaller even with digits" do
63
+ lower = described_class.parse('a1b2d-d3e')
64
+ higher = described_class.parse('a1b2d-d3ef')
65
+ expect(lower < higher).to eql(true)
66
+ end
67
+ it "shorter version is smaller when number is less" do
68
+ lower = described_class.parse('a1b2d-d9')
69
+ higher = described_class.parse('a1b2d-d13')
70
+ expect(lower < higher).to eql(true)
71
+ end
72
+ it "handles ~ version" do
73
+ lower = described_class.parse('a1b2d-d10~')
74
+ higher = described_class.parse('a1b2d-d10')
75
+ expect(lower < higher).to eql(true)
76
+ end
77
+ it "handles letters versus -" do
78
+ lower = described_class.parse('a1b2d-d1a')
79
+ higher = described_class.parse('a1b2d-d1-')
80
+ expect(lower < higher).to eql(true)
81
+ end
82
+ end
83
+ end