puppet 6.12.0-x86-mingw32 → 6.17.0-x86-mingw32

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

Potentially problematic release.


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

Files changed (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
@@ -1,3 +1,5 @@
1
+ # coding: utf-8
2
+
1
3
  require 'spec_helper'
2
4
  require 'puppet/util/plist'
3
5
  require 'puppet_spec/files'
@@ -52,6 +54,19 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
52
54
  </dict>
53
55
  </plist>'
54
56
  end
57
+ let(:ascii_xml_plist) do
58
+ '<?xml version="1.0" encoding="UTF-8"?>
59
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
60
+ <plist version="1.0">
61
+ <dict>
62
+ <key>RecordName</key>
63
+ <array>
64
+ <string>Timișoara</string>
65
+ <string>Tōkyō</string>
66
+ </array>
67
+ </dict>
68
+ </plist>'.force_encoding(Encoding::US_ASCII)
69
+ end
55
70
  let(:non_plist_data) do
56
71
  "Take my love, take my land
57
72
  Take me where I cannot stand
@@ -62,6 +77,7 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
62
77
  "\xCF\xFA\xED\xFE\a\u0000\u0000\u0001\u0003\u0000\u0000\x80\u0002\u0000\u0000\u0000\u0012\u0000\u0000\u0000\b"
63
78
  end
64
79
  let(:valid_xml_plist_hash) { {"LastUsedPrinters"=>[{"Network"=>"10.85.132.1", "PrinterID"=>"baskerville_corp_puppetlabs_net"}, {"Network"=>"10.14.96.1", "PrinterID"=>"Statler"}]} }
80
+ let(:ascii_xml_plist_hash) { {"RecordName"=>["Timișoara", "Tōkyō"]} }
65
81
  let(:plist_path) { file_containing('sample.plist', valid_xml_plist) }
66
82
  let(:binary_plist_magic_number) { 'bplist00' }
67
83
  let(:bad_xml_doctype) { '<!DOCTYPE plist PUBLIC -//Apple Computer' }
@@ -132,6 +148,10 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
132
148
  expect(subject.parse_plist(valid_xml_plist)).to eq(valid_xml_plist_hash)
133
149
  end
134
150
 
151
+ it "returns a valid hash when an ASCII XML plist is provided" do
152
+ expect(subject.parse_plist(ascii_xml_plist)).to eq(ascii_xml_plist_hash)
153
+ end
154
+
135
155
  it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
136
156
  expect(subject).to receive(:new_cfpropertylist).with({:data => good_xml_doctype}).and_return('plist_object')
137
157
  allow(subject).to receive(:convert_cfpropertylist_to_native_types).with('plist_object')
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'puppet/util/rpm_compare'
5
+
6
+ describe Puppet::Util::RpmCompare do
7
+ class RpmTest
8
+ extend Puppet::Util::RpmCompare
9
+ end
10
+
11
+ describe '.rpmvercmp' do
12
+ # test cases munged directly from rpm's own
13
+ # tests/rpmvercmp.at
14
+ it { expect(RpmTest.rpmvercmp('1.0', '1.0')).to eq(0) }
15
+ it { expect(RpmTest.rpmvercmp('1.0', '2.0')).to eq(-1) }
16
+ it { expect(RpmTest.rpmvercmp('2.0', '1.0')).to eq(1) }
17
+ it { expect(RpmTest.rpmvercmp('2.0.1', '2.0.1')).to eq(0) }
18
+ it { expect(RpmTest.rpmvercmp('2.0', '2.0.1')).to eq(-1) }
19
+ it { expect(RpmTest.rpmvercmp('2.0.1', '2.0')).to eq(1) }
20
+ it { expect(RpmTest.rpmvercmp('2.0.1a', '2.0.1a')).to eq(0) }
21
+ it { expect(RpmTest.rpmvercmp('2.0.1a', '2.0.1')).to eq(1) }
22
+ it { expect(RpmTest.rpmvercmp('2.0.1', '2.0.1a')).to eq(-1) }
23
+ it { expect(RpmTest.rpmvercmp('5.5p1', '5.5p1')).to eq(0) }
24
+ it { expect(RpmTest.rpmvercmp('5.5p1', '5.5p2')).to eq(-1) }
25
+ it { expect(RpmTest.rpmvercmp('5.5p2', '5.5p1')).to eq(1) }
26
+ it { expect(RpmTest.rpmvercmp('5.5p10', '5.5p10')).to eq(0) }
27
+ it { expect(RpmTest.rpmvercmp('5.5p1', '5.5p10')).to eq(-1) }
28
+ it { expect(RpmTest.rpmvercmp('5.5p10', '5.5p1')).to eq(1) }
29
+ it { expect(RpmTest.rpmvercmp('10xyz', '10.1xyz')).to eq(-1) }
30
+ it { expect(RpmTest.rpmvercmp('10.1xyz', '10xyz')).to eq(1) }
31
+ it { expect(RpmTest.rpmvercmp('xyz10', 'xyz10')).to eq(0) }
32
+ it { expect(RpmTest.rpmvercmp('xyz10', 'xyz10.1')).to eq(-1) }
33
+ it { expect(RpmTest.rpmvercmp('xyz10.1', 'xyz10')).to eq(1) }
34
+ it { expect(RpmTest.rpmvercmp('xyz.4', 'xyz.4')).to eq(0) }
35
+ it { expect(RpmTest.rpmvercmp('xyz.4', '8')).to eq(-1) }
36
+ it { expect(RpmTest.rpmvercmp('8', 'xyz.4')).to eq(1) }
37
+ it { expect(RpmTest.rpmvercmp('xyz.4', '2')).to eq(-1) }
38
+ it { expect(RpmTest.rpmvercmp('2', 'xyz.4')).to eq(1) }
39
+ it { expect(RpmTest.rpmvercmp('5.5p2', '5.6p1')).to eq(-1) }
40
+ it { expect(RpmTest.rpmvercmp('5.6p1', '5.5p2')).to eq(1) }
41
+ it { expect(RpmTest.rpmvercmp('5.6p1', '6.5p1')).to eq(-1) }
42
+ it { expect(RpmTest.rpmvercmp('6.5p1', '5.6p1')).to eq(1) }
43
+ it { expect(RpmTest.rpmvercmp('6.0.rc1', '6.0')).to eq(1) }
44
+ it { expect(RpmTest.rpmvercmp('6.0', '6.0.rc1')).to eq(-1) }
45
+ it { expect(RpmTest.rpmvercmp('10b2', '10a1')).to eq(1) }
46
+ it { expect(RpmTest.rpmvercmp('10a2', '10b2')).to eq(-1) }
47
+ it { expect(RpmTest.rpmvercmp('1.0aa', '1.0aa')).to eq(0) }
48
+ it { expect(RpmTest.rpmvercmp('1.0a', '1.0aa')).to eq(-1) }
49
+ it { expect(RpmTest.rpmvercmp('1.0aa', '1.0a')).to eq(1) }
50
+ it { expect(RpmTest.rpmvercmp('10.0001', '10.0001')).to eq(0) }
51
+ it { expect(RpmTest.rpmvercmp('10.0001', '10.1')).to eq(0) }
52
+ it { expect(RpmTest.rpmvercmp('10.1', '10.0001')).to eq(0) }
53
+ it { expect(RpmTest.rpmvercmp('10.0001', '10.0039')).to eq(-1) }
54
+ it { expect(RpmTest.rpmvercmp('10.0039', '10.0001')).to eq(1) }
55
+ it { expect(RpmTest.rpmvercmp('4.999.9', '5.0')).to eq(-1) }
56
+ it { expect(RpmTest.rpmvercmp('5.0', '4.999.9')).to eq(1) }
57
+ it { expect(RpmTest.rpmvercmp('20101121', '20101121')).to eq(0) }
58
+ it { expect(RpmTest.rpmvercmp('20101121', '20101122')).to eq(-1) }
59
+ it { expect(RpmTest.rpmvercmp('20101122', '20101121')).to eq(1) }
60
+ it { expect(RpmTest.rpmvercmp('2_0', '2_0')).to eq(0) }
61
+ it { expect(RpmTest.rpmvercmp('2.0', '2_0')).to eq(0) }
62
+ it { expect(RpmTest.rpmvercmp('2_0', '2.0')).to eq(0) }
63
+ it { expect(RpmTest.rpmvercmp('a', 'a')).to eq(0) }
64
+ it { expect(RpmTest.rpmvercmp('a+', 'a+')).to eq(0) }
65
+ it { expect(RpmTest.rpmvercmp('a+', 'a_')).to eq(0) }
66
+ it { expect(RpmTest.rpmvercmp('a_', 'a+')).to eq(0) }
67
+ it { expect(RpmTest.rpmvercmp('+a', '+a')).to eq(0) }
68
+ it { expect(RpmTest.rpmvercmp('+a', '_a')).to eq(0) }
69
+ it { expect(RpmTest.rpmvercmp('_a', '+a')).to eq(0) }
70
+ it { expect(RpmTest.rpmvercmp('+_', '+_')).to eq(0) }
71
+ it { expect(RpmTest.rpmvercmp('_+', '+_')).to eq(0) }
72
+ it { expect(RpmTest.rpmvercmp('_+', '_+')).to eq(0) }
73
+ it { expect(RpmTest.rpmvercmp('+', '_')).to eq(0) }
74
+ it { expect(RpmTest.rpmvercmp('_', '+')).to eq(0) }
75
+ it { expect(RpmTest.rpmvercmp('1.0~rc1', '1.0~rc1')).to eq(0) }
76
+ it { expect(RpmTest.rpmvercmp('1.0~rc1', '1.0')).to eq(-1) }
77
+ it { expect(RpmTest.rpmvercmp('1.0', '1.0~rc1')).to eq(1) }
78
+ it { expect(RpmTest.rpmvercmp('1.0~rc1', '1.0~rc2')).to eq(-1) }
79
+ it { expect(RpmTest.rpmvercmp('1.0~rc2', '1.0~rc1')).to eq(1) }
80
+ it { expect(RpmTest.rpmvercmp('1.0~rc1~git123', '1.0~rc1~git123')).to eq(0) }
81
+ it { expect(RpmTest.rpmvercmp('1.0~rc1~git123', '1.0~rc1')).to eq(-1) }
82
+ it { expect(RpmTest.rpmvercmp('1.0~rc1', '1.0~rc1~git123')).to eq(1) }
83
+ it { expect(RpmTest.rpmvercmp('1.0~rc1', '1.0arc1')).to eq(-1) }
84
+ it { expect(RpmTest.rpmvercmp('', '~')).to eq(1) }
85
+ it { expect(RpmTest.rpmvercmp('~', '~~')).to eq(1) }
86
+ it { expect(RpmTest.rpmvercmp('~', '~+~')).to eq(1) }
87
+ it { expect(RpmTest.rpmvercmp('~', '~a')).to eq(-1) }
88
+
89
+ # non-upstream test cases
90
+ it { expect(RpmTest.rpmvercmp('405', '406')).to eq(-1) }
91
+ it { expect(RpmTest.rpmvercmp('1', '0')).to eq(1) }
92
+ end
93
+
94
+ describe '.rpm_compareEVR' do
95
+ it 'evaluates identical version-release as equal' do
96
+ expect(RpmTest.rpm_compareEVR('1.2.3-1.el5', '1.2.3-1.el5')).to eq(0)
97
+ end
98
+
99
+ it 'evaluates identical version as equal' do
100
+ expect(RpmTest.rpm_compareEVR('1.2.3', '1.2.3')).to eq(0)
101
+ end
102
+
103
+ it 'evaluates identical version but older release as less' do
104
+ expect(RpmTest.rpm_compareEVR('1.2.3-1.el5', '1.2.3-2.el5')).to eq(-1)
105
+ end
106
+
107
+ it 'evaluates identical version but newer release as greater' do
108
+ expect(RpmTest.rpm_compareEVR('1.2.3-3.el5', '1.2.3-2.el5')).to eq(1)
109
+ end
110
+
111
+ it 'evaluates a newer epoch as greater' do
112
+ expect(RpmTest.rpm_compareEVR('1:1.2.3-4.5', '1.2.3-4.5')).to eq(1)
113
+ end
114
+
115
+ # these tests describe PUP-1244 logic yet to be implemented
116
+ it 'evaluates any version as equal to the same version followed by release' do
117
+ expect(RpmTest.rpm_compareEVR('1.2.3', '1.2.3-2.el5')).to eq(0)
118
+ end
119
+
120
+ # test cases for PUP-682
121
+ it 'evaluates same-length numeric revisions numerically' do
122
+ expect(RpmTest.rpm_compareEVR('2.2-405', '2.2-406')).to eq(-1)
123
+ end
124
+ end
125
+
126
+ describe '.rpm_parse_evr' do
127
+ it 'parses full simple evr' do
128
+ version = RpmTest.rpm_parse_evr('0:1.2.3-4.el5')
129
+ expect([version[:epoch], version[:version], version[:release]]).to \
130
+ eq(['0', '1.2.3', '4.el5'])
131
+ end
132
+
133
+ it 'parses version only' do
134
+ version = RpmTest.rpm_parse_evr('1.2.3')
135
+ expect([version[:epoch], version[:version], version[:release]]).to \
136
+ eq([nil, '1.2.3', nil])
137
+ end
138
+
139
+ it 'parses version-release' do
140
+ version = RpmTest.rpm_parse_evr('1.2.3-4.5.el6')
141
+ expect([version[:epoch], version[:version], version[:release]]).to \
142
+ eq([nil, '1.2.3', '4.5.el6'])
143
+ end
144
+
145
+ it 'parses release with git hash' do
146
+ version = RpmTest.rpm_parse_evr('1.2.3-4.1234aefd')
147
+ expect([version[:epoch], version[:version], version[:release]]).to \
148
+ eq([nil, '1.2.3', '4.1234aefd'])
149
+ end
150
+
151
+ it 'parses single integer versions' do
152
+ version = RpmTest.rpm_parse_evr('12345')
153
+ expect([version[:epoch], version[:version], version[:release]]).to \
154
+ eq([nil, '12345', nil])
155
+ end
156
+
157
+ it 'parses text in the epoch to 0' do
158
+ version = RpmTest.rpm_parse_evr('foo0:1.2.3-4')
159
+ expect([version[:epoch], version[:version], version[:release]]).to \
160
+ eq([nil, '1.2.3', '4'])
161
+ end
162
+
163
+ it 'parses revisions with text' do
164
+ version = RpmTest.rpm_parse_evr('1.2.3-SNAPSHOT20140107')
165
+ expect([version[:epoch], version[:version], version[:release]]).to \
166
+ eq([nil, '1.2.3', 'SNAPSHOT20140107'])
167
+ end
168
+
169
+ # test cases for PUP-682
170
+ it 'parses revisions with text and numbers' do
171
+ version = RpmTest.rpm_parse_evr('2.2-SNAPSHOT20121119105647')
172
+ expect([version[:epoch], version[:version], version[:release]]).to \
173
+ eq([nil, '2.2', 'SNAPSHOT20121119105647'])
174
+ end
175
+ end
176
+
177
+ describe '.compare_values' do
178
+ it 'treats two nil values as equal' do
179
+ expect(RpmTest.compare_values(nil, nil)).to eq(0)
180
+ end
181
+
182
+ it 'treats a nil value as less than a non-nil value' do
183
+ expect(RpmTest.compare_values(nil, '0')).to eq(-1)
184
+ end
185
+
186
+ it 'treats a non-nil value as greater than a nil value' do
187
+ expect(RpmTest.compare_values('0', nil)).to eq(1)
188
+ end
189
+
190
+ it 'passes two non-nil values on to rpmvercmp' do
191
+ allow(RpmTest).to receive(:rpmvercmp).and_return(0)
192
+ expect(RpmTest).to receive(:rpmvercmp).with('s1', 's2')
193
+ RpmTest.compare_values('s1', 's2')
194
+ end
195
+ end
196
+ end
@@ -201,14 +201,7 @@ describe Puppet::Util::Storage do
201
201
  Dir.mkdir(Puppet[:statefile])
202
202
  Puppet::Util::Storage.cache(:yayness)
203
203
 
204
- if Puppet::Util::Platform.windows?
205
- expect { Puppet::Util::Storage.store }.to raise_error do |error|
206
- expect(error).to be_a(Puppet::Util::Windows::Error)
207
- expect(error.code).to eq(5) # ERROR_ACCESS_DENIED
208
- end
209
- else
210
- expect { Puppet::Util::Storage.store }.to raise_error(Errno::EISDIR, /Is a directory/)
211
- end
204
+ expect { Puppet::Util::Storage.store }.to raise_error(Errno::EISDIR, /Is a directory/)
212
205
 
213
206
  Dir.rmdir(Puppet[:statefile])
214
207
  end
@@ -466,8 +466,8 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet::Util::Platform.windows? do
466
466
  expect(Puppet::Util::Windows::SID).to receive(:octet_string_to_principal).with([0]).and_return(sids[0])
467
467
  expect(Puppet::Util::Windows::SID).to receive(:octet_string_to_principal).with([1]).and_return(sids[1])
468
468
 
469
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(sids[1])
470
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('DOMAIN2\user3').and_return(sids[2])
469
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', false).and_return(sids[1])
470
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('DOMAIN2\user3', false).and_return(sids[2])
471
471
 
472
472
  expect(Puppet::Util::Windows::ADSI).to receive(:sid_uri).with(sids[0]).and_return("WinNT://DOMAIN/user1,user")
473
473
  expect(Puppet::Util::Windows::ADSI).to receive(:sid_uri).with(sids[2]).and_return("WinNT://DOMAIN2/user3,user")
@@ -493,8 +493,8 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet::Util::Platform.windows? do
493
493
  expect(Puppet::Util::Windows::SID).to receive(:octet_string_to_principal).with([0]).and_return(sids[0])
494
494
  expect(Puppet::Util::Windows::SID).to receive(:octet_string_to_principal).with([1]).and_return(sids[1])
495
495
 
496
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(sids[1])
497
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('DOMAIN2\user3').and_return(sids[2])
496
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(sids[1])
497
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('DOMAIN2\user3', any_args).and_return(sids[2])
498
498
 
499
499
  expect(Puppet::Util::Windows::ADSI).to receive(:sid_uri).with(sids[2]).and_return("WinNT://DOMAIN2/user3,user")
500
500
 
@@ -4,62 +4,86 @@ require 'spec_helper'
4
4
 
5
5
  describe "FFI::MemoryPointer", :if => Puppet::Util::Platform.windows? do
6
6
  # use 2 bad bytes at end so we have even number of bytes / characters
7
- let (:bad_string) { "hello invalid world".encode(Encoding::UTF_16LE) + "\xDD\xDD".force_encoding(Encoding::UTF_16LE) }
8
- let (:bad_string_bytes) { bad_string.bytes.to_a }
7
+ let(:bad_string) { "hello invalid world".encode(Encoding::UTF_16LE) + "\xDD\xDD".force_encoding(Encoding::UTF_16LE) }
8
+ let(:bad_string_bytes) { bad_string.bytes.to_a }
9
+ let(:a_wide_bytes) { "A".encode(Encoding::UTF_16LE).bytes.to_a }
10
+ let(:b_wide_bytes) { "B".encode(Encoding::UTF_16LE).bytes.to_a }
9
11
 
10
12
  context "read_wide_string" do
11
13
  let (:string) { "foo_bar" }
12
14
 
13
15
  it "should properly roundtrip a given string" do
14
- read_string = nil
15
16
  FFI::MemoryPointer.from_string_to_wide_string(string) do |ptr|
16
- read_string = ptr.read_wide_string(string.length)
17
+ expect(ptr.read_wide_string(string.length)).to eq(string)
17
18
  end
18
-
19
- expect(read_string).to eq(string)
20
19
  end
21
20
 
22
21
  it "should return a given string in UTF-8" do
23
- read_string = nil
24
22
  FFI::MemoryPointer.from_string_to_wide_string(string) do |ptr|
25
23
  read_string = ptr.read_wide_string(string.length)
24
+ expect(read_string.encoding).to eq(Encoding::UTF_8)
26
25
  end
27
-
28
- expect(read_string.encoding).to eq(Encoding::UTF_8)
29
26
  end
30
27
 
31
28
  it "should raise an error and emit a debug message when receiving a string containing invalid bytes in the destination encoding" do
32
- # enable a debug output sink to local string array
33
- Puppet.debug = true
34
- arraydest = []
35
- Puppet::Util::Log.newdestination(Puppet::Test::LogCollector.new(arraydest))
36
-
37
- read_string = nil
29
+ Puppet[:log_level] = 'debug'
38
30
 
39
31
  expect {
40
32
  FFI::MemoryPointer.new(:byte, bad_string_bytes.count) do |ptr|
41
33
  # uchar here is synonymous with byte
42
34
  ptr.put_array_of_uchar(0, bad_string_bytes)
43
35
 
44
- read_string = ptr.read_wide_string(bad_string.length)
36
+ ptr.read_wide_string(bad_string.length)
45
37
  end
46
38
  }.to raise_error(Encoding::InvalidByteSequenceError)
47
39
 
48
- expect(read_string).to be_nil
49
- expect(arraydest.last.message).to eq("Unable to convert value #{bad_string.dump} to encoding UTF-8 due to #<Encoding::InvalidByteSequenceError: \"\\xDD\\xDD\" on UTF-16LE>")
40
+ expect(@logs.last.message).to eq("Unable to convert value #{bad_string.dump} to encoding UTF-8 due to #<Encoding::InvalidByteSequenceError: \"\\xDD\\xDD\" on UTF-16LE>")
50
41
  end
51
42
 
52
43
  it "should not raise an error when receiving a string containing invalid bytes in the destination encoding, when specifying :invalid => :replace" do
53
- read_string = nil
54
-
55
44
  FFI::MemoryPointer.new(:byte, bad_string_bytes.count) do |ptr|
56
45
  # uchar here is synonymous with byte
57
46
  ptr.put_array_of_uchar(0, bad_string_bytes)
58
47
 
59
- read_string = ptr.read_wide_string(bad_string.length, Encoding::UTF_8, :invalid => :replace)
48
+ read_string = ptr.read_wide_string(bad_string.length, Encoding::UTF_8, false, :invalid => :replace)
49
+ expect(read_string).to eq("hello invalid world\uFFFD")
60
50
  end
51
+ end
61
52
 
62
- expect(read_string).to eq("hello invalid world\uFFFD")
53
+ it "raises an IndexError if asked to read more characters than there are bytes allocated" do
54
+ expect {
55
+ FFI::MemoryPointer.new(:byte, 1) do |ptr|
56
+ ptr.read_wide_string(1) # 1 wchar = 2 bytes
57
+ end
58
+ }.to raise_error(IndexError, /out of bounds/)
59
+ end
60
+
61
+ it "raises an IndexError if asked to read a negative number of characters" do
62
+ expect {
63
+ FFI::MemoryPointer.new(:byte, 1) do |ptr|
64
+ ptr.read_wide_string(-1)
65
+ end
66
+ }.to raise_error(IndexError, /out of bounds/)
67
+ end
68
+
69
+ it "returns an empty string if asked to read 0 characters" do
70
+ FFI::MemoryPointer.new(:byte, 1) do |ptr|
71
+ expect(ptr.read_wide_string(0)).to eq("")
72
+ end
73
+ end
74
+
75
+ it "returns a substring if asked to read fewer characters than are in the byte array" do
76
+ FFI::MemoryPointer.new(:byte, 4) do |ptr|
77
+ ptr.write_array_of_uint8("AB".encode('UTF-16LE').bytes.to_a)
78
+ expect(ptr.read_wide_string(1)).to eq("A")
79
+ end
80
+ end
81
+
82
+ it "preserves wide null characters in the string" do
83
+ FFI::MemoryPointer.new(:byte, 6) do |ptr|
84
+ ptr.write_array_of_uint8(a_wide_bytes + [0, 0] + b_wide_bytes)
85
+ expect(ptr.read_wide_string(3)).to eq("A\x00B")
86
+ end
63
87
  end
64
88
  end
65
89
 
@@ -69,52 +93,92 @@ describe "FFI::MemoryPointer", :if => Puppet::Util::Platform.windows? do
69
93
  let (:double_null_string) { string + "\x00\x00" }
70
94
 
71
95
  it "should read a short single null terminated string" do
72
- read_string = nil
73
96
  FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
74
- read_string = ptr.read_arbitrary_wide_string_up_to()
97
+ expect(ptr.read_arbitrary_wide_string_up_to).to eq(string)
75
98
  end
76
-
77
- expect(read_string).to eq(string)
78
99
  end
79
100
 
80
101
  it "should read a short double null terminated string" do
81
- read_string = nil
82
102
  FFI::MemoryPointer.from_string_to_wide_string(double_null_string) do |ptr|
83
- read_string = ptr.read_arbitrary_wide_string_up_to(512, :double_null)
103
+ expect(ptr.read_arbitrary_wide_string_up_to(512, :double_null)).to eq(string)
84
104
  end
105
+ end
106
+
107
+ it "detects trailing single null wchar" do
108
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
109
+ expect(ptr).to receive(:read_wide_string).with(string.length, anything, anything, anything).and_call_original
85
110
 
86
- expect(read_string).to eq(string)
111
+ expect(ptr.read_arbitrary_wide_string_up_to).to eq(string)
112
+ end
87
113
  end
88
114
 
89
- it "should return a string of max_length characters when specified" do
90
- read_string = nil
115
+ it "detects trailing double null wchar" do
116
+ FFI::MemoryPointer.from_string_to_wide_string(double_null_string) do |ptr|
117
+ expect(ptr).to receive(:read_wide_string).with(string.length, anything, anything, anything).and_call_original
118
+
119
+ expect(ptr.read_arbitrary_wide_string_up_to(512, :double_null)).to eq(string)
120
+ end
121
+ end
122
+
123
+ it "should raises an IndexError if max_length is negative" do
124
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
125
+ expect {
126
+ ptr.read_arbitrary_wide_string_up_to(-1)
127
+ }.to raise_error(IndexError, /out of bounds/)
128
+ end
129
+ end
130
+
131
+ it "should return an empty string when the max_length is 0" do
91
132
  FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
92
- read_string = ptr.read_arbitrary_wide_string_up_to(3)
133
+ expect(ptr.read_arbitrary_wide_string_up_to(0)).to eq("")
93
134
  end
135
+ end
94
136
 
95
- expect(read_string).to eq(string[0..2])
137
+ it "should return a string of max_length characters when specified" do
138
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
139
+ expect(ptr.read_arbitrary_wide_string_up_to(3)).to eq(string[0..2])
140
+ end
96
141
  end
97
142
 
98
143
  it "should return wide strings in UTF-8" do
99
- read_string = nil
100
144
  FFI::MemoryPointer.from_string_to_wide_string(string) do |ptr|
101
- read_string = ptr.read_arbitrary_wide_string_up_to()
145
+ read_string = ptr.read_arbitrary_wide_string_up_to
146
+ expect(read_string.encoding).to eq(Encoding::UTF_8)
102
147
  end
103
-
104
- expect(read_string.encoding).to eq(Encoding::UTF_8)
105
148
  end
106
149
 
107
150
  it "should not raise an error when receiving a string containing invalid bytes in the destination encoding, when specifying :invalid => :replace" do
108
- read_string = nil
109
-
110
151
  FFI::MemoryPointer.new(:byte, bad_string_bytes.count) do |ptr|
111
152
  # uchar here is synonymous with byte
112
153
  ptr.put_array_of_uchar(0, bad_string_bytes)
113
154
 
114
155
  read_string = ptr.read_arbitrary_wide_string_up_to(ptr.size / 2, :single_null, :invalid => :replace)
156
+ expect(read_string).to eq("hello invalid world\uFFFD")
157
+ end
158
+ end
159
+
160
+ it "should raise an IndexError if there isn't a null terminator" do
161
+ # This only works when using a memory pointer with a known number of cells
162
+ # and size per cell, but not arbitrary Pointers
163
+ FFI::MemoryPointer.new(:wchar, 1) do |ptr|
164
+ ptr.write_array_of_uint8(a_wide_bytes)
165
+
166
+ expect {
167
+ ptr.read_arbitrary_wide_string_up_to(42)
168
+ }.to raise_error(IndexError, /out of bounds/)
115
169
  end
170
+ end
171
+
172
+ it "should raise an IndexError if there isn't a double null terminator" do
173
+ # This only works when using a memory pointer with a known number of cells
174
+ # and size per cell, but not arbitrary Pointers
175
+ FFI::MemoryPointer.new(:wchar, 1) do |ptr|
176
+ ptr.write_array_of_uint8(a_wide_bytes)
116
177
 
117
- expect(read_string).to eq("hello invalid world\uFFFD")
178
+ expect {
179
+ ptr.read_arbitrary_wide_string_up_to(42, :double_null)
180
+ }.to raise_error(IndexError, /out of bounds/)
181
+ end
118
182
  end
119
183
  end
120
184
  end