puppet 4.2.3-x86-mingw32 → 4.3.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 (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
@@ -167,15 +167,15 @@ describe "Puppet resource expressions" do
167
167
  produces("notify{title:}; Notify[title] { * => { message => set}}" => "Notify[title][message] == 'set'")
168
168
  produces("Notify { * => { message => set}}; notify{title:}" => "Notify[title][message] == 'set'")
169
169
 
170
- fails("notify { title: unknown => value }" => /Invalid parameter: 'unknown'/)
170
+ fails("notify { title: unknown => value }" => /no parameter named 'unknown'/)
171
171
 
172
172
  # this really needs to be a better error message.
173
- fails("notify { title: * => { hash => value }, message => oops }" => /Invalid parameter: 'hash'/)
173
+ fails("notify { title: * => { hash => value }, message => oops }" => /no parameter named 'hash'/)
174
174
 
175
175
  # should this be a better error message?
176
- fails("notify { title: message => oops, * => { hash => value } }" => /Invalid parameter: 'hash'/)
176
+ fails("notify { title: message => oops, * => { hash => value } }" => /no parameter named 'hash'/)
177
177
 
178
- fails("notify { title: * => { unknown => value } }" => /Invalid parameter: 'unknown'/)
178
+ fails("notify { title: * => { unknown => value } }" => /no parameter named 'unknown'/)
179
179
  fails("
180
180
  $x = { mode => '0666' }
181
181
  $y = { owner => the_y }
@@ -78,7 +78,7 @@ describe "Parameter passing" do
78
78
  end
79
79
 
80
80
  it "errors when no parameter is provided and there is no default" do
81
- expect_puppet_error(/^Must pass x to A\[a\].*/) do <<-MANIFEST
81
+ expect_puppet_error(/A\[a\]: expects a value for parameter 'x'/) do <<-MANIFEST
82
82
  define a($x) { notify { 'something': message => $x }}
83
83
  a {'a': }
84
84
  MANIFEST
@@ -35,7 +35,7 @@ describe Puppet::Resource::Catalog do
35
35
  node.stub_everything
36
36
 
37
37
  Puppet::Node.indirection.expects(:find).returns(node)
38
- compiler.expects(:compile).with(node).returns nil
38
+ compiler.expects(:compile).with(node, anything).returns nil
39
39
 
40
40
  expect(Puppet::Resource::Catalog.indirection.find("me")).to be_nil
41
41
  end
@@ -54,6 +54,7 @@ end
54
54
 
55
55
  describe Puppet::Type.type(:package), "when packages with the same name are sourced" do
56
56
  before :each do
57
+ Process.stubs(:euid).returns 0
57
58
  @provider = stub(
58
59
  'provider',
59
60
  :class => Puppet::Type.type(:package).defaultprovider,
@@ -131,6 +132,7 @@ describe Puppet::Type.type(:package), 'logging package state transitions' do
131
132
  let(:provider) { stub('provider', :class => Puppet::Type.type(:package).defaultprovider, :clear => nil, :validate_source => nil) }
132
133
 
133
134
  before :each do
135
+ Process.stubs(:euid).returns 0
134
136
  provider.stubs(:satisfies?).with([:purgeable]).returns(true)
135
137
  provider.class.stubs(:instances).returns([])
136
138
  provider.stubs(:install).returns nil
@@ -238,6 +238,24 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
238
238
  expect(ace.mask).to eq(klass::FILE_ALL_ACCESS)
239
239
  expect(ace).not_to be_inherited
240
240
  end
241
+
242
+ if Puppet::FileSystem.directory?(path)
243
+ system_aces.each do |ace|
244
+ expect(ace).to be_object_inherit
245
+ expect(ace).to be_container_inherit
246
+ end
247
+
248
+ # it's critically important that this file be default created
249
+ # and that this file not have it's owner / group / mode set by winsec
250
+ nested_file = File.join(path, 'nested_file')
251
+ File.new(nested_file, 'w').close
252
+
253
+ system_aces = winsec.get_aces_for_path_by_sid(nested_file, sids[:system])
254
+ # even when SYSTEM is the owner (in CI), there should be an inherited SYSTEM
255
+ expect(system_aces.any? do |ace|
256
+ ace.mask == klass::FILE_ALL_ACCESS && ace.inherited?
257
+ end).to be_truthy
258
+ end
241
259
  end
242
260
 
243
261
  describe "for modes that require deny aces" do
@@ -11,10 +11,10 @@ RSpec::Matchers.define :include_in_order do |*expected|
11
11
  end
12
12
 
13
13
  def failure_message
14
- "expected #{@actual.inspect} to include#{expected_to_sentence} in order"
14
+ "expected #{@actual.inspect} to include#{expected} in order"
15
15
  end
16
16
 
17
17
  def failure_message_when_negated
18
- "expected #{@actual.inspect} not to include#{expected_to_sentence} in order"
18
+ "expected #{@actual.inspect} not to include#{expected} in order"
19
19
  end
20
20
  end
@@ -22,25 +22,25 @@ shared_examples_for 'all iterative functions argument checks' do |func|
22
22
  it 'raises an error when called with any parameters besides a block' do
23
23
  expect do
24
24
  compile_to_catalog(<<-MANIFEST)
25
- [1].#{func}(1) |$v| { }
25
+ [1].#{func}(1,2) |$v,$y| { }
26
26
  MANIFEST
27
- end.to raise_error(Puppet::Error, /mis-matched arguments.*expected.*arg count \{2\}.*actual.*arg count \{3\}/m)
27
+ end.to raise_error(Puppet::Error, /expects (?:between 1 and 2 arguments|1 argument), got 3/)
28
28
  end
29
29
 
30
30
  it 'raises an error when called without a block' do
31
31
  expect do
32
32
  compile_to_catalog(<<-MANIFEST)
33
- [1].#{func}()
33
+ [1].#{func}
34
34
  MANIFEST
35
- end.to raise_error(Puppet::Error, /mis-matched arguments.*expected.*arg count \{2\}.*actual.*arg count \{1\}/m)
35
+ end.to raise_error(Puppet::Error, /expects a block/)
36
36
  end
37
37
 
38
38
  it 'raises an error when called with something that is not a block' do
39
39
  expect do
40
40
  compile_to_catalog(<<-MANIFEST)
41
- [1].#{func}(1)
41
+ [1].#{func}(1,2)
42
42
  MANIFEST
43
- end.to raise_error(Puppet::Error, /mis-matched arguments.*expected.*Callable.*actual(?!Callable\)).*/m)
43
+ end.to raise_error(Puppet::Error, /expects (?:between 1 and 2 arguments|1 argument), got 3/)
44
44
  end
45
45
 
46
46
  it 'raises an error when called with a block with too many required parameters' do
@@ -48,7 +48,7 @@ shared_examples_for 'all iterative functions argument checks' do |func|
48
48
  compile_to_catalog(<<-MANIFEST)
49
49
  [1].#{func}() |$v1, $v2, $v3| { }
50
50
  MANIFEST
51
- end.to raise_error(Puppet::Error, /mis-matched arguments.*expected.*arg count \{2\}.*actual.*Callable\[Any, Any, Any\]/m)
51
+ end.to raise_error(Puppet::Error, /block expects(?: between 1 and)? 2 arguments, got 3/)
52
52
  end
53
53
 
54
54
  it 'raises an error when called with a block with too few parameters' do
@@ -56,7 +56,7 @@ shared_examples_for 'all iterative functions argument checks' do |func|
56
56
  compile_to_catalog(<<-MANIFEST)
57
57
  [1].#{func}() | | { }
58
58
  MANIFEST
59
- end.to raise_error(Puppet::Error, /mis-matched arguments.*expected.*arg count \{2\}.*actual.*Callable\[0, 0\]/m)
59
+ end.to raise_error(Puppet::Error, /block expects(?: between 1 and)? 2 arguments, got none/)
60
60
  end
61
61
 
62
62
  it 'does not raise an error when called with a block with too many but optional arguments' do
data/spec/spec_helper.rb CHANGED
@@ -43,6 +43,13 @@ Pathname.glob("#{dir}/shared_behaviours/**/*.rb") do |behaviour|
43
43
  require behaviour.relative_path_from(Pathname.new(dir))
44
44
  end
45
45
 
46
+ require 'vcr'
47
+ VCR.configure do |vcr|
48
+ vcr.cassette_library_dir = File.expand_path('vcr/cassettes', PuppetSpec::FIXTURE_DIR)
49
+ vcr.hook_into :webmock
50
+ vcr.configure_rspec_metadata!
51
+ end
52
+
46
53
  RSpec.configure do |config|
47
54
  include PuppetSpec::Fixtures
48
55
 
@@ -58,17 +58,17 @@ describe Puppet::Agent::Locker do
58
58
  expect(@locker.lock { :result }).to eq(:result)
59
59
  end
60
60
 
61
- it "should return nil when the lock method does not receive the lock" do
61
+ it "should raise LockError when the lock method does not receive the lock" do
62
62
  @locker.send(:lockfile).expects(:lock).returns false
63
63
 
64
- expect(@locker.lock {}).to be_nil
64
+ expect { @locker.lock {} }.to raise_error(Puppet::LockError)
65
65
  end
66
66
 
67
67
  it "should not yield when the lock method does not receive the lock" do
68
68
  @locker.send(:lockfile).expects(:lock).returns false
69
69
 
70
70
  yielded = false
71
- @locker.lock { yielded = true }
71
+ expect { @locker.lock { yielded = true } }.to raise_error(Puppet::LockError)
72
72
  expect(yielded).to be_falsey
73
73
  end
74
74
 
@@ -76,7 +76,7 @@ describe Puppet::Agent::Locker do
76
76
  @locker.send(:lockfile).expects(:lock).returns false
77
77
  @locker.send(:lockfile).expects(:unlock).never
78
78
 
79
- @locker.lock {}
79
+ expect { @locker.lock {} }.to raise_error(Puppet::LockError)
80
80
  end
81
81
 
82
82
  it "should unlock after yielding upon obtaining a lock" do
@@ -58,7 +58,6 @@ describe Puppet::Agent do
58
58
 
59
59
  client.expects(:run)
60
60
 
61
- @agent.stubs(:running?).returns false
62
61
  @agent.stubs(:disabled?).returns false
63
62
  @agent.run
64
63
  end
@@ -75,7 +74,6 @@ describe Puppet::Agent do
75
74
  describe "when being run" do
76
75
  before do
77
76
  AgentTestClient.stubs(:lockfile_path).returns "/my/lock"
78
- @agent.stubs(:running?).returns false
79
77
  @agent.stubs(:disabled?).returns false
80
78
  end
81
79
 
@@ -85,12 +83,6 @@ describe Puppet::Agent do
85
83
  @agent.run
86
84
  end
87
85
 
88
- it "should do nothing if already running" do
89
- @agent.expects(:running?).returns true
90
- AgentTestClient.expects(:new).never
91
- @agent.run
92
- end
93
-
94
86
  it "should do nothing if disabled" do
95
87
  @agent.expects(:disabled?).returns(true)
96
88
  AgentTestClient.expects(:new).never
@@ -197,6 +197,11 @@ describe Puppet::Application::Agent do
197
197
  Puppet.stubs(:settraps)
198
198
  end
199
199
 
200
+ it "should not run with extra arguments" do
201
+ @puppetd.command_line.stubs(:args).returns(%w{disable})
202
+ expect{@puppetd.setup}.to raise_error ArgumentError, /does not take parameters/
203
+ end
204
+
200
205
  describe "with --test" do
201
206
  it "should call setup_test" do
202
207
  @puppetd.options[:test] = true
@@ -470,4 +470,12 @@ describe Puppet::Application::Apply do
470
470
  @apply.send(:apply_catalog, catalog)
471
471
  end
472
472
  end
473
+
474
+ it "should honor the catalog_cache_terminus setting" do
475
+ Puppet.settings[:catalog_cache_terminus] = "json"
476
+ Puppet::Resource::Catalog.indirection.expects(:cache_class=).with(:json)
477
+
478
+ @apply.initialize_app_defaults
479
+ @apply.setup
480
+ end
473
481
  end
@@ -21,7 +21,15 @@ describe Puppet::Application::Filebucket do
21
21
  expect(@filebucket).to respond_to(:restore)
22
22
  end
23
23
 
24
- [:bucket, :debug, :local, :remote, :verbose].each do |option|
24
+ it "should declare a diff command" do
25
+ expect(@filebucket).to respond_to(:diff)
26
+ end
27
+
28
+ it "should declare a list command" do
29
+ expect(@filebucket).to respond_to(:list)
30
+ end
31
+
32
+ [:bucket, :debug, :local, :remote, :verbose, :fromdate, :todate].each do |option|
25
33
  it "should declare handle_#{option} method" do
26
34
  expect(@filebucket).to respond_to("handle_#{option}".to_sym)
27
35
  end
@@ -201,6 +209,84 @@ describe Puppet::Application::Filebucket do
201
209
  end
202
210
  end
203
211
 
212
+ describe "the command diff" do
213
+ it "should call the client diff method with 2 given checksums" do
214
+ md5a="DEADBEEF"
215
+ md5b="BEEF"
216
+ Puppet::FileSystem.stubs(:exist?).returns(false)
217
+ @filebucket.stubs(:args).returns([md5a, md5b])
218
+
219
+ @client.expects(:diff).with(md5a,md5b, nil, nil)
220
+
221
+ @filebucket.diff
222
+ end
223
+
224
+ it "should call the clien diff with a path if the second argument is a file" do
225
+ md5a="DEADBEEF"
226
+ md5b="BEEF"
227
+ Puppet::FileSystem.stubs(:exist?).with(md5a).returns(false)
228
+ Puppet::FileSystem.stubs(:exist?).with(md5b).returns(true)
229
+ @filebucket.stubs(:args).returns([md5a, md5b])
230
+
231
+ @client.expects(:diff).with(md5a, nil, nil, md5b)
232
+
233
+ @filebucket.diff
234
+ end
235
+
236
+ it "should call the clien diff with a path if the first argument is a file" do
237
+ md5a="DEADBEEF"
238
+ md5b="BEEF"
239
+ Puppet::FileSystem.stubs(:exist?).with(md5a).returns(true)
240
+ Puppet::FileSystem.stubs(:exist?).with(md5b).returns(false)
241
+ @filebucket.stubs(:args).returns([md5a, md5b])
242
+
243
+ @client.expects(:diff).with(nil, md5b, md5a, nil)
244
+
245
+ @filebucket.diff
246
+ end
247
+
248
+ it "should call the clien diff with paths if the both arguments are files" do
249
+ md5a="DEADBEEF"
250
+ md5b="BEEF"
251
+ Puppet::FileSystem.stubs(:exist?).with(md5a).returns(true)
252
+ Puppet::FileSystem.stubs(:exist?).with(md5b).returns(true)
253
+ @filebucket.stubs(:args).returns([md5a, md5b])
254
+
255
+ @client.expects(:diff).with(nil, nil, md5a, md5b)
256
+
257
+ @filebucket.diff
258
+ end
259
+
260
+ it "should fail if only one checksum is given" do
261
+ md5a="DEADBEEF"
262
+ @filebucket.stubs(:args).returns([md5a])
263
+
264
+ expect { @filebucket.diff }.to raise_error Puppet::Error
265
+ end
266
+ end
267
+ describe "the command list" do
268
+ it "should call the client list method with nil dates" do
269
+ @client.expects(:list).with(nil, nil)
270
+
271
+ @filebucket.list
272
+ end
273
+ it "should call the client list method with the given dates" do
274
+ # 3 Hours ago
275
+ threehours = 60*60*3
276
+ fromdate = (Time.now - threehours).strftime("%F %T")
277
+ # 1 Hour ago
278
+ onehour = 60*60
279
+ todate = (Time.now - onehour).strftime("%F %T")
280
+
281
+ @filebucket.options.stubs(:[]).with(:fromdate).returns(fromdate)
282
+ @filebucket.options.stubs(:[]).with(:todate).returns(todate)
283
+
284
+ @client.expects(:list).with(fromdate, todate)
285
+
286
+ @filebucket.list
287
+ end
288
+ end
289
+
204
290
  end
205
291
 
206
292
 
@@ -0,0 +1,195 @@
1
+ require 'spec_helper'
2
+ require 'puppet/application/lookup'
3
+ require 'puppet/pops/lookup'
4
+
5
+ describe Puppet::Application::Lookup do
6
+
7
+ context "when running with incorrect command line options" do
8
+ let (:lookup) { Puppet::Application[:lookup] }
9
+
10
+ it "errors if no keys are given via the command line" do
11
+ lookup.options[:node] = 'dantooine.local'
12
+ expected_error = "No keys were given to lookup."
13
+
14
+ expect { lookup.run_command }.to raise_error(RuntimeError, expected_error)
15
+ end
16
+
17
+ it "does not allow deep merge options if '--merge' was not set to deep" do
18
+ lookup.options[:node] = 'dantooine.local'
19
+ lookup.options[:merge_hash_arrays] = true
20
+ lookup.options[:merge] = 'hash'
21
+ lookup.command_line.stubs(:args).returns(['atton', 'kreia'])
22
+
23
+ expected_error = "The options --knock-out-prefix, --sort-merged-arrays, --unpack-arrays, and --merge-hash-arrays are only available with '--merge deep'\nRun 'puppet lookup --help' for more details"
24
+
25
+ expect { lookup.run_command }.to raise_error(RuntimeError, expected_error)
26
+ end
27
+ end
28
+
29
+ context "when running with correct command line options" do
30
+ let (:lookup) { Puppet::Application[:lookup] }
31
+
32
+ it "calls the lookup method with the correct arguments" do
33
+ lookup.options[:node] = 'dantooine.local'
34
+ lookup.options[:render_as] = :s;
35
+ lookup.options[:merge_hash_arrays] = true
36
+ lookup.options[:merge] = 'deep'
37
+ lookup.command_line.stubs(:args).returns(['atton', 'kreia'])
38
+ lookup.stubs(:generate_scope).yields('scope')
39
+
40
+ expected_merge = { "strategy" => "deep", "sort_merge_arrays" => false, "merge_hash_arrays" => true }
41
+
42
+ (Puppet::Pops::Lookup).expects(:lookup).with(['atton', 'kreia'], nil, nil, false, expected_merge, anything).returns('rand')
43
+
44
+ expect { lookup.run_command }.to output("rand\n").to_stdout
45
+ end
46
+
47
+ it "prints the value found by lookup" do
48
+ lookup.options[:node] = 'dantooine.local'
49
+ lookup.command_line.stubs(:args).returns(['atton', 'kreia'])
50
+ lookup.stubs(:generate_scope).yields('scope')
51
+
52
+ Puppet::Pops::Lookup.stubs(:lookup).returns('rand')
53
+
54
+ expect { lookup.run_command }.to output("--- rand\n...\n").to_stdout
55
+ end
56
+ end
57
+
58
+
59
+ context 'when asked to explain' do
60
+ let (:lookup) { Puppet::Application[:lookup] }
61
+
62
+ # There is a fully configured 'sample' environment in fixtures at this location
63
+ let(:environmentpath) { File.absolute_path(File.join(my_fixture_dir(), '../environments')) }
64
+
65
+ let(:facts) { Puppet::Node::Facts.new("facts", {}) }
66
+
67
+ let(:node) { Puppet::Node.new("testnode", :facts => facts, :environment => environment) }
68
+
69
+ let(:expected_json_hash) { {
70
+ 'type' => 'merge',
71
+ 'merge' => 'first',
72
+ 'event' => 'result',
73
+ 'value' => 'This is A',
74
+ 'branches' => [
75
+ { 'key' => 'a',
76
+ 'event' => 'not_found',
77
+ 'type' => 'global',
78
+ 'name' => 'hiera'
79
+ },
80
+ {
81
+ 'type' => 'data_provider',
82
+ 'name' => 'Hiera Data Provider, version 4',
83
+ 'configuration_path' => "#{environmentpath}/production/hiera.yaml",
84
+ 'branches' => [
85
+ {
86
+ 'name' => 'common',
87
+ 'type' => 'data_provider',
88
+ 'branches' => [
89
+ {
90
+ 'key' => 'a',
91
+ 'value' => 'This is A',
92
+ 'event' => 'found',
93
+ 'type' => 'path',
94
+ 'original_path' => 'common',
95
+ 'path' => "#{environmentpath}/production/data/common.yaml",
96
+ }]
97
+ }]
98
+ }]
99
+ } }
100
+
101
+ let(:expected_yaml_hash) { {
102
+ :type => :merge,
103
+ :merge => :first,
104
+ :event => :result,
105
+ :value => 'This is A',
106
+ :branches => [
107
+ { :key => 'a',
108
+ :event => :not_found,
109
+ :type => :global,
110
+ :name => :hiera
111
+ },
112
+ {
113
+ :type => :data_provider,
114
+ :name => 'Hiera Data Provider, version 4',
115
+ :configuration_path => "#{environmentpath}/production/hiera.yaml",
116
+ :branches => [
117
+ {
118
+ :type => :data_provider,
119
+ :name => 'common',
120
+ :branches => [
121
+ {
122
+ :key => 'a',
123
+ :value => 'This is A',
124
+ :event => :found,
125
+ :type => :path,
126
+ :original_path => 'common',
127
+ :path => "#{environmentpath}/production/data/common.yaml",
128
+ }]
129
+ }]
130
+ }]
131
+ } }
132
+
133
+ around(:each) do |example|
134
+ # Initialize settings to get a full compile as close as possible to a real
135
+ # environment load
136
+ Puppet.settings.initialize_global_settings
137
+ loader = Puppet::Environments::Directories.new(environmentpath, [])
138
+ Puppet.override(:environments => loader) do
139
+ example.run
140
+ end
141
+ end
142
+
143
+ it 'produces human readable text by default' do
144
+ lookup.options[:node] = Puppet::Node.new("testnode", :facts => facts, :environment => 'production')
145
+ lookup.options[:explain] = true
146
+ lookup.command_line.stubs(:args).returns(['a'])
147
+ expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
148
+ Merge strategy first
149
+ Data Binding "hiera"
150
+ No such key: "a"
151
+ Data Provider "Hiera Data Provider, version 4"
152
+ ConfigurationPath "#{environmentpath}/production/hiera.yaml"
153
+ Data Provider "common"
154
+ Path "#{environmentpath}/production/data/common.yaml"
155
+ Original path: common
156
+ Found key: "a" value: "This is A"
157
+ Merged result: "This is A"
158
+ EXPLANATION
159
+ end
160
+
161
+ it 'can produce a yaml explanation' do
162
+ lookup.options[:node] = Puppet::Node.new("testnode", :facts => facts, :environment => 'production')
163
+ lookup.options[:explain] = true
164
+ lookup.options[:render_as] = :yaml
165
+ lookup.command_line.stubs(:args).returns(['a'])
166
+ save_stdout = $stdout
167
+ output = nil
168
+ begin
169
+ $stdout = StringIO.new
170
+ lookup.run_command
171
+ output = $stdout.string
172
+ ensure
173
+ $stdout = save_stdout
174
+ end
175
+ expect(YAML.load(output)).to eq(expected_yaml_hash)
176
+ end
177
+
178
+ it 'can produce a json explanation' do
179
+ lookup.options[:node] = Puppet::Node.new("testnode", :facts => facts, :environment => 'production')
180
+ lookup.options[:explain] = true
181
+ lookup.options[:render_as] = :json
182
+ lookup.command_line.stubs(:args).returns(['a'])
183
+ save_stdout = $stdout
184
+ output = nil
185
+ begin
186
+ $stdout = StringIO.new
187
+ lookup.run_command
188
+ output = $stdout.string
189
+ ensure
190
+ $stdout = save_stdout
191
+ end
192
+ expect(JSON.parse(output)).to eq(expected_json_hash)
193
+ end
194
+ end
195
+ end