puppet 4.5.3-x86-mingw32 → 4.6.1-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 (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
@@ -792,7 +792,7 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
792
792
  Puppet.override({:global_scope => scope,
793
793
  :environments => Puppet::Environments::Static.new(@node.environment)
794
794
  }, "gets class parameter test") do
795
- scope.known_resource_types.import_ast(ast, '')
795
+ scope.environment.known_resource_types.import_ast(ast, '')
796
796
  expect(ast.code.safeevaluate(scope)).to eq('chocolate')
797
797
  end
798
798
  end
@@ -114,6 +114,6 @@ Puppet::Functions.create_function('testmodule::foo') {
114
114
  end
115
115
 
116
116
  def typed_name(type, name)
117
- Puppet::Pops::Loader::Loader::TypedName.new(type, name)
117
+ Puppet::Pops::Loader::TypedName.new(type, name)
118
118
  end
119
119
  end
@@ -7,7 +7,7 @@ describe 'loader paths' do
7
7
  include PuppetSpec::Files
8
8
 
9
9
  let(:static_loader) { Puppet::Pops::Loader::StaticLoader.new() }
10
- let(:unused_loaders) { nil }
10
+ let(:unused_loaders) { Puppet::Pops::Loaders.new(Puppet::Node::Environment.create(:'*test*', [])) }
11
11
 
12
12
  it 'module loader has smart-paths that prunes unavailable paths' do
13
13
  module_dir = dir_containing('testmodule', {'lib' => {'puppet' => {'functions' =>
@@ -15,7 +15,7 @@ describe 'loader helper classes' do
15
15
  end
16
16
 
17
17
  it 'TypedName holds values and is frozen' do
18
- tn = Puppet::Pops::Loader::Loader::TypedName.new(:function, '::foo::bar')
18
+ tn = Puppet::Pops::Loader::TypedName.new(:function, '::foo::bar')
19
19
  expect(tn.frozen?).to be_truthy
20
20
  expect(tn.type).to eq(:function)
21
21
  expect(tn.name_parts).to eq(['foo', 'bar'])
@@ -33,6 +33,7 @@ describe 'loaders' do
33
33
  let(:mix_4x_and_3x_functions) { config_dir('mix_4x_and_3x_functions') }
34
34
  let(:module_with_metadata) { File.join(config_dir('single_module'), 'modules') }
35
35
  let(:dependent_modules_with_metadata) { config_dir('dependent_modules_with_metadata') }
36
+ let(:no_modules) { config_dir('no_modules') }
36
37
  let(:user_metadata_path) { File.join(dependent_modules_with_metadata, 'modules/user/metadata.json') }
37
38
 
38
39
  let(:empty_test_env) { environment_for() }
@@ -40,6 +41,42 @@ describe 'loaders' do
40
41
  # Loaders caches the puppet_system_loader, must reset between tests
41
42
  before(:each) { Puppet::Pops::Loaders.clear() }
42
43
 
44
+ context 'when loading pp resource types using auto loading' do
45
+ let(:pp_resources) { config_dir('pp_resources') }
46
+ let(:environments) { Puppet::Environments::Directories.new(my_fixture_dir, []) }
47
+ let(:env) { Puppet::Node::Environment.create(:'pp_resources', [File.join(pp_resources, 'modules')]) }
48
+ let(:scope) { Puppet::Parser::Compiler.new(Puppet::Node.new("test", :environment => env)).newscope(nil) }
49
+ let(:loader) { Puppet::Pops::Loaders.loaders.find_loader(nil) }
50
+ around(:each) do |example|
51
+ Puppet.override(:environments => environments, :current_environment => scope.environment, :global_scope => scope) do
52
+ Puppet.override(:loaders => Puppet::Pops::Loaders.new(env)) do
53
+ example.run
54
+ end
55
+ end
56
+ end
57
+
58
+ it 'finds a resource type that resides under <environment root>/.resource_types' do
59
+ rt = loader.load(:resource_type_pp, 'myresource')
60
+ expect(rt).to be_a(Puppet::Pops::Resource::ResourceTypeImpl)
61
+ end
62
+
63
+ it 'does not allow additional logic in the file' do
64
+ expect{loader.load(:resource_type_pp, 'addlogic')}.to raise_error(ArgumentError, /it has additional logic/)
65
+ end
66
+
67
+ it 'does not allow creation of classes other than Puppet::Resource::ResourceType3' do
68
+ expect{loader.load(:resource_type_pp, 'badcall')}.to raise_error(ArgumentError, /no call to Puppet::Resource::ResourceType3.new found/)
69
+ end
70
+
71
+ it 'does not allow creation of other types' do
72
+ expect{loader.load(:resource_type_pp, 'wrongname')}.to raise_error(ArgumentError, /produced resource type with the wrong name, expected 'wrongname', actual 'notwrongname'/)
73
+ end
74
+
75
+ it 'errors with message about empty file for files that contain no logic' do
76
+ expect{loader.load(:resource_type_pp, 'empty')}.to raise_error(ArgumentError, /it is empty/)
77
+ end
78
+ end
79
+
43
80
  it 'creates a puppet_system loader' do
44
81
  loaders = Puppet::Pops::Loaders.new(empty_test_env)
45
82
  expect(loaders.puppet_system_loader()).to be_a(Puppet::Pops::Loader::ModuleLoaders::FileBased)
@@ -51,7 +88,7 @@ describe 'loaders' do
51
88
  expect(loaders.public_environment_loader()).to be_a(Puppet::Pops::Loader::SimpleEnvironmentLoader)
52
89
  expect(loaders.public_environment_loader().to_s).to eql("(SimpleEnvironmentLoader 'environment:*test*')")
53
90
  expect(loaders.private_environment_loader()).to be_a(Puppet::Pops::Loader::DependencyLoader)
54
- expect(loaders.private_environment_loader().to_s).to eql("(DependencyLoader 'environment' [])")
91
+ expect(loaders.private_environment_loader().to_s).to eql("(DependencyLoader 'environment private' [])")
55
92
  end
56
93
 
57
94
  context 'when loading from a module' do
@@ -200,7 +237,7 @@ describe 'loaders' do
200
237
  expect(resource['message']).to eq(desc[:expects])
201
238
  end
202
239
 
203
- it 'can not call ruby function in a dependent module from outside a function if dependency is missing in existing metadata.json' do
240
+ it "can not call #{desc[:called]} from #{desc[:from]} if dependency is missing in existing metadata.json" do
204
241
  File.stubs(:read).with(user_metadata_path, {:encoding => 'utf-8'}).returns user_metadata.merge('dependencies' => []).to_pson
205
242
  Puppet[:code] = "$case_number = #{case_number}\ninclude ::user"
206
243
  expect { catalog = compiler.compile }.to raise_error(Puppet::Error, /Unknown function/)
@@ -274,6 +311,28 @@ describe 'loaders' do
274
311
  end
275
312
  end
276
313
 
314
+ context 'when loading from an environment without modules' do
315
+ let(:node) { Puppet::Node.new('test', :facts => Puppet::Node::Facts.new('facts', {}), :environment => 'no_modules') }
316
+
317
+ it 'can load the same function twice with two different compilations and produce different values' do
318
+ Puppet.settings.initialize_global_settings
319
+ environments = Puppet::Environments::Directories.new(my_fixture_dir, [])
320
+ Puppet.override(:environments => environments) do
321
+ compiler = Puppet::Parser::Compiler.new(node)
322
+ compiler.topscope['value_from_scope'] = 'first'
323
+ catalog = compiler.compile
324
+ expect(catalog.resource('Notify[first]')).to be_a(Puppet::Resource)
325
+
326
+ Puppet::Pops::Loader::RubyFunctionInstantiator.expects(:create).never
327
+ compiler = Puppet::Parser::Compiler.new(node)
328
+ compiler.topscope['value_from_scope'] = 'second'
329
+ catalog = compiler.compile
330
+ expect(catalog.resource('Notify[first]')).to be_nil
331
+ expect(catalog.resource('Notify[second]')).to be_a(Puppet::Resource)
332
+ end
333
+ end
334
+ end
335
+
277
336
  context 'when calling' do
278
337
  let(:env) { environment_for(mix_4x_and_3x_functions) }
279
338
  let(:scope) { Puppet::Parser::Compiler.new(Puppet::Node.new("test", :environment => env)).newscope(nil) }
@@ -314,13 +373,12 @@ describe 'loaders' do
314
373
  end
315
374
  end
316
375
 
317
-
318
376
  def environment_for(*module_paths)
319
377
  Puppet::Node::Environment.create(:'*test*', module_paths)
320
378
  end
321
379
 
322
380
  def typed_name(type, name)
323
- Puppet::Pops::Loader::Loader::TypedName.new(type, name)
381
+ Puppet::Pops::Loader::TypedName.new(type, name)
324
382
  end
325
383
 
326
384
  def config_dir(config_name)
@@ -58,7 +58,7 @@ describe 'FileBased module loader' do
58
58
  end
59
59
 
60
60
  it 'system loader has itself as private loader' do
61
- module_loader = Puppet::Pops::Loader::ModuleLoaders.system_loader_from(static_loader, loaders)
61
+ module_loader = loaders.puppet_system_loader
62
62
  expect(module_loader.private_loader).to be(module_loader)
63
63
  end
64
64
 
@@ -90,6 +90,6 @@ describe 'FileBased module loader' do
90
90
  end
91
91
 
92
92
  def typed_name(type, name)
93
- Puppet::Pops::Loader::Loader::TypedName.new(type, name)
93
+ Puppet::Pops::Loader::TypedName.new(type, name)
94
94
  end
95
95
  end
@@ -121,7 +121,7 @@ describe 'the static loader' do
121
121
  end
122
122
 
123
123
  def typed_name(type, name)
124
- Puppet::Pops::Loader::Loader::TypedName.new(type, name)
124
+ Puppet::Pops::Loader::TypedName.new(type, name)
125
125
  end
126
126
 
127
127
  def resource_type(name)
@@ -25,7 +25,7 @@ describe 'Lexer2' do
25
25
  :RBRACK => ']',
26
26
  :LBRACE => '{',
27
27
  :RBRACE => '}',
28
- :LPAREN => '(',
28
+ :WSLPAREN => '(', # since it is first on a line it is special (LPAREN handled separately)
29
29
  :RPAREN => ')',
30
30
  :EQUALS => '=',
31
31
  :ISEQUAL => '==',
@@ -301,12 +301,32 @@ describe 'Lexer2' do
301
301
  expect(tokens_scanned_from("$a [1]")).to match_tokens2(:VARIABLE, :LISTSTART, :NUMBER, :RBRACK)
302
302
  expect(tokens_scanned_from("a[1]")).to match_tokens2(:NAME, :LBRACK, :NUMBER, :RBRACK)
303
303
  expect(tokens_scanned_from("a [1]")).to match_tokens2(:NAME, :LISTSTART, :NUMBER, :RBRACK)
304
- expect(tokens_scanned_from(" if \n\r\t\nif if ")).to match_tokens2(:IF, :IF, :IF)
304
+ end
305
+
306
+ it "differentiates between '(' first on line, and not first on line" do
307
+ expect(tokens_scanned_from("(")).to match_tokens2(:WSLPAREN)
308
+ expect(tokens_scanned_from("\n(")).to match_tokens2(:WSLPAREN)
309
+ expect(tokens_scanned_from("\n\r(")).to match_tokens2(:WSLPAREN)
310
+ expect(tokens_scanned_from("\n\t(")).to match_tokens2(:WSLPAREN)
311
+ expect(tokens_scanned_from("\n\r\t(")).to match_tokens2(:WSLPAREN)
312
+ expect(tokens_scanned_from("\n\u00a0(")).to match_tokens2(:WSLPAREN)
313
+
314
+ expect(tokens_scanned_from("x(")).to match_tokens2(:NAME, :LPAREN)
315
+ expect(tokens_scanned_from("\nx(")).to match_tokens2(:NAME, :LPAREN)
316
+ expect(tokens_scanned_from("\n\rx(")).to match_tokens2(:NAME, :LPAREN)
317
+ expect(tokens_scanned_from("\n\tx(")).to match_tokens2(:NAME, :LPAREN)
318
+ expect(tokens_scanned_from("\n\r\tx(")).to match_tokens2(:NAME, :LPAREN)
319
+ expect(tokens_scanned_from("\n\u00a0x(")).to match_tokens2(:NAME, :LPAREN)
320
+
321
+ expect(tokens_scanned_from("x (")).to match_tokens2(:NAME, :LPAREN)
322
+ expect(tokens_scanned_from("x\t(")).to match_tokens2(:NAME, :LPAREN)
323
+ expect(tokens_scanned_from("x\u00a0(")).to match_tokens2(:NAME, :LPAREN)
305
324
  end
306
325
 
307
326
  it "skips whitepsace" do
308
327
  expect(tokens_scanned_from(" if if if ")).to match_tokens2(:IF, :IF, :IF)
309
328
  expect(tokens_scanned_from(" if \n\r\t\nif if ")).to match_tokens2(:IF, :IF, :IF)
329
+ expect(tokens_scanned_from(" if \n\r\t\n\u00a0if\u00a0 if ")).to match_tokens2(:IF, :IF, :IF)
310
330
  end
311
331
 
312
332
  it "skips single line comments" do
@@ -331,7 +351,11 @@ describe 'Lexer2' do
331
351
  { "=~" => [:MATCH, "=~ /./"],
332
352
  "!~" => [:NOMATCH, "!~ /./"],
333
353
  "," => [:COMMA, ", /./"],
334
- "(" => [:LPAREN, "( /./"],
354
+
355
+ "(" => [:WSLPAREN, "( /./"],
356
+ "x (" => [[:NAME, :LPAREN], "x ( /./"],
357
+ "x\\t (" => [[:NAME, :LPAREN], "x\t ( /./"],
358
+
335
359
  "[ (liststart)" => [:LISTSTART, "[ /./"],
336
360
  "[ (LBRACK)" => [[:NAME, :LBRACK], "a[ /./"],
337
361
  "[ (liststart after name)" => [[:NAME, :LISTSTART], "a [ /./"],
@@ -307,5 +307,13 @@ describe "egrammar parsing basic expressions" do
307
307
  expect(dump(parse("$a = \"yo${var.foo}yo\""))).to eq("(= $a (cat 'yo' (str (call-method (. $var foo))) 'yo'))")
308
308
  expect(dump(parse("$a = \"yo${var.foo.bar}yo\""))).to eq("(= $a (cat 'yo' (str (call-method (. (call-method (. $var foo)) bar))) 'yo'))")
309
309
  end
310
+
311
+ it "should interpolate interpolated expressions with a variable, \"yo${\"$var\"}yo\"" do
312
+ expect(dump(parse("$a = \"yo${\"$var\"}yo\""))).to eq("(= $a (cat 'yo' (str (cat '' (str $var) '')) 'yo'))")
313
+ end
314
+
315
+ it "should interpolate interpolated expressions with an expression, \"yo${\"${$var+2}\"}yo\"" do
316
+ expect(dump(parse("$a = \"yo${\"${$var+2}\"}yo\""))).to eq("(= $a (cat 'yo' (str (cat '' (str (+ $var 2)) '')) 'yo'))")
317
+ end
310
318
  end
311
319
  end
@@ -45,6 +45,11 @@ describe "egrammar parsing function calls" do
45
45
  it "notice type(42)" do
46
46
  expect(dump(parse("notice type(42)"))).to eq('(invoke notice (call type 42))')
47
47
  end
48
+
49
+ it "is required to place the '(' on the same line as the name of the function to recognize it as arguments in call" do
50
+ expect(dump(parse("notice foo\n(42)"))).to eq("(block\n (invoke notice foo)\n 42\n)")
51
+ end
52
+
48
53
  end
49
54
 
50
55
  context "in nested scopes" do
@@ -111,6 +116,10 @@ describe "egrammar parsing function calls" do
111
116
  it "notice 42.type(detailed)" do
112
117
  expect(dump(parse("notice 42.type(detailed)"))).to eq('(invoke notice (call-method (. 42 type) detailed))')
113
118
  end
119
+
120
+ it "is required to place the '(' on the same line as the name of the method to recognize it as arguments in call" do
121
+ expect(dump(parse("notice 42.type\n(detailed)"))).to eq("(block\n (invoke notice (call-method (. 42 type)))\n detailed\n)")
122
+ end
114
123
  end
115
124
 
116
125
  context "When parsing an illegal argument list" do
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/pops'
4
+
5
+ describe 'Puppet::Pops::PuppetStack' do
6
+ class StackTraceTest
7
+ def get_stacktrace
8
+ Puppet::Pops::PuppetStack.stacktrace
9
+ end
10
+
11
+ def one_level
12
+ Puppet::Pops::PuppetStack.stack("one_level.pp", 1234, self, :get_stacktrace, [])
13
+ end
14
+
15
+ def one_level
16
+ Puppet::Pops::PuppetStack.stack("one_level.pp", 1234, self, :get_stacktrace, [])
17
+ end
18
+
19
+ def two_levels
20
+ Puppet::Pops::PuppetStack.stack("two_levels.pp", 1237, self, :level2, [])
21
+ end
22
+
23
+ def level2
24
+ Puppet::Pops::PuppetStack.stack("level2.pp", 1240, self, :get_stacktrace, [])
25
+ end
26
+
27
+ def gets_block(a, &block)
28
+ block.call(a)
29
+ end
30
+
31
+ def gets_args_and_block(a, b, &block)
32
+ block.call(a, b)
33
+ end
34
+
35
+ def with_nil_file
36
+ Puppet::Pops::PuppetStack.stack(nil, 1250, self, :get_stacktrace, [])
37
+ end
38
+
39
+ def with_empty_string_file
40
+ Puppet::Pops::PuppetStack.stack('', 1251, self, :get_stacktrace, [])
41
+ end
42
+ end
43
+
44
+ it 'returns an empty array from stacktrace when there is nothing on the stack' do
45
+ expect(Puppet::Pops::PuppetStack.stacktrace).to eql([])
46
+ end
47
+
48
+ it 'returns a one element array with file, line from stacktrace when there is one entry on the stack' do
49
+ expect(StackTraceTest.new.one_level).to eql([['one_level.pp', 1234]])
50
+ end
51
+
52
+ it 'returns an array from stacktrace with information about each level with oldest frame last' do
53
+ expect(StackTraceTest.new.two_levels).to eql([['two_levels.pp', 1237], ['level2.pp', 1240]])
54
+ end
55
+
56
+ it 'accepts file to be nil' do
57
+ expect(StackTraceTest.new.with_nil_file).to eql([['unknown', 1250]])
58
+ end
59
+
60
+ it 'accepts file to be empty_string' do
61
+ expect(StackTraceTest.new.with_empty_string_file).to eql([['unknown', 1251]])
62
+ end
63
+
64
+ it 'stacktrace is empty when call has returned' do
65
+ StackTraceTest.new.two_levels
66
+ expect(Puppet::Pops::PuppetStack.stacktrace).to eql([])
67
+ end
68
+
69
+ it 'allows passing a block to the stack call' do
70
+ expect(Puppet::Pops::PuppetStack.stack("test.pp", 1, StackTraceTest.new, :gets_block, ['got_it']) {|x| x }).to eql('got_it')
71
+ end
72
+
73
+ it 'allows passing multiple variables and a block' do
74
+ expect(
75
+ Puppet::Pops::PuppetStack.stack("test.pp", 1, StackTraceTest.new, :gets_args_and_block, ['got_it', 'again']) {|x, y| [x,y].join(' ')}
76
+ ).to eql('got_it again')
77
+ end
78
+
79
+ end
@@ -0,0 +1,37 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/pops'
4
+ require 'puppet_spec/compiler'
5
+
6
+ module Puppet::Pops
7
+ module Resource
8
+ describe "Puppet::Pops::Resource" do
9
+ include PuppetSpec::Compiler
10
+
11
+ let!(:pp_parser) { Parser::EvaluatingParser.new }
12
+ let(:loader) { Loader::BaseLoader.new(nil, 'type_parser_unit_test_loader') }
13
+ let(:factory) { TypeFactory }
14
+
15
+ context 'when creating resources' do
16
+ let!(:resource_type) { ResourceTypeImpl._ptype }
17
+
18
+ it 'can create an instance of a ResourceType' do
19
+ code = <<-CODE
20
+ $rt = Puppet::Resource::ResourceType3.new('notify', [], [Puppet::Resource::Param.new(String, 'message')])
21
+ assert_type(Puppet::Resource::ResourceType3, $rt)
22
+ notice('looks like we made it')
23
+ CODE
24
+ rt = nil
25
+ notices = eval_and_collect_notices(code) do |scope, _|
26
+ rt = scope['rt']
27
+ end
28
+ expect(notices).to eq(['looks like we made it'])
29
+ expect(rt).to be_a(ResourceTypeImpl)
30
+ expect(rt.valid_parameter?(:nonesuch)).to be_falsey
31
+ expect(rt.valid_parameter?(:message)).to be_truthy
32
+ expect(rt.valid_parameter?(:loglevel)).to be_truthy
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops/serialization'
3
+
4
+ module Puppet::Pops::Serialization
5
+ [JSON].each do |packer_module|
6
+ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
7
+ let(:io) { StringIO.new }
8
+ let(:reader_class) { packer_module::Reader }
9
+ let(:writer_class) { packer_module::Writer }
10
+
11
+ def write(*values)
12
+ io.reopen
13
+ serializer = writer_class.new(io)
14
+ values.each { |val| serializer.write(val) }
15
+ serializer.finish
16
+ io.rewind
17
+ end
18
+
19
+ def read(count = nil)
20
+ @deserializer = reader_class.new(io)
21
+ count.nil? ? @deserializer.read : Array.new(count) { @deserializer.read }
22
+ end
23
+
24
+ context 'can write and read a Scalar' do
25
+ it 'String' do
26
+ val = 'the value'
27
+ write(val)
28
+ val2 = read
29
+ expect(val2).to be_a(String)
30
+ expect(val2).to eql(val)
31
+ end
32
+
33
+ it 'positive Integer' do
34
+ val = 2**63-1
35
+ write(val)
36
+ val2 = read
37
+ expect(val2).to be_a(Integer)
38
+ expect(val2).to eql(val)
39
+ end
40
+
41
+ it 'negative Integer' do
42
+ val = -2**63
43
+ write(val)
44
+ val2 = read
45
+ expect(val2).to be_a(Integer)
46
+ expect(val2).to eql(val)
47
+ end
48
+
49
+ it 'Float' do
50
+ val = 32.45
51
+ write(val)
52
+ val2 = read
53
+ expect(val2).to be_a(Float)
54
+ expect(val2).to eql(val)
55
+ end
56
+
57
+ it 'true' do
58
+ val = true
59
+ write(val)
60
+ val2 = read
61
+ expect(val2).to be_a(TrueClass)
62
+ expect(val2).to eql(val)
63
+ end
64
+
65
+ it 'false' do
66
+ val = false
67
+ write(val)
68
+ val2 = read
69
+ expect(val2).to be_a(FalseClass)
70
+ expect(val2).to eql(val)
71
+ end
72
+
73
+ it 'nil' do
74
+ val = nil
75
+ write(val)
76
+ val2 = read
77
+ expect(val2).to be_a(NilClass)
78
+ expect(val2).to eql(val)
79
+ end
80
+
81
+ it 'Regexp' do
82
+ val = /match me/
83
+ write(val)
84
+ val2 = read
85
+ expect(val2).to be_a(Regexp)
86
+ expect(val2).to eql(val)
87
+ end
88
+
89
+ it 'Time created by TimeFactory' do
90
+ val = TimeFactory.now
91
+ write(val)
92
+ val2 = read
93
+ expect(val2).to be_a(Time)
94
+ expect(val2).to eql(val)
95
+ end
96
+
97
+ it 'Version' do
98
+ val = Semantic::Version.parse('1.2.3-alpha2')
99
+ write(val)
100
+ val2 = read
101
+ expect(val2).to be_a(Semantic::Version)
102
+ expect(val2).to eql(val)
103
+ end
104
+
105
+ it 'VersionRange' do
106
+ val = Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
107
+ write(val)
108
+ val2 = read
109
+ expect(val2).to be_a(Semantic::VersionRange)
110
+ expect(val2).to eql(val)
111
+ end
112
+
113
+ it 'will never fail write and read of Time created by TimeFactory' do
114
+ val = Time.now
115
+ val = TimeFactory.at(val.tv_sec, val.tv_nsec / 1000 + 0.123)
116
+ write(val)
117
+ val2 = read
118
+ expect(val).to eq(val2)
119
+ end
120
+
121
+ # Windows doesn't seem ot have fine enough granularity to provoke the problem
122
+ it 'will fail on Time not created by TimeFactory' do
123
+ val = Time.now
124
+ val = Time.at(val.tv_sec, val.tv_nsec / 1000 + 0.123)
125
+ write(val)
126
+ val2 = read
127
+ expect(val).not_to eq(val2)
128
+ end
129
+ end
130
+
131
+ context 'will fail on attempts to write' do
132
+ it 'Integer larger than 2**63-1' do
133
+ expect { write(2**63) }.to raise_error(SerializationError, 'Integer out of bounds')
134
+ end
135
+
136
+ it 'Integer smaller than -2**63' do
137
+ expect { write(-2**63-1) }.to raise_error(SerializationError, 'Integer out of bounds')
138
+ end
139
+
140
+ it 'objects unknown to Puppet serialization' do
141
+ expect { write("".class) }.to raise_error(SerializationError, 'Unable to serialize a Class')
142
+ end
143
+ end
144
+
145
+ it 'should be able to write and read primitives using tabulation' do
146
+ val = 'the value'
147
+ write(val, val)
148
+ expect(read(2)).to eql([val, val])
149
+ expect(@deserializer.primitive_count).to eql(1)
150
+ end
151
+ end
152
+ end
153
+ end