puppet 3.1.1 → 3.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (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
data/CONTRIBUTING.md CHANGED
@@ -49,7 +49,7 @@ top of things.
49
49
 
50
50
  ## Submitting Changes
51
51
 
52
- * Sign the [Contributor License Agreement](https://projects.puppetlabs.com/contributor_licenses/sign).
52
+ * Sign the [Contributor License Agreement](http://links.puppetlabs.com/cla).
53
53
  * Push your changes to a topic branch in your fork of the repository.
54
54
  * Submit a pull request to the repository in the puppetlabs organization.
55
55
  * Update your Redmine ticket to mark that you have submitted code and are ready for it to be reviewed.
@@ -59,7 +59,7 @@ top of things.
59
59
 
60
60
  * [More information on contributing](http://links.puppetlabs.com/contribute-to-puppet)
61
61
  * [Bug tracker (Redmine)](http://projects.puppetlabs.com)
62
- * [Contributor License Agreement](https://projects.puppetlabs.com/contributor_licenses/sign)
62
+ * [Contributor License Agreement](http://links.puppetlabs.com/cla)
63
63
  * [General GitHub documentation](http://help.github.com/)
64
64
  * [GitHub pull request documentation](http://help.github.com/send-pull-requests/)
65
65
  * #puppet-dev IRC channel on freenode.org
data/Gemfile CHANGED
@@ -1,30 +1,42 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
- def location_for(place)
3
+ def location_for(place, fake_version = nil)
4
4
  if place =~ /^(git:[^#]*)#(.*)/
5
- [{ :git => $1, :branch => $2, :require => false }]
5
+ [fake_version, { :git => $1, :branch => $2, :require => false }].compact
6
6
  elsif place =~ /^file:\/\/(.*)/
7
- ['>= 0', { :path => File.expand_path($1), :require => false }]
7
+ [fake_version, { :path => File.expand_path($1), :require => false }].compact
8
8
  else
9
9
  [place, { :require => false }]
10
10
  end
11
11
  end
12
12
 
13
- group(:development, :test) do
14
- gem "puppet", *location_for('file://.')
15
- gem "facter", *location_for(ENV['FACTER_LOCATION'] || '~> 1.6')
16
- gem "hiera", *location_for(ENV['HIERA_LOCATION'] || '~> 1.0')
13
+ # C Ruby (MRI) or Rubinius, but NOT Windows
14
+ platforms :ruby do
15
+ gem 'pry', :group => :development
16
+ gem 'yard', :group => :development
17
+ gem 'redcarpet', :group => :development
18
+ gem "racc", "~> 1.4", :group => :development
19
+ end
20
+
21
+ gem "puppet", *location_for("file://#{File.dirname(__FILE__)}", '99.0.0')
22
+ gem "facter", *location_for(ENV['FACTER_LOCATION'] || '~> 1.6')
23
+ gem "hiera", *location_for(ENV['HIERA_LOCATION'] || '~> 1.0', '99.0.0')
24
+ gem "rake", :require => false
25
+ gem "rspec", "~> 2.11.0", :require => false
26
+ gem "mocha", "~> 0.10.5", :require => false
27
+ gem "rgen", "0.6.1", :require => false
28
+
29
+ gem "yarjuf", "~> 1.0"
30
+
31
+ group(:extra) do
17
32
  gem "rack", "~> 1.4", :require => false
18
- gem "rake", :require => false
19
- gem "rspec", "~> 2.11.0", :require => false
20
- gem "mocha", "~> 0.10.5", :require => false
21
- gem "activerecord", *location_for('~> 3.0.7')
22
- gem "couchrest", *location_for('~> 1.0')
23
- gem "net-ssh", *location_for('~> 2.1')
24
- gem "puppetlabs_spec_helper"
25
- gem "sqlite3"
26
- gem "stomp"
27
- gem "tzinfo"
33
+ gem "activerecord", '~> 3.0.7', :require => false
34
+ gem "couchrest", '~> 1.0', :require => false
35
+ gem "net-ssh", '~> 2.1', :require => false
36
+ gem "puppetlabs_spec_helper", :require => false
37
+ gem "sqlite3", :require => false
38
+ gem "stomp", :require => false
39
+ gem "tzinfo", :require => false
28
40
  end
29
41
 
30
42
  platforms :mswin, :mingw do
@@ -37,8 +49,9 @@ platforms :mswin, :mingw do
37
49
  gem "win32-service", "~> 0.7.2", :require => false
38
50
  gem "win32-taskscheduler", "~> 0.2.2", :require => false
39
51
  gem "win32console", "~> 1.3.2", :require => false
40
- gem "windows-api", "~> 0.4.1", :require => false
52
+ gem "windows-api", "~> 0.4.2", :require => false
41
53
  gem "windows-pr", "~> 1.2.1", :require => false
54
+ gem "minitar", "~> 0.5.4", :require => false
42
55
  end
43
56
 
44
57
  if File.exists? "#{__FILE__}.local"
data/README_DEVELOPER.md CHANGED
@@ -149,7 +149,7 @@ with the following actions. The trick is to symlink `gems` to `src`.
149
149
  $ cd /workspace
150
150
  $ ln -s src gems
151
151
  $ mkdir specifications
152
- $ pushd specifications; ln -s ../gems/puppet/puppet.gemspec; popd
152
+ $ pushd specifications; ln -s ../gems/puppet/puppet.gemspec; ln -s ../gems/puppet/lib; popd
153
153
  $ export GEM_PATH="/workspace:${GEM_PATH}"
154
154
  $ gem list puppet
155
155
 
@@ -157,6 +157,13 @@ This should list out
157
157
 
158
158
  puppet (2.7.19)
159
159
 
160
+ The final directory structure should look like this:
161
+
162
+ /workspace/src --- git working directory
163
+ /gems -> src
164
+ /specifications/puppet.gemspec -> ../gems/puppet/puppet.gemspec
165
+ /lib -> ../gems/puppet/lib
166
+
160
167
  ## Bundler ##
161
168
 
162
169
  With a source checkout of Puppet properly setup as a gem, dependencies can be
@@ -177,6 +184,308 @@ installed using [Bundler](http://gembundler.com/)
177
184
  Using bundler (1.1.5)
178
185
  Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
179
186
 
187
+ # Running Tests #
188
+
189
+ Puppet Labs projects use a common convention of using Rake to run unit tests.
190
+ The tests can be run with the following rake task:
191
+
192
+ rake spec
193
+ # Or if using Bundler
194
+ bundle exec rake spec
195
+
196
+ This allows the Rakefile to set up the environment beforehand if needed. This
197
+ method is how the unit tests are run in [Jenkins](https://jenkins.puppetlabs.com).
198
+
199
+ Under the hood Puppet's tests use `rspec`. To run all of them, you can directly
200
+ use 'rspec':
201
+
202
+ rspec
203
+ # Or if using Bundler
204
+ bundle exec rspec
205
+
206
+ To run a single file's worth of tests (much faster!), give the filename, and use
207
+ the nested format to see the descriptions:
208
+
209
+ rspec spec/unit/ssl/host_spec.rb --format nested
210
+
211
+ # A brief introduction to testing in Puppet
212
+
213
+ Puppet relies heavily on automated testing to ensure that Puppet behaves as
214
+ expected and that new features don't interfere with existing behavior. There are
215
+ three primary sets of tests that Puppet uses: _unit tests_, _integration tests_,
216
+ and _acceptance tests_.
217
+
218
+ - - -
219
+
220
+ Unit tests are used to test the individual components of Puppet to ensure that
221
+ they function as expected in isolation. Unit tests are designed to hide the
222
+ actual system implementations and provide canned information so that only the
223
+ intended behavior is tested, rather than the targeted code and everything else
224
+ connected to it. Unit tests should never affect the state of the system that's
225
+ running the test.
226
+
227
+ - - -
228
+
229
+ Integration tests serve to test different units of code together to ensure that
230
+ they interact correctly. While individual methods might perform correctly, when
231
+ used with the rest of the system they might fail, so integration tests are a
232
+ higher level version of unit tests that serve to check the behavior of
233
+ individual subsystems.
234
+
235
+ All of the unit and integration tests for Puppet are kept in the spec/ directory.
236
+
237
+ - - -
238
+
239
+ Acceptance tests are used to test high level behaviors of Puppet that deal with
240
+ a number of concerns and aren't easily tested with normal unit tests. Acceptance
241
+ tests function by changing system state and checking the system after
242
+ the fact to make sure that the intended behavior occurred. Because of this
243
+ acceptance tests can be destructive, so the systems being tested should be
244
+ throwaway systems.
245
+
246
+ All of the acceptance tests for Puppet are kept in the acceptance/tests/
247
+ directory.
248
+
249
+ ## Puppet Continuous integration
250
+
251
+ * Travis-ci (unit tests only): https://travis-ci.org/puppetlabs/puppet/
252
+ * Jenkins (unit and acceptance tests): https://jenkins.puppetlabs.com/view/Puppet%20FOSS/
253
+
254
+ ## RSpec
255
+
256
+ Puppet uses RSpec to perform unit and integration tests. RSpec handles a number
257
+ of concerns to make testing easier:
258
+
259
+ * Executing examples and ensuring the actual behavior matches the expected behavior (examples)
260
+ * Grouping tests (describe and contexts)
261
+ * Setting up test environments and cleaning up afterwards (before and after blocks)
262
+ * Isolating tests (mocks and stubs)
263
+
264
+ #### Examples and expectations
265
+
266
+ At the most basic level, RSpec provides a framework for executing tests (which
267
+ are called examples) and ensuring that the actual behavior matches the expected
268
+ behavior (which are done with expectations)
269
+
270
+ ```ruby
271
+ # This is an example; it sets the test name and defines the test to run
272
+ specify "one equals one" do
273
+ # 'should' is an expectation; it adds a check to make sure that the left argument
274
+ # matches the right argument
275
+ 1.should == 1
276
+ end
277
+
278
+ # Examples can be declared with either 'it' or 'specify'
279
+ it "one doesn't equal two" do
280
+ 1.should_not == 2
281
+ end
282
+ ```
283
+
284
+ Good examples generally do as little setup as possible and only test one or two
285
+ things; it makes tests easier to understand and easier to debug.
286
+
287
+ More complete documentation on expectations is available at https://www.relishapp.com/rspec/rspec-expectations/docs
288
+
289
+ ### Example groups
290
+
291
+ Example groups are fairly self explanatory; they group similar examples into a
292
+ set.
293
+
294
+ ```ruby
295
+ describe "the number one" do
296
+
297
+ it "is larger than zero" do
298
+ 1.should be > 0
299
+ end
300
+
301
+ it "is an odd number" do
302
+ 1.odd?.should be true
303
+ end
304
+
305
+ it "is not nil" do
306
+ 1.should_not be_nil
307
+ end
308
+ end
309
+ ```
310
+
311
+ Example groups have a number of uses that we'll get into later, but one of the
312
+ simplest demonstrations of what they do is how they help to format
313
+ documentation:
314
+
315
+ ```
316
+ rspec ex.rb --format documentation
317
+
318
+ the number one
319
+ is larger than zero
320
+ is an odd number
321
+ is not nil
322
+
323
+ Finished in 0.00516 seconds
324
+ 3 examples, 0 failures
325
+ ```
326
+
327
+ ### Setting up and tearing down tests
328
+
329
+ Examples may require some setup before they can run, and might need to clean up
330
+ afterwards. `before` and `after` blocks can be used before this, and can be
331
+ used inside of example groups to limit how many examples they affect.
332
+
333
+ ```ruby
334
+
335
+ describe "something that could warn" do
336
+ before :each do
337
+ # Disable warnings for this test
338
+ $VERBOSE = nil
339
+ end
340
+
341
+ after do
342
+ # Enable warnings afterwards
343
+ $VERBOSE = true
344
+ end
345
+
346
+ it "doesn't generate a warning" do
347
+ MY_CONSTANT = 1
348
+ # reassigning a normally prints out 'warning: already initialized constant FOO'
349
+ MY_CONSTANT = 2
350
+ end
351
+ end
352
+ ```
353
+
354
+ ### Setting up helper data
355
+
356
+ Some examples may require setting up data before hand and making it available to
357
+ tests. RSpec provides helper methods with the `let` method call that can be used
358
+ inside of tests.
359
+
360
+ ```ruby
361
+ describe "a helper object" do
362
+ # This creates an array with three elements that we can retrieve in tests. A
363
+ # new copy will be made for each test.
364
+ let(:my_helper) do
365
+ ['foo', 'bar', 'baz']
366
+ end
367
+
368
+ it "should be an array" do
369
+ my_helper.should be_a_kind_of Array
370
+ end
371
+
372
+ it "should have three elements" do
373
+ my_helper.should have(3).items
374
+ end
375
+ end
376
+ ```
377
+
378
+ Like `before` blocks, helper objects like this are used to avoid doing a lot of
379
+ setup in individual examples and share setup between similar tests.
380
+
381
+ ### Isolating tests with stubs
382
+
383
+ RSpec allows you to provide fake data during testing to make sure that
384
+ individual tests are only running the code being tested. You can stub out entire
385
+ objects, or just stub out individual methods on an object. When a method is
386
+ stubbed the method itself will never be called.
387
+
388
+ While RSpec comes with its own stubbing framework, Puppet uses the Mocha
389
+ framework.
390
+
391
+ A brief usage guide for Mocha is available at http://gofreerange.com/mocha/docs/#Usage,
392
+ and an overview of Mocha expectations is available at http://gofreerange.com/mocha/docs/Mocha/Expectation.html
393
+
394
+ ```ruby
395
+ describe "stubbing a method on an object" do
396
+ let(:my_helper) do
397
+ ['foo', 'bar', 'baz']
398
+ end
399
+
400
+ it 'should have three items before being stubbed' do
401
+ my_helper.size.should == 3
402
+ end
403
+
404
+ describe 'when stubbing the size' do
405
+ before do
406
+ my_helper.stubs(:size).returns 10
407
+ end
408
+
409
+ it 'should have the stubbed value for size' do
410
+ my_helper.size.should == 10
411
+ end
412
+ end
413
+ end
414
+ ```
415
+
416
+ Entire objects can be stubbed as well.
417
+
418
+ ```ruby
419
+ describe "stubbing an object" do
420
+ let(:my_helper) do
421
+ stub(:not_an_array, :size => 10)
422
+ end
423
+
424
+ it 'should have the stubbed size'
425
+ my_helper.size.should == 10
426
+ end
427
+ end
428
+ ```
429
+
430
+ ### Adding expectations with mocks
431
+
432
+ It's possible to combine the concepts of stubbing and expectations so that a
433
+ method has to be called for the test to pass (like an expectation), and can
434
+ return a fixed value (like a stub).
435
+
436
+ ```ruby
437
+ describe "mocking a method on an object" do
438
+ let(:my_helper) do
439
+ ['foo', 'bar', 'baz']
440
+ end
441
+
442
+ describe "when mocking the size" do
443
+ before do
444
+ my_helper.expects(:size).returns 10
445
+ end
446
+
447
+ it "adds an expectation that a method was called" do
448
+ my_helper.size
449
+ end
450
+ end
451
+ end
452
+ ```
453
+
454
+ Like stubs, entire objects can be mocked.
455
+
456
+ ```ruby
457
+ describe "mocking an object" do
458
+ let(:my_helper) do
459
+ mock(:not_an_array)
460
+ end
461
+
462
+ before do
463
+ not_an_array.expects(:size).returns 10
464
+ end
465
+
466
+ it "adds an expectation that the method was called" do
467
+ not_an_array.size
468
+ end
469
+ end
470
+ ```
471
+
472
+ ### RSpec references
473
+
474
+ * RSpec core docs: https://www.relishapp.com/rspec/rspec-core/docs
475
+ * RSpec guidelines with Ruby: http://betterspecs.org/
476
+
477
+ ### Puppet-acceptance
478
+
479
+ [puppet-acceptance]: https://github.com/puppetlabs/puppet-acceptance
480
+ [test::unit]: http://test-unit.rubyforge.org/
481
+
482
+ Puppet has a custom acceptance testing framework called
483
+ [puppet-acceptance][puppet-acceptance] for running acceptance tests.
484
+ Puppet-acceptance runs the tests by configuring one or more VMs, copying the
485
+ test cases onto the VMs, performing the tests and collecting the results, and
486
+ ensuring that the results match the intended behavior. It uses
487
+ [test::unit][test::unit] to perform the actual assertions.
488
+
180
489
  # UTF-8 Handling #
181
490
 
182
491
  As Ruby 1.9 becomes more commonly used with Puppet, developers should be aware
@@ -242,23 +551,32 @@ include `ext/envpuppet.bat` will help.
242
551
  To quickly run Puppet from source, assuming you already have Ruby installed
243
552
  from [rubyinstaller.org](http://rubyinstaller.org).
244
553
 
245
- gem install sys-admin win32-process win32-dir win32-taskscheduler --no-rdoc --no-ri
246
- gem install win32-service --platform=mswin32 --no-rdoc --no-ri --version 0.7.1
247
- net use Z: "\\vmware-host\Shared Folders" /persistent:yes
248
- Z:
249
- cd <path_to_puppet>
250
- set PATH=%PATH%;Z:\<path_to_puppet>\ext
251
- envpuppet puppet --version
554
+ C:\> cd C:\work\puppet
555
+ C:\work\puppet> set PATH=%PATH%;C:\work\puppet\ext
556
+ C:\work\puppet> envpuppet bundle install
557
+ C:\work\puppet> envpuppet puppet --version
252
558
  2.7.9
253
559
 
254
- Some spec tests are known to fail on Windows, e.g. no mount provider
255
- on Windows, so use the following rspec exclude filter:
560
+ When writing a test that cannot possibly run on Windows, e.g. there is
561
+ no mount type on windows, do the following:
562
+
563
+ describe Puppet::MyClass, :unless => Puppet.features.microsoft_windows? do
564
+ ..
565
+ end
566
+
567
+ If the test doesn't currently pass on Windows, e.g. due to on going porting, then use an rspec conditional pending block:
568
+
569
+ pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
570
+ <example1>
571
+ end
572
+
573
+ pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
574
+ <example2>
575
+ end
256
576
 
257
- cd <path_to_puppet>
258
- envpuppet rspec --tag ~fails_on_windows spec
577
+ Then run the test as:
259
578
 
260
- This will give you a shared filesystem with your Mac and allow you to run
261
- Puppet directly from source without using install.rb or copying files around.
579
+ C:\work\puppet> envpuppet bundle exec rspec spec
262
580
 
263
581
  ## Common Issues ##
264
582