puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1226,6 +1226,7 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1226
1226
  :backup => false
1227
1227
  }
1228
1228
  end
1229
+
1229
1230
  describe "on POSIX systems", :if => Puppet.features.posix? do
1230
1231
  it "should apply the source metadata values" do
1231
1232
  @options[:source_permissions] = :use
@@ -1260,6 +1261,102 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1260
1261
  end
1261
1262
 
1262
1263
  let(:source) { tmpfile_with_contents("source_default_values", "yay") }
1264
+
1265
+ describe "from http" do
1266
+ let(:http_source) { "http://my-server/file" }
1267
+ let(:httppath) { "#{path}http" }
1268
+
1269
+ context "using mtime", :vcr => true do
1270
+ let(:resource) do
1271
+ described_class.new(
1272
+ :path => httppath,
1273
+ :ensure => :file,
1274
+ :source => http_source,
1275
+ :backup => false,
1276
+ :checksum => :mtime
1277
+ )
1278
+ end
1279
+
1280
+ it "should fetch if not on the local disk" do
1281
+ catalog.add_resource resource
1282
+ catalog.apply
1283
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1284
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1285
+ end
1286
+
1287
+ # The fixture has neither last-modified nor content-checksum headers.
1288
+ # Such upstream ressources are treated as "really fresh" and get
1289
+ # downloaded during every run.
1290
+ it "should fetch if no header specified" do
1291
+ File.open(httppath, "wb") { |f| f.puts "Content originally on disk\n" }
1292
+ # make sure the mtime is not "right now", lest we get a race
1293
+ FileUtils.touch httppath, :mtime => Time.parse("Sun, 22 Mar 2015 22:57:43 GMT")
1294
+ catalog.add_resource resource
1295
+ catalog.apply
1296
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1297
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1298
+ end
1299
+
1300
+ it "should fetch if mtime is older on disk" do
1301
+ File.open(httppath, "wb") { |f| f.puts "Content originally on disk\n" }
1302
+ # fixture has Last-Modified: Sun, 22 Mar 2015 22:25:34 GMT
1303
+ FileUtils.touch httppath, :mtime => Time.parse("Sun, 22 Mar 2015 22:22:34 GMT")
1304
+ catalog.add_resource resource
1305
+ catalog.apply
1306
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1307
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1308
+ end
1309
+
1310
+ it "should not update if mtime is newer on disk" do
1311
+ File.open(httppath, "wb") { |f| f.puts "Content via HTTP\n" }
1312
+ mtime = File.stat(httppath).mtime
1313
+ catalog.add_resource resource
1314
+ catalog.apply
1315
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1316
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1317
+ expect(File.stat(httppath).mtime).to eq mtime
1318
+ end
1319
+ end
1320
+
1321
+ context "using md5", :vcr => true do
1322
+ let(:resource) do
1323
+ described_class.new(
1324
+ :path => httppath,
1325
+ :ensure => :file,
1326
+ :source => http_source,
1327
+ :backup => false,
1328
+ )
1329
+ end
1330
+
1331
+ it "should fetch if not on the local disk" do
1332
+ catalog.add_resource resource
1333
+ catalog.apply
1334
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1335
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1336
+ end
1337
+
1338
+ it "should update if content differs on disk" do
1339
+ File.open(httppath, "wb") { |f| f.puts "Content originally on disk\n" }
1340
+ catalog.add_resource resource
1341
+ catalog.apply
1342
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1343
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1344
+ end
1345
+
1346
+ it "should not update if content on disk is up-to-date" do
1347
+ File.open(httppath, "wb") { |f| f.puts "Content via HTTP\n" }
1348
+ disk_mtime = Time.parse("Sun, 22 Mar 2015 22:22:34 GMT")
1349
+ FileUtils.touch httppath, :mtime => disk_mtime
1350
+ catalog.add_resource resource
1351
+ catalog.apply
1352
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1353
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1354
+ expect(File.stat(httppath).mtime).to eq disk_mtime
1355
+ end
1356
+
1357
+ end
1358
+ end
1359
+
1263
1360
  describe "on Windows systems", :if => Puppet.features.microsoft_windows? do
1264
1361
  def expects_sid_granted_full_access_explicitly(path, sid)
1265
1362
  inherited_ace = Puppet::Util::Windows::AccessControlEntry::INHERITED_ACE
@@ -1297,11 +1394,11 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1297
1394
  before do
1298
1395
  @sids = {
1299
1396
  :current_user => Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_user_name),
1300
- :system => Win32::Security::SID::LocalSystem,
1397
+ :system => Puppet::Util::Windows::SID::LocalSystem,
1301
1398
  :guest => Puppet::Util::Windows::SID.name_to_sid("Guest"),
1302
- :users => Win32::Security::SID::BuiltinUsers,
1303
- :power_users => Win32::Security::SID::PowerUsers,
1304
- :none => Win32::Security::SID::Nobody
1399
+ :users => Puppet::Util::Windows::SID::BuiltinUsers,
1400
+ :power_users => Puppet::Util::Windows::SID::PowerUsers,
1401
+ :none => Puppet::Util::Windows::SID::Nobody
1305
1402
  }
1306
1403
  end
1307
1404
 
@@ -1690,4 +1787,97 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1690
1787
  end
1691
1788
  end
1692
1789
  end
1790
+
1791
+ [:md5, :sha256, :md5lite, :sha256lite].each do |checksum|
1792
+ describe "setting checksum_value explicitly with checksum #{checksum}" do
1793
+ let(:path) { tmpfile('target') }
1794
+ let(:contents) { 'yay' }
1795
+
1796
+ before :each do
1797
+ @options = {
1798
+ :path => path,
1799
+ :ensure => :file,
1800
+ :checksum => checksum,
1801
+ :checksum_value => Puppet::Util::Checksums.send(checksum, contents)
1802
+ }
1803
+ end
1804
+
1805
+ def verify_file(transaction)
1806
+ status = transaction.report.resource_statuses["File[#{path}]"]
1807
+ expect(status).not_to be_failed
1808
+ expect(Puppet::FileSystem).to be_file(path)
1809
+ expect(File.read(path)).to eq(contents)
1810
+ status
1811
+ end
1812
+
1813
+ [:source, :content].each do |prop|
1814
+ context "from #{prop}" do
1815
+ let(:source) { tmpfile_with_contents("source_default_values", contents) }
1816
+
1817
+ before :each do
1818
+ @options[prop] = {:source => source, :content => contents}[prop]
1819
+ end
1820
+
1821
+ it "should create a new file" do
1822
+ catalog.add_resource described_class.new(@options)
1823
+ status = verify_file catalog.apply
1824
+ expect(status).to be_changed
1825
+ end
1826
+
1827
+ it "should overwrite an existing file" do
1828
+ File.open(path, "w") { |f| f.write('bar') }
1829
+ catalog.add_resource described_class.new(@options)
1830
+ status = verify_file catalog.apply
1831
+ expect(status).to be_changed
1832
+ end
1833
+
1834
+ it "should not overwrite the same file" do
1835
+ File.open(path, "w") { |f| f.write(contents) }
1836
+ catalog.add_resource described_class.new(@options)
1837
+ status = verify_file catalog.apply
1838
+ expect(status).to_not be_changed
1839
+ end
1840
+
1841
+ it "should not create a file when ensuring absent" do
1842
+ @options[:ensure] = :absent
1843
+ catalog.add_resource described_class.new(@options)
1844
+ catalog.apply
1845
+ expect(Puppet::FileSystem).to_not be_file(path)
1846
+ end
1847
+ end
1848
+ end
1849
+ end
1850
+ end
1851
+
1852
+ describe "setting checksum_value explicitly with checksum mtime" do
1853
+ let(:path) { tmpfile('target_dir') }
1854
+ let(:time) { Time.now }
1855
+
1856
+ before :each do
1857
+ @options = {
1858
+ :path => path,
1859
+ :ensure => :directory,
1860
+ :checksum => :mtime,
1861
+ :checksum_value => time
1862
+ }
1863
+ end
1864
+
1865
+ it "should create a new directory" do
1866
+ catalog.add_resource described_class.new(@options)
1867
+ status = catalog.apply.report.resource_statuses["File[#{path}]"]
1868
+ expect(status).not_to be_failed
1869
+ expect(status).to be_changed
1870
+ expect(Puppet::FileSystem).to be_directory(path)
1871
+ end
1872
+
1873
+ it "should not update mtime on an old directory" do
1874
+ disk_mtime = Time.parse("Sun, 22 Mar 2015 22:22:34 GMT")
1875
+ FileUtils.mkdir_p path
1876
+ FileUtils.touch path, :mtime => disk_mtime
1877
+ status = catalog.apply.report.resource_statuses["File[#{path}]"]
1878
+ expect(status).to be_nil
1879
+ expect(Puppet::FileSystem).to be_directory(path)
1880
+ expect(File.stat(path).mtime).to eq(disk_mtime)
1881
+ end
1882
+ end
1693
1883
  end
@@ -28,7 +28,11 @@ describe Puppet::Type.type(:package), "when choosing a default package provider"
28
28
  :yum
29
29
  end
30
30
  when 'Fedora'
31
- :yum
31
+ if Puppet::Util::Package.versioncmp(Facter.value(:operatingsystemmajrelease), '22') >= 0
32
+ :dnf
33
+ else
34
+ :yum
35
+ end
32
36
  when 'FreeBSD'
33
37
  :ports
34
38
  when 'OpenBSD'
@@ -1,16 +1,32 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
 
4
+ require 'puppet_spec/compiler'
4
5
  require 'puppet_spec/files'
5
6
  require 'puppet/file_bucket/dipper'
6
7
 
7
8
  describe Puppet::Type.type(:tidy) do
8
9
  include PuppetSpec::Files
10
+ include PuppetSpec::Compiler
9
11
 
10
12
  before do
11
13
  Puppet::Util::Storage.stubs(:store)
12
14
  end
13
15
 
16
+ it "should be able to recursively remove directories" do
17
+ dir = tmpfile("tidy_testing")
18
+ FileUtils.mkdir_p(File.join(dir, "foo", "bar"))
19
+
20
+ apply_compiled_manifest(<<-MANIFEST)
21
+ tidy { '#{dir}':
22
+ recurse => true,
23
+ rmdirs => true,
24
+ }
25
+ MANIFEST
26
+
27
+ expect(Puppet::FileSystem.directory?(dir)).to be_falsey
28
+ end
29
+
14
30
  # Testing #355.
15
31
  it "should be able to remove dead links", :if => Puppet.features.manages_symlinks? do
16
32
  dir = tmpfile("tidy_link_testing")
@@ -19,15 +35,11 @@ describe Puppet::Type.type(:tidy) do
19
35
  Dir.mkdir(dir)
20
36
  Puppet::FileSystem.symlink(target, link)
21
37
 
22
- tidy = Puppet::Type.type(:tidy).new :path => dir, :recurse => true
23
-
24
- catalog = Puppet::Resource::Catalog.new
25
- catalog.add_resource(tidy)
26
- # avoid crude failures because of nil resources that result
27
- # from implicit containment and lacking containers
28
- catalog.stubs(:container_of).returns tidy
29
-
30
- catalog.apply
38
+ apply_compiled_manifest(<<-MANIFEST)
39
+ tidy { '#{dir}':
40
+ recurse => true,
41
+ }
42
+ MANIFEST
31
43
 
32
44
  expect(Puppet::FileSystem.symlink?(link)).to be_falsey
33
45
  end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Puppet::Util::Execution do
4
+ include PuppetSpec::Files
5
+
4
6
  describe "#execpipe" do
5
7
  it "should set LANG to C avoid localized output", :if => !Puppet.features.microsoft_windows? do
6
8
  out = ""
@@ -14,4 +16,24 @@ describe Puppet::Util::Execution do
14
16
  expect(out).to eq("C")
15
17
  end
16
18
  end
19
+
20
+ describe "#execute (Windows)", :if => Puppet.features.microsoft_windows? do
21
+ let(:utf8text) do
22
+ # Japanese Lorem Ipsum snippet
23
+ "utf8testfile" + [227, 131, 171, 227, 131, 147, 227, 131, 179, 227, 131, 132, 227,
24
+ 130, 162, 227, 130, 166, 227, 130, 167, 227, 131, 150, 227, 130,
25
+ 162, 227, 129, 181, 227, 129, 185, 227, 129, 139, 227, 130, 137,
26
+ 227, 129, 154, 227, 130, 187, 227, 130, 183, 227, 131, 147, 227,
27
+ 131, 170, 227, 131, 134].pack('c*').force_encoding(Encoding::UTF_8)
28
+ end
29
+ let(:temputf8filename) do
30
+ script_containing(utf8text, :windows => "@ECHO OFF\nECHO #{utf8text}\nEXIT 100")
31
+ end
32
+
33
+ it "should execute with non-english characters in command line" do
34
+ result = Puppet::Util::Execution.execute("cmd /c \"#{temputf8filename}\"", :failonfail => false)
35
+ expect(temputf8filename.encoding.name).to eq('UTF-8')
36
+ expect(result.exitstatus).to eq(100)
37
+ end
38
+ end
17
39
  end
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/util/windows'
4
+
5
+ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft_windows? do
6
+
7
+ let (:system_bytes) { [1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0] }
8
+ let (:administrator_bytes) { [1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0] }
9
+
10
+ describe ".lookup_account_name" do
11
+ it "should create an instance from a well-known account name" do
12
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('SYSTEM')
13
+ expect(principal.account).to eq('SYSTEM')
14
+ expect(principal.sid_bytes).to eq(system_bytes)
15
+ expect(principal.sid).to eq('S-1-5-18')
16
+ expect(principal.domain).to eq('NT AUTHORITY')
17
+ expect(principal.domain_account).to eq('NT AUTHORITY\\SYSTEM')
18
+
19
+ # Windows API LookupAccountSid behaves differently if current user is SYSTEM
20
+ if Puppet::Util::Windows::ADSI::User.current_user_name != 'SYSTEM'
21
+ account_type = :SidTypeWellKnownGroup
22
+ else
23
+ account_type = :SidTypeUser
24
+ end
25
+
26
+ expect(principal.account_type).to eq(account_type)
27
+ end
28
+
29
+ it "should create an instance from a well-known account prefixed with NT AUTHORITY" do
30
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('NT AUTHORITY\\SYSTEM')
31
+ expect(principal.account).to eq('SYSTEM')
32
+ expect(principal.sid_bytes).to eq(system_bytes)
33
+ expect(principal.sid).to eq('S-1-5-18')
34
+ expect(principal.domain).to eq('NT AUTHORITY')
35
+ expect(principal.domain_account).to eq('NT AUTHORITY\\SYSTEM')
36
+
37
+ # Windows API LookupAccountSid behaves differently if current user is SYSTEM
38
+ if Puppet::Util::Windows::ADSI::User.current_user_name != 'SYSTEM'
39
+ account_type = :SidTypeWellKnownGroup
40
+ else
41
+ account_type = :SidTypeUser
42
+ end
43
+
44
+ expect(principal.account_type).to eq(account_type)
45
+ end
46
+
47
+ it "should create an instance from a local account prefixed with hostname" do
48
+ current_user_name = Puppet::Util::Windows::ADSI::User.current_user_name
49
+ running_as_system = (current_user_name == 'SYSTEM')
50
+ username = running_as_system ? 'Administrator' : current_user_name
51
+
52
+ user_exists = Puppet::Util::Windows::ADSI::User.exists?(".\\#{username}")
53
+
54
+ # when running as SYSTEM (in Jenkins CI), then Administrator should be used
55
+ # otherwise running in AppVeyor there is no Administrator and a the current local user can be used
56
+ skip if (running_as_system && !user_exists)
57
+
58
+ hostname = Socket.gethostname
59
+
60
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name("#{hostname}\\#{username}")
61
+ expect(principal.account).to match(/^#{Regexp.quote(username)}$/i)
62
+ # skip SID and bytes in this case since the most interesting thing here is domain_account
63
+ expect(principal.domain).to match(/^#{Regexp.quote(hostname)}$/i)
64
+ expect(principal.domain_account).to match(/^#{Regexp.quote(hostname)}\\#{Regexp.quote(username)}$/i)
65
+ expect(principal.account_type).to eq(:SidTypeUser)
66
+ end
67
+
68
+ it "should create an instance from a well-known group alias" do
69
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('Administrators')
70
+ expect(principal.account).to eq('Administrators')
71
+ expect(principal.sid_bytes).to eq(administrator_bytes)
72
+ expect(principal.sid).to eq('S-1-5-32-544')
73
+ expect(principal.domain).to eq('BUILTIN')
74
+ expect(principal.domain_account).to eq('BUILTIN\\Administrators')
75
+ expect(principal.account_type).to eq(:SidTypeAlias)
76
+ end
77
+
78
+ it "should raise an error when trying to lookup an account that doesn't exist" do
79
+ principal = Puppet::Util::Windows::SID::Principal
80
+ expect {
81
+ principal.lookup_account_name('ConanTheBarbarian')
82
+ }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountNameW/)
83
+ end
84
+
85
+ it "should return a BUILTIN domain principal for empty account names" do
86
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('')
87
+ expect(principal.account_type).to eq(:SidTypeDomain)
88
+ expect(principal.sid).to eq('S-1-5-32')
89
+ expect(principal.account).to eq('BUILTIN')
90
+ expect(principal.domain).to eq('BUILTIN')
91
+ expect(principal.domain_account).to eq('BUILTIN')
92
+ end
93
+
94
+ it "should return a BUILTIN domain principal for BUILTIN account names" do
95
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('BUILTIN')
96
+ expect(principal.account_type).to eq(:SidTypeDomain)
97
+ expect(principal.sid).to eq('S-1-5-32')
98
+ expect(principal.account).to eq('BUILTIN')
99
+ expect(principal.domain).to eq('BUILTIN')
100
+ expect(principal.domain_account).to eq('BUILTIN')
101
+ end
102
+
103
+ end
104
+
105
+ describe ".lookup_account_sid" do
106
+ it "should create an instance from a well-known account SID" do
107
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_sid(system_bytes)
108
+ expect(principal.account).to eq('SYSTEM')
109
+ expect(principal.sid_bytes).to eq(system_bytes)
110
+ expect(principal.sid).to eq('S-1-5-18')
111
+ expect(principal.domain).to eq('NT AUTHORITY')
112
+ expect(principal.domain_account).to eq('NT AUTHORITY\\SYSTEM')
113
+
114
+ # Windows API LookupAccountSid behaves differently if current user is SYSTEM
115
+ if Puppet::Util::Windows::ADSI::User.current_user_name != 'SYSTEM'
116
+ account_type = :SidTypeWellKnownGroup
117
+ else
118
+ account_type = :SidTypeUser
119
+ end
120
+
121
+ expect(principal.account_type).to eq(account_type)
122
+ end
123
+
124
+ it "should create an instance from a well-known group SID" do
125
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_sid(administrator_bytes)
126
+ expect(principal.account).to eq('Administrators')
127
+ expect(principal.sid_bytes).to eq(administrator_bytes)
128
+ expect(principal.sid).to eq('S-1-5-32-544')
129
+ expect(principal.domain).to eq('BUILTIN')
130
+ expect(principal.domain_account).to eq('BUILTIN\\Administrators')
131
+ expect(principal.account_type).to eq(:SidTypeAlias)
132
+ end
133
+
134
+ it "should raise an error when trying to lookup nil" do
135
+ principal = Puppet::Util::Windows::SID::Principal
136
+ expect {
137
+ principal.lookup_account_sid(nil)
138
+ }.to raise_error(Puppet::Util::Windows::Error, /must not be nil/)
139
+ end
140
+
141
+ it "should raise an error when trying to lookup non-byte array" do
142
+ principal = Puppet::Util::Windows::SID::Principal
143
+ expect {
144
+ principal.lookup_account_sid('ConanTheBarbarian')
145
+ }.to raise_error(Puppet::Util::Windows::Error, /array/)
146
+ end
147
+
148
+ it "should raise an error when trying to lookup an empty array" do
149
+ principal = Puppet::Util::Windows::SID::Principal
150
+ expect {
151
+ principal.lookup_account_sid([])
152
+ }.to raise_error(Puppet::Util::Windows::Error, /at least 1 byte long/)
153
+ end
154
+
155
+ # https://technet.microsoft.com/en-us/library/cc962011.aspx
156
+ # "... The structure used in all SIDs created by Windows NT and Windows 2000 is revision level 1. ..."
157
+ # Therefore a value of zero for the revision, is not a valid SID
158
+ it "should raise an error when trying to lookup completely invalid SID bytes" do
159
+ principal = Puppet::Util::Windows::SID::Principal
160
+ expect {
161
+ principal.lookup_account_sid([0])
162
+ }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountSidW: The parameter is incorrect/)
163
+ end
164
+
165
+ it "should raise an error when trying to lookup a valid SID that doesn't have a matching account" do
166
+ principal = Puppet::Util::Windows::SID::Principal
167
+ expect {
168
+ # S-1-1-1 which is not a valid account
169
+ principal.lookup_account_sid([1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0])
170
+ }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountSidW: No mapping between account names and security IDs was done/)
171
+ end
172
+
173
+ it "should return a domain principal for BUILTIN SID S-1-5-32" do
174
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_sid([1, 1, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0])
175
+ expect(principal.account_type).to eq(:SidTypeDomain)
176
+ expect(principal.sid).to eq('S-1-5-32')
177
+ expect(principal.account).to eq('BUILTIN')
178
+ expect(principal.domain).to eq('BUILTIN')
179
+ expect(principal.domain_account).to eq('BUILTIN')
180
+ end
181
+ end
182
+
183
+ describe "it should create matching Principal objects" do
184
+ let(:builtin_sid) { [1, 1, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0] }
185
+ let(:sid_principal) { Puppet::Util::Windows::SID::Principal.lookup_account_sid(builtin_sid) }
186
+
187
+ ['.', 'builtin', ''].each do |name|
188
+ it "when comparing the one looked up via SID S-1-5-32 to one looked up via non-canonical name #{name} for the BUILTIN domain" do
189
+ name_principal = Puppet::Util::Windows::SID::Principal.lookup_account_name(name)
190
+
191
+ # compares canonical sid
192
+ expect(sid_principal).to eq(name_principal)
193
+
194
+ # compare all properties that have public accessors
195
+ sid_principal.public_methods(false).reject { |m| m == :== }.each do |method|
196
+ expect(sid_principal.send(method)).to eq(name_principal.send(method))
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -31,4 +31,35 @@ describe "Puppet::Util::Windows::Process", :if => Puppet.features.microsoft_wind
31
31
  expect { Puppet::Util::Windows::Process.lookup_privilege_value('foo') }.to raise_error(Puppet::Util::Windows::Error, fail_msg)
32
32
  end
33
33
  end
34
+
35
+ describe "when setting environment variables" do
36
+ it "can properly handle env var values with = in them" do
37
+ begin
38
+ name = SecureRandom.uuid
39
+ value = 'foo=bar'
40
+
41
+ Puppet::Util::Windows::Process.set_environment_variable(name, value)
42
+
43
+ env = Puppet::Util::Windows::Process.get_environment_strings
44
+
45
+ expect(env[name]).to eq(value)
46
+ ensure
47
+ Puppet::Util::Windows::Process.set_environment_variable(name, nil)
48
+ end
49
+ end
50
+
51
+ it "can properly handle empty env var values" do
52
+ begin
53
+ name = SecureRandom.uuid
54
+
55
+ Puppet::Util::Windows::Process.set_environment_variable(name, '')
56
+
57
+ env = Puppet::Util::Windows::Process.get_environment_strings
58
+
59
+ expect(env[name]).to eq('')
60
+ ensure
61
+ Puppet::Util::Windows::Process.set_environment_variable(name, nil)
62
+ end
63
+ end
64
+ end
34
65
  end
@@ -2,10 +2,30 @@
2
2
  require 'spec_helper'
3
3
  require 'puppet/util/windows'
4
4
 
5
- describe Puppet::Util::Windows::Registry, :if => Puppet::Util::Platform.windows? do
5
+ if Puppet::Util::Platform.windows?
6
+ describe Puppet::Util::Windows::Registry do
6
7
  subject do
7
8
  class TestRegistry
8
9
  include Puppet::Util::Windows::Registry
10
+ extend FFI::Library
11
+
12
+ ffi_lib :advapi32
13
+ attach_function :RegSetValueExW,
14
+ [:handle, :pointer, :dword, :dword, :pointer, :dword], :win32_long
15
+
16
+ def write_corrupt_dword(reg, valuename)
17
+ # Normally DWORDs contain 4 bytes. This bad data only has 2
18
+ bad_data = [0, 0]
19
+ FFI::Pointer.from_string_to_wide_string(valuename) do |name_ptr|
20
+ FFI::MemoryPointer.new(:uchar, bad_data.length) do |data_ptr|
21
+ data_ptr.write_array_of_uchar(bad_data)
22
+ if RegSetValueExW(reg.hkey, name_ptr, 0,
23
+ Win32::Registry::REG_DWORD, data_ptr, data_ptr.size) != 0
24
+ raise Puppet::Util::Windows::Error.new("Failed to write registry value")
25
+ end
26
+ end
27
+ end
28
+ end
9
29
  end
10
30
 
11
31
  TestRegistry.new
@@ -163,5 +183,75 @@ describe Puppet::Util::Windows::Registry, :if => Puppet::Util::Platform.windows?
163
183
  end
164
184
  end
165
185
  end
186
+
187
+ context "when reading values" do
188
+ let (:hklm) { Win32::Registry::HKEY_LOCAL_MACHINE }
189
+ let (:puppet_key) { "SOFTWARE\\Puppet Labs"}
190
+ let (:subkey_name) { "PuppetRegistryTest" }
191
+ let (:value_name) { SecureRandom.uuid }
192
+
193
+ after(:each) do
194
+ hklm.open(puppet_key, Win32::Registry::KEY_ALL_ACCESS) do |reg|
195
+ subject.delete_key(reg, subkey_name)
196
+ end
197
+ end
198
+
199
+ [
200
+ {:name => 'REG_SZ', :type => Win32::Registry::REG_SZ, :value => 'reg sz string'},
201
+ {:name => 'REG_EXPAND_SZ', :type => Win32::Registry::REG_EXPAND_SZ, :value => 'reg expand string'},
202
+ {:name => 'REG_MULTI_SZ', :type => Win32::Registry::REG_MULTI_SZ, :value => ['string1', 'string2']},
203
+ {:name => 'REG_BINARY', :type => Win32::Registry::REG_BINARY, :value => 'abinarystring'},
204
+ {:name => 'REG_DWORD', :type => Win32::Registry::REG_DWORD, :value => 0xFFFFFFFF},
205
+ {:name => 'REG_DWORD_BIG_ENDIAN', :type => Win32::Registry::REG_DWORD_BIG_ENDIAN, :value => 0xFFFF},
206
+ {:name => 'REG_QWORD', :type => Win32::Registry::REG_QWORD, :value => 0xFFFFFFFFFFFFFFFF},
207
+ ].each do |pair|
208
+ it "should return #{pair[:name]} values" do
209
+ hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
210
+ reg.write(value_name, pair[:type], pair[:value])
211
+ end
212
+
213
+ hklm.open("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_READ) do |reg|
214
+ vals = subject.values(reg)
215
+
216
+ expect(vals).to have_key(value_name)
217
+ subject.each_value(reg) do |subkey, type, data|
218
+ expect(type).to eq(pair[:type])
219
+ end
220
+
221
+ written = vals[value_name]
222
+ expect(written).to eq(pair[:value])
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ context "when reading corrupt values" do
229
+ let (:hklm) { Win32::Registry::HKEY_LOCAL_MACHINE }
230
+ let (:puppet_key) { "SOFTWARE\\Puppet Labs"}
231
+ let (:subkey_name) { "PuppetRegistryTest" }
232
+ let (:value_name) { SecureRandom.uuid }
233
+
234
+ before(:each) do
235
+ hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg_key|
236
+ subject.write_corrupt_dword(reg_key, value_name)
237
+ end
238
+ end
239
+
240
+ after(:each) do
241
+ hklm.open(puppet_key, Win32::Registry::KEY_ALL_ACCESS) do |reg_key|
242
+ subject.delete_key(reg_key, subkey_name)
243
+ end
244
+ end
245
+
246
+ it "should return nil for a corrupt DWORD" do
247
+ hklm.open("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg_key|
248
+ vals = subject.values(reg_key)
249
+
250
+ expect(vals).to have_key(value_name)
251
+ expect(vals[value_name]).to be_nil
252
+ end
253
+ end
254
+ end
166
255
  end
167
256
  end
257
+ end