puppet 4.2.3 → 4.3.0

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 (337) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +1 -1
  3. data/ext/debian/puppet.init +0 -1
  4. data/ext/debian/puppet.logrotate +14 -5
  5. data/ext/osx/puppet.plist +0 -2
  6. data/ext/redhat/client.init +13 -5
  7. data/ext/redhat/logrotate +15 -3
  8. data/ext/redhat/puppet.spec.erb +5 -1
  9. data/ext/redhat/server.init +1 -1
  10. data/ext/systemd/puppet.service +1 -0
  11. data/lib/puppet.rb +12 -0
  12. data/lib/puppet/agent.rb +4 -4
  13. data/lib/puppet/agent/locker.rb +11 -2
  14. data/lib/puppet/application/agent.rb +5 -1
  15. data/lib/puppet/application/apply.rb +4 -0
  16. data/lib/puppet/application/filebucket.rb +78 -4
  17. data/lib/puppet/application/lookup.rb +356 -0
  18. data/lib/puppet/application/master.rb +3 -0
  19. data/lib/puppet/configurer.rb +9 -5
  20. data/lib/puppet/context.rb +16 -1
  21. data/lib/puppet/context/trusted_information.rb +21 -1
  22. data/lib/puppet/daemon.rb +17 -13
  23. data/lib/puppet/data_binding.rb +4 -2
  24. data/lib/puppet/data_providers.rb +12 -13
  25. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  26. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  27. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  28. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  29. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  30. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  31. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  32. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  33. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  34. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  35. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  36. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  37. data/lib/puppet/defaults.rb +12 -2
  38. data/lib/puppet/error.rb +4 -0
  39. data/lib/puppet/face/module/changes.rb +2 -1
  40. data/lib/puppet/feature/cfacter.rb +1 -0
  41. data/lib/puppet/file_bucket/dipper.rb +58 -2
  42. data/lib/puppet/functions.rb +2 -4
  43. data/lib/puppet/functions/assert_type.rb +48 -12
  44. data/lib/puppet/functions/defined.rb +79 -48
  45. data/lib/puppet/functions/each.rb +85 -27
  46. data/lib/puppet/functions/filter.rb +58 -23
  47. data/lib/puppet/functions/hiera.rb +76 -3
  48. data/lib/puppet/functions/hiera_array.rb +65 -3
  49. data/lib/puppet/functions/hiera_hash.rb +74 -2
  50. data/lib/puppet/functions/hiera_include.rb +75 -2
  51. data/lib/puppet/functions/lookup.rb +19 -17
  52. data/lib/puppet/functions/map.rb +56 -21
  53. data/lib/puppet/functions/match.rb +29 -12
  54. data/lib/puppet/functions/reduce.rb +95 -58
  55. data/lib/puppet/functions/versioncmp.rb +36 -0
  56. data/lib/puppet/functions/with.rb +15 -7
  57. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  58. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  59. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  61. data/lib/puppet/indirector/hiera.rb +4 -0
  62. data/lib/puppet/indirector/json.rb +1 -1
  63. data/lib/puppet/indirector/msgpack.rb +1 -1
  64. data/lib/puppet/indirector/request.rb +7 -8
  65. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  66. data/lib/puppet/info_service.rb +7 -0
  67. data/lib/puppet/info_service/class_information_service.rb +111 -0
  68. data/lib/puppet/module_tool/metadata.rb +32 -9
  69. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  70. data/lib/puppet/network/authconfig.rb +21 -1
  71. data/lib/puppet/network/authorization.rb +8 -1
  72. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  73. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  74. data/lib/puppet/node/environment.rb +9 -2
  75. data/lib/puppet/parser.rb +3 -0
  76. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  77. data/lib/puppet/parser/compiler.rb +302 -12
  78. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  79. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  80. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  81. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  82. data/lib/puppet/parser/environment_compiler.rb +165 -0
  83. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  84. data/lib/puppet/parser/functions/defined.rb +105 -68
  85. data/lib/puppet/parser/functions/each.rb +85 -27
  86. data/lib/puppet/parser/functions/filter.rb +59 -23
  87. data/lib/puppet/parser/functions/hiera.rb +83 -27
  88. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  89. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  90. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  91. data/lib/puppet/parser/functions/map.rb +55 -20
  92. data/lib/puppet/parser/functions/match.rb +27 -12
  93. data/lib/puppet/parser/functions/reduce.rb +97 -60
  94. data/lib/puppet/parser/functions/with.rb +16 -8
  95. data/lib/puppet/parser/resource.rb +98 -19
  96. data/lib/puppet/plugins/configuration.rb +3 -2
  97. data/lib/puppet/plugins/data_providers.rb +12 -60
  98. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  99. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  100. data/lib/puppet/pops.rb +19 -17
  101. data/lib/puppet/pops/adapters.rb +12 -0
  102. data/lib/puppet/pops/binder/binder.rb +2 -2
  103. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  104. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  105. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  106. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  107. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  108. data/lib/puppet/pops/binder/injector.rb +4 -4
  109. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  110. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  111. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  112. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  113. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  114. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  115. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  116. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  117. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  118. data/lib/puppet/pops/issues.rb +1 -1
  119. data/lib/puppet/pops/label_provider.rb +1 -1
  120. data/lib/puppet/pops/lookup.rb +25 -47
  121. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  122. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  123. data/lib/puppet/pops/merge_strategy.rb +73 -5
  124. data/lib/puppet/pops/model/factory.rb +34 -0
  125. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  126. data/lib/puppet/pops/model/model_meta.rb +15 -0
  127. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  128. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  129. data/lib/puppet/pops/parser/egrammar.ra +56 -3
  130. data/lib/puppet/pops/parser/eparser.rb +1549 -1352
  131. data/lib/puppet/pops/parser/lexer2.rb +31 -6
  132. data/lib/puppet/pops/parser/locator.rb +1 -1
  133. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  134. data/lib/puppet/pops/types/enumeration.rb +1 -2
  135. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  136. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  137. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  138. data/lib/puppet/pops/types/type_factory.rb +87 -148
  139. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  140. data/lib/puppet/pops/types/type_parser.rb +116 -127
  141. data/lib/puppet/pops/types/types.rb +1394 -255
  142. data/lib/puppet/pops/types/types_meta.rb +0 -234
  143. data/lib/puppet/pops/validation.rb +7 -2
  144. data/lib/puppet/pops/validation/checker4_0.rb +28 -0
  145. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  146. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  147. data/lib/puppet/provider/package/dnf.rb +41 -0
  148. data/lib/puppet/provider/package/gem.rb +7 -2
  149. data/lib/puppet/provider/package/rpm.rb +1 -0
  150. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  151. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  152. data/lib/puppet/provider/package/windows/package.rb +9 -1
  153. data/lib/puppet/provider/package/yum.rb +14 -9
  154. data/lib/puppet/provider/service/bsd.rb +1 -1
  155. data/lib/puppet/provider/service/debian.rb +21 -0
  156. data/lib/puppet/provider/service/init.rb +6 -0
  157. data/lib/puppet/provider/service/rcng.rb +51 -0
  158. data/lib/puppet/provider/service/redhat.rb +2 -1
  159. data/lib/puppet/provider/service/smf.rb +43 -2
  160. data/lib/puppet/provider/service/src.rb +27 -0
  161. data/lib/puppet/provider/service/systemd.rb +15 -3
  162. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  163. data/lib/puppet/reference/report.rb +9 -12
  164. data/lib/puppet/reports.rb +5 -1
  165. data/lib/puppet/resource.rb +50 -73
  166. data/lib/puppet/resource/capability_finder.rb +95 -0
  167. data/lib/puppet/resource/catalog.rb +47 -7
  168. data/lib/puppet/resource/status.rb +0 -2
  169. data/lib/puppet/resource/type.rb +238 -44
  170. data/lib/puppet/resource/type_collection.rb +60 -2
  171. data/lib/puppet/settings.rb +2 -2
  172. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  173. data/lib/puppet/ssl/oids.rb +9 -1
  174. data/lib/puppet/transaction.rb +4 -1
  175. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  176. data/lib/puppet/transaction/resource_harness.rb +9 -4
  177. data/lib/puppet/type.rb +74 -3
  178. data/lib/puppet/type/augeas.rb +8 -0
  179. data/lib/puppet/type/file/source.rb +14 -12
  180. data/lib/puppet/type/user.rb +4 -2
  181. data/lib/puppet/util/windows/security.rb +4 -1
  182. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  183. data/lib/puppet/version.rb +1 -1
  184. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  185. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  186. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  187. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  188. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  189. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  190. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  191. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  192. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  193. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  194. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  195. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  198. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  201. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  202. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  203. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  204. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  205. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  206. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  207. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  208. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  209. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  210. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  211. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  212. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  213. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  214. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  215. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  216. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  217. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  218. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  219. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  220. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  224. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  225. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  226. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  227. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  228. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  229. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  230. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  231. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  232. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  233. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  234. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  235. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  236. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  238. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  239. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  241. data/spec/integration/data_binding_spec.rb +229 -0
  242. data/spec/integration/file_bucket/file_spec.rb +2 -2
  243. data/spec/integration/parser/compiler_spec.rb +23 -19
  244. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  245. data/spec/integration/parser/undef_param_spec.rb +1 -1
  246. data/spec/integration/resource/catalog_spec.rb +1 -1
  247. data/spec/integration/type/package_spec.rb +2 -0
  248. data/spec/integration/util/windows/security_spec.rb +18 -0
  249. data/spec/lib/matchers/include_in_order.rb +2 -2
  250. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  251. data/spec/spec_helper.rb +7 -0
  252. data/spec/unit/agent/locker_spec.rb +4 -4
  253. data/spec/unit/agent_spec.rb +0 -8
  254. data/spec/unit/application/agent_spec.rb +5 -0
  255. data/spec/unit/application/apply_spec.rb +8 -0
  256. data/spec/unit/application/filebucket_spec.rb +87 -1
  257. data/spec/unit/application/lookup_spec.rb +195 -0
  258. data/spec/unit/appmgmt_spec.rb +657 -0
  259. data/spec/unit/capability_spec.rb +414 -0
  260. data/spec/unit/configurer_spec.rb +7 -1
  261. data/spec/unit/context/trusted_information_spec.rb +24 -1
  262. data/spec/unit/daemon_spec.rb +18 -8
  263. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  264. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  265. data/spec/unit/functions/assert_type_spec.rb +5 -7
  266. data/spec/unit/functions/defined_spec.rb +2 -2
  267. data/spec/unit/functions/epp_spec.rb +2 -2
  268. data/spec/unit/functions/lookup_spec.rb +200 -9
  269. data/spec/unit/functions/regsubst_spec.rb +17 -8
  270. data/spec/unit/functions/scanf_spec.rb +1 -1
  271. data/spec/unit/functions/split_spec.rb +2 -2
  272. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  273. data/spec/unit/functions4_spec.rb +58 -72
  274. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  275. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  276. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  277. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  278. data/spec/unit/indirector/request_spec.rb +8 -8
  279. data/spec/unit/info_service_spec.rb +236 -0
  280. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  281. data/spec/unit/network/authconfig_spec.rb +62 -32
  282. data/spec/unit/network/authorization_spec.rb +30 -2
  283. data/spec/unit/network/http/connection_spec.rb +14 -19
  284. data/spec/unit/parser/compiler_spec.rb +86 -2
  285. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  286. data/spec/unit/parser/resource_spec.rb +2 -20
  287. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  288. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  289. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  290. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  291. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
  292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  293. data/spec/unit/pops/label_provider_spec.rb +5 -1
  294. data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
  295. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  296. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  297. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  298. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  299. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  300. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  301. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  302. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  303. data/spec/unit/pops/types/type_parser_spec.rb +7 -12
  304. data/spec/unit/pops/validator/validator_spec.rb +25 -0
  305. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  306. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  307. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  308. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  309. data/spec/unit/provider/package/gem_spec.rb +7 -0
  310. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  311. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  312. data/spec/unit/provider/package/yum_spec.rb +21 -13
  313. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  314. data/spec/unit/provider/service/debian_spec.rb +27 -0
  315. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  316. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  317. data/spec/unit/provider/service/smf_spec.rb +30 -5
  318. data/spec/unit/provider/service/src_spec.rb +19 -4
  319. data/spec/unit/provider/service/systemd_spec.rb +78 -29
  320. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  321. data/spec/unit/reports_spec.rb +10 -0
  322. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  323. data/spec/unit/resource/catalog_spec.rb +31 -8
  324. data/spec/unit/resource/type_collection_spec.rb +23 -2
  325. data/spec/unit/resource/type_spec.rb +1 -1
  326. data/spec/unit/resource_spec.rb +22 -4
  327. data/spec/unit/settings_spec.rb +90 -1
  328. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  329. data/spec/unit/ssl/oids_spec.rb +8 -0
  330. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  331. data/spec/unit/transaction/report_spec.rb +24 -1
  332. data/spec/unit/type/package_spec.rb +1 -0
  333. data/spec/unit/type/user_spec.rb +14 -7
  334. data/spec/unit/type_spec.rb +1 -1
  335. metadata +169 -5
  336. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  337. data/spec/integration/data_binding.rb +0 -104
@@ -25,13 +25,11 @@ describe 'the assert_type function' do
25
25
  it 'checks that first argument is a type' do
26
26
  expect do
27
27
  func.call({}, 10, 10)
28
- end.to raise_error(ArgumentError, Regexp.new(Regexp.escape(
29
- "function 'assert_type' called with mis-matched arguments
30
- expected one of:
31
- assert_type(Type type, Any value, Callable[Type, Type] block {0,1}) - arg count {2,3}
32
- assert_type(String type_string, Any value, Callable[Type, Type] block {0,1}) - arg count {2,3}
33
- actual:
34
- assert_type(Integer, Integer) - arg count {2}")))
28
+ end.to raise_error(ArgumentError, "'assert_type' expected one of:
29
+ (Type type, Any value, Callable[Type, Type] block?)
30
+ rejected: parameter 'type' expects a Type value, got Integer
31
+ (String type_string, Any value, Callable[Type, Type] block?)
32
+ rejected: parameter 'type_string' expects a String value, got Integer")
35
33
  end
36
34
 
37
35
  it 'allows the second arg to be undef/nil)' do
@@ -268,11 +268,11 @@ describe "the 'defined' function" do
268
268
  end
269
269
 
270
270
  it 'raises error if referencing undef' do
271
- expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /mis-matched arguments/)
271
+ expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\[CatalogEntry\]\], got Undef/)
272
272
  end
273
273
 
274
274
  it 'raises error if referencing a number' do
275
- expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /mis-matched arguments/)
275
+ expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\[CatalogEntry\]\], got Integer/)
276
276
  end
277
277
 
278
278
  it 'is false if referencing empty string' do
@@ -80,13 +80,13 @@ describe "the epp function" do
80
80
  it "raises an error when the passed value does not match the parameter's type" do
81
81
  expect do
82
82
  eval_template_with_args("<%-|Integer $x|-%><%= $x %>", 'x' => 'incorrect')
83
- end.to raise_error(/expected.*Integer.*actual.*String/m)
83
+ end.to raise_error(/block parameter 'x' expects an Integer value, got String/)
84
84
  end
85
85
 
86
86
  it "raises an error when the default value does not match the parameter's type" do
87
87
  expect do
88
88
  eval_template("<%-|Integer $x = 'nope'|-%><%= $x %>")
89
- end.to raise_error(/expected.*Integer.*actual.*String/m)
89
+ end.to raise_error(/block parameter 'x' expects an Integer value, got String/)
90
90
  end
91
91
 
92
92
  it "allows an parameter to default to undef" do
@@ -27,19 +27,24 @@ describe "when performing lookup" do
27
27
  # @param *args [String] splat of args that will be concatenated to form the puppet args sent to lookup
28
28
  # @return [Array<String>] List of names of Notify resources in the resulting catalog
29
29
  #
30
- def assemble_and_compile(fmt, *lookup_args)
31
- assemble_and_compile_with_block(fmt, "'no_block_present'", *lookup_args)
30
+ def assemble_and_compile(fmt, *lookup_args, &block)
31
+ assemble_and_compile_with_block(fmt, "'no_block_present'", *lookup_args, &block)
32
32
  end
33
33
 
34
- def assemble_and_compile_with_block(fmt, block, *lookup_args)
35
- Puppet[:code] = <<-END.gsub(/^ {6}/, '')
34
+ def assemble_and_compile_with_block(fmt, block, *lookup_args, &cblock)
35
+ compile_and_get_notifications(<<-END.gsub(/^ {6}/, ''), &cblock)
36
36
  $args = [#{lookup_args.join(',')}]
37
37
  $block = #{block}
38
38
  include abc
39
39
  $r = if $abc::result == undef { 'no_value' } else { $abc::result }
40
40
  notify { \"#{fmt}\": }
41
41
  END
42
- compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
42
+ end
43
+
44
+ def compile_and_get_notifications(code)
45
+ Puppet[:code] = code
46
+ catalog = block_given? ? compiler.compile { |catalog| yield(compiler.topscope); catalog } : compiler.compile
47
+ catalog.resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
43
48
  end
44
49
 
45
50
  # There is a fully configured 'production' environment in fixtures at this location
@@ -76,7 +81,18 @@ describe "when performing lookup" do
76
81
  expect(resources).to include('module_b')
77
82
  end
78
83
 
84
+ it "can lookup value provided by the module that has 'function' data_provider entry in metadata.json" do
85
+ resources = compile_and_get_notifications("$args = ['meta::b']\ninclude meta\nnotify { $meta::result: }\n")
86
+ expect(resources).to include('module_b')
87
+ end
88
+
89
+ it "can lookup value provided by the module that has 'sample' data_provider entry in metadata.json" do
90
+ resources = compile_and_get_notifications("$args = ['metawcp::b']\ninclude metawcp\nnotify { $metawcp::result: }\n")
91
+ expect(resources).to include('module_b')
92
+ end
93
+
79
94
  it 'can lookup value provided in global scope' do
95
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
80
96
  Hiera.any_instance.expects(:lookup).with('abc::a', any_parameters).returns('global_a')
81
97
  resources = assemble_and_compile('${r}', "'abc::a'")
82
98
  expect(resources).to include('global_a')
@@ -108,6 +124,7 @@ describe "when performing lookup" do
108
124
  end
109
125
 
110
126
  it "can 'hash' merge values provided by global, environment, and module" do
127
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
111
128
  Hiera.any_instance.expects(:lookup).with('abc::e', any_parameters).returns({ 'k1' => 'global_e1' })
112
129
  resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "'hash'")
113
130
  expect(resources).to include('global_e1_module_e2_env_e3')
@@ -173,30 +190,35 @@ describe "when performing lookup" do
173
190
  end
174
191
 
175
192
  it 'can lookup and deep merge deep values provided by global, environment, and module' do
193
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
176
194
  Hiera.any_instance.expects(:lookup).with('abc::f', any_parameters).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
177
195
  resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "'deep'")
178
196
  expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
179
197
  end
180
198
 
181
199
  it 'will propagate resolution_type :array to Hiera when merge == \'unique\'' do
200
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
182
201
  Hiera.any_instance.expects(:lookup).with('abc::c', anything, anything, anything, :array).returns(['global_c'])
183
202
  resources = assemble_and_compile('${r[0]}_${r[1]}_${r[2]}', "'abc::c'", 'Array[String]', "'unique'")
184
203
  expect(resources).to include('global_c_env_c_module_c')
185
204
  end
186
205
 
187
206
  it 'will propagate a Hash resolution_type with :behavior => :native to Hiera when merge == \'hash\'' do
207
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
188
208
  Hiera.any_instance.expects(:lookup).with('abc::e', anything, anything, anything, { :behavior => :native }).returns({ 'k1' => 'global_e1' })
189
209
  resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "{strategy => 'hash'}")
190
210
  expect(resources).to include('global_e1_module_e2_env_e3')
191
211
  end
192
212
 
193
213
  it 'will propagate a Hash resolution_type with :behavior => :deeper to Hiera when merge == \'deep\'' do
214
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
194
215
  Hiera.any_instance.expects(:lookup).with('abc::f', anything, anything, anything, { :behavior => :deeper }).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
195
216
  resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "'deep'")
196
217
  expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
197
218
  end
198
219
 
199
220
  it 'will propagate a Hash resolution_type with symbolic deep merge options to Hiera' do
221
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
200
222
  Hiera.any_instance.expects(:lookup).with('abc::f', anything, anything, anything, { :behavior => :deeper, :knockout_prefix => '--' }).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
201
223
  resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "{ 'strategy' => 'deep', 'knockout_prefix' => '--' }")
202
224
  expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
@@ -331,24 +353,26 @@ describe "when performing lookup" do
331
353
  end
332
354
 
333
355
  it 'will resolve global, environment, and module correctly' do
356
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
334
357
  Hiera.any_instance.expects(:lookup).with('bca::e', any_parameters).returns({ 'k1' => 'global_e1' })
335
- Puppet[:code] = <<-END.gsub(/^ {8}/, '')
358
+ resources = compile_and_get_notifications(<<-END.gsub(/^ {8}/, '')
336
359
  include bca
337
360
  $r = lookup(bca::e, Hash[String,String], hash)
338
361
  notify { "${r[k1]}_${r[k2]}_${r[k3]}": }
339
362
  END
340
- resources = compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
363
+ )
341
364
  expect(resources).to include('global_e1_module_bca_e2_env_bca_e3')
342
365
  end
343
366
 
344
367
  it 'will resolve global and environment correctly when module has no provider' do
368
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
345
369
  Hiera.any_instance.expects(:lookup).with('no_provider::e', any_parameters).returns({ 'k1' => 'global_e1' })
346
- Puppet[:code] = <<-END.gsub(/^ {8}/, '')
370
+ resources = compile_and_get_notifications(<<-END.gsub(/^ {8}/, '')
347
371
  include no_provider
348
372
  $r = lookup(no_provider::e, Hash[String,String], hash)
349
373
  notify { "${r[k1]}_${r[k2]}_${r[k3]}": }
350
374
  END
351
- resources = compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
375
+ )
352
376
  expect(resources).to include('global_e1__env_no_provider_e3') # k2 is missing
353
377
  end
354
378
  end
@@ -361,4 +385,171 @@ describe "when performing lookup" do
361
385
  end.to raise_error(Puppet::ParseError, /data for module 'bad_data' must use keys qualified with the name of the module/)
362
386
  end
363
387
  end
388
+
389
+
390
+ context 'when using explain' do
391
+ it 'will explain that module is not found' do
392
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
393
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
394
+ begin
395
+ Puppet::Pops::Lookup.lookup('ppx::e',nil, nil, false, nil, lookup_invocation)
396
+ rescue Puppet::Error
397
+ end
398
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
399
+ Merge strategy first
400
+ Data Binding "hiera"
401
+ No such key: "ppx::e"
402
+ Data Provider "FunctionEnvDataProvider"
403
+ No such key: "ppx::e"
404
+ Module "ppx"
405
+ Module not found
406
+ EOS
407
+ end
408
+ end
409
+
410
+ it 'will explain that module does not find a key' do
411
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
412
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
413
+ begin
414
+ Puppet::Pops::Lookup.lookup('abc::x', nil, nil, false, nil, lookup_invocation)
415
+ rescue Puppet::Error
416
+ end
417
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
418
+ Merge strategy first
419
+ Data Binding "hiera"
420
+ No such key: "abc::x"
421
+ Data Provider "FunctionEnvDataProvider"
422
+ No such key: "abc::x"
423
+ Module "abc" using Data Provider "FunctionModuleDataProvider"
424
+ No such key: "abc::x"
425
+ EOS
426
+ end
427
+ end
428
+
429
+ it 'will explain deep merge results without options' do
430
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
431
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
432
+ Puppet::Pops::Lookup.lookup('abc::e', Puppet::Pops::Types::TypeParser.new.parse('Hash[String,String]'), nil, false, 'deep', lookup_invocation)
433
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
434
+ Merge strategy deep
435
+ Data Binding "hiera"
436
+ No such key: "abc::e"
437
+ Data Provider "FunctionEnvDataProvider"
438
+ Found key: "abc::e" value: {
439
+ "k1" => "env_e1",
440
+ "k3" => "env_e3"
441
+ }
442
+ Module "abc" using Data Provider "FunctionModuleDataProvider"
443
+ Found key: "abc::e" value: {
444
+ "k1" => "module_e1",
445
+ "k2" => "module_e2"
446
+ }
447
+ Merged result: {
448
+ "k1" => "env_e1",
449
+ "k2" => "module_e2",
450
+ "k3" => "env_e3"
451
+ }
452
+ EOS
453
+ end
454
+ end
455
+
456
+ it 'will explain deep merge results with options' do
457
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
458
+ Hiera.any_instance.expects(:lookup).with(any_parameters).returns({'k1' => 'global_g1'})
459
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
460
+ Puppet::Pops::Lookup.lookup('abc::e', Puppet::Pops::Types::TypeParser.new.parse('Hash[String,String]'), nil, false, {'strategy' => 'deep', 'merge_hash_arrays' => true}, lookup_invocation)
461
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
462
+ Merge strategy deep
463
+ Options: {
464
+ "merge_hash_arrays" => true
465
+ }
466
+ Data Binding "hiera"
467
+ Found key: "abc::e" value: {
468
+ "k1" => "global_g1"
469
+ }
470
+ Data Provider "FunctionEnvDataProvider"
471
+ Found key: "abc::e" value: {
472
+ "k1" => "env_e1",
473
+ "k3" => "env_e3"
474
+ }
475
+ Module "abc" using Data Provider "FunctionModuleDataProvider"
476
+ Found key: "abc::e" value: {
477
+ "k1" => "module_e1",
478
+ "k2" => "module_e2"
479
+ }
480
+ Merged result: {
481
+ "k1" => "global_g1",
482
+ "k2" => "module_e2",
483
+ "k3" => "env_e3"
484
+ }
485
+ EOS
486
+ end
487
+ end
488
+
489
+ it 'will handle path merge with not found correctly' do
490
+ assemble_and_compile('${r}', "'hieraprovider::test::param_a'") do |scope|
491
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
492
+ begin
493
+ Puppet::Pops::Lookup.lookup('hieraprovider::test::not_found', nil, nil, false, nil, lookup_invocation)
494
+ rescue Puppet::DataBinding::LookupError
495
+ end
496
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
497
+ Merge strategy first
498
+ Data Binding "hiera"
499
+ No such key: "hieraprovider::test::not_found"
500
+ Data Provider "FunctionEnvDataProvider"
501
+ No such key: "hieraprovider::test::not_found"
502
+ Module "hieraprovider" using Data Provider "Hiera Data Provider, version 4"
503
+ ConfigurationPath "#{environmentpath}/production/modules/hieraprovider/hiera.yaml"
504
+ Data Provider "two paths"
505
+ Merge strategy first
506
+ Path "#{environmentpath}/production/modules/hieraprovider/data/first.json"
507
+ Original path: first
508
+ No such key: "hieraprovider::test::not_found"
509
+ Path "#{environmentpath}/production/modules/hieraprovider/data/second_not_present.json"
510
+ Original path: second_not_present
511
+ Path not found
512
+ EOS
513
+ end
514
+ end
515
+
516
+ it 'will provide a hash containing all explanation elements' do
517
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
518
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
519
+ Puppet::Pops::Lookup.lookup('abc::e', Puppet::Pops::Types::TypeParser.new.parse('Hash[String,String]'), nil, false, {'strategy' => 'deep', 'merge_hash_arrays' => true}, lookup_invocation)
520
+ expect(lookup_invocation.explainer.to_hash).to eq(
521
+ {
522
+ :branches => [
523
+ {
524
+ :key => 'abc::e',
525
+ :event => :not_found,
526
+ :type => :global,
527
+ :name => :hiera
528
+ },
529
+ {
530
+ :key => 'abc::e',
531
+ :value => { 'k1' => 'env_e1', 'k3' => 'env_e3' },
532
+ :event => :found,
533
+ :type => :data_provider,
534
+ :name => 'FunctionEnvDataProvider'
535
+ },
536
+ {
537
+ :key => 'abc::e',
538
+ :value => { 'k1' => 'module_e1', 'k2' => 'module_e2' },
539
+ :event => :found,
540
+ :type => :data_provider,
541
+ :name => 'FunctionModuleDataProvider',
542
+ :module => 'abc'
543
+ }
544
+ ],
545
+ :value => { 'k1' => 'env_e1', 'k2' => 'module_e2', 'k3' => 'env_e3' },
546
+ :event => :result,
547
+ :merge => :deep,
548
+ :options => { 'merge_hash_arrays' => true },
549
+ :type => :merge
550
+ }
551
+ )
552
+ end
553
+ end
554
+ end
364
555
  end
@@ -22,19 +22,19 @@ describe 'the regsubst function' do
22
22
 
23
23
  context 'when using a string pattern' do
24
24
  it 'should raise an Error if there is less than 3 arguments' do
25
- expect { regsubst('foo', 'bar') }.to raise_error(/called with mis-matched arguments/)
25
+ expect { regsubst('foo', 'bar') }.to raise_error(/expects between 3 and 5 arguments, got 2/)
26
26
  end
27
27
 
28
28
  it 'should raise an Error if there is more than 5 arguments' do
29
- expect { regsubst('foo', 'bar', 'gazonk', 'G', 'U', 'y') }.to raise_error(/called with mis-matched arguments/)
29
+ expect { regsubst('foo', 'bar', 'gazonk', 'G', 'U', 'y') }.to raise_error(/expects between 3 and 5 arguments, got 6/)
30
30
  end
31
31
 
32
32
  it 'should raise an Error if given a bad flag' do
33
- expect { regsubst('foo', 'bar', 'gazonk', 'X') }.to raise_error(/called with mis-matched arguments/)
33
+ expect { regsubst('foo', 'bar', 'gazonk', 'X') }.to raise_error(/parameter 'flags' expects a match for Pattern\[\/\^\[GEIM\]\*\$\/\], got 'X'/)
34
34
  end
35
35
 
36
36
  it 'should raise an Error if given a bad encoding' do
37
- expect { regsubst('foo', 'bar', 'gazonk', nil, 'X') }.to raise_error(/called with mis-matched arguments/)
37
+ expect { regsubst('foo', 'bar', 'gazonk', nil, 'X') }.to raise_error(/parameter 'encoding' expects a match for Enum\['E', 'N', 'S', 'U'\], got 'X'/)
38
38
  end
39
39
 
40
40
  it 'should raise an Error if given a bad regular expression' do
@@ -48,15 +48,15 @@ describe 'the regsubst function' do
48
48
 
49
49
  context 'when using a regexp pattern' do
50
50
  it 'should raise an Error if there is less than 3 arguments' do
51
- expect { regsubst('foo', /bar/) }.to raise_error(/called with mis-matched arguments/)
51
+ expect { regsubst('foo', /bar/) }.to raise_error(/expects between 3 and 5 arguments, got 2/)
52
52
  end
53
53
 
54
- it 'should raise an Error if there is more than 4 arguments' do
55
- expect { regsubst('foo', /bar/, 'gazonk', 'G', 'y') }.to raise_error(/called with mis-matched arguments/)
54
+ it 'should raise an Error if there is more than 5 arguments' do
55
+ expect { regsubst('foo', /bar/, 'gazonk', 'G', 'E', 'y') }.to raise_error(/expects between 3 and 5 arguments, got 6/)
56
56
  end
57
57
 
58
58
  it 'should raise an Error if given a flag other thant G' do
59
- expect { regsubst('foo', /bar/, 'gazonk', 'I') }.to raise_error(/called with mis-matched arguments/)
59
+ expect { regsubst('foo', /bar/, 'gazonk', 'I') }.to raise_error(/expected one of/)
60
60
  end
61
61
 
62
62
  it 'should handle global substitutions' do
@@ -94,5 +94,14 @@ describe 'the regsubst function' do
94
94
  'G')
95
95
  ).to eql(['<130>.<236>.<254>.<10>', '<foo>.<example>.<com>','<coconut>', '<10>.<20>.<30>.<40>'])
96
96
  end
97
+
98
+ it 'should return an empty array if given an empty array and string pattern' do
99
+ expect(regsubst([], '', '')).to eql([])
100
+ end
101
+
102
+ it 'should return an empty array if given an empty array and regexp pattern' do
103
+ expect(regsubst([], //, '')).to eql([])
104
+ end
105
+
97
106
  end
98
107
  end
@@ -27,6 +27,6 @@ describe 'the scanf function' do
27
27
  it 'errors when not given enough arguments' do
28
28
  expect do
29
29
  compile_to_catalog("'42'.scanf()")
30
- end.to raise_error(/.*expected.*scanf\(String data, String format, Callable block \{0,1\}\)/m)
30
+ end.to raise_error(/'scanf' expects 2 arguments, got 1/)
31
31
  end
32
32
  end
@@ -21,11 +21,11 @@ describe 'the split function' do
21
21
  let(:type_parser) { Puppet::Pops::Types::TypeParser.new }
22
22
 
23
23
  it 'should raise an Error if there is less than 2 arguments' do
24
- expect { split('a,b') }.to raise_error(/called with mis-matched arguments/)
24
+ expect { split('a,b') }.to raise_error(/'split' expects 2 arguments, got 1/)
25
25
  end
26
26
 
27
27
  it 'should raise an Error if there is more than 2 arguments' do
28
- expect { split('a,b','foo', 'bar') }.to raise_error(/called with mis-matched arguments/)
28
+ expect { split('a,b','foo', 'bar') }.to raise_error(/'split' expects 2 arguments, got 3/)
29
29
  end
30
30
 
31
31
  it 'should raise a RegexpError if the regexp is malformed' do
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet/loaders'
4
+
5
+ describe "the versioncmp function" do
6
+
7
+ before(:all) do
8
+ loaders = Puppet::Pops::Loaders.new(Puppet::Node::Environment.create(:testing, []))
9
+ Puppet.push_context({:loaders => loaders}, "test-examples")
10
+ end
11
+
12
+ after(:all) do
13
+ Puppet::Pops::Loaders.clear
14
+ Puppet::pop_context()
15
+ end
16
+
17
+ def versioncmp(*args)
18
+ Puppet.lookup(:loaders).puppet_system_loader.load(:function, 'versioncmp').call({}, *args)
19
+ end
20
+
21
+ let(:type_parser) { Puppet::Pops::Types::TypeParser.new }
22
+
23
+ it 'should raise an Error if there is less than 2 arguments' do
24
+ expect { versioncmp('a,b') }.to raise_error(/expects 2 arguments, got 1/)
25
+ end
26
+
27
+ it 'should raise an Error if there is more than 2 arguments' do
28
+ expect { versioncmp('a,b','foo', 'bar') }.to raise_error(/expects 2 arguments, got 3/)
29
+ end
30
+
31
+ it "should call Puppet::Util::Package.versioncmp (included in scope)" do
32
+ Puppet::Util::Package.expects(:versioncmp).with('1.2', '1.3').returns(-1)
33
+
34
+ expect(versioncmp('1.2', '1.3')).to eq -1
35
+ end
36
+ end