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
@@ -1,84 +1,86 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
 
4
- require 'puppet/util/network_device/transport/telnet'
4
+ if Puppet.features.telnet?
5
+ require 'puppet/util/network_device/transport/telnet'
5
6
 
6
- describe Puppet::Util::NetworkDevice::Transport::Telnet do
7
+ describe Puppet::Util::NetworkDevice::Transport::Telnet do
7
8
 
8
- before(:each) do
9
- TCPSocket.stubs(:open).returns stub_everything('tcp')
10
- @transport = Puppet::Util::NetworkDevice::Transport::Telnet.new()
11
- end
12
-
13
- it "should not handle login through the transport" do
14
- expect(@transport).not_to be_handles_login
15
- end
16
-
17
- it "should not open any files" do
18
- File.expects(:open).never
19
- @transport.host = "localhost"
20
- @transport.port = 23
21
-
22
- @transport.connect
23
- end
9
+ before(:each) do
10
+ TCPSocket.stubs(:open).returns stub_everything('tcp')
11
+ @transport = Puppet::Util::NetworkDevice::Transport::Telnet.new()
12
+ end
24
13
 
25
- it "should connect to the given host and port" do
26
- Net::Telnet.expects(:new).with { |args| args["Host"] == "localhost" && args["Port"] == 23 }.returns stub_everything
27
- @transport.host = "localhost"
28
- @transport.port = 23
14
+ it "should not handle login through the transport" do
15
+ expect(@transport).not_to be_handles_login
16
+ end
29
17
 
30
- @transport.connect
31
- end
18
+ it "should not open any files" do
19
+ File.expects(:open).never
20
+ @transport.host = "localhost"
21
+ @transport.port = 23
32
22
 
33
- it "should connect and specify the default prompt" do
34
- @transport.default_prompt = "prompt"
35
- Net::Telnet.expects(:new).with { |args| args["Prompt"] == "prompt" }.returns stub_everything
36
- @transport.host = "localhost"
37
- @transport.port = 23
23
+ @transport.connect
24
+ end
38
25
 
39
- @transport.connect
40
- end
26
+ it "should connect to the given host and port" do
27
+ Net::Telnet.expects(:new).with { |args| args["Host"] == "localhost" && args["Port"] == 23 }.returns stub_everything
28
+ @transport.host = "localhost"
29
+ @transport.port = 23
41
30
 
42
- describe "when connected" do
43
- before(:each) do
44
- @telnet = stub_everything 'telnet'
45
- Net::Telnet.stubs(:new).returns(@telnet)
46
31
  @transport.connect
47
32
  end
48
33
 
49
- it "should send line to the telnet session" do
50
- @telnet.expects(:puts).with("line")
51
- @transport.send("line")
34
+ it "should connect and specify the default prompt" do
35
+ @transport.default_prompt = "prompt"
36
+ Net::Telnet.expects(:new).with { |args| args["Prompt"] == "prompt" }.returns stub_everything
37
+ @transport.host = "localhost"
38
+ @transport.port = 23
39
+
40
+ @transport.connect
52
41
  end
53
42
 
54
- describe "when expecting output" do
55
- it "should waitfor output on the telnet session" do
56
- @telnet.expects(:waitfor).with(/regex/)
57
- @transport.expect(/regex/)
43
+ describe "when connected" do
44
+ before(:each) do
45
+ @telnet = stub_everything 'telnet'
46
+ Net::Telnet.stubs(:new).returns(@telnet)
47
+ @transport.connect
58
48
  end
59
49
 
60
- it "should return telnet session output" do
61
- @telnet.expects(:waitfor).returns("output")
62
- expect(@transport.expect(/regex/)).to eq("output")
50
+ it "should send line to the telnet session" do
51
+ @telnet.expects(:puts).with("line")
52
+ @transport.send("line")
63
53
  end
64
54
 
65
- it "should yield telnet session output to the given block" do
66
- @telnet.expects(:waitfor).yields("output")
67
- @transport.expect(/regex/) { |out| expect(out).to eq("output") }
55
+ describe "when expecting output" do
56
+ it "should waitfor output on the telnet session" do
57
+ @telnet.expects(:waitfor).with(/regex/)
58
+ @transport.expect(/regex/)
59
+ end
60
+
61
+ it "should return telnet session output" do
62
+ @telnet.expects(:waitfor).returns("output")
63
+ expect(@transport.expect(/regex/)).to eq("output")
64
+ end
65
+
66
+ it "should yield telnet session output to the given block" do
67
+ @telnet.expects(:waitfor).yields("output")
68
+ @transport.expect(/regex/) { |out| expect(out).to eq("output") }
69
+ end
68
70
  end
69
71
  end
70
- end
71
72
 
72
- describe "when closing" do
73
- before(:each) do
74
- @telnet = stub_everything 'telnet'
75
- Net::Telnet.stubs(:new).returns(@telnet)
76
- @transport.connect
77
- end
73
+ describe "when closing" do
74
+ before(:each) do
75
+ @telnet = stub_everything 'telnet'
76
+ Net::Telnet.stubs(:new).returns(@telnet)
77
+ @transport.connect
78
+ end
78
79
 
79
- it "should close the telnet session" do
80
- @telnet.expects(:close)
81
- @transport.close
80
+ it "should close the telnet session" do
81
+ @telnet.expects(:close)
82
+ @transport.close
83
+ end
82
84
  end
83
85
  end
84
86
  end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
3
+ require 'puppet_spec/files'
4
+
5
+ module Puppet::Util::Plist; end
6
+
7
+ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
8
+ include PuppetSpec::Files
9
+
10
+ let(:valid_xml_plist) do
11
+ '<?xml version="1.0" encoding="UTF-8"?>
12
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
13
+ <plist version="1.0">
14
+ <dict>
15
+ <key>LastUsedPrinters</key>
16
+ <array>
17
+ <dict>
18
+ <key>Network</key>
19
+ <string>10.85.132.1</string>
20
+ <key>PrinterID</key>
21
+ <string>baskerville_corp_puppetlabs_net</string>
22
+ </dict>
23
+ <dict>
24
+ <key>Network</key>
25
+ <string>10.14.96.1</string>
26
+ <key>PrinterID</key>
27
+ <string>Statler</string>
28
+ </dict>
29
+ </array>
30
+ </dict>
31
+ </plist>'
32
+ end
33
+ let(:invalid_xml_plist) do
34
+ '<?xml version="1.0" encoding="UTF-8"?>
35
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
36
+ <plist version="1.0">
37
+ <dict>
38
+ <key>LastUsedPrinters</key>
39
+ <array>
40
+ <dict>
41
+ <!-- this comment is --terrible -->
42
+ <key>Network</key>
43
+ <string>10.85.132.1</string>
44
+ <key>PrinterID</key>
45
+ <string>baskerville_corp_puppetlabs_net</string>
46
+ </dict>
47
+ <dict>
48
+ <key>Network</key>
49
+ <string>10.14.96.1</string>
50
+ <key>PrinterID</key>
51
+ <string>Statler</string>
52
+ </dict>
53
+ </array>
54
+ </dict>
55
+ </plist>'
56
+ end
57
+ let(:valid_xml_plist_hash) { {"LastUsedPrinters"=>[{"Network"=>"10.85.132.1", "PrinterID"=>"baskerville_corp_puppetlabs_net"}, {"Network"=>"10.14.96.1", "PrinterID"=>"Statler"}]} }
58
+ let(:plist_path) { file_containing('sample.plist', valid_xml_plist) }
59
+ let(:binary_plist_magic_number) { 'bplist00' }
60
+ let(:bad_xml_doctype) { '<!DOCTYPE plist PUBLIC -//Apple Computer' }
61
+ let(:good_xml_doctype) { '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' }
62
+
63
+ describe "#read_plist_file" do
64
+ it "calls #convert_cfpropertylist_to_native_types on a plist object when a valid binary plist is read" do
65
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns(binary_plist_magic_number)
66
+ subject.stubs(:new_cfpropertylist).with({:file => plist_path}).returns('plist_object')
67
+ subject.expects(:convert_cfpropertylist_to_native_types).with('plist_object').returns('plist_hash')
68
+ expect(subject.read_plist_file(plist_path)).to eq('plist_hash')
69
+ end
70
+ it "returns a valid hash when a valid XML plist is read" do
71
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
72
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(valid_xml_plist)
73
+ expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
74
+ end
75
+ it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
76
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
77
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(bad_xml_doctype)
78
+ subject.expects(:new_cfpropertylist).with({:data => good_xml_doctype}).returns('plist_object')
79
+ subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object').returns('plist_hash')
80
+ Puppet.expects(:debug).with("Had to fix plist with incorrect DOCTYPE declaration: #{plist_path}")
81
+ expect(subject.read_plist_file(plist_path)).to eq('plist_hash')
82
+ end
83
+ it "attempts to read pure xml using plutil when reading an improperly formatted service plist" do
84
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
85
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(invalid_xml_plist)
86
+ Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
87
+ Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
88
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
89
+ {:failonfail => true, :combine => true}).returns(valid_xml_plist)
90
+ expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
91
+ end
92
+ end
93
+
94
+ describe "#parse_plist" do
95
+ it "returns a valid hash when a valid XML plist is provided" do
96
+ expect(subject.parse_plist(valid_xml_plist)).to eq(valid_xml_plist_hash)
97
+ end
98
+ it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
99
+ subject.expects(:new_cfpropertylist).with({:data => good_xml_doctype}).returns('plist_object')
100
+ subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object')
101
+ Puppet.expects(:debug).with("Had to fix plist with incorrect DOCTYPE declaration: #{plist_path}")
102
+ subject.parse_plist(bad_xml_doctype, plist_path)
103
+ end
104
+ it "raises a debug message with malformed plist" do
105
+ subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object')
106
+ Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
107
+ subject.parse_plist("<plist><dict><key>Foo</key>")
108
+ end
109
+ end
110
+ end
@@ -20,7 +20,7 @@ describe Puppet::Util::ResourceTemplate do
20
20
  describe "when evaluating" do
21
21
  before do
22
22
  Puppet::FileSystem.stubs(:exist?).returns true
23
- File.stubs(:read).returns "eh"
23
+ Puppet::FileSystem.stubs(:read).returns "eh"
24
24
 
25
25
  @template = stub 'template', :result => nil
26
26
  ERB.stubs(:new).returns @template
@@ -38,7 +38,7 @@ describe Puppet::Util::ResourceTemplate do
38
38
  end
39
39
 
40
40
  it "should create a template instance with the contents of the file" do
41
- File.expects(:read).with("/my/template").returns "yay"
41
+ Puppet::FileSystem.expects(:read).with("/my/template", :encoding => 'utf-8').returns "yay"
42
42
  ERB.expects(:new).with("yay", 0, "-").returns(@template)
43
43
 
44
44
  @wrapper.stubs :set_resource_variables
@@ -261,6 +261,30 @@ describe Puppet::Util::RunMode do
261
261
  end
262
262
  end
263
263
  end
264
+
265
+ describe "#without_env internal helper with UTF8 characters" do
266
+ let(:varname) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
267
+ let(:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
268
+
269
+ before do
270
+ Puppet::Util::Windows::Process.set_environment_variable(varname, rune_utf8)
271
+ end
272
+
273
+ it "removes environment variables within the block with UTF8 name" do
274
+ without_env(varname) do
275
+ expect(ENV[varname]).to be(nil)
276
+ end
277
+ end
278
+
279
+ it "restores UTF8 characters in environment variable values" do
280
+ without_env(varname) do
281
+ Puppet::Util::Windows::Process.set_environment_variable(varname, 'bad value')
282
+ end
283
+
284
+ envhash = Puppet::Util::Windows::Process.get_environment_strings
285
+ expect(envhash[varname]).to eq(rune_utf8)
286
+ end
287
+ end
264
288
  end
265
289
 
266
290
  def as_root
@@ -274,11 +298,11 @@ describe Puppet::Util::RunMode do
274
298
  end
275
299
 
276
300
  def without_env(name, &block)
277
- saved = ENV[name]
278
- ENV.delete name
301
+ saved = Puppet::Util.get_env(name)
302
+ Puppet::Util.set_env(name, nil)
279
303
  yield
280
304
  ensure
281
- ENV[name] = saved
305
+ Puppet::Util.set_env(name, saved)
282
306
  end
283
307
 
284
308
  def without_home(&block)
@@ -40,16 +40,16 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
40
40
  end
41
41
 
42
42
  describe ".sid_uri" do
43
- it "should raise an error when the input is not a SID object" do
43
+ it "should raise an error when the input is not a SID Principal" do
44
44
  [Object.new, {}, 1, :symbol, '', nil].each do |input|
45
45
  expect {
46
46
  Puppet::Util::Windows::ADSI.sid_uri(input)
47
- }.to raise_error(Puppet::Error, /Must use a valid SID object/)
47
+ }.to raise_error(Puppet::Error, /Must use a valid SID::Principal/)
48
48
  end
49
49
  end
50
50
 
51
51
  it "should return a SID uri for a well-known SID (SYSTEM)" do
52
- sid = Win32::Security::SID.new('SYSTEM')
52
+ sid = Puppet::Util::Windows::SID::Principal.lookup_account_name('SYSTEM')
53
53
  expect(Puppet::Util::Windows::ADSI.sid_uri(sid)).to eq('WinNT://S-1-5-18')
54
54
  end
55
55
  end
@@ -60,12 +60,10 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
60
60
  let(:domain_username) { "#{domain}\\#{username}"}
61
61
 
62
62
  it "should generate the correct URI" do
63
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
64
63
  expect(Puppet::Util::Windows::ADSI::User.uri(username)).to eq("WinNT://./#{username},user")
65
64
  end
66
65
 
67
66
  it "should generate the correct URI for a user with a domain" do
68
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
69
67
  expect(Puppet::Util::Windows::ADSI::User.uri(username, domain)).to eq("WinNT://#{domain}/#{username},user")
70
68
  end
71
69
 
@@ -96,25 +94,33 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
96
94
  end
97
95
 
98
96
  it "should be able to check the existence of a user" do
99
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
97
+ Puppet::Util::Windows::SID.expects(:name_to_sid_object).with(username).returns nil
100
98
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://./#{username},user").returns connection
99
+ connection.expects(:Class).returns('User')
101
100
  expect(Puppet::Util::Windows::ADSI::User.exists?(username)).to be_truthy
102
101
  end
103
102
 
104
103
  it "should be able to check the existence of a domain user" do
105
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
104
+ Puppet::Util::Windows::SID.expects(:name_to_sid_object).with("#{domain}\\#{username}").returns nil
106
105
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://#{domain}/#{username},user").returns connection
106
+ connection.expects(:Class).returns('User')
107
107
  expect(Puppet::Util::Windows::ADSI::User.exists?(domain_username)).to be_truthy
108
108
  end
109
109
 
110
110
  it "should be able to confirm the existence of a user with a well-known SID" do
111
-
112
- system_user = Win32::Security::SID::LocalSystem
111
+ system_user = Puppet::Util::Windows::SID::LocalSystem
113
112
  # ensure that the underlying OS is queried here
114
113
  Puppet::Util::Windows::ADSI.unstub(:connect)
115
114
  expect(Puppet::Util::Windows::ADSI::User.exists?(system_user)).to be_truthy
116
115
  end
117
116
 
117
+ it "should return false with a well-known Group SID" do
118
+ group = Puppet::Util::Windows::SID::BuiltinAdministrators
119
+ # ensure that the underlying OS is queried here
120
+ Puppet::Util::Windows::ADSI.unstub(:connect)
121
+ expect(Puppet::Util::Windows::ADSI::User.exists?(group)).to be_falsey
122
+ end
123
+
118
124
  it "should return nil with an unknown SID" do
119
125
 
120
126
  bogus_sid = 'S-1-2-3-4'
@@ -130,8 +136,6 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
130
136
  end
131
137
 
132
138
  it "should return an enumeration of IADsUser wrapped objects" do
133
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
134
-
135
139
  name = 'Administrator'
136
140
  wmi_users = [stub('WMI', :name => name)]
137
141
  Puppet::Util::Windows::ADSI.expects(:execquery).with('select name from win32_useraccount where localaccount = "TRUE"').returns(wmi_users)
@@ -203,20 +207,20 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
203
207
 
204
208
  describe "when given a set of groups to which to add the user" do
205
209
  let(:existing_groups) { ['group2','group3'] }
206
- let(:group_sids) { existing_groups.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i])} }
210
+ let(:group_sids) { existing_groups.each_with_index.map{|n,i| stub(:Name => n, :objectSID => stub(:sid => i))} }
207
211
 
208
212
  let(:groups_to_set) { 'group1,group2' }
209
- let(:desired_sids) { groups_to_set.split(',').each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i-1])} }
213
+ let(:desired_sids) { groups_to_set.split(',').each_with_index.map{|n,i| stub(:Name => n, :objectSID => stub(:sid => i-1))} }
210
214
 
211
215
  before(:each) do
212
- user.expects(:group_sids).returns(group_sids.map {|s| s.objectSID})
216
+ user.expects(:group_sids).returns(group_sids.map {|s| s.objectSID })
213
217
  end
214
218
 
215
219
  describe "if membership is specified as inclusive" do
216
220
  it "should add the user to those groups, and remove it from groups not in the list" do
217
- Puppet::Util::Windows::ADSI::User.expects(:name_sid_hash).returns(Hash[ desired_sids.map { |s| [s.objectSID.to_s, s.objectSID] }])
218
- user.expects(:add_group_sids).with([-1])
219
- user.expects(:remove_group_sids).with([1])
221
+ Puppet::Util::Windows::ADSI::User.expects(:name_sid_hash).returns(Hash[ desired_sids.map { |s| [s.objectSID.sid, s.objectSID] }])
222
+ user.expects(:add_group_sids).with { |value| value.sid == -1 }
223
+ user.expects(:remove_group_sids).with { |value| value.sid == 1 }
220
224
 
221
225
  user.set_groups(groups_to_set, false)
222
226
  end
@@ -224,7 +228,7 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
224
228
  it "should remove all users from a group if desired is empty" do
225
229
  Puppet::Util::Windows::ADSI::User.expects(:name_sid_hash).returns({})
226
230
  user.expects(:add_group_sids).never
227
- user.expects(:remove_group_sids).with([0], [1])
231
+ user.expects(:remove_group_sids).with { |user1, user2| user1.sid == 0 && user2.sid == 1 }
228
232
 
229
233
  user.set_groups('', false)
230
234
  end
@@ -232,8 +236,8 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
232
236
 
233
237
  describe "if membership is specified as minimum" do
234
238
  it "should add the user to the specified groups without affecting its other memberships" do
235
- Puppet::Util::Windows::ADSI::User.expects(:name_sid_hash).returns(Hash[ desired_sids.map { |s| [s.objectSID.to_s, s.objectSID] }])
236
- user.expects(:add_group_sids).with([-1])
239
+ Puppet::Util::Windows::ADSI::User.expects(:name_sid_hash).returns(Hash[ desired_sids.map { |s| [s.objectSID.sid, s.objectSID] }])
240
+ user.expects(:add_group_sids).with { |value| value.sid == -1 }
237
241
  user.expects(:remove_group_sids).never
238
242
 
239
243
  user.set_groups(groups_to_set, true)
@@ -270,7 +274,7 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
270
274
  end
271
275
 
272
276
  it "and raise when passed a non-SID object to add" do
273
- expect{ group.add_member_sids(invalid)}.to raise_error(Puppet::Error, /Must use a valid SID object/)
277
+ expect{ group.add_member_sids(invalid)}.to raise_error(Puppet::Error, /Must use a valid SID::Principal/)
274
278
  end
275
279
 
276
280
  it "to remove a member" do
@@ -280,7 +284,7 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
280
284
  end
281
285
 
282
286
  it "and raise when passed a non-SID object to remove" do
283
- expect{ group.remove_member_sids(invalid)}.to raise_error(Puppet::Error, /Must use a valid SID object/)
287
+ expect{ group.remove_member_sids(invalid)}.to raise_error(Puppet::Error, /Must use a valid SID::Principal/)
284
288
  end
285
289
  end
286
290
 
@@ -298,9 +302,9 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
298
302
  it "should set the members of a group to only desired_members when inclusive" do
299
303
  names = ['DOMAIN\user1', 'user2']
300
304
  sids = [
301
- stub(:account => 'user1', :domain => 'DOMAIN'),
302
- stub(:account => 'user2', :domain => 'testcomputername'),
303
- stub(:account => 'user3', :domain => 'DOMAIN2'),
305
+ stub(:account => 'user1', :domain => 'DOMAIN', :sid => 1),
306
+ stub(:account => 'user2', :domain => 'testcomputername', :sid => 2),
307
+ stub(:account => 'user3', :domain => 'DOMAIN2', :sid => 3),
304
308
  ]
305
309
 
306
310
  # use stubbed objectSid on member to return stubbed SID
@@ -325,9 +329,9 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
325
329
  it "should add the desired_members to an existing group when not inclusive" do
326
330
  names = ['DOMAIN\user1', 'user2']
327
331
  sids = [
328
- stub(:account => 'user1', :domain => 'DOMAIN'),
329
- stub(:account => 'user2', :domain => 'testcomputername'),
330
- stub(:account => 'user3', :domain => 'DOMAIN2'),
332
+ stub(:account => 'user1', :domain => 'DOMAIN', :sid => 1),
333
+ stub(:account => 'user2', :domain => 'testcomputername', :sid => 2),
334
+ stub(:account => 'user3', :domain => 'DOMAIN2', :sid => 3),
331
335
  ]
332
336
 
333
337
  # use stubbed objectSid on member to return stubbed SID
@@ -361,8 +365,8 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
361
365
  it "should remove all members when desired_members is empty and inclusive" do
362
366
  names = ['DOMAIN\user1', 'user2']
363
367
  sids = [
364
- stub(:account => 'user1', :domain => 'DOMAIN'),
365
- stub(:account => 'user2', :domain => 'testcomputername')
368
+ stub(:account => 'user1', :domain => 'DOMAIN', :sid => 1 ),
369
+ stub(:account => 'user2', :domain => 'testcomputername', :sid => 2 ),
366
370
  ]
367
371
 
368
372
  # use stubbed objectSid on member to return stubbed SID
@@ -384,8 +388,8 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
384
388
  it "should do nothing when desired_members is empty and not inclusive" do
385
389
  names = ['DOMAIN\user1', 'user2']
386
390
  sids = [
387
- stub(:account => 'user1', :domain => 'DOMAIN'),
388
- stub(:account => 'user2', :domain => 'testcomputername')
391
+ stub(:account => 'user1', :domain => 'DOMAIN', :sid => 1 ),
392
+ stub(:account => 'user2', :domain => 'testcomputername', :sid => 2 ),
389
393
  ]
390
394
  # use stubbed objectSid on member to return stubbed SID
391
395
  Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(sids[0])
@@ -409,7 +413,6 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
409
413
  end
410
414
 
411
415
  it "should generate the correct URI" do
412
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
413
416
  adsi_group.expects(:objectSID).returns([0])
414
417
  Socket.expects(:gethostname).returns('testcomputername')
415
418
  Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(stub(:account => groupname,:domain => 'testcomputername'))
@@ -418,7 +421,6 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
418
421
  end
419
422
 
420
423
  it "should generate the correct URI" do
421
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
422
424
  expect(Puppet::Util::Windows::ADSI::Group.uri("people")).to eq("WinNT://./people,group")
423
425
  end
424
426
 
@@ -435,20 +437,28 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
435
437
  end
436
438
 
437
439
  it "should be able to confirm the existence of a group" do
438
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
440
+ Puppet::Util::Windows::SID.expects(:name_to_sid_object).with(groupname).returns nil
439
441
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://./#{groupname},group").returns connection
442
+ connection.expects(:Class).returns('Group')
440
443
 
441
444
  expect(Puppet::Util::Windows::ADSI::Group.exists?(groupname)).to be_truthy
442
445
  end
443
446
 
444
447
  it "should be able to confirm the existence of a group with a well-known SID" do
445
448
 
446
- service_group = Win32::Security::SID::Service
449
+ service_group = Puppet::Util::Windows::SID::Service
447
450
  # ensure that the underlying OS is queried here
448
451
  Puppet::Util::Windows::ADSI.unstub(:connect)
449
452
  expect(Puppet::Util::Windows::ADSI::Group.exists?(service_group)).to be_truthy
450
453
  end
451
454
 
455
+ it "will return true with a well-known User SID, as there is no way to resolve it with a WinNT:// style moniker" do
456
+ user = Puppet::Util::Windows::SID::NtLocal
457
+ # ensure that the underlying OS is queried here
458
+ Puppet::Util::Windows::ADSI.unstub(:connect)
459
+ expect(Puppet::Util::Windows::ADSI::Group.exists?(user)).to be_truthy
460
+ end
461
+
452
462
  it "should return nil with an unknown SID" do
453
463
 
454
464
  bogus_sid = 'S-1-2-3-4'
@@ -464,8 +474,6 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
464
474
  end
465
475
 
466
476
  it "should return an enumeration of IADsGroup wrapped objects" do
467
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
468
-
469
477
  name = 'Administrators'
470
478
  wmi_groups = [stub('WMI', :name => name)]
471
479
  Puppet::Util::Windows::ADSI.expects(:execquery).with('select name from win32_group where localaccount = "TRUE"').returns(wmi_groups)
@@ -25,4 +25,46 @@ describe "FFI::MemoryPointer", :if => Puppet.features.microsoft_windows? do
25
25
  expect(read_string.encoding).to eq(Encoding::UTF_8)
26
26
  end
27
27
  end
28
+
29
+ context "read_arbitrary_wide_string_up_to" do
30
+ let (:string) { "foo_bar" }
31
+ let (:single_null_string) { string + "\x00" }
32
+ let (:double_null_string) { string + "\x00\x00" }
33
+
34
+ it "should read a short single null terminated string" do
35
+ read_string = nil
36
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
37
+ read_string = ptr.read_arbitrary_wide_string_up_to()
38
+ end
39
+
40
+ expect(read_string).to eq(string)
41
+ end
42
+
43
+ it "should read a short double null terminated string" do
44
+ read_string = nil
45
+ FFI::MemoryPointer.from_string_to_wide_string(double_null_string) do |ptr|
46
+ read_string = ptr.read_arbitrary_wide_string_up_to(512, :double_null)
47
+ end
48
+
49
+ expect(read_string).to eq(string)
50
+ end
51
+
52
+ it "should return a string of max_length characters when specified" do
53
+ read_string = nil
54
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
55
+ read_string = ptr.read_arbitrary_wide_string_up_to(3)
56
+ end
57
+
58
+ expect(read_string).to eq(string[0..2])
59
+ end
60
+
61
+ it "should return wide strings in UTF-8" do
62
+ read_string = nil
63
+ FFI::MemoryPointer.from_string_to_wide_string(string) do |ptr|
64
+ read_string = ptr.read_arbitrary_wide_string_up_to()
65
+ end
66
+
67
+ expect(read_string.encoding).to eq(Encoding::UTF_8)
68
+ end
69
+ end
28
70
  end
@@ -4,9 +4,9 @@ require 'spec_helper'
4
4
  require 'puppet/util/windows'
5
5
 
6
6
  describe "Puppet::Util::Windows::SecurityDescriptor", :if => Puppet.features.microsoft_windows? do
7
- let(:system_sid) { Win32::Security::SID::LocalSystem }
8
- let(:admins_sid) { Win32::Security::SID::BuiltinAdministrators }
9
- let(:group_sid) { Win32::Security::SID::Nobody }
7
+ let(:system_sid) { Puppet::Util::Windows::SID::LocalSystem }
8
+ let(:admins_sid) { Puppet::Util::Windows::SID::BuiltinAdministrators }
9
+ let(:group_sid) { Puppet::Util::Windows::SID::Nobody }
10
10
  let(:new_sid) { 'S-1-5-32-500-1-2-3' }
11
11
 
12
12
  def empty_dacl