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
data/spec/spec_helper.rb CHANGED
@@ -43,6 +43,10 @@ Pathname.glob("#{dir}/shared_behaviours/**/*.rb") do |behaviour|
43
43
  require behaviour.relative_path_from(Pathname.new(dir))
44
44
  end
45
45
 
46
+ Pathname.glob("#{dir}/shared_examples/**/*.rb") do |behaviour|
47
+ require behaviour.relative_path_from(Pathname.new(dir))
48
+ end
49
+
46
50
  require 'vcr'
47
51
  VCR.configure do |vcr|
48
52
  vcr.cassette_library_dir = File.expand_path('vcr/cassettes', PuppetSpec::FIXTURE_DIR)
@@ -68,8 +72,8 @@ RSpec.configure do |config|
68
72
 
69
73
  config.mock_with :mocha
70
74
 
71
- tmpdir = Dir.mktmpdir("rspecrun")
72
- oldtmpdir = Dir.tmpdir()
75
+ tmpdir = Puppet::FileSystem.expand_path(Dir.mktmpdir("rspecrun"))
76
+ oldtmpdir = Puppet::FileSystem.expand_path(Dir.tmpdir())
73
77
  ENV['TMPDIR'] = tmpdir
74
78
 
75
79
  if Puppet::Util::Platform.windows?
@@ -148,6 +152,8 @@ RSpec.configure do |config|
148
152
  Puppet[:rundir] = "$vardir/run"
149
153
  Puppet[:hiera_config] = File.join(base, 'hiera')
150
154
 
155
+ FileUtils.mkdir_p Puppet[:statedir]
156
+
151
157
  Puppet::Test::TestHelper.before_each_test()
152
158
  end
153
159
 
@@ -52,6 +52,26 @@ describe Puppet::Application::Cert => true do
52
52
  expect(@cert_app.signed).to be_truthy
53
53
  end
54
54
 
55
+ it "should set human to true for --human-readable" do
56
+ @cert_app.handle_human_readable(0)
57
+ expect(@cert_app.options[:format]).to be :human
58
+ end
59
+
60
+ it "should set machine to true for --machine-readable" do
61
+ @cert_app.handle_machine_readable(0)
62
+ expect(@cert_app.options[:format]).to be :machine
63
+ end
64
+
65
+ it "should set interactive to true for --interactive" do
66
+ @cert_app.handle_interactive(0)
67
+ expect(@cert_app.options[:interactive]).to be_truthy
68
+ end
69
+
70
+ it "should set yes to true for --assume-yes" do
71
+ @cert_app.handle_assume_yes(0)
72
+ expect(@cert_app.options[:yes]).to be_truthy
73
+ end
74
+
55
75
  Puppet::SSL::CertificateAuthority::Interface::INTERFACE_METHODS.reject { |m| m == :destroy }.each do |method|
56
76
  it "should set cert_mode to #{method} with option --#{method}" do
57
77
  @cert_app.send("handle_#{method}".to_sym, nil)
@@ -39,30 +39,4 @@ describe Puppet::Configurer::PluginHandler do
39
39
  expect(pluginhandler.download_plugins(environment)).to match_array(%w[/a /b])
40
40
  end
41
41
  end
42
-
43
- context "when external facts are not supported" do
44
- before :each do
45
- Puppet.features.stubs(:external_facts?).returns(false)
46
- end
47
-
48
- it "downloads plugins only" do
49
- plugin_downloader = stub('plugin-downloader', :evaluate => [])
50
-
51
- factory.expects(:create_plugin_downloader).returns(plugin_downloader)
52
- factory.expects(:create_plugin_facts_downloader).never
53
-
54
- pluginhandler.download_plugins(environment)
55
- end
56
-
57
- it "returns downloaded plugin filenames only" do
58
- Puppet.features.stubs(:external_facts?).returns(false)
59
-
60
- plugin_downloader = stub('plugin-downloader', :evaluate => %w[/a])
61
- facts_downloader = stub('facts-downloader')
62
-
63
- factory.expects(:create_plugin_downloader).returns(plugin_downloader)
64
-
65
- expect(pluginhandler.download_plugins(environment)).to match_array(%w[/a])
66
- end
67
- end
68
42
  end
@@ -920,4 +920,50 @@ describe Puppet::Configurer do
920
920
  expect(described_class).not_to be_should_pluginsync
921
921
  end
922
922
  end
923
+
924
+ describe "when attempting failover" do
925
+ it "should not failover if server_list is not set" do
926
+ Puppet.settings[:server_list] = []
927
+ @agent.expects(:find_functional_server).never
928
+ @agent.run
929
+ end
930
+
931
+ it "should not failover during an apply run" do
932
+ Puppet.settings[:server_list] = ["myserver:123"]
933
+ @agent.expects(:find_functional_server).never
934
+ catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
935
+ @agent.run :catalog => catalog
936
+ end
937
+
938
+ it "should select a server when provided" do
939
+ Puppet.settings[:server_list] = ["myserver:123"]
940
+ pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
941
+ Puppet::Network::HTTP::Pool.expects(:new).returns(pool)
942
+ Puppet.expects(:override).with({:http_pool => pool}).yields
943
+ Puppet.expects(:override).with({:server => "myserver", :serverport => '123'}).twice.yields
944
+ Puppet::Node.indirection.expects(:find).returns(nil)
945
+ @agent.expects(:run_internal).returns(nil)
946
+ @agent.run
947
+ end
948
+
949
+ it "should fallback to an empty server when failover fails" do
950
+ Puppet.settings[:server_list] = ["myserver:123"]
951
+ pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
952
+ Puppet::Network::HTTP::Pool.expects(:new).returns(pool)
953
+ Puppet.expects(:override).with({:http_pool => pool}).yields
954
+ Puppet.expects(:override).with({:server => "myserver", :serverport => '123'}).yields
955
+ Puppet.expects(:override).with({:server => nil, :serverport => nil}).yields
956
+ error = Net::HTTPError.new(400, 'dummy server communication error')
957
+ Puppet::Node.indirection.expects(:find).raises(error)
958
+ @agent.expects(:run_internal).returns(nil)
959
+ @agent.run
960
+ end
961
+
962
+ it "should not make multiple node requets when the server is found" do
963
+ Puppet.settings[:server_list] = ["myserver:123"]
964
+ Puppet::Node.indirection.expects(:find).returns("mynode").once
965
+ @agent.expects(:prepare_and_retrieve_catalog).returns(nil)
966
+ @agent.run
967
+ end
968
+ end
923
969
  end
@@ -104,4 +104,18 @@ describe "Defaults" do
104
104
  expect(Puppet.settings[:supported_checksum_types]).to eq(['sha256', 'md5lite', 'mtime'])
105
105
  end
106
106
  end
107
+
108
+ describe 'server vs server_list' do
109
+ it 'should warn when both settings are set in code' do
110
+ Puppet.expects(:deprecation_warning).with('Attempted to set both server and server_list. Server setting will not be used.', :SERVER_DUPLICATION)
111
+ Puppet.settings[:server] = 'test_server'
112
+ Puppet.settings[:server_list] = ['one', 'two']
113
+ end
114
+
115
+ it 'should warn when both settings are set by command line' do
116
+ Puppet.expects(:deprecation_warning).with('Attempted to set both server and server_list. Server setting will not be used.', :SERVER_DUPLICATION)
117
+ Puppet.settings.handlearg("--server_list", "one,two")
118
+ Puppet.settings.handlearg("--server", "test_server")
119
+ end
120
+ end
107
121
  end
@@ -0,0 +1,230 @@
1
+ require 'spec_helper'
2
+ require 'puppet_spec/files'
3
+
4
+ require 'puppet/face'
5
+
6
+ describe Puppet::Face[:generate, :current] do
7
+ include PuppetSpec::Files
8
+
9
+ let(:genface) { Puppet::Face[:generate, :current] }
10
+
11
+ # * Format is 'pcore' by default
12
+ # * Format is accepted as 'pcore'
13
+ # * Any format expect 'pcore' is an error
14
+ # * Produces output to '<envroot>/.resource_types'
15
+ # * Produces all types found on the module path (that are not in puppet core)
16
+ # * Output files match input
17
+ # * Removes files for which there is no input
18
+ # * Updates a pcore file if it is out of date
19
+ # * The --force flag overwrite the output even if it is up to date
20
+ # * Environment is set with --environment (setting) (not tested explicitly)
21
+ # Writes output for:
22
+ # - isomorphic
23
+ # - parameters
24
+ # - properties
25
+ # - title patterns
26
+ # - type information is written when the type is X, Y, or Z
27
+ #
28
+ # Additional features
29
+ # - blacklist? whitelist? types to exclude/include
30
+ # - generate one resource type (somewhere on modulepath)
31
+ # - output to directory of choice
32
+ # - clean, clean the output directory (similar to force)
33
+ #
34
+
35
+ [:types].each do |action|
36
+ it { is_expected.to be_action(action) }
37
+ it { is_expected.to respond_to(action) }
38
+ end
39
+
40
+ context "when used from an interactive terminal" do
41
+ before :each do
42
+ from_an_interactive_terminal
43
+ end
44
+
45
+ context "in an environment with two modules containing resource types" do
46
+ let(:dir) do
47
+ dir_containing('environments', { 'testing_generate' => {
48
+ 'environment.conf' => "modulepath = modules",
49
+ 'manifests' => { 'site.pp' => "" },
50
+ 'modules' => {
51
+ 'm1' => {
52
+ 'lib' => { 'puppet' => { 'type' => {
53
+ 'test1.rb' => <<-EOF
54
+ module Puppet
55
+ Type.newtype(:test1) do
56
+ @doc = "Docs for resource"
57
+ newproperty(:message) do
58
+ desc "Docs for 'message' property"
59
+ end
60
+ newparam(:name) do
61
+ desc "Docs for 'name' parameter"
62
+ isnamevar
63
+ end
64
+ end; end
65
+ EOF
66
+ } }
67
+ },
68
+ },
69
+ 'm2' => {
70
+ 'lib' => { 'puppet' => { 'type' => {
71
+ 'test2.rb' => <<-EOF
72
+ module Puppet
73
+ Type.newtype(:test2) do
74
+ @doc = "Docs for resource"
75
+ newproperty(:message) do
76
+ desc "Docs for 'message' property"
77
+ end
78
+ newparam(:name) do
79
+ desc "Docs for 'name' parameter"
80
+ isnamevar
81
+ end
82
+ end;end
83
+ EOF
84
+ } } },
85
+ }
86
+ }}})
87
+ end
88
+
89
+ let(:modulepath) do
90
+ File.join(dir, 'testing_generate', 'modules')
91
+ end
92
+
93
+ let(:m1) do
94
+ File.join(modulepath, 'm1')
95
+ end
96
+
97
+ let(:m2) do
98
+ File.join(modulepath, 'm2')
99
+ end
100
+
101
+ let(:outputdir) do
102
+ File.join(dir, 'testing_generate', '.resource_types')
103
+ end
104
+
105
+ around(:each) do |example|
106
+ Puppet.settings.initialize_global_settings
107
+ Puppet[:manifest] = ''
108
+ loader = Puppet::Environments::Directories.new(dir, [])
109
+ Puppet.override(:environments => loader) do
110
+ Puppet.override(:current_environment => loader.get('testing_generate')) do
111
+ example.run
112
+ end
113
+ end
114
+ end
115
+
116
+ it 'error if format is given as something other than pcore' do
117
+ expect {
118
+ genface.types(:format => 'json')
119
+ }.to raise_exception(ArgumentError, /'json' is not a supported format for type generation/)
120
+ end
121
+
122
+ it 'accepts --format pcore as a format' do
123
+ expect {
124
+ genface.types(:format => 'pcore')
125
+ }.not_to raise_error
126
+ end
127
+
128
+ it 'sets pcore as the default format' do
129
+ Puppet::Generate::Type.expects(:find_inputs).with(:pcore).returns([])
130
+ genface.types()
131
+ end
132
+
133
+ it 'finds all files to generate types for' do
134
+ # using expects and returning what the side effect should have been
135
+ # (There is no way to call the original when mocking expected parameters).
136
+ input1 = Puppet::Generate::Type::Input.new(m1, File.join(m1, 'lib', 'puppet', 'type', 'test1.rb'), :pcore)
137
+ input2 = Puppet::Generate::Type::Input.new(m1, File.join(m2, 'lib', 'puppet', 'type', 'test2.rb'), :pcore)
138
+ Puppet::Generate::Type::Input.expects(:new).with(m1, File.join(m1, 'lib', 'puppet', 'type', 'test1.rb'), :pcore).returns(input1)
139
+ Puppet::Generate::Type::Input.expects(:new).with(m2, File.join(m2, 'lib', 'puppet', 'type', 'test2.rb'), :pcore).returns(input2)
140
+ genface.types
141
+ end
142
+
143
+ it 'creates output directory <env>/.resource_types/ if it does not exist' do
144
+ expect(Puppet::FileSystem.exist?(outputdir)).to be(false)
145
+ genface.types
146
+ expect(Puppet::FileSystem.dir_exist?(outputdir)).to be(true)
147
+ end
148
+
149
+ it 'creates output with matching names for each input' do
150
+ expect(Puppet::FileSystem.exist?(outputdir)).to be(false)
151
+ genface.types
152
+ children = Puppet::FileSystem.children(outputdir).map {|p| Puppet::FileSystem.basename_string(p) }
153
+ expect(children.sort).to eql(['test1.pp', 'test2.pp'])
154
+ end
155
+
156
+ it 'tolerates that <env>/.resource_types/ directory exists' do
157
+ Puppet::FileSystem.mkpath(outputdir)
158
+ expect(Puppet::FileSystem.exist?(outputdir)).to be(true)
159
+ genface.types
160
+ expect(Puppet::FileSystem.dir_exist?(outputdir)).to be(true)
161
+ end
162
+
163
+ it 'errors if <env>/.resource_types exists and is not a directory' do
164
+ expect(Puppet::FileSystem.exist?(outputdir)).to be(false) # assert it is not already there
165
+ Puppet::FileSystem.touch(outputdir)
166
+ expect(Puppet::FileSystem.exist?(outputdir)).to be(true)
167
+ expect(Puppet::FileSystem.directory?(outputdir)).to be(false)
168
+ expect {
169
+ genface.types
170
+ }.to raise_error(ArgumentError, /The output directory '#{outputdir}' exists and is not a directory/)
171
+ end
172
+
173
+ it 'does not overwrite if files exists and are up to date' do
174
+ # create them (first run)
175
+ genface.types
176
+ stats_before = [Puppet::FileSystem.stat(File.join(outputdir, 'test1.pp')), Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))]
177
+ # generate again
178
+ genface.types
179
+ stats_after = [Puppet::FileSystem.stat(File.join(outputdir, 'test1.pp')), Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))]
180
+ expect(stats_before <=> stats_after).to be(0)
181
+ end
182
+
183
+ it 'overwrites if files exists that are not up to date while keeping up to date files' do
184
+ # create them (first run)
185
+ genface.types
186
+ stats_before = [Puppet::FileSystem.stat(File.join(outputdir, 'test1.pp')), Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))]
187
+ # fake change in input test1 - sorry about the sleep (which there was a better way to change the modtime
188
+ sleep(1)
189
+ Puppet::FileSystem.touch(File.join(m1, 'lib', 'puppet', 'type', 'test1.rb'))
190
+ # generate again
191
+ genface.types
192
+ # assert that test1 was overwritten (later) but not test2 (same time)
193
+ stats_after = [Puppet::FileSystem.stat(File.join(outputdir, 'test1.pp')), Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))]
194
+ expect(stats_before[1] <=> stats_after[1]).to be(0)
195
+ expect(stats_before[0] <=> stats_after[0]).to be(-1)
196
+ end
197
+
198
+ it 'overwrites all files when called with --force' do
199
+ # create them (first run)
200
+ genface.types
201
+ stats_before = [Puppet::FileSystem.stat(File.join(outputdir, 'test1.pp')), Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))]
202
+ # generate again
203
+ sleep(1) # sorry, if there is no delay the stats will be the same
204
+ genface.types(:force => true)
205
+ stats_after = [Puppet::FileSystem.stat(File.join(outputdir, 'test1.pp')), Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))]
206
+ expect(stats_before <=> stats_after).to be(-1)
207
+ end
208
+
209
+ it 'removes previously generated files from output when there is no input for it' do
210
+ # create them (first run)
211
+ genface.types
212
+ stat_before = Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))
213
+ # remove input
214
+ Puppet::FileSystem.unlink(File.join(m1, 'lib', 'puppet', 'type', 'test1.rb'))
215
+ # generate again
216
+ genface.types
217
+ # assert that test1 was deleted but not test2 (same time)
218
+ expect(Puppet::FileSystem.exist?(File.join(outputdir, 'test1.pp'))).to be(false)
219
+ stats_after = Puppet::FileSystem.stat(File.join(outputdir, 'test2.pp'))
220
+ expect(stat_before <=> stats_after).to be(0)
221
+ end
222
+
223
+ end
224
+ end
225
+
226
+ def from_an_interactive_terminal
227
+ STDIN.stubs(:tty?).returns(true)
228
+ end
229
+
230
+ end
@@ -48,6 +48,24 @@ describe Puppet::Face[:help, '0.0.1'] do
48
48
  to eq(subject.help(:huzzah, :version => :current))
49
49
  end
50
50
 
51
+ it "raises an ArgumentError if the face raises a StandardError" do
52
+ face = Puppet::Face[:module, :current]
53
+ face.stubs(:short_description).raises(StandardError, "whoops")
54
+
55
+ expect {
56
+ subject.help(:module)
57
+ }.to raise_error(ArgumentError, /Detail: "whoops"/)
58
+ end
59
+
60
+ it "raises an ArgumentError if the face raises a LoadError" do
61
+ face = Puppet::Face[:module, :current]
62
+ face.stubs(:short_description).raises(LoadError, "cannot load such file -- yard")
63
+
64
+ expect {
65
+ subject.help(:module)
66
+ }.to raise_error(ArgumentError, /Detail: "cannot load such file -- yard"/)
67
+ end
68
+
51
69
  context "when listing subcommands" do
52
70
  subject { Puppet::Face[:help, :current].help }
53
71
 
@@ -84,6 +102,18 @@ describe Puppet::Face[:help, '0.0.1'] do
84
102
  end
85
103
  end
86
104
 
105
+ it "returns an 'unavailable' summary if the 'agent' application fails to generate help" do
106
+ Puppet::Application['agent'].class.any_instance.stubs(:help).raises(ArgumentError, "whoops")
107
+
108
+ expect(subject).to match(/agent\s+! Subcommand unavailable due to error\. Check error logs\./)
109
+ end
110
+
111
+ it "returns an 'unavailable' summary if the legacy application raises a LoadError" do
112
+ Puppet::Application['agent'].class.any_instance.stubs(:help).raises(LoadError, "cannot load such file -- yard")
113
+
114
+ expect(subject).to match(/agent\s+! Subcommand unavailable due to error\. Check error logs\./)
115
+ end
116
+
87
117
  context "face summaries" do
88
118
  it "can generate face summaries" do
89
119
  faces = Puppet::Face.faces
@@ -92,6 +122,13 @@ describe Puppet::Face[:help, '0.0.1'] do
92
122
  expect(Puppet::Face[name, :current]).to have_a_summary
93
123
  end
94
124
  end
125
+
126
+ it "returns an 'unavailable' summary if the face application raises a LoadError" do
127
+ face = Puppet::Face[:module, :current]
128
+ face.stubs(:summary).raises(LoadError, "cannot load such file -- yard")
129
+
130
+ expect(Puppet::Face[:help, :current].help).to match(/module\s+! Subcommand unavailable due to error\. Check error logs\./)
131
+ end
95
132
  end
96
133
 
97
134
  it "lists all legacy applications" do
@@ -141,5 +178,21 @@ describe Puppet::Face[:help, '0.0.1'] do
141
178
  expect { subject.help(appname, :whatever) }.
142
179
  to raise_error ArgumentError, /Legacy subcommands don't take actions/
143
180
  end
181
+
182
+ it "raises an ArgumentError if a legacy application raises a StandardError" do
183
+ Puppet::Application[appname].class.any_instance.stubs(:help).raises(StandardError, "whoops")
184
+
185
+ expect {
186
+ subject.help(appname)
187
+ }.to raise_error ArgumentError, /Detail: "whoops"/
188
+ end
189
+
190
+ it "raises an ArgumentError if a legacy application raises a LoadError" do
191
+ Puppet::Application[appname].class.any_instance.stubs(:help).raises(LoadError, "cannot load such file -- yard")
192
+
193
+ expect {
194
+ subject.help(appname)
195
+ }.to raise_error ArgumentError, /Detail: "cannot load such file -- yard"/
196
+ end
144
197
  end
145
198
  end