puppet 3.1.1 → 3.2.0.rc1

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 (477) hide show
  1. data/CONTRIBUTING.md +2 -2
  2. data/Gemfile +32 -19
  3. data/README_DEVELOPER.md +332 -14
  4. data/Rakefile +9 -5
  5. data/ext/build_defaults.yaml +2 -3
  6. data/ext/debian/changelog.erb +6 -0
  7. data/ext/debian/control +6 -6
  8. data/ext/envpuppet +4 -4
  9. data/ext/project_data.yaml +1 -0
  10. data/ext/puppet-nm-dispatcher +13 -0
  11. data/ext/redhat/puppet.spec.erb +17 -0
  12. data/ext/suse/client.init +1 -1
  13. data/ext/systemd/puppetagent.service +2 -2
  14. data/ext/systemd/puppetmaster.service +2 -2
  15. data/lib/hiera/scope.rb +29 -11
  16. data/lib/hiera_puppet.rb +1 -3
  17. data/lib/puppet/agent.rb +3 -3
  18. data/lib/puppet/application.rb +2 -2
  19. data/lib/puppet/application/agent.rb +27 -12
  20. data/lib/puppet/application/apply.rb +11 -1
  21. data/lib/puppet/application/describe.rb +1 -1
  22. data/lib/puppet/application/doc.rb +13 -9
  23. data/lib/puppet/application/filebucket.rb +0 -1
  24. data/lib/puppet/application/kick.rb +1 -0
  25. data/lib/puppet/application/master.rb +16 -8
  26. data/lib/puppet/daemon.rb +19 -64
  27. data/lib/puppet/defaults.rb +61 -5
  28. data/lib/puppet/error.rb +15 -4
  29. data/lib/puppet/external/nagios/grammar.ry +1 -1
  30. data/lib/puppet/external/nagios/makefile +1 -1
  31. data/lib/puppet/external/nagios/parser.rb +185 -618
  32. data/lib/puppet/external/pson/pure/parser.rb +47 -1
  33. data/lib/puppet/face/certificate.rb +3 -3
  34. data/lib/puppet/face/module.rb +1 -1
  35. data/lib/puppet/face/module/changes.rb +3 -1
  36. data/lib/puppet/face/module/uninstall.rb +1 -1
  37. data/lib/puppet/face/node/clean.rb +5 -5
  38. data/lib/puppet/feature/base.rb +3 -1
  39. data/lib/puppet/feature/libuser.rb +8 -0
  40. data/lib/puppet/file_serving/fileset.rb +9 -1
  41. data/lib/puppet/forge.rb +28 -5
  42. data/lib/puppet/forge/errors.rb +34 -0
  43. data/lib/puppet/forge/repository.rb +1 -1
  44. data/lib/puppet/indirector.rb +4 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +37 -30
  46. data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
  47. data/lib/puppet/indirector/indirection.rb +28 -15
  48. data/lib/puppet/indirector/rest.rb +18 -10
  49. data/lib/puppet/interface.rb +11 -4
  50. data/lib/puppet/interface/action.rb +1 -3
  51. data/lib/puppet/interface/action_builder.rb +0 -3
  52. data/lib/puppet/interface/action_manager.rb +0 -3
  53. data/lib/puppet/interface/face_collection.rb +0 -2
  54. data/lib/puppet/interface/option.rb +0 -2
  55. data/lib/puppet/interface/option_builder.rb +0 -2
  56. data/lib/puppet/interface/option_manager.rb +0 -2
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module_tool.rb +1 -0
  59. data/lib/puppet/module_tool/applications/application.rb +0 -3
  60. data/lib/puppet/module_tool/applications/builder.rb +8 -20
  61. data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
  62. data/lib/puppet/module_tool/applications/installer.rb +1 -0
  63. data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +18 -1
  66. data/lib/puppet/module_tool/modulefile.rb +2 -2
  67. data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
  68. data/lib/puppet/module_tool/tar.rb +17 -0
  69. data/lib/puppet/module_tool/tar/gnu.rb +9 -0
  70. data/lib/puppet/module_tool/tar/mini.rb +39 -0
  71. data/lib/puppet/module_tool/tar/solaris.rb +5 -0
  72. data/lib/puppet/network/http.rb +1 -0
  73. data/lib/puppet/network/http/connection.rb +9 -23
  74. data/lib/puppet/network/http/handler.rb +38 -7
  75. data/lib/puppet/network/http/rack/rest.rb +14 -3
  76. data/lib/puppet/network/http/webrick.rb +3 -1
  77. data/lib/puppet/network/http/webrick/rest.rb +11 -2
  78. data/lib/puppet/node/environment.rb +3 -1
  79. data/lib/puppet/parameter.rb +32 -29
  80. data/lib/puppet/parameter/package_options.rb +1 -1
  81. data/lib/puppet/parameter/path.rb +1 -1
  82. data/lib/puppet/parameter/value.rb +1 -1
  83. data/lib/puppet/parameter/value_collection.rb +7 -3
  84. data/lib/puppet/parser/ast.rb +3 -1
  85. data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
  86. data/lib/puppet/parser/ast/astarray.rb +1 -1
  87. data/lib/puppet/parser/ast/block_expression.rb +41 -0
  88. data/lib/puppet/parser/ast/function.rb +13 -2
  89. data/lib/puppet/parser/ast/lambda.rb +107 -0
  90. data/lib/puppet/parser/ast/leaf.rb +1 -2
  91. data/lib/puppet/parser/ast/method_call.rb +77 -0
  92. data/lib/puppet/parser/ast/vardef.rb +7 -0
  93. data/lib/puppet/parser/compiler.rb +27 -16
  94. data/lib/puppet/parser/e_parser_adapter.rb +120 -0
  95. data/lib/puppet/parser/files.rb +7 -6
  96. data/lib/puppet/parser/functions.rb +10 -8
  97. data/lib/puppet/parser/functions/collect.rb +43 -0
  98. data/lib/puppet/parser/functions/each.rb +96 -0
  99. data/lib/puppet/parser/functions/foreach.rb +96 -0
  100. data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
  101. data/lib/puppet/parser/functions/hiera.rb +20 -2
  102. data/lib/puppet/parser/functions/hiera_array.rb +21 -2
  103. data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
  104. data/lib/puppet/parser/functions/hiera_include.rb +33 -2
  105. data/lib/puppet/parser/functions/inline_template.rb +4 -4
  106. data/lib/puppet/parser/functions/reduce.rb +74 -0
  107. data/lib/puppet/parser/functions/reject.rb +46 -0
  108. data/lib/puppet/parser/functions/select.rb +46 -0
  109. data/lib/puppet/parser/functions/slice.rb +96 -0
  110. data/lib/puppet/parser/functions/template.rb +2 -2
  111. data/lib/puppet/parser/grammar.ra +7 -4
  112. data/lib/puppet/parser/lexer.rb +10 -0
  113. data/lib/puppet/parser/methods.rb +69 -0
  114. data/lib/puppet/parser/parser.rb +855 -808
  115. data/lib/puppet/parser/parser_factory.rb +62 -0
  116. data/lib/puppet/parser/parser_support.rb +8 -2
  117. data/lib/puppet/parser/scope.rb +153 -47
  118. data/lib/puppet/parser/templatewrapper.rb +28 -21
  119. data/lib/puppet/parser/type_loader.rb +3 -1
  120. data/lib/puppet/pops.rb +40 -0
  121. data/lib/puppet/pops/adaptable.rb +190 -0
  122. data/lib/puppet/pops/adapters.rb +65 -0
  123. data/lib/puppet/pops/containment.rb +37 -0
  124. data/lib/puppet/pops/issues.rb +258 -0
  125. data/lib/puppet/pops/label_provider.rb +71 -0
  126. data/lib/puppet/pops/model/ast_transformer.rb +636 -0
  127. data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
  128. data/lib/puppet/pops/model/factory.rb +804 -0
  129. data/lib/puppet/pops/model/model.rb +567 -0
  130. data/lib/puppet/pops/model/model_label_provider.rb +75 -0
  131. data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
  132. data/lib/puppet/pops/model/tree_dumper.rb +59 -0
  133. data/lib/puppet/pops/parser/egrammar.ra +723 -0
  134. data/lib/puppet/pops/parser/eparser.rb +2300 -0
  135. data/lib/puppet/pops/parser/grammar.ra +746 -0
  136. data/lib/puppet/pops/parser/lexer.rb +842 -0
  137. data/lib/puppet/pops/parser/makefile +13 -0
  138. data/lib/puppet/pops/parser/parser_support.rb +203 -0
  139. data/lib/puppet/pops/patterns.rb +35 -0
  140. data/lib/puppet/pops/utils.rb +104 -0
  141. data/lib/puppet/pops/validation.rb +297 -0
  142. data/lib/puppet/pops/validation/checker3_1.rb +551 -0
  143. data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
  144. data/lib/puppet/pops/visitable.rb +6 -0
  145. data/lib/puppet/pops/visitor.rb +50 -0
  146. data/lib/puppet/property.rb +37 -28
  147. data/lib/puppet/property/ensure.rb +2 -2
  148. data/lib/puppet/property/ordered_list.rb +1 -1
  149. data/lib/puppet/provider.rb +26 -30
  150. data/lib/puppet/provider/aixobject.rb +45 -44
  151. data/lib/puppet/provider/augeas/augeas.rb +0 -1
  152. data/lib/puppet/provider/confiner.rb +1 -1
  153. data/lib/puppet/provider/cron/crontab.rb +107 -67
  154. data/lib/puppet/provider/group/groupadd.rb +59 -3
  155. data/lib/puppet/provider/interface/cisco.rb +4 -4
  156. data/lib/puppet/provider/mount/parsed.rb +1 -1
  157. data/lib/puppet/provider/nameservice.rb +22 -6
  158. data/lib/puppet/provider/nameservice/pw.rb +1 -1
  159. data/lib/puppet/provider/package/aix.rb +28 -4
  160. data/lib/puppet/provider/package/gem.rb +0 -2
  161. data/lib/puppet/provider/package/macports.rb +1 -1
  162. data/lib/puppet/provider/package/nim.rb +249 -4
  163. data/lib/puppet/provider/package/opkg.rb +77 -0
  164. data/lib/puppet/provider/package/pacman.rb +2 -2
  165. data/lib/puppet/provider/package/rpm.rb +30 -16
  166. data/lib/puppet/provider/package/yum.rb +3 -3
  167. data/lib/puppet/provider/parsedfile.rb +80 -3
  168. data/lib/puppet/provider/selmodule/semodule.rb +2 -2
  169. data/lib/puppet/provider/service/debian.rb +0 -4
  170. data/lib/puppet/provider/service/freebsd.rb +2 -2
  171. data/lib/puppet/provider/service/gentoo.rb +0 -9
  172. data/lib/puppet/provider/service/init.rb +27 -2
  173. data/lib/puppet/provider/service/launchd.rb +1 -1
  174. data/lib/puppet/provider/service/openwrt.rb +36 -0
  175. data/lib/puppet/provider/service/redhat.rb +0 -9
  176. data/lib/puppet/provider/service/src.rb +38 -4
  177. data/lib/puppet/provider/service/systemd.rb +2 -2
  178. data/lib/puppet/provider/service/upstart.rb +1 -8
  179. data/lib/puppet/provider/user/aix.rb +4 -10
  180. data/lib/puppet/provider/user/pw.rb +6 -10
  181. data/lib/puppet/provider/user/useradd.rb +129 -31
  182. data/lib/puppet/provider/vlan/cisco.rb +4 -4
  183. data/lib/puppet/reference/function.rb +2 -2
  184. data/lib/puppet/reference/indirection.rb +46 -5
  185. data/lib/puppet/reference/metaparameter.rb +2 -2
  186. data/lib/puppet/reports.rb +5 -5
  187. data/lib/puppet/reports/rrdgraph.rb +4 -4
  188. data/lib/puppet/reports/tagmail.rb +1 -1
  189. data/lib/puppet/resource.rb +1 -1
  190. data/lib/puppet/resource/type.rb +13 -11
  191. data/lib/puppet/scheduler.rb +16 -0
  192. data/lib/puppet/scheduler/job.rb +53 -0
  193. data/lib/puppet/scheduler/scheduler.rb +45 -0
  194. data/lib/puppet/scheduler/splay_job.rb +32 -0
  195. data/lib/puppet/scheduler/timer.rb +13 -0
  196. data/lib/puppet/settings/base_setting.rb +1 -1
  197. data/lib/puppet/simple_graph.rb +4 -4
  198. data/lib/puppet/ssl/base.rb +12 -2
  199. data/lib/puppet/ssl/certificate.rb +4 -1
  200. data/lib/puppet/ssl/certificate_request.rb +4 -1
  201. data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
  202. data/lib/puppet/ssl/configuration.rb +32 -0
  203. data/lib/puppet/ssl/host.rb +18 -21
  204. data/lib/puppet/ssl/key.rb +4 -1
  205. data/lib/puppet/ssl/validator.rb +116 -0
  206. data/lib/puppet/transaction.rb +1 -1
  207. data/lib/puppet/transaction/event.rb +3 -10
  208. data/lib/puppet/transaction/event_manager.rb +8 -1
  209. data/lib/puppet/transaction/report.rb +17 -16
  210. data/lib/puppet/type.rb +77 -69
  211. data/lib/puppet/type/cron.rb +20 -8
  212. data/lib/puppet/type/exec.rb +9 -3
  213. data/lib/puppet/type/file.rb +95 -21
  214. data/lib/puppet/type/file/content.rb +1 -1
  215. data/lib/puppet/type/file/mode.rb +7 -1
  216. data/lib/puppet/type/file/source.rb +2 -2
  217. data/lib/puppet/type/group.rb +11 -0
  218. data/lib/puppet/type/scheduled_task.rb +5 -1
  219. data/lib/puppet/type/service.rb +1 -1
  220. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  221. data/lib/puppet/type/user.rb +24 -6
  222. data/lib/puppet/util.rb +12 -2
  223. data/lib/puppet/util/classgen.rb +4 -4
  224. data/lib/puppet/util/colors.rb +55 -0
  225. data/lib/puppet/util/command_line/trollop.rb +4 -4
  226. data/lib/puppet/util/errors.rb +39 -3
  227. data/lib/puppet/util/fileparsing.rb +5 -0
  228. data/lib/puppet/util/filetype.rb +11 -9
  229. data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
  230. data/lib/puppet/util/libuser.conf +15 -0
  231. data/lib/puppet/util/libuser.rb +12 -0
  232. data/lib/puppet/util/monkey_patches.rb +48 -0
  233. data/lib/puppet/util/network_device.rb +1 -1
  234. data/lib/puppet/util/network_device/base.rb +2 -2
  235. data/lib/puppet/util/network_device/cisco/device.rb +29 -19
  236. data/lib/puppet/util/network_device/config.rb +5 -2
  237. data/lib/puppet/util/network_device/ipcalc.rb +1 -1
  238. data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
  239. data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
  240. data/lib/puppet/util/plugins.rb +4 -4
  241. data/lib/puppet/util/posix.rb +1 -1
  242. data/lib/puppet/util/profiler.rb +28 -0
  243. data/lib/puppet/util/profiler/logging.rb +47 -0
  244. data/lib/puppet/util/profiler/none.rb +8 -0
  245. data/lib/puppet/util/profiler/object_counts.rb +17 -0
  246. data/lib/puppet/util/profiler/wall_clock.rb +34 -0
  247. data/lib/puppet/util/provider_features.rb +1 -1
  248. data/lib/puppet/util/rdoc/parser.rb +5 -5
  249. data/lib/puppet/util/ssl.rb +38 -0
  250. data/lib/puppet/util/subclass_loader.rb +1 -5
  251. data/lib/puppet/util/windows.rb +1 -0
  252. data/lib/puppet/util/windows/process.rb +3 -0
  253. data/lib/puppet/util/windows/root_certs.rb +86 -0
  254. data/lib/puppet/util/windows/security.rb +1 -0
  255. data/lib/puppet/version.rb +1 -1
  256. data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
  257. data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
  258. data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
  259. data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
  260. data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
  261. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
  262. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
  263. data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
  264. data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
  265. data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
  266. data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
  267. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
  268. data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
  269. data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
  270. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
  271. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
  272. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
  273. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
  274. data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
  275. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
  276. data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
  277. data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
  278. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
  279. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
  280. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
  281. data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
  282. data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
  283. data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
  284. data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
  285. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
  286. data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
  287. data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
  288. data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
  289. data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
  290. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
  291. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
  292. data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
  293. data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
  294. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
  295. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
  296. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
  297. data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
  298. data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
  299. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
  300. data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
  301. data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
  302. data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
  303. data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
  304. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
  305. data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
  306. data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
  307. data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
  308. data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
  309. data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
  310. data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
  311. data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
  312. data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
  313. data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
  314. data/spec/integration/parser/collector_spec.rb +1 -1
  315. data/spec/integration/parser/compiler_spec.rb +252 -227
  316. data/spec/integration/parser/parser_spec.rb +171 -53
  317. data/spec/integration/parser/scope_spec.rb +1 -1
  318. data/spec/integration/provider/cron/crontab_spec.rb +187 -0
  319. data/spec/integration/provider/service/systemd_spec.rb +20 -0
  320. data/spec/integration/type/file_spec.rb +21 -21
  321. data/spec/integration/type/package_spec.rb +1 -1
  322. data/spec/lib/puppet_spec/database.rb +2 -5
  323. data/spec/spec_helper.rb +6 -1
  324. data/spec/unit/application/apply_spec.rb +16 -1
  325. data/spec/unit/application/describe_spec.rb +1 -1
  326. data/spec/unit/application/doc_spec.rb +55 -32
  327. data/spec/unit/application/kick_spec.rb +8 -6
  328. data/spec/unit/application/master_spec.rb +4 -4
  329. data/spec/unit/daemon_spec.rb +1 -1
  330. data/spec/unit/forge/errors_spec.rb +40 -0
  331. data/spec/unit/forge/repository_spec.rb +11 -1
  332. data/spec/unit/forge_spec.rb +13 -3
  333. data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
  334. data/spec/unit/hiera/scope_spec.rb +48 -25
  335. data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
  336. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
  337. data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
  338. data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
  339. data/spec/unit/indirector/indirection_spec.rb +5 -0
  340. data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
  341. data/spec/unit/indirector_spec.rb +7 -1
  342. data/spec/unit/interface/action_builder_spec.rb +1 -1
  343. data/spec/unit/interface/action_manager_spec.rb +0 -2
  344. data/spec/unit/interface/action_spec.rb +1 -1
  345. data/spec/unit/interface/documentation_spec.rb +0 -2
  346. data/spec/unit/interface/face_collection_spec.rb +1 -1
  347. data/spec/unit/interface/option_builder_spec.rb +1 -1
  348. data/spec/unit/interface/option_spec.rb +0 -1
  349. data/spec/unit/module_spec.rb +17 -19
  350. data/spec/unit/module_tool/application_spec.rb +1 -3
  351. data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
  352. data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
  353. data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
  354. data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
  355. data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
  356. data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
  357. data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
  358. data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
  359. data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
  360. data/spec/unit/network/http/connection_spec.rb +17 -2
  361. data/spec/unit/network/http/handler_spec.rb +195 -167
  362. data/spec/unit/network/http/rack/rest_spec.rb +26 -4
  363. data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
  364. data/spec/unit/network/http/webrick_spec.rb +12 -3
  365. data/spec/unit/node/environment_spec.rb +421 -404
  366. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
  367. data/spec/unit/parser/collector_spec.rb +4 -4
  368. data/spec/unit/parser/compiler_spec.rb +13 -13
  369. data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
  370. data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
  371. data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
  372. data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
  373. data/spec/unit/parser/functions/hiera_spec.rb +0 -2
  374. data/spec/unit/parser/functions_spec.rb +27 -15
  375. data/spec/unit/parser/methods/collect_spec.rb +110 -0
  376. data/spec/unit/parser/methods/each_spec.rb +91 -0
  377. data/spec/unit/parser/methods/foreach_spec.rb +91 -0
  378. data/spec/unit/parser/methods/reduce_spec.rb +67 -0
  379. data/spec/unit/parser/methods/reject_spec.rb +73 -0
  380. data/spec/unit/parser/methods/select_spec.rb +79 -0
  381. data/spec/unit/parser/methods/shared.rb +61 -0
  382. data/spec/unit/parser/methods/slice_spec.rb +97 -0
  383. data/spec/unit/parser/parser_spec.rb +2 -2
  384. data/spec/unit/parser/scope_spec.rb +39 -16
  385. data/spec/unit/parser/templatewrapper_spec.rb +6 -5
  386. data/spec/unit/parser/type_loader_spec.rb +191 -165
  387. data/spec/unit/pops/adaptable_spec.rb +143 -0
  388. data/spec/unit/pops/containment_spec.rb +25 -0
  389. data/spec/unit/pops/factory_rspec_helper.rb +77 -0
  390. data/spec/unit/pops/factory_spec.rb +329 -0
  391. data/spec/unit/pops/issues_spec.rb +26 -0
  392. data/spec/unit/pops/label_provider_spec.rb +42 -0
  393. data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
  394. data/spec/unit/pops/model/model_spec.rb +37 -0
  395. data/spec/unit/pops/parser/lexer_spec.rb +884 -0
  396. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
  397. data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
  398. data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
  399. data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
  400. data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
  401. data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
  402. data/spec/unit/pops/parser/parser_spec.rb +15 -0
  403. data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
  404. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
  405. data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
  406. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
  407. data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
  408. data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
  409. data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
  410. data/spec/unit/pops/visitor_spec.rb +94 -0
  411. data/spec/unit/property_spec.rb +11 -0
  412. data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
  413. data/spec/unit/provider/cron/crontab_spec.rb +97 -7
  414. data/spec/unit/provider/cron/parsed_spec.rb +325 -0
  415. data/spec/unit/provider/exec/posix_spec.rb +1 -1
  416. data/spec/unit/provider/group/groupadd_spec.rb +33 -3
  417. data/spec/unit/provider/group/pw_spec.rb +5 -5
  418. data/spec/unit/provider/nameservice_spec.rb +304 -0
  419. data/spec/unit/provider/package/aix_spec.rb +53 -11
  420. data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
  421. data/spec/unit/provider/package/gem_spec.rb +6 -11
  422. data/spec/unit/provider/package/nim_spec.rb +216 -7
  423. data/spec/unit/provider/package/opkg_spec.rb +180 -0
  424. data/spec/unit/provider/package/rpm_spec.rb +149 -3
  425. data/spec/unit/provider/package/yum_spec.rb +6 -5
  426. data/spec/unit/provider/parsedfile_spec.rb +122 -28
  427. data/spec/unit/provider/service/freebsd_spec.rb +18 -0
  428. data/spec/unit/provider/service/init_spec.rb +108 -87
  429. data/spec/unit/provider/service/launchd_spec.rb +2 -2
  430. data/spec/unit/provider/service/openwrt_spec.rb +109 -0
  431. data/spec/unit/provider/service/src_spec.rb +117 -41
  432. data/spec/unit/provider/service/systemd_spec.rb +125 -17
  433. data/spec/unit/provider/service/upstart_spec.rb +1 -1
  434. data/spec/unit/provider/user/aix_spec.rb +42 -0
  435. data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
  436. data/spec/unit/provider/user/pw_spec.rb +24 -12
  437. data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
  438. data/spec/unit/provider/user/useradd_spec.rb +179 -15
  439. data/spec/unit/resource/type_spec.rb +3 -3
  440. data/spec/unit/scheduler/job_spec.rb +79 -0
  441. data/spec/unit/scheduler/scheduler_spec.rb +129 -0
  442. data/spec/unit/scheduler/splay_job_spec.rb +35 -0
  443. data/spec/unit/ssl/base_spec.rb +3 -9
  444. data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
  445. data/spec/unit/ssl/certificate_request_spec.rb +3 -1
  446. data/spec/unit/ssl/certificate_spec.rb +3 -1
  447. data/spec/unit/ssl/configuration_spec.rb +74 -0
  448. data/spec/unit/ssl/host_spec.rb +28 -7
  449. data/spec/unit/ssl/validator_spec.rb +311 -0
  450. data/spec/unit/transaction/event_manager_spec.rb +49 -0
  451. data/spec/unit/transaction/event_spec.rb +20 -5
  452. data/spec/unit/transaction/report_spec.rb +8 -0
  453. data/spec/unit/type/cron_spec.rb +9 -0
  454. data/spec/unit/type/exec_spec.rb +11 -0
  455. data/spec/unit/type/file/content_spec.rb +20 -20
  456. data/spec/unit/type/file/mode_spec.rb +6 -0
  457. data/spec/unit/type/file/source_spec.rb +9 -7
  458. data/spec/unit/type/file_spec.rb +22 -3
  459. data/spec/unit/type/service_spec.rb +34 -21
  460. data/spec/unit/type_spec.rb +46 -1
  461. data/spec/unit/util/backups_spec.rb +2 -2
  462. data/spec/unit/util/execution_spec.rb +4 -1
  463. data/spec/unit/util/filetype_spec.rb +6 -0
  464. data/spec/unit/util/monkey_patches_spec.rb +18 -0
  465. data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
  466. data/spec/unit/util/network_device/config_spec.rb +14 -0
  467. data/spec/unit/util/network_device_spec.rb +3 -3
  468. data/spec/unit/util/profiler/logging_spec.rb +81 -0
  469. data/spec/unit/util/profiler/none_spec.rb +12 -0
  470. data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
  471. data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
  472. data/spec/unit/util/pson_spec.rb +5 -0
  473. data/spec/unit/util/ssl_spec.rb +51 -0
  474. data/spec/unit/util/windows/root_certs_spec.rb +15 -0
  475. data/spec/unit/util_spec.rb +28 -0
  476. metadata +2593 -2307
  477. data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -24,7 +24,7 @@ describe Puppet::Parser::AST::ArithmeticOperator do
24
24
  end
25
25
 
26
26
  it "should fail for an unknown operator" do
27
- lambda { operator = ast::ArithmeticOperator.new :lval => @one, :operator => "%", :rval => @two }.should raise_error
27
+ lambda { operator = ast::ArithmeticOperator.new :lval => @one, :operator => "^", :rval => @two }.should raise_error
28
28
  end
29
29
 
30
30
  it "should call Puppet::Parser::Scope.number?" do
@@ -35,7 +35,7 @@ describe Puppet::Parser::AST::ArithmeticOperator do
35
35
  end
36
36
 
37
37
 
38
- %w{ + - * / << >>}.each do |op|
38
+ %w{ + - * / % << >>}.each do |op|
39
39
  it "should call ruby Numeric '#{op}'" do
40
40
  one = stub 'one'
41
41
  two = stub 'two'
@@ -61,4 +61,100 @@ describe Puppet::Parser::AST::ArithmeticOperator do
61
61
  operator.evaluate(@scope).should == 4.33
62
62
  end
63
63
 
64
+ context "when applied to array" do
65
+ before :each do
66
+ Puppet[:parser] = 'future'
67
+ end
68
+
69
+ it "+ should concatenate an array" do
70
+ one = stub 'one', :safeevaluate => [1,2,3]
71
+ two = stub 'two', :safeevaluate => [4,5]
72
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
73
+ operator.evaluate(@scope).should == [1,2,3,4,5]
74
+ end
75
+
76
+ it "<< should append array to an array" do
77
+ one = stub 'one', :safeevaluate => [1,2,3]
78
+ two = stub 'two', :safeevaluate => [4,5]
79
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "<<", :rval => two
80
+ operator.evaluate(@scope).should == [1,2,3, [4,5]]
81
+ end
82
+
83
+ it "<< should append object to an array" do
84
+ one = stub 'one', :safeevaluate => [1,2,3]
85
+ two = stub 'two', :safeevaluate => 'a b c'
86
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "<<", :rval => two
87
+ operator.evaluate(@scope).should == [1,2,3, 'a b c']
88
+ end
89
+
90
+ context "and input is invalid" do
91
+ it "should raise error for + if left is not an array" do
92
+ one = stub 'one', :safeevaluate => 4
93
+ two = stub 'two', :safeevaluate => [4,5]
94
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
95
+ lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/left/)
96
+ end
97
+
98
+ it "should raise error for << if left is not an array" do
99
+ one = stub 'one', :safeevaluate => 4
100
+ two = stub 'two', :safeevaluate => [4,5]
101
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "<<", :rval => two
102
+ lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/left/)
103
+ end
104
+
105
+ it "should raise error for + if right is not an array" do
106
+ one = stub 'one', :safeevaluate => [1,2]
107
+ two = stub 'two', :safeevaluate => 45
108
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
109
+ lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/right/)
110
+ end
111
+
112
+ %w{ - * / % >>}.each do |op|
113
+ it "should raise error for '#{op}'" do
114
+ one = stub 'one', :safeevaluate => [1,2,3]
115
+ two = stub 'two', :safeevaluate => [4,5]
116
+ operator = ast::ArithmeticOperator.new :lval => @one, :operator => op, :rval => @two
117
+ lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error
118
+ end
119
+ end
120
+ end
121
+
122
+ context "when applied to hash" do
123
+ before :each do
124
+ Puppet[:parser] = 'future'
125
+ end
126
+
127
+ it "+ should merge two hashes" do
128
+ one = stub 'one', :safeevaluate => {'a' => 1, 'b' => 2}
129
+ two = stub 'two', :safeevaluate => {'c' => 3 }
130
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
131
+ operator.evaluate(@scope).should == {'a' => 1, 'b' => 2, 'c' => 3}
132
+ end
133
+
134
+ context "and input is invalid" do
135
+ it "should raise error for + if left is not a hash" do
136
+ one = stub 'one', :safeevaluate => 4
137
+ two = stub 'two', :safeevaluate => {'a' => 1}
138
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
139
+ lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/left/)
140
+ end
141
+
142
+ it "should raise error for + if right is not a hash" do
143
+ one = stub 'one', :safeevaluate => {'a' => 1}
144
+ two = stub 'two', :safeevaluate => 1
145
+ operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
146
+ lambda { operator.evaluate(@scope).should == {'a'=>1, 1=>nil} }.should raise_error(/right/)
147
+ end
148
+
149
+ %w{ - * / % << >>}.each do |op|
150
+ it "should raise error for '#{op}'" do
151
+ one = stub 'one', :safeevaluate => {'a' => 1, 'b' => 2}
152
+ two = stub 'two', :safeevaluate => {'c' => 3 }
153
+ operator = ast::ArithmeticOperator.new :lval => @one, :operator => op, :rval => @two
154
+ lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
64
160
  end
@@ -288,6 +288,10 @@ describe Puppet::Parser::Collector, "when collecting exported resources", :if =>
288
288
  Puppet[:storeconfigs_backend] = "active_record"
289
289
  end
290
290
 
291
+ after :each do
292
+ Puppet::Rails.teardown
293
+ end
294
+
291
295
  it "should return all matching resources from the current compile and mark them non-virtual and non-exported" do
292
296
  one = Puppet::Parser::Resource.new('notify', 'one',
293
297
  :virtual => true,
@@ -304,10 +308,6 @@ describe Puppet::Parser::Collector, "when collecting exported resources", :if =>
304
308
  @collector.evaluate.should == [one, two]
305
309
  one.should_not be_virtual
306
310
  two.should_not be_virtual
307
-
308
- # REVISIT: Apparently we never actually marked local resources as
309
- # non-exported. So, this is what the previous test asserted, and checking
310
- # what it claims to do causes test failures. --daniel 2011-08-23
311
311
  end
312
312
 
313
313
  it "should mark all returned resources as not virtual" do
@@ -152,7 +152,7 @@ describe Puppet::Parser::Compiler do
152
152
 
153
153
  it "should transform node class hashes into a class list" do
154
154
  node = Puppet::Node.new("mynode")
155
- node.classes = {'foo'=>{'one'=>'1'}, 'bar'=>{'two'=>'2'}}
155
+ node.classes = {'foo'=>{'one'=>'p1'}, 'bar'=>{'two'=>'p2'}}
156
156
  compiler = Puppet::Parser::Compiler.new(node)
157
157
 
158
158
  compiler.classlist.should =~ ['foo', 'bar']
@@ -231,7 +231,7 @@ describe Puppet::Parser::Compiler do
231
231
  end
232
232
 
233
233
  it "should evaluate any parameterized classes named in the node" do
234
- classes = {'foo'=>{'1'=>'one'}, 'bar'=>{'2'=>'two'}}
234
+ classes = {'foo'=>{'p1'=>'one'}, 'bar'=>{'p2'=>'two'}}
235
235
  @node.stubs(:classes).returns(classes)
236
236
  @compiler.expects(:evaluate_classes).with(classes, @compiler.topscope)
237
237
  @compiler.compile
@@ -609,7 +609,7 @@ describe Puppet::Parser::Compiler do
609
609
  # Define the given class with default parameters
610
610
  def define_class(name, parameters)
611
611
  @node.classes[name] = parameters
612
- klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'1' => @ast_obj, '2' => @ast_obj})
612
+ klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'p1' => @ast_obj, 'p2' => @ast_obj})
613
613
  @compiler.topscope.known_resource_types.add klass
614
614
  end
615
615
 
@@ -627,20 +627,20 @@ describe Puppet::Parser::Compiler do
627
627
  it "should provide default values for parameters that have no values specified" do
628
628
  define_class('foo', {})
629
629
  compile()
630
- @catalog.resource(:class, 'foo')['1'].should == "foo"
630
+ @catalog.resource(:class, 'foo')['p1'].should == "foo"
631
631
  end
632
632
 
633
633
  it "should use any provided values" do
634
- define_class('foo', {'1' => 'real_value'})
634
+ define_class('foo', {'p1' => 'real_value'})
635
635
  compile()
636
- @catalog.resource(:class, 'foo')['1'].should == "real_value"
636
+ @catalog.resource(:class, 'foo')['p1'].should == "real_value"
637
637
  end
638
638
 
639
639
  it "should support providing some but not all values" do
640
- define_class('foo', {'1' => 'real_value'})
640
+ define_class('foo', {'p1' => 'real_value'})
641
641
  compile()
642
- @catalog.resource(:class, 'Foo')['1'].should == "real_value"
643
- @catalog.resource(:class, 'Foo')['2'].should == "foo"
642
+ @catalog.resource(:class, 'Foo')['p1'].should == "real_value"
643
+ @catalog.resource(:class, 'Foo')['p2'].should == "foo"
644
644
  end
645
645
 
646
646
  it "should ensure each node class is in catalog and has appropriate tags" do
@@ -648,7 +648,7 @@ describe Puppet::Parser::Compiler do
648
648
  @node.classes = klasses
649
649
  ast_obj = Puppet::Parser::AST::String.new(:value => 'foo')
650
650
  klasses.each do |name|
651
- klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'1' => ast_obj, '2' => ast_obj})
651
+ klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'p1' => ast_obj, 'p2' => ast_obj})
652
652
  @compiler.topscope.known_resource_types.add klass
653
653
  end
654
654
  catalog = @compiler.compile
@@ -659,11 +659,11 @@ describe Puppet::Parser::Compiler do
659
659
  end
660
660
 
661
661
  it "should fail if required parameters are missing" do
662
- klass = {'foo'=>{'1'=>'one'}}
662
+ klass = {'foo'=>{'a'=>'one'}}
663
663
  @node.classes = klass
664
- klass = Puppet::Resource::Type.new(:hostclass, 'foo', :arguments => {'1' => nil, '2' => nil})
664
+ klass = Puppet::Resource::Type.new(:hostclass, 'foo', :arguments => {'a' => nil, 'b' => nil})
665
665
  @compiler.topscope.known_resource_types.add klass
666
- lambda { @compiler.compile }.should raise_error(Puppet::ParseError, "Must pass 2 to Class[Foo]")
666
+ lambda { @compiler.compile }.should raise_error(Puppet::ParseError, "Must pass b to Class[Foo]")
667
667
  end
668
668
 
669
669
  it "should fail if invalid parameters are passed" do
@@ -0,0 +1,407 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/parser/e_parser_adapter'
4
+
5
+ describe Puppet::Parser do
6
+
7
+ Puppet::Parser::AST
8
+
9
+ before :each do
10
+ @known_resource_types = Puppet::Resource::TypeCollection.new("development")
11
+ @classic_parser = Puppet::Parser::Parser.new "development"
12
+ @parser = Puppet::Parser::EParserAdapter.new(@classic_parser)
13
+ @classic_parser.stubs(:known_resource_types).returns @known_resource_types
14
+ @true_ast = Puppet::Parser::AST::Boolean.new :value => true
15
+ end
16
+
17
+ it "should require an environment at initialization" do
18
+ expect {
19
+ Puppet::Parser::EParserAdapter.new
20
+ }.to raise_error(ArgumentError, /wrong number of arguments/)
21
+ end
22
+
23
+ describe "when parsing append operator" do
24
+
25
+ it "should not raise syntax errors" do
26
+ expect { @parser.parse("$var += something") }.to_not raise_error
27
+ end
28
+
29
+ it "should raise syntax error on incomplete syntax " do
30
+ expect {
31
+ @parser.parse("$var += ")
32
+ }.to raise_error(Puppet::ParseError, /Syntax error at end of file/)
33
+ end
34
+
35
+ it "should create ast::VarDef with append=true" do
36
+ vardef = @parser.parse("$var += 2").code[0]
37
+ vardef.should be_a(Puppet::Parser::AST::VarDef)
38
+ vardef.append.should == true
39
+ end
40
+
41
+ it "should work with arrays too" do
42
+ vardef = @parser.parse("$var += ['test']").code[0]
43
+ vardef.should be_a(Puppet::Parser::AST::VarDef)
44
+ vardef.append.should == true
45
+ end
46
+
47
+ end
48
+
49
+ describe "when parsing selector" do
50
+ it "should support hash access on the left hand side" do
51
+ expect { @parser.parse("$h = { 'a' => 'b' } $a = $h['a'] ? { 'b' => 'd', default => undef }") }.to_not raise_error
52
+ end
53
+ end
54
+
55
+ describe "parsing 'unless'" do
56
+ it "should create the correct ast objects" do
57
+ Puppet::Parser::AST::Not.expects(:new).with { |h| h[:value].is_a?(Puppet::Parser::AST::Boolean) }
58
+ @parser.parse("unless false { $var = 1 }")
59
+ end
60
+
61
+ it "should not raise an error with empty statements" do
62
+ expect { @parser.parse("unless false { }") }.to_not raise_error
63
+ end
64
+
65
+ #test for bug #13296
66
+ it "should not override 'unless' as a parameter inside resources" do
67
+ lambda { @parser.parse("exec {'/bin/echo foo': unless => '/usr/bin/false',}") }.should_not raise_error
68
+ end
69
+ end
70
+
71
+ describe "when parsing parameter names" do
72
+ Puppet::Parser::Lexer::KEYWORDS.sort_tokens.each do |keyword|
73
+ it "should allow #{keyword} as a keyword" do
74
+ lambda { @parser.parse("exec {'/bin/echo foo': #{keyword} => '/usr/bin/false',}") }.should_not raise_error
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "when parsing 'if'" do
80
+ it "not, it should create the correct ast objects" do
81
+ Puppet::Parser::AST::Not.expects(:new).with { |h| h[:value].is_a?(Puppet::Parser::AST::Boolean) }
82
+ @parser.parse("if ! true { $var = 1 }")
83
+ end
84
+
85
+ it "boolean operation, it should create the correct ast objects" do
86
+ Puppet::Parser::AST::BooleanOperator.expects(:new).with {
87
+ |h| h[:rval].is_a?(Puppet::Parser::AST::Boolean) and h[:lval].is_a?(Puppet::Parser::AST::Boolean) and h[:operator]=="or"
88
+ }
89
+ @parser.parse("if true or true { $var = 1 }")
90
+
91
+ end
92
+
93
+ it "comparison operation, it should create the correct ast objects" do
94
+ Puppet::Parser::AST::ComparisonOperator.expects(:new).with {
95
+ |h| h[:lval].is_a?(Puppet::Parser::AST::Name) and h[:rval].is_a?(Puppet::Parser::AST::Name) and h[:operator]=="<"
96
+ }
97
+ @parser.parse("if 1 < 2 { $var = 1 }")
98
+
99
+ end
100
+
101
+ end
102
+
103
+ describe "when parsing if complex expressions" do
104
+ it "should create a correct ast tree" do
105
+ aststub = stub_everything 'ast'
106
+ Puppet::Parser::AST::ComparisonOperator.expects(:new).with {
107
+ |h| h[:rval].is_a?(Puppet::Parser::AST::Name) and h[:lval].is_a?(Puppet::Parser::AST::Name) and h[:operator]==">"
108
+ }.returns(aststub)
109
+ Puppet::Parser::AST::ComparisonOperator.expects(:new).with {
110
+ |h| h[:rval].is_a?(Puppet::Parser::AST::Name) and h[:lval].is_a?(Puppet::Parser::AST::Name) and h[:operator]=="=="
111
+ }.returns(aststub)
112
+ Puppet::Parser::AST::BooleanOperator.expects(:new).with {
113
+ |h| h[:rval]==aststub and h[:lval]==aststub and h[:operator]=="and"
114
+ }
115
+ @parser.parse("if (1 > 2) and (1 == 2) { $var = 1 }")
116
+ end
117
+
118
+ it "should raise an error on incorrect expression" do
119
+ expect {
120
+ @parser.parse("if (1 > 2 > ) or (1 == 2) { $var = 1 }")
121
+ }.to raise_error(Puppet::ParseError, /Syntax error at '\)'/)
122
+ end
123
+
124
+ end
125
+
126
+ describe "when parsing resource references" do
127
+
128
+ it "should not raise syntax errors" do
129
+ expect { @parser.parse('exec { test: param => File["a"] }') }.to_not raise_error
130
+ end
131
+
132
+ it "should not raise syntax errors with multiple references" do
133
+ expect { @parser.parse('exec { test: param => File["a","b"] }') }.to_not raise_error
134
+ end
135
+
136
+ it "should create an ast::ResourceReference" do
137
+ # NOTE: In egrammar, type and name are unified immediately to lower case whereas the regular grammar
138
+ # keeps the UC name in some contexts - it gets downcased later as the name of the type is in lower case.
139
+ #
140
+ Puppet::Parser::AST::ResourceReference.expects(:new).with { |arg|
141
+ arg[:line]==1 and arg[:pos] ==25 and arg[:type]=="file" and arg[:title].is_a?(Puppet::Parser::AST::ASTArray)
142
+ }
143
+ @parser.parse('exec { test: command => File["a","b"] }')
144
+ end
145
+ end
146
+
147
+ describe "when parsing resource overrides" do
148
+
149
+ it "should not raise syntax errors" do
150
+ expect { @parser.parse('Resource["title"] { param => value }') }.to_not raise_error
151
+ end
152
+
153
+ it "should not raise syntax errors with multiple overrides" do
154
+ expect { @parser.parse('Resource["title1","title2"] { param => value }') }.to_not raise_error
155
+ end
156
+
157
+ it "should create an ast::ResourceOverride" do
158
+ ro = @parser.parse('Resource["title1","title2"] { param => value }').code[0]
159
+ ro.should be_a(Puppet::Parser::AST::ResourceOverride)
160
+ ro.line.should == 1
161
+ ro.object.should be_a(Puppet::Parser::AST::ResourceReference)
162
+ ro.parameters[0].should be_a(Puppet::Parser::AST::ResourceParam)
163
+ end
164
+
165
+ end
166
+
167
+ describe "when parsing if statements" do
168
+
169
+ it "should not raise errors with empty if" do
170
+ expect { @parser.parse("if true { }") }.to_not raise_error
171
+ end
172
+
173
+ it "should not raise errors with empty else" do
174
+ expect { @parser.parse("if false { notice('if') } else { }") }.to_not raise_error
175
+ end
176
+
177
+ it "should not raise errors with empty if and else" do
178
+ expect { @parser.parse("if false { } else { }") }.to_not raise_error
179
+ end
180
+
181
+ it "should create a nop node for empty branch" do
182
+ Puppet::Parser::AST::Nop.expects(:new).twice
183
+ @parser.parse("if true { }")
184
+ end
185
+
186
+ it "should create a nop node for empty else branch" do
187
+ Puppet::Parser::AST::Nop.expects(:new)
188
+ @parser.parse("if true { notice('test') } else { }")
189
+ end
190
+
191
+ it "should build a chain of 'ifs' if there's an 'elsif'" do
192
+ expect { @parser.parse(<<-PP) }.to_not raise_error
193
+ if true { notice('test') } elsif true {} else { }
194
+ PP
195
+ end
196
+
197
+ end
198
+
199
+ describe "when parsing function calls" do
200
+ it "should not raise errors with no arguments" do
201
+ expect { @parser.parse("tag()") }.to_not raise_error
202
+ end
203
+
204
+ it "should not raise errors with rvalue function with no args" do
205
+ expect { @parser.parse("$a = template()") }.to_not raise_error
206
+ end
207
+
208
+ it "should not raise errors with arguments" do
209
+ expect { @parser.parse("notice(1)") }.to_not raise_error
210
+ end
211
+
212
+ it "should not raise errors with multiple arguments" do
213
+ expect { @parser.parse("notice(1,2)") }.to_not raise_error
214
+ end
215
+
216
+ it "should not raise errors with multiple arguments and a trailing comma" do
217
+ expect { @parser.parse("notice(1,2,)") }.to_not raise_error
218
+ end
219
+
220
+ end
221
+
222
+ describe "when parsing arrays" do
223
+ it "should parse an array" do
224
+ expect { @parser.parse("$a = [1,2]") }.to_not raise_error
225
+ end
226
+
227
+ it "should not raise errors with a trailing comma" do
228
+ expect { @parser.parse("$a = [1,2,]") }.to_not raise_error
229
+ end
230
+
231
+ it "should accept an empty array" do
232
+ expect { @parser.parse("$var = []\n") }.to_not raise_error
233
+ end
234
+ end
235
+
236
+ describe "when parsing classes" do
237
+ before :each do
238
+ @krt = Puppet::Resource::TypeCollection.new("development")
239
+ @classic_parser = Puppet::Parser::Parser.new "development"
240
+ @parser = Puppet::Parser::EParserAdapter.new(@classic_parser)
241
+ @classic_parser.stubs(:known_resource_types).returns @krt
242
+ end
243
+
244
+ it "should not create new classes" do
245
+ @parser.parse("class foobar {}").code[0].should be_a(Puppet::Parser::AST::Hostclass)
246
+ @krt.hostclass("foobar").should be_nil
247
+ end
248
+
249
+ it "should correctly set the parent class when one is provided" do
250
+ @parser.parse("class foobar inherits yayness {}").code[0].instantiate('')[0].parent.should == "yayness"
251
+ end
252
+
253
+ it "should correctly set the parent class for multiple classes at a time" do
254
+ statements = @parser.parse("class foobar inherits yayness {}\nclass boo inherits bar {}").code
255
+ statements[0].instantiate('')[0].parent.should == "yayness"
256
+ statements[1].instantiate('')[0].parent.should == "bar"
257
+ end
258
+
259
+ it "should define the code when some is provided" do
260
+ @parser.parse("class foobar { $var = val }").code[0].code.should_not be_nil
261
+ end
262
+
263
+ it "should accept parameters with trailing comma" do
264
+ @parser.parse("file { '/example': ensure => file, }").should be
265
+ end
266
+
267
+ it "should accept parametrized classes with trailing comma" do
268
+ @parser.parse("class foobar ($var1 = 0,) { $var = val }").code[0].code.should_not be_nil
269
+ end
270
+
271
+ it "should define parameters when provided" do
272
+ foobar = @parser.parse("class foobar($biz,$baz) {}").code[0].instantiate('')[0]
273
+ foobar.arguments.should == {"biz" => nil, "baz" => nil}
274
+ end
275
+ end
276
+
277
+ describe "when parsing resources" do
278
+ before :each do
279
+ @krt = Puppet::Resource::TypeCollection.new("development")
280
+ @classic_parser = Puppet::Parser::Parser.new "development"
281
+ @parser = Puppet::Parser::EParserAdapter.new(@classic_parser)
282
+ @classic_parser.stubs(:known_resource_types).returns @krt
283
+ end
284
+
285
+ it "should be able to parse class resources" do
286
+ @krt.add(Puppet::Resource::Type.new(:hostclass, "foobar", :arguments => {"biz" => nil}))
287
+ expect { @parser.parse("class { foobar: biz => stuff }") }.to_not raise_error
288
+ end
289
+
290
+ it "should correctly mark exported resources as exported" do
291
+ @parser.parse("@@file { '/file': }").code[0].exported.should be_true
292
+ end
293
+
294
+ it "should correctly mark virtual resources as virtual" do
295
+ @parser.parse("@file { '/file': }").code[0].virtual.should be_true
296
+ end
297
+ end
298
+
299
+ describe "when parsing nodes" do
300
+ it "should be able to parse a node with a single name" do
301
+ node = @parser.parse("node foo { }").code[0]
302
+ node.should be_a Puppet::Parser::AST::Node
303
+ node.names.length.should == 1
304
+ node.names[0].value.should == "foo"
305
+ end
306
+
307
+ it "should be able to parse a node with two names" do
308
+ node = @parser.parse("node foo, bar { }").code[0]
309
+ node.should be_a Puppet::Parser::AST::Node
310
+ node.names.length.should == 2
311
+ node.names[0].value.should == "foo"
312
+ node.names[1].value.should == "bar"
313
+ end
314
+
315
+ it "should be able to parse a node with three names" do
316
+ node = @parser.parse("node foo, bar, baz { }").code[0]
317
+ node.should be_a Puppet::Parser::AST::Node
318
+ node.names.length.should == 3
319
+ node.names[0].value.should == "foo"
320
+ node.names[1].value.should == "bar"
321
+ node.names[2].value.should == "baz"
322
+ end
323
+ end
324
+
325
+ it "should fail if trying to collect defaults" do
326
+ expect {
327
+ @parser.parse("@Port { protocols => tcp }")
328
+ }.to raise_error(Puppet::ParseError, /Defaults are not virtualizable/)
329
+ end
330
+
331
+ context "when parsing collections" do
332
+ it "should parse basic collections" do
333
+ @parser.parse("Port <| |>").code.
334
+ should be_all {|x| x.is_a? Puppet::Parser::AST::Collection }
335
+ end
336
+
337
+ it "should parse fully qualified collections" do
338
+ @parser.parse("Port::Range <| |>").code.
339
+ should be_all {|x| x.is_a? Puppet::Parser::AST::Collection }
340
+ end
341
+ end
342
+
343
+ it "should not assign to a fully qualified variable" do
344
+ expect {
345
+ @parser.parse("$one::two = yay")
346
+ }.to raise_error(Puppet::ParseError, /Cannot assign to variables in other namespaces/)
347
+ end
348
+
349
+ it "should parse assignment of undef" do
350
+ tree = @parser.parse("$var = undef")
351
+ tree.code.children[0].should be_an_instance_of Puppet::Parser::AST::VarDef
352
+ tree.code.children[0].value.should be_an_instance_of Puppet::Parser::AST::Undef
353
+ end
354
+
355
+ it "should treat classes as case insensitive" do
356
+ @classic_parser.known_resource_types.import_ast(@parser.parse("class yayness {}"), '')
357
+ @classic_parser.known_resource_types.hostclass('yayness').
358
+ should == @classic_parser.find_hostclass("", "YayNess")
359
+ end
360
+
361
+ it "should treat defines as case insensitive" do
362
+ @classic_parser.known_resource_types.import_ast(@parser.parse("define funtest {}"), '')
363
+ @classic_parser.known_resource_types.hostclass('funtest').
364
+ should == @classic_parser.find_hostclass("", "fUntEst")
365
+ end
366
+ context "when parsing method calls" do
367
+ it "should parse method call with one param lambda" do
368
+ expect { @parser.parse("$a.foreach {|$a| debug $a }") }.to_not raise_error
369
+ end
370
+ it "should parse method call with two param lambda" do
371
+ expect { @parser.parse("$a.foreach {|$a,$b| debug $a }") }.to_not raise_error
372
+ end
373
+ it "should parse method call with two param lambda and default value" do
374
+ expect { @parser.parse("$a.foreach {|$a,$b=1| debug $a }") }.to_not raise_error
375
+ end
376
+ it "should parse method call without lambda (statement)" do
377
+ expect { @parser.parse("$a.foreach") }.to_not raise_error
378
+ end
379
+ it "should parse method call without lambda (expression)" do
380
+ expect { @parser.parse("$x = $a.foreach + 1") }.to_not raise_error
381
+ end
382
+ context "a receiver expression of type" do
383
+ it "variable should be allowed" do
384
+ expect { @parser.parse("$a.foreach") }.to_not raise_error
385
+ end
386
+ it "hasharrayaccess should be allowed" do
387
+ expect { @parser.parse("$a[0][1].foreach") }.to_not raise_error
388
+ end
389
+ it "quoted text should be allowed" do
390
+ expect { @parser.parse("\"monkey\".foreach") }.to_not raise_error
391
+ expect { @parser.parse("'monkey'.foreach") }.to_not raise_error
392
+ end
393
+ it "selector text should be allowed" do
394
+ expect { @parser.parse("$a ? { 'banana'=>[1,2,3]}.foreach") }.to_not raise_error
395
+ end
396
+ it "function call should be allowed" do
397
+ expect { @parser.parse("duh(1,2,3).foreach") }.to_not raise_error
398
+ end
399
+ it "method call should be allowed" do
400
+ expect { @parser.parse("$a.foo.bar") }.to_not raise_error
401
+ end
402
+ it "chained method calls with lambda should be allowed" do
403
+ expect { @parser.parse("$a.foo{||}.bar{||}") }.to_not raise_error
404
+ end
405
+ end
406
+ end
407
+ end