puppet 4.5.3-x64-mingw32 → 4.6.1-x64-mingw32

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

Potentially problematic release.


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

Files changed (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +91 -48
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ module Puppet::Pops
5
+ module Serialization
6
+ describe 'RGen' do
7
+ let!(:env) { Puppet::Node::Environment.create(:testing, []) }
8
+ let!(:loaders) { Puppet::Pops::Loaders.new(env) }
9
+ let!(:loader) { loaders.find_loader(nil) }
10
+
11
+ around :each do |example|
12
+ Puppet.override(:loaders => loaders, :current_environment => env) do
13
+ example.run
14
+ end
15
+ end
16
+
17
+ def find_parent(type, parent_name)
18
+ p = type
19
+ while p.is_a?(Types::PObjectType) && p.name != parent_name
20
+ p = p.parent
21
+ end
22
+ expect(p).to be_a(Types::PObjectType), "did not find #{parent_name} in parent chain of #{type.name}"
23
+ p
24
+ end
25
+
26
+ context 'TypeGenerator' do
27
+
28
+ let!(:generator) { RGen::TypeGenerator.new }
29
+ let!(:type_set) { generator.generate_type_set('PuppetSpec::Bindings', Binder::Bindings, loader) }
30
+ let!(:bindings_classes) do
31
+ Binder::Bindings.constants.each_with_object([]) do |n, a|
32
+ cls = Binder::Bindings.const_get(n)
33
+ a << cls if cls.is_a?(Class) && cls.respond_to?(:ecore)
34
+ end
35
+ end
36
+
37
+ it 'generates TypeSet from a module that represents an ECore package' do
38
+ expect(type_set).to be_a(Types::PTypeSetType)
39
+ expect(type_set.types).not_to be_empty
40
+ expect(type_set.types.size).to eql(bindings_classes.size)
41
+ end
42
+
43
+ it 'all types are in the PuppetSpec::Bindings namespace' do
44
+ type_set.types.values.each {|type| expect(type.name).to start_with('PuppetSpec::Bindings::') }
45
+ end
46
+
47
+ it 'all types extend from PuppetSpec::Bindings::BindingsModelObject' do
48
+ type_set.types.values.each do |type|
49
+ expect(find_parent(type, 'PuppetSpec::Bindings::BindingsModelObject').name).to eq('PuppetSpec::Bindings::BindingsModelObject')
50
+ end
51
+ end
52
+ end
53
+
54
+ context 'AST model types' do
55
+ let!(:impl_repo) { Loaders.implementation_registry }
56
+ let!(:loader) { Loaders.find_loader(nil) }
57
+ let!(:type_set) { Types::TypeParser.singleton.parse('Puppet::AST', loader) }
58
+ let!(:ast_classes) do
59
+ Model.constants.each_with_object([]) do |n, a|
60
+ cls = Model.const_get(n)
61
+ a << cls if cls.is_a?(Class) && cls.respond_to?(:ecore)
62
+ end
63
+ end
64
+
65
+ it 'can be mapped from the ecore classes found in Puppet::Pops::Model' do
66
+ ast_classes.each { |ast_class| expect(impl_repo.type_for_module(ast_class)).to be_a(Types::PObjectType) }
67
+ end
68
+
69
+ it 'are contained in a TypeSet named Puppet::AST' do
70
+ expect(type_set).to be_a(Types::PTypeSetType)
71
+ expect(type_set.name).to eq('Puppet::AST')
72
+ expect(type_set.types.size).to eql(ast_classes.size + 1) # +1 because the Locator is added
73
+ end
74
+
75
+ it 'all reside in the Puppet::AST namespace' do
76
+ type_set.types.values.each {|type| expect(type.name).to start_with('Puppet::AST::') }
77
+ end
78
+
79
+ it 'all extend from Puppet::AST::PopsObject' do
80
+ type_set.types.values.each do |type|
81
+ next if type.name == 'Puppet::AST::Locator'
82
+ expect(find_parent(type, 'Puppet::AST::PopsObject').name).to eq('Puppet::AST::PopsObject')
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,228 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ module Puppet::Pops
5
+ module Serialization
6
+ [JSON].each do |packer_module|
7
+ describe "the Puppet::Pops::Serialization over #{packer_module.name}" do
8
+ let!(:dumper) { Model::ModelTreeDumper.new }
9
+ let(:io) { StringIO.new }
10
+ let(:parser) { Parser::EvaluatingParser.new }
11
+ let(:env) { Puppet::Node::Environment.create(:testing, []) }
12
+ let(:loaders) { Puppet::Pops::Loaders.new(env) }
13
+ let(:loader) { loaders.find_loader(nil) }
14
+ let(:reader_class) { packer_module::Reader }
15
+ let(:writer_class) { packer_module::Writer }
16
+
17
+ around :each do |example|
18
+ Puppet.override(:loaders => loaders, :current_environment => env) do
19
+ example.run
20
+ end
21
+ end
22
+
23
+ def write(*values)
24
+ io.reopen
25
+ serializer = Serializer.new(writer_class.new(io))
26
+ values.each { |val| serializer.write(val) }
27
+ serializer.finish
28
+ io.rewind
29
+ end
30
+
31
+ def read
32
+ deserializer = Deserializer.new(reader_class.new(io), loaders.find_loader(nil))
33
+ deserializer.read
34
+ end
35
+
36
+ def parse(string)
37
+ parser.parse_string(string, '/home/tester/experiments/manifests/init.pp').current
38
+ end
39
+
40
+ context 'can write and read a Scalar' do
41
+ it 'String' do
42
+ val = 'the value'
43
+ write(val)
44
+ val2 = read
45
+ expect(val2).to be_a(String)
46
+ expect(val2).to eql(val)
47
+ end
48
+
49
+ it 'Integer' do
50
+ val = 32
51
+ write(val)
52
+ val2 = read
53
+ expect(val2).to be_a(Integer)
54
+ expect(val2).to eql(val)
55
+ end
56
+
57
+ it 'Float' do
58
+ val = 32.45
59
+ write(val)
60
+ val2 = read
61
+ expect(val2).to be_a(Float)
62
+ expect(val2).to eql(val)
63
+ end
64
+
65
+ it 'true' do
66
+ val = true
67
+ write(val)
68
+ val2 = read
69
+ expect(val2).to be_a(TrueClass)
70
+ expect(val2).to eql(val)
71
+ end
72
+
73
+ it 'false' do
74
+ val = false
75
+ write(val)
76
+ val2 = read
77
+ expect(val2).to be_a(FalseClass)
78
+ expect(val2).to eql(val)
79
+ end
80
+
81
+ it 'nil' do
82
+ val = nil
83
+ write(val)
84
+ val2 = read
85
+ expect(val2).to be_a(NilClass)
86
+ expect(val2).to eql(val)
87
+ end
88
+
89
+ it 'Regexp' do
90
+ val = /match me/
91
+ write(val)
92
+ val2 = read
93
+ expect(val2).to be_a(Regexp)
94
+ expect(val2).to eql(val)
95
+ end
96
+
97
+ it 'Time created by TimeFactory' do
98
+ # It does succeed on rare occasions, so we need to repeat
99
+ val = TimeFactory.now
100
+ write(val)
101
+ val2 = read
102
+ expect(val2).to be_a(Time)
103
+ expect(val2).to eql(val)
104
+ end
105
+
106
+ it 'Version' do
107
+ # It does succeed on rare occasions, so we need to repeat
108
+ val = Semantic::Version.parse('1.2.3-alpha2')
109
+ write(val)
110
+ val2 = read
111
+ expect(val2).to be_a(Semantic::Version)
112
+ expect(val2).to eql(val)
113
+ end
114
+
115
+ it 'VersionRange' do
116
+ # It does succeed on rare occasions, so we need to repeat
117
+ val = Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
118
+ write(val)
119
+ val2 = read
120
+ expect(val2).to be_a(Semantic::VersionRange)
121
+ expect(val2).to eql(val)
122
+ end
123
+ end
124
+
125
+ context 'can write and read' do
126
+ include_context 'types_setup'
127
+
128
+ it 'all default types' do
129
+ all_types.each do |t|
130
+ val = t::DEFAULT
131
+ write(val)
132
+ val2 = read
133
+ expect(val2).to be_a(t)
134
+ expect(val2).to eql(val)
135
+ end
136
+ end
137
+
138
+ context 'a parameterized' do
139
+ it 'String' do
140
+ val = Types::TypeFactory.string(Types::TypeFactory.range(1, :default))
141
+ write(val)
142
+ val2 = read
143
+ expect(val2).to be_a(Types::PStringType)
144
+ expect(val2).to eql(val)
145
+ end
146
+
147
+ it 'Regex' do
148
+ val = Types::TypeFactory.regexp(/foo/)
149
+ write(val)
150
+ val2 = read
151
+ expect(val2).to be_a(Types::PRegexpType)
152
+ expect(val2).to eql(val)
153
+ end
154
+
155
+ it 'Variant' do
156
+ val = Types::TypeFactory.variant(Types::TypeFactory.string, Types::TypeFactory.range(1, :default))
157
+ write(val)
158
+ val2 = read
159
+ expect(val2).to be_a(Types::PVariantType)
160
+ expect(val2).to eql(val)
161
+ end
162
+
163
+ it 'Object' do
164
+ val = Types::TypeParser.singleton.parse('Pcore::StringType', loader)
165
+ write(val)
166
+ val2 = read
167
+ expect(val2).to be_a(Types::PObjectType)
168
+ expect(val2).to eql(val)
169
+ end
170
+ end
171
+
172
+ context 'an AST model' do
173
+ it "Locator" do
174
+ val = Parser::Locator::Locator19.new('here is some text', '/tmp/foo', [5])
175
+ write(val)
176
+ val2 = read
177
+ expect(val2).to be_a(Parser::Locator::Locator19)
178
+ expect(val2).to eql(val)
179
+ end
180
+
181
+ it 'nested Expression' do
182
+ expr = parse(<<-CODE)
183
+ $rootgroup = $osfamily ? {
184
+ 'Solaris' => 'wheel',
185
+ /(Darwin|FreeBSD)/ => 'wheel',
186
+ default => 'root',
187
+ }
188
+
189
+ file { '/etc/passwd':
190
+ ensure => file,
191
+ owner => 'root',
192
+ group => $rootgroup,
193
+ }
194
+ CODE
195
+ write(expr)
196
+ expr2 = read
197
+ expect(dumper.dump(expr)).to eq(dumper.dump(expr2))
198
+ end
199
+ end
200
+ end
201
+
202
+ context 'When debugging' do
203
+ let(:debug_io) { StringIO.new }
204
+ let(:writer) { reader_class.new(io, { :debug_io => debug_io, :tabulate => false, :verbose => true }) }
205
+
206
+ it 'can write and read an AST expression' do
207
+ expr = parse(<<-CODE)
208
+ $rootgroup = $osfamily ? {
209
+ 'Solaris' => 'wheel',
210
+ /(Darwin|FreeBSD)/ => 'wheel',
211
+ default => 'root',
212
+ }
213
+
214
+ file { '/etc/passwd':
215
+ ensure => file,
216
+ owner => 'root',
217
+ group => $rootgroup,
218
+ }
219
+ CODE
220
+ write(expr)
221
+ expr2 = read
222
+ expect(dumper.dump(expr)).to eq(dumper.dump(expr2))
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -7,14 +7,14 @@ module Types
7
7
  describe 'The Object Type' do
8
8
  include PuppetSpec::Compiler
9
9
 
10
- let(:parser) { TypeParser.new }
10
+ let(:parser) { TypeParser.singleton }
11
11
  let(:pp_parser) { Parser::EvaluatingParser.new }
12
12
  let(:loader) { Loader::BaseLoader.new(nil, 'type_parser_unit_test_loader') }
13
13
  let(:factory) { TypeFactory }
14
14
 
15
15
  def type_object_t(name, body_string)
16
16
  object = PObjectType.new(name, pp_parser.parse_string("{#{body_string}}").current.body)
17
- loader.set_entry(Loader::Loader::TypedName.new(:type, name.downcase), object)
17
+ loader.set_entry(Loader::TypedName.new(:type, name.downcase), object)
18
18
  object
19
19
  end
20
20
 
@@ -1055,6 +1055,48 @@ describe 'The Object Type' do
1055
1055
  end
1056
1056
  end
1057
1057
  end
1058
+
1059
+ context 'is assigned to all PAnyType classes such that' do
1060
+ include_context 'types_setup'
1061
+
1062
+ def find_parent(tc, parent_name)
1063
+ p = tc._ptype
1064
+ while p.is_a?(PObjectType) && p.name != parent_name
1065
+ p = p.parent
1066
+ end
1067
+ expect(p).to be_a(PObjectType), "did not find #{parent_name} in parent chain of #{tc.name}"
1068
+ p
1069
+ end
1070
+
1071
+ it 'the class has a _ptype method' do
1072
+ all_types.each do |tc|
1073
+ expect(tc).to respond_to(:_ptype).with(0).arguments
1074
+ end
1075
+ end
1076
+
1077
+ it 'the _ptype method returns a PObjectType instance' do
1078
+ all_types.each do |tc|
1079
+ expect(tc._ptype).to be_a(PObjectType)
1080
+ end
1081
+ end
1082
+
1083
+ it 'the instance returned by _ptype is a descendant from Pcore::AnyType' do
1084
+ all_types.each { |tc| expect(find_parent(tc, 'Pcore::AnyType').name).to eq('Pcore::AnyType') }
1085
+ end
1086
+
1087
+ it 'PScalarType classes _ptype returns a descendant from Pcore::ScalarType' do
1088
+ scalar_types.each { |tc| expect(find_parent(tc, 'Pcore::ScalarType').name).to eq('Pcore::ScalarType') }
1089
+ end
1090
+
1091
+ it 'PNumericType classes _ptype returns a descendant from Pcore::NumberType' do
1092
+ numeric_types.each { |tc| expect(find_parent(tc, 'Pcore::NumericType').name).to eq('Pcore::NumericType') }
1093
+ end
1094
+
1095
+ it 'PCollectionType classes _ptype returns a descendant from Pcore::CollectionType' do
1096
+ coll_descendants = collection_types - [PTupleType, PStructType]
1097
+ coll_descendants.each { |tc| expect(find_parent(tc, 'Pcore::CollectionType').name).to eq('Pcore::CollectionType') }
1098
+ end
1099
+ end
1058
1100
  end
1059
1101
  end
1060
1102
  end
@@ -13,6 +13,48 @@ describe 'Semantic Versions' do
13
13
  expect(t).to be_a(PSemVerType)
14
14
  expect(t).to eql(TypeFactory.sem_ver('>=1.0.0 <4.0.0'))
15
15
  end
16
+
17
+ context 'convert method' do
18
+ it 'returns nil on a nil argument' do
19
+ expect(PSemVerType.convert(nil)).to be_nil
20
+ end
21
+
22
+ it 'returns its argument when the argument is a version' do
23
+ v = Semantic::Version.new(1,0,0)
24
+ expect(PSemVerType.convert(v)).to equal(v)
25
+ end
26
+
27
+ it 'converts a valid version string argument to a version' do
28
+ v = Semantic::Version.new(1,0,0)
29
+ expect(PSemVerType.convert('1.0.0')).to eq(v)
30
+ end
31
+
32
+ it 'raises an error string that does not represent a valid version' do
33
+ expect{PSemVerType.convert('1-3')}.to raise_error(ArgumentError)
34
+ end
35
+ end
36
+ end
37
+
38
+ context 'the SemVerRange type' do
39
+ context 'convert method' do
40
+ it 'returns nil on a nil argument' do
41
+ expect(PSemVerRangeType.convert(nil)).to be_nil
42
+ end
43
+
44
+ it 'returns its argument when the argument is a version range' do
45
+ vr = Semantic::VersionRange.parse('1.x')
46
+ expect(PSemVerRangeType.convert(vr)).to equal(vr)
47
+ end
48
+
49
+ it 'converts a valid version string argument to a version range' do
50
+ vr = Semantic::VersionRange.parse('1.x')
51
+ expect(PSemVerRangeType.convert('1.x')).to eq(vr)
52
+ end
53
+
54
+ it 'raises an error string that does not represent a valid version range' do
55
+ expect{PSemVerRangeType.convert('x3')}.to raise_error(ArgumentError)
56
+ end
57
+ end
16
58
  end
17
59
 
18
60
  context 'when used in Puppet expressions' do
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet_spec/compiler'
4
+
5
+ module Puppet::Pops
6
+ module Types
7
+ describe 'Sensitive Type' do
8
+ include PuppetSpec::Compiler
9
+
10
+ context 'as a type' do
11
+ it 'can be created without a parameter with the type factory' do
12
+ t = TypeFactory.sensitive
13
+ expect(t).to be_a(PSensitiveType)
14
+ expect(t).to eql(PSensitiveType::DEFAULT)
15
+ end
16
+
17
+ it 'can be created with a parameter with the type factory' do
18
+ t = TypeFactory.sensitive(PIntegerType::DEFAULT)
19
+ expect(t).to be_a(PSensitiveType)
20
+ expect(t.type).to eql(PIntegerType::DEFAULT)
21
+ end
22
+
23
+ context 'when used in Puppet expressions' do
24
+ it 'is equal to itself only' do
25
+ code = <<-CODE
26
+ $t = Sensitive
27
+ notice(Sensitive =~ Type[ Sensitive ])
28
+ notice(Sensitive == Sensitive)
29
+ notice(Sensitive < Sensitive)
30
+ notice(Sensitive > Sensitive)
31
+ CODE
32
+ expect(eval_and_collect_notices(code)).to eq(['true', 'true', 'false', 'false'])
33
+ end
34
+
35
+ context "when parameterized" do
36
+ it 'is equal other types with the same parameterization' do
37
+ code = <<-CODE
38
+ notice(Sensitive[String] == Sensitive[String])
39
+ notice(Sensitive[Numeric] != Sensitive[Integer])
40
+ CODE
41
+ expect(eval_and_collect_notices(code)).to eq(['true', 'true'])
42
+ end
43
+
44
+ it 'orders parameterized types based on the type system hierarchy' do
45
+ code = <<-CODE
46
+ notice(Sensitive[Numeric] > Sensitive[Integer])
47
+ notice(Sensitive[Numeric] < Sensitive[Integer])
48
+ CODE
49
+ expect(eval_and_collect_notices(code)).to eq(['true', 'false'])
50
+ end
51
+
52
+ it 'does not order incomparable parameterized types' do
53
+ code = <<-CODE
54
+ notice(Sensitive[String] < Sensitive[Integer])
55
+ notice(Sensitive[String] > Sensitive[Integer])
56
+ CODE
57
+ expect(eval_and_collect_notices(code)).to eq(['false', 'false'])
58
+ end
59
+
60
+ it 'generalizes passed types to prevent information leakage' do
61
+ code =<<-CODE
62
+ $it = String[7, 7]
63
+ $st = Sensitive[$it]
64
+ notice(type($st))
65
+ CODE
66
+ expect(eval_and_collect_notices(code)).to eq(['Type[Sensitive[String]]'])
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ context 'a Sensitive instance' do
73
+ it 'can be created from a string and does not leak its contents' do
74
+ code =<<-CODE
75
+ $o = Sensitive("hunter2")
76
+ notice($o)
77
+ notice(type($o))
78
+ CODE
79
+ expect(eval_and_collect_notices(code)).to eq(['Sensitive [value redacted]', 'Sensitive[String]'])
80
+ end
81
+
82
+ it 'matches the appropriate parameterized type' do
83
+ code =<<-CODE
84
+ $o = Sensitive("hunter2")
85
+ notice(assert_type(Sensitive[String], $o))
86
+ notice(assert_type(Sensitive[String[7, 7]], $o))
87
+ CODE
88
+ expect(eval_and_collect_notices(code)).to eq(['Sensitive [value redacted]', 'Sensitive [value redacted]'])
89
+ end
90
+
91
+ it 'verifies the constrains of the parameterized type' do
92
+ pending "the ability to enforce constraints without leaking information"
93
+ code =<<-CODE
94
+ $o = Sensitive("hunter2")
95
+ notice(assert_type(Sensitive[String[10, 20]], $o))
96
+ CODE
97
+ expect {
98
+ eval_and_collect_notices(code)
99
+ }.to raise_error(Puppet::Error, /expected a Sensitive\[String\[10, 20\]\] value, got Sensitive\[String\[7, 7\]\]/)
100
+ end
101
+
102
+ it 'does not match an inappropriate parameterized type' do
103
+ code =<<-CODE
104
+ $o = Sensitive("hunter2")
105
+ notice(assert_type(Sensitive[Integer], $o) |$expected, $actual| {
106
+ "$expected != $actual"
107
+ })
108
+ CODE
109
+ expect(eval_and_collect_notices(code)).to eq(['Sensitive[Integer] != Sensitive[String]'])
110
+ end
111
+
112
+ it 'can be created from another sensitive instance ' do
113
+ code =<<-CODE
114
+ $o = Sensitive("hunter2")
115
+ $x = Sensitive($o)
116
+ notice(assert_type(Sensitive[String], $x))
117
+ CODE
118
+ expect(eval_and_collect_notices(code)).to eq(['Sensitive [value redacted]'])
119
+ end
120
+ end
121
+
122
+ it "enforces wrapped type constraints" do
123
+ pending "the ability to enforce constraints without leaking information"
124
+ code =<<-CODE
125
+ class secrets_handler(Sensitive[Array[String[4, 8]]] $pwlist) {
126
+ notice($pwlist)
127
+ }
128
+
129
+ class { "secrets_handler":
130
+ pwlist => Sensitive(['hi', 'longlonglong'])
131
+ }
132
+ CODE
133
+ expect {
134
+ expect(eval_and_collect_notices(code))
135
+ }.to raise_error(Puppet::Error, /expects a String\[4, 8\], got String/)
136
+ end
137
+ end
138
+ end
139
+ end