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
@@ -342,6 +342,18 @@ describe Puppet::Type.type(:file) do
342
342
  expect(file[:path]).to eq(title)
343
343
  end
344
344
 
345
+ it "should allow a single slash for a title and create the path" do
346
+ title = File.expand_path("/")
347
+ file = described_class.new(:title => title)
348
+ expect(file[:path]).to eq(title)
349
+ end
350
+
351
+ it "should allow multiple slashes for a title and create the path" do
352
+ title = File.expand_path("/") + "//"
353
+ file = described_class.new(:title => title)
354
+ expect(file[:path]).to eq(File.expand_path("/"))
355
+ end
356
+
345
357
  it "should set a desired 'ensure' value if none is set and 'content' is set" do
346
358
  file = described_class.new(:path => path, :content => "/foo/bar")
347
359
  expect(file[:ensure]).to eq(:file)
@@ -351,6 +363,22 @@ describe Puppet::Type.type(:file) do
351
363
  file = described_class.new(:path => path, :target => File.expand_path(__FILE__))
352
364
  expect(file[:ensure]).to eq(:link)
353
365
  end
366
+
367
+ describe "marking parameters as sensitive" do
368
+ it "marks sensitive, content, and ensure as sensitive when source is sensitive" do
369
+ resource = Puppet::Resource.new(:file, make_absolute("/tmp/foo"), :parameters => {:source => make_absolute('/tmp/bar')}, :sensitive_parameters => [:source])
370
+ file = described_class.new(resource)
371
+ expect(file.parameter(:source).sensitive).to eq true
372
+ expect(file.property(:content).sensitive).to eq true
373
+ expect(file.property(:ensure).sensitive).to eq true
374
+ end
375
+
376
+ it "marks ensure as sensitive when content is sensitive" do
377
+ resource = Puppet::Resource.new(:file, make_absolute("/tmp/foo"), :parameters => {:content => 'hello world!'}, :sensitive_parameters => [:content])
378
+ file = described_class.new(resource)
379
+ expect(file.property(:ensure).sensitive).to eq true
380
+ end
381
+ end
354
382
  end
355
383
 
356
384
  describe "#mark_children_for_purging" do
@@ -577,9 +577,10 @@ describe Puppet::Type.type(:mount), :unless => Puppet.features.microsoft_windows
577
577
  let(:var_file) { create_file_resource('/var') }
578
578
  let(:log_file) { create_file_resource('/var/log') }
579
579
  let(:puppet_file) { create_file_resource('/var/log/puppet') }
580
+ let(:opt_file) { create_file_resource('/opt/var/puppet') }
580
581
 
581
582
  before do
582
- create_catalog(root_mount, var_mount, log_mount, var_file, log_file, puppet_file)
583
+ create_catalog(root_mount, var_mount, log_mount, var_file, log_file, puppet_file, opt_file)
583
584
  end
584
585
 
585
586
  it "adds no autorequires for the root mount" do
@@ -588,32 +589,24 @@ describe Puppet::Type.type(:mount), :unless => Puppet.features.microsoft_windows
588
589
 
589
590
  it "adds the parent autorequire and the file autorequire for a mount with one parent" do
590
591
  parent_relationship = var_mount.autorequire[0]
591
- file_relationship = var_mount.autorequire[1]
592
592
 
593
- expect(var_mount.autorequire).to have_exactly(2).items
593
+ expect(var_mount.autorequire).to have_exactly(1).item
594
594
 
595
595
  expect(parent_relationship.source).to eq root_mount
596
596
  expect(parent_relationship.target).to eq var_mount
597
-
598
- expect(file_relationship.source).to eq var_file
599
- expect(file_relationship.target).to eq var_mount
600
597
  end
601
598
 
602
599
  it "adds both parent autorequires and the file autorequire for a mount with two parents" do
603
600
  grandparent_relationship = log_mount.autorequire[0]
604
601
  parent_relationship = log_mount.autorequire[1]
605
- file_relationship = log_mount.autorequire[2]
606
602
 
607
- expect(log_mount.autorequire).to have_exactly(3).items
603
+ expect(log_mount.autorequire).to have_exactly(2).items
608
604
 
609
605
  expect(grandparent_relationship.source).to eq root_mount
610
606
  expect(grandparent_relationship.target).to eq log_mount
611
607
 
612
608
  expect(parent_relationship.source).to eq var_mount
613
609
  expect(parent_relationship.target).to eq log_mount
614
-
615
- expect(file_relationship.source).to eq log_file
616
- expect(file_relationship.target).to eq log_mount
617
610
  end
618
611
 
619
612
  it "adds the child autobefore for a mount with one file child" do
@@ -625,7 +618,7 @@ describe Puppet::Type.type(:mount), :unless => Puppet.features.microsoft_windows
625
618
  expect(child_relationship.target).to eq puppet_file
626
619
  end
627
620
 
628
- it "adds both child autobefores for a mount with two file childs" do
621
+ it "adds both child autobefores for a mount with two file children" do
629
622
  child_relationship = var_mount.autobefore[0]
630
623
  grandchild_relationship = var_mount.autobefore[1]
631
624
 
@@ -42,13 +42,9 @@ shared_examples_for "a yumrepo parameter that expects a natural value" do |param
42
42
  end
43
43
 
44
44
  shared_examples_for "a yumrepo parameter that expects a boolean parameter" do |param|
45
- valid_values = %w[True False 0 1 No Yes]
45
+ valid_values = %w[true false 0 1 no yes]
46
46
 
47
47
  valid_values.each do |value|
48
- it "accepts a valid value of #{value}" do
49
- instance = described_class.new(:name => 'puppetlabs', param => value)
50
- expect(instance[param]).to eq value
51
- end
52
48
  it "accepts #{value} downcased to #{value.downcase} and capitalizes it" do
53
49
  instance = described_class.new(:name => 'puppetlabs', param => value.downcase)
54
50
  expect(instance[param]).to eq value.downcase.capitalize
@@ -556,6 +556,38 @@ describe Puppet::Type, :unless => Puppet.features.microsoft_windows? do
556
556
  expect(params[:fstype]).to eq("boo")
557
557
  expect(params[:atboot]).to eq(:yes)
558
558
  end
559
+
560
+ it "copies sensitive parameters to the appropriate properties" do
561
+ resource = Puppet::Resource.new(:mount, "/foo",
562
+ :parameters => {:atboot => :yes, :fstype => "boo"},
563
+ :sensitive_parameters => [:fstype])
564
+ type = Puppet::Type.type(:mount).new(resource)
565
+ expect(type.property(:fstype).sensitive).to eq true
566
+ end
567
+
568
+ it "logs a warning when a parameter is marked as sensitive" do
569
+ resource = Puppet::Resource.new(:mount, "/foo",
570
+ :parameters => {:atboot => :yes, :fstype => "boo", :remounts => true},
571
+ :sensitive_parameters => [:remounts])
572
+ Puppet::Type.type(:mount).any_instance.expects(:warning).with(regexp_matches(/Unable to mark 'remounts' as sensitive: remounts is a parameter and not a property/))
573
+ Puppet::Type.type(:mount).new(resource)
574
+ end
575
+
576
+ it "logs a warning when a property is not set but is marked as sensitive" do
577
+ resource = Puppet::Resource.new(:mount, "/foo",
578
+ :parameters => {:atboot => :yes, :fstype => "boo"},
579
+ :sensitive_parameters => [:device])
580
+ Puppet::Type.type(:mount).any_instance.expects(:warning).with("Unable to mark 'device' as sensitive: the property itself was not assigned a value.")
581
+ Puppet::Type.type(:mount).new(resource)
582
+ end
583
+
584
+ it "logs an error when a property is not defined on the type but is marked as sensitive" do
585
+ resource = Puppet::Resource.new(:mount, "/foo",
586
+ :parameters => {:atboot => :yes, :fstype => "boo"},
587
+ :sensitive_parameters => [:content])
588
+ Puppet::Type.type(:mount).any_instance.expects(:err).with("Unable to mark 'content' as sensitive: the property itself is not defined on mount.")
589
+ Puppet::Type.type(:mount).new(resource)
590
+ end
559
591
  end
560
592
 
561
593
  describe "and passed a Hash" do
@@ -66,6 +66,17 @@ describe Puppet::Util::CommandLine do
66
66
  end.to have_printed(/^#{Regexp.escape(Puppet.version)}$/)
67
67
  end
68
68
  end
69
+
70
+ %w{--help -h}.each do|arg|
71
+ it "should print help" do
72
+ commandline = Puppet::Util::CommandLine.new("puppet", [arg])
73
+ commandline.expects(:exec).never
74
+
75
+ expect {
76
+ commandline.execute
77
+ }.to have_printed(/Usage: puppet <subcommand> \[options\] <action> \[options\]/).and_exit_with(0)
78
+ end
79
+ end
69
80
  end
70
81
 
71
82
  describe "when dealing with puppet commands" do
@@ -311,7 +311,7 @@ describe Puppet::Util::Execution do
311
311
 
312
312
  Puppet::Util::Execution.stubs(:execute_windows).returns(proc_info_stub)
313
313
  stub_process_wait(real_exit_status)
314
- $CHILD_STATUS.stubs(:exitstatus).returns(real_exit_status % 256) # The exitstatus is changed to be mod 256 so that ruby can fit it into 8 bits.
314
+ Puppet::Util::Execution.stubs(:exitstatus).returns(real_exit_status % 256) # The exitstatus is changed to be mod 256 so that ruby can fit it into 8 bits.
315
315
 
316
316
  expect(Puppet::Util::Execution.execute('test command', :failonfail => false).exitstatus).to eq(real_exit_status)
317
317
  end
@@ -1,9 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'puppet/util/plist' if Puppet.features.cfpropertylist?
2
+ require 'puppet/util/plist'
3
3
  require 'puppet_spec/files'
4
4
 
5
- module Puppet::Util::Plist; end
6
-
7
5
  describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
8
6
  include PuppetSpec::Files
9
7
 
@@ -54,6 +52,12 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
54
52
  </dict>
55
53
  </plist>'
56
54
  end
55
+ let(:non_plist_data) do
56
+ "Take my love, take my land
57
+ Take me where I cannot stand
58
+ I don't care, I'm still free
59
+ You can't take the sky from me."
60
+ end
57
61
  let(:valid_xml_plist_hash) { {"LastUsedPrinters"=>[{"Network"=>"10.85.132.1", "PrinterID"=>"baskerville_corp_puppetlabs_net"}, {"Network"=>"10.14.96.1", "PrinterID"=>"Statler"}]} }
58
62
  let(:plist_path) { file_containing('sample.plist', valid_xml_plist) }
59
63
  let(:binary_plist_magic_number) { 'bplist00' }
@@ -89,6 +93,15 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
89
93
  {:failonfail => true, :combine => true}).returns(valid_xml_plist)
90
94
  expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
91
95
  end
96
+ it "returns nil when direct parsing and plutil conversion both fail" do
97
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
98
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(non_plist_data)
99
+ Puppet.expects(:debug).with(regexp_matches(/^Failed with NoMethodError/))
100
+ Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
101
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
102
+ {:failonfail => true, :combine => true}).raises(Puppet::ExecutionFailure, 'boom')
103
+ expect(subject.read_plist_file(plist_path)).to eq(nil)
104
+ end
92
105
  end
93
106
 
94
107
  describe "#parse_plist" do
@@ -189,7 +189,10 @@ describe Puppet::Util::Storage do
189
189
  Puppet::Util::Storage.cache(:yayness)
190
190
 
191
191
  if Puppet.features.microsoft_windows?
192
- expect { Puppet::Util::Storage.store }.to raise_error(Puppet::Util::Windows::Error, /Access is denied/)
192
+ expect { Puppet::Util::Storage.store }.to raise_error do |error|
193
+ expect(error).to be_a(Puppet::Util::Windows::Error)
194
+ expect(error.code).to eq(5) # ERROR_ACCESS_DENIED
195
+ end
193
196
  else
194
197
  expect { Puppet::Util::Storage.store }.to raise_error(Errno::EISDIR, /Is a directory/)
195
198
  end
@@ -6,6 +6,10 @@ require 'puppet/util/windows'
6
6
 
7
7
  describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows? do
8
8
  let(:connection) { stub 'connection' }
9
+ let(:builtin_localized) { Puppet::Util::Windows::SID.sid_to_name('S-1-5-32') }
10
+ # SYSTEM is special as English can retrieve it via Windows API
11
+ # but will return localized names
12
+ let(:ntauthority_localized) { Puppet::Util::Windows::SID::Principal.lookup_account_name('SYSTEM').domain }
9
13
 
10
14
  before(:each) do
11
15
  Puppet::Util::Windows::ADSI.instance_variable_set(:@computer_name, 'testcomputername')
@@ -67,6 +71,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
67
71
  expect(Puppet::Util::Windows::ADSI::User.uri(username, domain)).to eq("WinNT://#{domain}/#{username},user")
68
72
  end
69
73
 
74
+ it "should generate the correct URI for a BUILTIN user" do
75
+ expect(Puppet::Util::Windows::ADSI::User.uri(username, builtin_localized)).to eq("WinNT://./#{username},user")
76
+ end
77
+
78
+ it "should generate the correct URI for a NT AUTHORITY user" do
79
+ expect(Puppet::Util::Windows::ADSI::User.uri(username, ntauthority_localized)).to eq("WinNT://./#{username},user")
80
+ end
81
+
70
82
  it "should be able to parse a username without a domain" do
71
83
  expect(Puppet::Util::Windows::ADSI::User.parse_name(username)).to eq([username, '.'])
72
84
  end
@@ -414,8 +426,9 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
414
426
 
415
427
  it "should generate the correct URI" do
416
428
  adsi_group.expects(:objectSID).returns([0])
417
- Socket.expects(:gethostname).returns('testcomputername')
418
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(stub(:account => groupname,:domain => 'testcomputername'))
429
+ Socket.expects(:gethostname).returns('TESTcomputerNAME')
430
+ computer_sid = stub(:account => groupname,:domain => 'testcomputername')
431
+ Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(computer_sid)
419
432
  expect(group.uri).to eq("WinNT://./#{groupname},group")
420
433
  end
421
434
  end
@@ -424,6 +437,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
424
437
  expect(Puppet::Util::Windows::ADSI::Group.uri("people")).to eq("WinNT://./people,group")
425
438
  end
426
439
 
440
+ it "should generate the correct URI for a BUILTIN group" do
441
+ expect(Puppet::Util::Windows::ADSI::Group.uri(groupname, builtin_localized)).to eq("WinNT://./#{groupname},group")
442
+ end
443
+
444
+ it "should generate the correct URI for a NT AUTHORITY group" do
445
+ expect(Puppet::Util::Windows::ADSI::Group.uri(groupname, ntauthority_localized)).to eq("WinNT://./#{groupname},group")
446
+ end
447
+
427
448
  it "should be able to create a group" do
428
449
  adsi_group = stub("adsi")
429
450
 
@@ -5,7 +5,8 @@ require 'puppet/util/windows'
5
5
  describe Puppet::Util::Windows::File, :if => Puppet::Util::Platform.windows? do
6
6
  include PuppetSpec::Files
7
7
 
8
- let(:nonexist_file) { 'C:\somefile\that\wont\ever\exist' }
8
+ let(:nonexist_file) { 'C:\foo.bar' }
9
+ let(:nonexist_path) { 'C:\somefile\that\wont\ever\exist' }
9
10
  let(:invalid_file_attributes) { 0xFFFFFFFF } #define INVALID_FILE_ATTRIBUTES (DWORD (-1))
10
11
 
11
12
  describe "get_attributes" do
@@ -31,4 +32,58 @@ describe Puppet::Util::Windows::File, :if => Puppet::Util::Platform.windows? do
31
32
  expect(described_class.get_attributes(nonexist_file, false)).to eq(invalid_file_attributes)
32
33
  end
33
34
  end
35
+
36
+ describe "get_long_pathname" do
37
+ it "should raise an ERROR_FILE_NOT_FOUND for a file that does not exist in a valid path" do
38
+ expect {
39
+ described_class.get_long_pathname(nonexist_file)
40
+ }.to raise_error do |error|
41
+ expect(error).to be_a(Puppet::Util::Windows::Error)
42
+ expect(error.code).to eq(Puppet::Util::Windows::File::ERROR_FILE_NOT_FOUND)
43
+ end
44
+ end
45
+
46
+ it "should raise an ERROR_PATH_NOT_FOUND for a path that does not exist" do
47
+ expect {
48
+ described_class.get_long_pathname(nonexist_path)
49
+ }.to raise_error do |error|
50
+ expect(error).to be_a(Puppet::Util::Windows::Error)
51
+ expect(error.code).to eq(Puppet::Util::Windows::File::ERROR_PATH_NOT_FOUND)
52
+ end
53
+ end
54
+
55
+ it "should return the fully expanded path 'Program Files' given 'Progra~1'" do
56
+ # this test could be resolve some of these values at runtime rather than hard-coding
57
+ shortened = ENV['SystemDrive'] + '\\Progra~1'
58
+ expanded = ENV['SystemDrive'] + '\\Program Files'
59
+ expect(described_class.get_long_pathname(shortened)).to eq (expanded)
60
+ end
61
+ end
62
+
63
+ describe "get_short_pathname" do
64
+ it "should raise an ERROR_FILE_NOT_FOUND for a file that does not exist in a valid path" do
65
+ expect {
66
+ described_class.get_short_pathname(nonexist_file)
67
+ }.to raise_error do |error|
68
+ expect(error).to be_a(Puppet::Util::Windows::Error)
69
+ expect(error.code).to eq(Puppet::Util::Windows::File::ERROR_FILE_NOT_FOUND)
70
+ end
71
+ end
72
+
73
+ it "should raise an ERROR_PATH_NOT_FOUND for a path that does not exist" do
74
+ expect {
75
+ described_class.get_short_pathname(nonexist_path)
76
+ }.to raise_error do |error|
77
+ expect(error).to be_a(Puppet::Util::Windows::Error)
78
+ expect(error.code).to eq(Puppet::Util::Windows::File::ERROR_PATH_NOT_FOUND)
79
+ end
80
+ end
81
+
82
+ it "should return the shortened 'PROGRA~1' given fully expanded path 'Program Files'" do
83
+ # this test could be resolve some of these values at runtime rather than hard-coding
84
+ expanded = ENV['SystemDrive'] + '\\Program Files'
85
+ shortened = ENV['SystemDrive'] + '\\PROGRA~1'
86
+ expect(described_class.get_short_pathname(expanded)).to eq (shortened)
87
+ end
88
+ end
34
89
  end
@@ -10,17 +10,20 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
10
10
  let(:sid) { Puppet::Util::Windows::SID::LocalSystem }
11
11
  let(:invalid_sid) { 'bogus' }
12
12
  let(:unknown_sid) { 'S-0-0-0' }
13
+ let(:null_sid) { 'S-1-0-0' }
13
14
  let(:unknown_name) { 'chewbacca' }
14
15
 
15
16
  context "#octet_string_to_sid_object" do
16
- it "should properly convert an array of bytes for a well-known SID" do
17
- bytes = [1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0]
17
+ it "should properly convert an array of bytes for a well-known non-localized SID" do
18
+ bytes = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
18
19
  converted = subject.octet_string_to_sid_object(bytes)
19
20
 
20
21
  expect(converted).to be_an_instance_of Puppet::Util::Windows::SID::Principal
21
22
  expect(converted.sid_bytes).to eq(bytes)
22
- expect(converted.sid).to eq(sid)
23
- expect(converted.account).to eq('SYSTEM')
23
+ expect(converted.sid).to eq(null_sid)
24
+
25
+ # carefully select a SID here that is not localized on international Windows
26
+ expect(converted.account).to eq('NULL SID')
24
27
  end
25
28
 
26
29
  it "should raise an error for non-array input" do
@@ -40,14 +43,20 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
40
43
  # S-1-1-1 which is not a valid account
41
44
  valid_octet_invalid_user =[1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
42
45
  subject.octet_string_to_sid_object(valid_octet_invalid_user)
43
- }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountSidW: No mapping between account names and security IDs was done./)
46
+ }.to raise_error do |error|
47
+ expect(error).to be_a(Puppet::Util::Windows::Error)
48
+ expect(error.code).to eq(1332) # ERROR_NONE_MAPPED
49
+ end
44
50
  end
45
51
 
46
52
  it "should raise an error for a malformed byte array" do
47
53
  expect {
48
54
  invalid_octet = [2]
49
55
  subject.octet_string_to_sid_object(invalid_octet)
50
- }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountSidW: The parameter is incorrect./)
56
+ }.to raise_error do |error|
57
+ expect(error).to be_a(Puppet::Util::Windows::Error)
58
+ expect(error.code).to eq(87) # ERROR_INVALID_PARAMETER
59
+ end
51
60
  end
52
61
  end
53
62
 
@@ -57,6 +66,8 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
57
66
  end
58
67
 
59
68
  it "should accept unqualified account name" do
69
+ # NOTE: lookup by name works in localized environments only for a few instances
70
+ # this works in French Windows, even though the account is really Syst\u00E8me
60
71
  expect(subject.name_to_sid('SYSTEM')).to eq(sid)
61
72
  end
62
73
 
@@ -79,6 +90,8 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
79
90
  end
80
91
 
81
92
  it "should accept domain qualified account names" do
93
+ # NOTE: lookup by name works in localized environments only for a few instances
94
+ # this works in French Windows, even though the account is really AUTORITE NT\\Syst\u00E8me
82
95
  expect(subject.name_to_sid('NT AUTHORITY\SYSTEM')).to eq(sid)
83
96
  end
84
97
 
@@ -125,18 +138,26 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
125
138
  end
126
139
 
127
140
  it "should accept unqualified account name" do
141
+ # NOTE: lookup by name works in localized environments only for a few instances
142
+ # this works in French Windows, even though the account is really Syst\u00E8me
128
143
  expect(subject.name_to_sid_object('SYSTEM').sid).to eq(sid)
129
144
  end
130
145
 
131
146
  it "should be case-insensitive" do
147
+ # NOTE: lookup by name works in localized environments only for a few instances
148
+ # this works in French Windows, even though the account is really Syst\u00E8me
132
149
  expect(subject.name_to_sid_object('SYSTEM')).to eq(subject.name_to_sid_object('system'))
133
150
  end
134
151
 
135
152
  it "should be leading and trailing whitespace-insensitive" do
153
+ # NOTE: lookup by name works in localized environments only for a few instances
154
+ # this works in French Windows, even though the account is really Syst\u00E8me
136
155
  expect(subject.name_to_sid_object('SYSTEM')).to eq(subject.name_to_sid_object(' SYSTEM '))
137
156
  end
138
157
 
139
158
  it "should accept domain qualified account names" do
159
+ # NOTE: lookup by name works in localized environments only for a few instances
160
+ # this works in French Windows, even though the account is really AUTORITE NT\\Syst\u00E8me
140
161
  expect(subject.name_to_sid_object('NT AUTHORITY\SYSTEM').sid).to eq(sid)
141
162
  end
142
163
  end
@@ -147,7 +168,10 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
147
168
  end
148
169
 
149
170
  it "should accept a sid" do
150
- expect(subject.sid_to_name(sid)).to eq("NT AUTHORITY\\SYSTEM")
171
+ # choose a value that is not localized, for instance
172
+ # S-1-5-18 can be NT AUTHORITY\\SYSTEM or AUTORITE NT\\Syst\u00E8me
173
+ # but NULL SID appears universal
174
+ expect(subject.sid_to_name(null_sid)).to eq('NULL SID')
151
175
  end
152
176
  end
153
177