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
@@ -8,9 +8,7 @@ describe Puppet::ModuleTool::Applications::Searcher do
8
8
  describe "when searching" do
9
9
  let(:forge) { mock 'forge' }
10
10
  let(:searcher) do
11
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
12
- described_class.new('search_term', forge)
13
- end
11
+ described_class.new('search_term', forge)
14
12
  end
15
13
 
16
14
  it "should return results from a forge query when successful" do
@@ -64,23 +64,19 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
64
64
  context "when the module is installed" do
65
65
 
66
66
  it "should uninstall the module" do
67
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
68
- PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
67
+ PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
69
68
 
70
- results = @uninstaller.new("puppetlabs-foo", options).run
71
- results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
72
- end
69
+ results = @uninstaller.new("puppetlabs-foo", options).run
70
+ results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
73
71
  end
74
72
 
75
73
  it "should only uninstall the requested module" do
76
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
77
- PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
78
- PuppetSpec::Modules.create('bar', modpath1, :metadata => bar_metadata)
74
+ PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
75
+ PuppetSpec::Modules.create('bar', modpath1, :metadata => bar_metadata)
79
76
 
80
- results = @uninstaller.new("puppetlabs-foo", options).run
81
- results[:affected_modules].length == 1
82
- results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
83
- end
77
+ results = @uninstaller.new("puppetlabs-foo", options).run
78
+ results[:affected_modules].length == 1
79
+ results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
84
80
  end
85
81
 
86
82
  it "should uninstall fail if a module exists twice in the modpath" do
@@ -93,16 +89,14 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
93
89
  context "when options[:version] is specified" do
94
90
 
95
91
  it "should uninstall the module if the version matches" do
96
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
97
- PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
92
+ PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
98
93
 
99
- options[:version] = "1.0.0"
94
+ options[:version] = "1.0.0"
100
95
 
101
- results = @uninstaller.new("puppetlabs-foo", options).run
102
- results[:affected_modules].length.should == 1
103
- results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
104
- results[:affected_modules].first.version.should == "1.0.0"
105
- end
96
+ results = @uninstaller.new("puppetlabs-foo", options).run
97
+ results[:affected_modules].length.should == 1
98
+ results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
99
+ results[:affected_modules].first.version.should == "1.0.0"
106
100
  end
107
101
 
108
102
  it "should not uninstall the module if the version does not match" do
@@ -137,13 +131,11 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
137
131
  context "when the module does not have local changes" do
138
132
 
139
133
  it "should uninstall the module" do
140
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
141
- PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
134
+ PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
142
135
 
143
- results = @uninstaller.new("puppetlabs-foo", options).run
144
- results[:affected_modules].length.should == 1
145
- results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
146
- end
136
+ results = @uninstaller.new("puppetlabs-foo", options).run
137
+ results[:affected_modules].length.should == 1
138
+ results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
147
139
  end
148
140
  end
149
141
 
@@ -5,63 +5,30 @@ require 'puppet_spec/modules'
5
5
  describe Puppet::ModuleTool::Applications::Unpacker do
6
6
  include PuppetSpec::Files
7
7
 
8
- let(:target) { tmpdir("unpacker") }
9
-
10
- context "initialization" do
11
- it "should support filename and basic options" do
12
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
13
- Puppet::ModuleTool::Applications::Unpacker.new("myusername-mytarball-1.0.0.tar.gz", :target_dir => target)
14
- end
15
- end
16
-
17
- it "should raise ArgumentError when filename is invalid" do
18
- expect { Puppet::ModuleTool::Applications::Unpacker.new("invalid.tar.gz", :target_dir => target) }.to raise_error(ArgumentError)
19
- end
8
+ let(:target) { tmpdir("unpacker") }
9
+ let(:module_name) { 'myusername-mytarball' }
10
+ let(:filename) { tmpdir("module") + "/#{module_name}-1.0.0.tar.gz" }
11
+ let(:working_dir) { tmpdir("working_dir") }
12
+ let(:unpacker) do
13
+ Puppet::ModuleTool::Applications::Unpacker.new(filename, :target_dir => target)
20
14
  end
21
15
 
22
- context "#run" do
23
- let(:cache_base_path) { Pathname.new(tmpdir("unpacker")) }
24
- let(:filename) { tmpdir("module") + "/myusername-mytarball-1.0.0.tar.gz" }
25
- let(:build_dir) { Pathname.new(tmpdir("build_dir")) }
26
- let(:unpacker) do
27
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
28
- Puppet::ModuleTool::Applications::Unpacker.new(filename, :target_dir => target)
29
- end
30
- end
16
+ before :each do
17
+ Puppet.settings[:module_working_dir] = working_dir
18
+ end
31
19
 
32
- before :each do
33
- # Mock redhat for most test cases
34
- Facter.stubs(:value).with("osfamily").returns("Redhat")
35
- build_dir.stubs(:mkpath => nil, :rmtree => nil, :children => [])
36
- unpacker.stubs(:build_dir).at_least_once.returns(build_dir)
37
- FileUtils.stubs(:mv)
38
- end
20
+ it "should raise ArgumentError when filename is invalid" do
21
+ expect { Puppet::ModuleTool::Applications::Unpacker.new("invalid.tar.gz", :target_dir => target) }.to raise_error(ArgumentError)
22
+ end
39
23
 
40
- context "on linux" do
41
- it "should attempt to untar file to temporary location using system tar" do
42
- pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
43
- Puppet::Util::Execution.expects(:execute).with("tar xzf #{filename} -C #{build_dir}").returns(true)
44
- unpacker.run
45
- end
46
- end
24
+ it "should attempt to untar file to temporary location" do
25
+ untarrer = mock('untarrer')
26
+ Puppet::ModuleTool::Tar.expects(:instance).with(module_name).returns(untarrer)
27
+ untarrer.expects(:unpack).with(filename, regexp_matches(/^#{Regexp.escape(working_dir)}/)) do |src, dest|
28
+ FileUtils.mkdir(File.join(dest, 'extractedmodule'))
47
29
  end
48
30
 
49
- context "on solaris" do
50
- before :each do
51
- Facter.expects(:value).with("osfamily").returns("Solaris")
52
- end
53
-
54
- it "should attempt to untar file to temporary location using gnu tar" do
55
- Puppet::Util.stubs(:which).with('gtar').returns('/usr/sfw/bin/gtar')
56
- Puppet::Util::Execution.expects(:execute).with("gtar xzf #{filename} -C #{build_dir}").returns(true)
57
- unpacker.run
58
- end
59
-
60
- it "should throw exception if gtar is not in the path exists" do
61
- Puppet::Util.stubs(:which).with('gtar').returns(nil)
62
- expect { unpacker.run }.to raise_error RuntimeError, "Cannot find the command 'gtar'. Make sure GNU tar is installed, and is in your PATH."
63
- end
64
- end
31
+ unpacker.run
32
+ File.should be_directory(File.join(target, 'mytarball'))
65
33
  end
66
-
67
34
  end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'puppet/module_tool'
3
+
4
+ describe Puppet::ModuleTool::Tar::Gnu do
5
+ let(:sourcefile) { '/the/module.tar.gz' }
6
+ let(:destdir) { '/the/dest/dir' }
7
+ let(:sourcedir) { '/the/src/dir' }
8
+ let(:destfile) { '/the/dest/file.tar.gz' }
9
+
10
+ it "unpacks a tar file" do
11
+ Puppet::Util::Execution.expects(:execute).with("tar xzf #{sourcefile} -C #{destdir}")
12
+ subject.unpack(sourcefile, destdir)
13
+ end
14
+
15
+ it "packs a tar file" do
16
+ Puppet::Util::Execution.expects(:execute).with("tar cf - #{sourcedir} | gzip -c > #{destfile}")
17
+ subject.pack(sourcedir, destfile)
18
+ end
19
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+ require 'puppet/module_tool'
3
+
4
+ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Puppet.features.zlib?) do
5
+ let(:sourcefile) { '/the/module.tar.gz' }
6
+ let(:destdir) { File.expand_path '/the/dest/dir' }
7
+ let(:sourcedir) { '/the/src/dir' }
8
+ let(:destfile) { '/the/dest/file.tar.gz' }
9
+ let(:minitar) { described_class.new('nginx') }
10
+
11
+ it "unpacks a tar file" do
12
+ unpacks_the_entry(:file_start, 'thefile')
13
+
14
+ minitar.unpack(sourcefile, destdir)
15
+ end
16
+
17
+ it "does not allow an absolute path" do
18
+ unpacks_the_entry(:file_start, '/thefile')
19
+
20
+ expect {
21
+ minitar.unpack(sourcefile, destdir)
22
+ }.to raise_error(Puppet::ModuleTool::Errors::InvalidPathInPackageError,
23
+ "Attempt to install file into \"/thefile\" under \"#{destdir}\"")
24
+ end
25
+
26
+ it "does not allow a file to be written outside the destination directory" do
27
+ unpacks_the_entry(:file_start, '../../thefile')
28
+
29
+ expect {
30
+ minitar.unpack(sourcefile, destdir)
31
+ }.to raise_error(Puppet::ModuleTool::Errors::InvalidPathInPackageError,
32
+ "Attempt to install file into \"#{File.expand_path('/the/thefile')}\" under \"#{destdir}\"")
33
+ end
34
+
35
+ it "does not allow a directory to be written outside the destination directory" do
36
+ unpacks_the_entry(:dir, '../../thedir')
37
+
38
+ expect {
39
+ minitar.unpack(sourcefile, destdir)
40
+ }.to raise_error(Puppet::ModuleTool::Errors::InvalidPathInPackageError,
41
+ "Attempt to install file into \"#{File.expand_path('/the/thedir')}\" under \"#{destdir}\"")
42
+ end
43
+
44
+ it "packs a tar file" do
45
+ writer = mock('GzipWriter')
46
+
47
+ Zlib::GzipWriter.expects(:open).with(destfile).yields(writer)
48
+ Archive::Tar::Minitar.expects(:pack).with(sourcedir, writer)
49
+
50
+ minitar.pack(sourcedir, destfile)
51
+ end
52
+
53
+ def unpacks_the_entry(type, name)
54
+ reader = mock('GzipReader')
55
+
56
+ Zlib::GzipReader.expects(:open).with(sourcefile).yields(reader)
57
+ Archive::Tar::Minitar.expects(:unpack).with(reader, destdir).yields(type, name, nil)
58
+ end
59
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'puppet/module_tool'
3
+
4
+ describe Puppet::ModuleTool::Tar::Solaris do
5
+ let(:sourcefile) { '/the/module.tar.gz' }
6
+ let(:destdir) { '/the/dest/dir' }
7
+ let(:sourcedir) { '/the/src/dir' }
8
+ let(:destfile) { '/the/dest/file.tar.gz' }
9
+
10
+ it "unpacks a tar file" do
11
+ Puppet::Util::Execution.expects(:execute).with("gtar xzf #{sourcefile} -C #{destdir}")
12
+ subject.unpack(sourcefile, destdir)
13
+ end
14
+
15
+ it "packs a tar file" do
16
+ Puppet::Util::Execution.expects(:execute).with("tar cf - #{sourcedir} | gzip -c > #{destfile}")
17
+ subject.pack(sourcedir, destfile)
18
+ end
19
+ end
@@ -199,9 +199,14 @@ describe Puppet::Network::HTTP::Connection do
199
199
 
200
200
  def a_store_context(args)
201
201
  Puppet[:confdir] = tmpdir('conf')
202
- cert = Puppet::SSL::CertificateAuthority.new.generate(args[:for_server], :dns_alt_names => args[:for_aliases]).content
203
202
  ssl_context = mock('OpenSSL::X509::StoreContext')
204
- ssl_context.stubs(:current_cert).returns(cert)
203
+ if args[:verify_raises]
204
+ ssl_context.stubs(:current_cert).raises("oh noes")
205
+ else
206
+ cert = Puppet::SSL::CertificateAuthority.new.generate(args[:for_server], :dns_alt_names => args[:for_aliases]).content
207
+ ssl_context.stubs(:current_cert).returns(cert)
208
+ end
209
+ ssl_context.stubs(:chain).returns([])
205
210
  ssl_context.stubs(:error_string).returns(args[:with_error_string])
206
211
  ssl_context
207
212
  end
@@ -217,6 +222,16 @@ describe Puppet::Network::HTTP::Connection do
217
222
  end.to raise_error(Puppet::Error, "certificate verify failed: [shady looking signature for /CN=not_my_server]")
218
223
  end
219
224
 
225
+ it "should provide a useful error message when verify_callback raises", :unless => Puppet.features.microsoft_windows? do
226
+ subject.stubs(:create_connection).
227
+ returns(a_connection_that_verifies(:has_passed_pre_checks => false,
228
+ :in_context => a_store_context(:verify_raises => true),
229
+ :fails_with => 'certificate verify failed'))
230
+ expect do
231
+ subject.request(:get, stub('request'))
232
+ end.to raise_error(Puppet::Error, "certificate verify failed: [oh noes]")
233
+ end
234
+
220
235
  it "should provide a helpful error message when hostname was not match with server certificate", :unless => Puppet.features.microsoft_windows? do
221
236
  subject.stubs(:create_connection).
222
237
  returns(a_connection_that_verifies(:has_passed_pre_checks => true,
@@ -1,17 +1,12 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
+ require 'puppet/network/http'
3
4
  require 'puppet/network/http/handler'
4
5
  require 'puppet/network/authorization'
5
6
  require 'puppet/network/authentication'
6
7
 
7
- class HttpHandled
8
- include Puppet::Network::HTTP::Handler
9
- end
10
-
11
8
  describe Puppet::Network::HTTP::Handler do
12
- before do
13
- @handler = HttpHandled.new
14
- end
9
+ let(:handler) { TestingHandler.new }
15
10
 
16
11
  it "should include the v1 REST API" do
17
12
  Puppet::Network::HTTP::Handler.ancestors.should be_include(Puppet::Network::HTTP::API::V1)
@@ -21,126 +16,134 @@ describe Puppet::Network::HTTP::Handler do
21
16
  Puppet::Network::HTTP::Handler.ancestors.should be_include(Puppet::Network::Authorization)
22
17
  end
23
18
 
24
- it "should have a method for initializing" do
25
- @handler.should respond_to(:initialize_for_puppet)
26
- end
27
-
28
19
  describe "when initializing" do
29
20
  it "should fail when no server type has been provided" do
30
- lambda { @handler.initialize_for_puppet }.should raise_error(ArgumentError)
21
+ lambda { handler.initialize_for_puppet }.should raise_error(ArgumentError)
31
22
  end
32
23
 
33
24
  it "should set server type" do
34
- @handler.initialize_for_puppet("foo")
35
- @handler.server.should == "foo"
25
+ handler.initialize_for_puppet("foo")
26
+ handler.server.should == "foo"
36
27
  end
37
28
  end
38
29
 
39
- it "should be able to process requests" do
40
- @handler.should respond_to(:process)
41
- end
42
-
43
30
  describe "when processing a request" do
31
+ let(:request) do
32
+ {
33
+ :accept_header => "format_one,format_two",
34
+ :content_type_header => "text/yaml",
35
+ :http_method => "GET",
36
+ :path => "/my_handler/my_result",
37
+ :params => {},
38
+ :client_cert => nil
39
+ }
40
+ end
41
+
42
+ let(:response) { mock('http response') }
43
+
44
44
  before do
45
- @request = stub('http request')
46
- @request.stubs(:[]).returns "foo"
47
- @response = stub('http response')
48
45
  @model_class = stub('indirected model class')
49
46
  @indirection = stub('indirection')
50
47
  @model_class.stubs(:indirection).returns(@indirection)
51
48
 
52
49
  @result = stub 'result', :render => "mytext"
53
50
 
54
- @handler.stubs(:check_authorization)
55
- @handler.stubs(:warn_if_near_expiration)
51
+ request[:headers] = {
52
+ "Content-Type" => request[:content_type_header],
53
+ "Accept" => request[:accept_header]
54
+ }
56
55
 
57
- stub_server_interface
58
- end
59
-
60
- # Stub out the interface we require our including classes to
61
- # implement.
62
- def stub_server_interface
63
- @handler.stubs(:accept_header ).returns "format_one,format_two"
64
- @handler.stubs(:content_type_header).returns "text/yaml"
65
- @handler.stubs(:set_content_type ).returns "my_result"
66
- @handler.stubs(:set_response ).returns "my_result"
67
- @handler.stubs(:path ).returns "/my_handler/my_result"
68
- @handler.stubs(:http_method ).returns("GET")
69
- @handler.stubs(:params ).returns({})
70
- @handler.stubs(:content_type ).returns("text/plain")
71
- @handler.stubs(:client_cert ).returns(nil)
56
+ handler.stubs(:check_authorization)
57
+ handler.stubs(:warn_if_near_expiration)
58
+ handler.stubs(:headers).returns(request[:headers])
72
59
  end
73
60
 
74
61
  it "should check the client certificate for upcoming expiration" do
75
62
  cert = mock 'cert'
76
- @handler.stubs(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
77
- @handler.expects(:client_cert).returns(cert).with(@request)
78
- @handler.expects(:warn_if_near_expiration).with(cert)
63
+ handler.stubs(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
64
+ handler.expects(:client_cert).returns(cert).with(request)
65
+ handler.expects(:warn_if_near_expiration).with(cert)
66
+
67
+ handler.process(request, response)
68
+ end
69
+
70
+ it "should setup a profiler when the puppet-profiling header exists" do
71
+ request[:headers][Puppet::Network::HTTP::HEADER_ENABLE_PROFILING.downcase] = "true"
72
+
73
+ handler.process(request, response)
74
+
75
+ Puppet::Util::Profiler.current.should be_kind_of(Puppet::Util::Profiler::WallClock)
76
+ end
77
+
78
+ it "should not setup profiler when the profile parameter is missing" do
79
+ request[:params] = { }
80
+
81
+ handler.process(request, response)
79
82
 
80
- @handler.process(@request, @response)
83
+ Puppet::Util::Profiler.current.should == Puppet::Util::Profiler::NONE
81
84
  end
82
85
 
83
86
  it "should create an indirection request from the path, parameters, and http method" do
84
- @handler.expects(:path).with(@request).returns "mypath"
85
- @handler.expects(:http_method).with(@request).returns "mymethod"
86
- @handler.expects(:params).with(@request).returns "myparams"
87
+ request[:path] = "mypath"
88
+ request[:http_method] = "mymethod"
89
+ request[:params] = { :params => "mine" }
87
90
 
88
- @handler.expects(:uri2indirection).with("mymethod", "mypath", "myparams").returns stub("request", :method => :find)
91
+ handler.expects(:uri2indirection).with("mymethod", "mypath", { :params => "mine" }).returns stub("request", :method => :find)
89
92
 
90
- @handler.stubs(:do_find)
93
+ handler.stubs(:do_find)
91
94
 
92
- @handler.process(@request, @response)
95
+ handler.process(request, response)
93
96
  end
94
97
 
95
98
  it "should call the 'do' method and delegate authorization to the authorization layer" do
96
- @handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
99
+ handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
97
100
 
98
- @handler.expects(:do_mymethod).with("facts", "key", {:node => "name"}, @request, @response)
101
+ handler.expects(:do_mymethod).with("facts", "key", {:node => "name"}, request, response)
99
102
 
100
- @handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"})
103
+ handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"})
101
104
 
102
- @handler.process(@request, @response)
105
+ handler.process(request, response)
103
106
  end
104
107
 
105
108
  it "should return 403 if the request is not authorized" do
106
- @handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
109
+ handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
107
110
 
108
- @handler.expects(:do_mymethod).never
111
+ handler.expects(:do_mymethod).never
109
112
 
110
- @handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"}).raises(Puppet::Network::AuthorizationError.new("forbidden"))
113
+ handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"}).raises(Puppet::Network::AuthorizationError.new("forbidden"))
111
114
 
112
- @handler.expects(:set_response).with { |response, body, status| status == 403 }
115
+ handler.expects(:set_response).with(anything, anything, 403)
113
116
 
114
- @handler.process(@request, @response)
117
+ handler.process(request, response)
115
118
  end
116
119
 
117
120
  it "should serialize a controller exception when an exception is thrown while finding the model instance" do
118
- @handler.expects(:uri2indirection).returns(["facts", :find, "key", {:node => "name"}])
121
+ handler.expects(:uri2indirection).returns(["facts", :find, "key", {:node => "name"}])
119
122
 
120
- @handler.expects(:do_find).raises(ArgumentError, "The exception")
121
- @handler.expects(:set_response).with { |response, body, status| body == "The exception" and status == 400 }
122
- @handler.process(@request, @response)
123
+ handler.expects(:do_find).raises(ArgumentError, "The exception")
124
+ handler.expects(:set_response).with(anything, "The exception", 400)
125
+ handler.process(request, response)
123
126
  end
124
127
 
125
128
  it "should set the format to text/plain when serializing an exception" do
126
- @handler.expects(:set_content_type).with(@response, "text/plain")
127
- @handler.do_exception(@response, "A test", 404)
129
+ handler.expects(:set_content_type).with(response, "text/plain")
130
+ handler.do_exception(response, "A test", 404)
128
131
  end
129
132
 
130
133
  it "should raise an error if the request is formatted in an unknown format" do
131
- @handler.stubs(:content_type_header).returns "unknown format"
132
- lambda { @handler.request_format(@request) }.should raise_error
134
+ handler.stubs(:content_type_header).returns "unknown format"
135
+ lambda { handler.request_format(request) }.should raise_error
133
136
  end
134
137
 
135
138
  it "should still find the correct format if content type contains charset information" do
136
- @handler.stubs(:content_type_header).returns "text/plain; charset=UTF-8"
137
- @handler.request_format(@request).should == "s"
139
+ handler.stubs(:content_type_header).returns "text/plain; charset=UTF-8"
140
+ handler.request_format(request).should == "s"
138
141
  end
139
142
 
140
143
  it "should deserialize YAML parameters" do
141
144
  params = {'my_param' => [1,2,3].to_yaml}
142
145
 
143
- decoded_params = @handler.send(:decode_params, params)
146
+ decoded_params = handler.send(:decode_params, params)
144
147
 
145
148
  decoded_params.should == {:my_param => [1,2,3]}
146
149
  end
@@ -148,7 +151,7 @@ describe Puppet::Network::HTTP::Handler do
148
151
  it "should accept YAML parameters with !ruby/hash tags on Ruby 1.8", :if => RUBY_VERSION =~ /^1\.8/ do
149
152
  params = {'my_param' => "--- !ruby/hash:Array {}"}
150
153
 
151
- decoded_params = @handler.send(:decode_params, params)
154
+ decoded_params = handler.send(:decode_params, params)
152
155
 
153
156
  decoded_params[:my_param].should be_an(Array)
154
157
  end
@@ -159,7 +162,7 @@ describe Puppet::Network::HTTP::Handler do
159
162
  it "should fail if YAML parameters have !ruby/hash tags on Ruby 1.9", :unless => RUBY_VERSION =~ /^1\.8/ do
160
163
  params = {'my_param' => "--- !ruby/hash:Array {}"}
161
164
 
162
- expect { @handler.send(:decode_params, params) }.to raise_error(ArgumentError, /Illegal YAML mapping found/)
165
+ expect { handler.send(:decode_params, params) }.to raise_error(ArgumentError, /Illegal YAML mapping found/)
163
166
  end
164
167
 
165
168
  describe "when finding a model instance" do
@@ -175,84 +178,81 @@ describe Puppet::Network::HTTP::Handler do
175
178
  end
176
179
 
177
180
  it "should use the indirection request to find the model class" do
178
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
181
+ handler.do_find("my_handler", "my_result", {}, request, response)
179
182
  end
180
183
 
181
184
  it "should use the escaped request key" do
182
- @indirection.expects(:find).with do |key, args|
183
- key == "my_result"
184
- end.returns @result
185
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
185
+ @indirection.expects(:find).with("my_result", anything).returns @result
186
+ handler.do_find("my_handler", "my_result", {}, request, response)
186
187
  end
187
188
 
188
189
  it "should use a common method for determining the request parameters" do
189
- @indirection.expects(:find).with do |key, args|
190
- args[:foo] == :baz and args[:bar] == :xyzzy
191
- end.returns @result
192
- @handler.do_find("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
190
+ @indirection.expects(:find).with(anything, has_entries(:foo => :baz, :bar => :xyzzy)).returns @result
191
+
192
+ handler.do_find("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, request, response)
193
193
  end
194
194
 
195
195
  it "should set the content type to the first format specified in the accept header" do
196
- @handler.expects(:accept_header).with(@request).returns "one,two"
197
- @handler.expects(:set_content_type).with(@response, @oneformat)
198
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
196
+ handler.expects(:accept_header).with(request).returns "one,two"
197
+ handler.expects(:set_content_type).with(response, @oneformat)
198
+ handler.do_find("my_handler", "my_result", {}, request, response)
199
199
  end
200
200
 
201
201
  it "should fail if no accept header is provided" do
202
- @handler.expects(:accept_header).with(@request).returns nil
203
- lambda { @handler.do_find("my_handler", "my_result", {}, @request, @response) }.should raise_error(ArgumentError)
202
+ handler.expects(:accept_header).with(request).returns nil
203
+ lambda { handler.do_find("my_handler", "my_result", {}, request, response) }.should raise_error(ArgumentError)
204
204
  end
205
205
 
206
206
  it "should fail if the accept header does not contain a valid format" do
207
- @handler.expects(:accept_header).with(@request).returns ""
208
- lambda { @handler.do_find("my_handler", "my_result", {}, @request, @response) }.should raise_error(RuntimeError)
207
+ handler.expects(:accept_header).with(request).returns ""
208
+ lambda { handler.do_find("my_handler", "my_result", {}, request, response) }.should raise_error(RuntimeError)
209
209
  end
210
210
 
211
211
  it "should not use an unsuitable format" do
212
- @handler.expects(:accept_header).with(@request).returns "foo,bar"
212
+ handler.expects(:accept_header).with(request).returns "foo,bar"
213
213
  foo = mock 'foo', :suitable? => false
214
214
  bar = mock 'bar', :suitable? => true
215
215
  Puppet::Network::FormatHandler.expects(:format).with("foo").returns foo
216
216
  Puppet::Network::FormatHandler.expects(:format).with("bar").returns bar
217
217
 
218
- @handler.expects(:set_content_type).with(@response, bar) # the suitable one
218
+ handler.expects(:set_content_type).with(response, bar) # the suitable one
219
219
 
220
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
220
+ handler.do_find("my_handler", "my_result", {}, request, response)
221
221
  end
222
222
 
223
223
  it "should render the result using the first format specified in the accept header" do
224
224
 
225
- @handler.expects(:accept_header).with(@request).returns "one,two"
225
+ handler.expects(:accept_header).with(request).returns "one,two"
226
226
  @result.expects(:render).with(@oneformat)
227
227
 
228
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
228
+ handler.do_find("my_handler", "my_result", {}, request, response)
229
229
  end
230
230
 
231
231
  it "should pass the result through without rendering it if the result is a string" do
232
232
  @indirection.stubs(:find).returns "foo"
233
- @handler.expects(:set_response).with(@response, "foo")
234
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
233
+ handler.expects(:set_response).with(response, "foo")
234
+ handler.do_find("my_handler", "my_result", {}, request, response)
235
235
  end
236
236
 
237
237
  it "should use the default status when a model find call succeeds" do
238
- @handler.expects(:set_response).with { |response, body, status| status.nil? }
239
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
238
+ handler.expects(:set_response).with(anything, anything, nil)
239
+ handler.do_find("my_handler", "my_result", {}, request, response)
240
240
  end
241
241
 
242
242
  it "should return a serialized object when a model find call succeeds" do
243
243
  @model_instance = stub('model instance')
244
244
  @model_instance.expects(:render).returns "my_rendered_object"
245
245
 
246
- @handler.expects(:set_response).with { |response, body, status| body == "my_rendered_object" }
246
+ handler.expects(:set_response).with(anything, "my_rendered_object", anything)
247
247
  @indirection.stubs(:find).returns(@model_instance)
248
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
248
+ handler.do_find("my_handler", "my_result", {}, request, response)
249
249
  end
250
250
 
251
251
  it "should return a 404 when no model instance can be found" do
252
252
  @model_class.stubs(:name).returns "my name"
253
- @handler.expects(:set_response).with { |response, body, status| status == 404 }
253
+ handler.expects(:set_response).with(anything, anything, 404)
254
254
  @indirection.stubs(:find).returns(nil)
255
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
255
+ handler.do_find("my_handler", "my_result", {}, request, response)
256
256
  end
257
257
 
258
258
  it "should write a log message when no model instance can be found" do
@@ -261,46 +261,44 @@ describe Puppet::Network::HTTP::Handler do
261
261
 
262
262
  Puppet.expects(:info).with("Could not find my_handler for 'my_result'")
263
263
 
264
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
264
+ handler.do_find("my_handler", "my_result", {}, request, response)
265
265
  end
266
266
 
267
267
 
268
268
  it "should serialize the result in with the appropriate format" do
269
269
  @model_instance = stub('model instance')
270
270
 
271
- @handler.expects(:format_to_use).returns(@oneformat)
271
+ handler.expects(:format_to_use).returns(@oneformat)
272
272
  @model_instance.expects(:render).with(@oneformat).returns "my_rendered_object"
273
273
  @indirection.stubs(:find).returns(@model_instance)
274
- @handler.do_find("my_handler", "my_result", {}, @request, @response)
274
+ handler.do_find("my_handler", "my_result", {}, request, response)
275
275
  end
276
276
  end
277
277
 
278
278
  describe "when performing head operation" do
279
279
  before do
280
- @handler.stubs(:model).with("my_handler").returns(stub 'model', :indirection => @model_class)
281
- @handler.stubs(:http_method).with(@request).returns("HEAD")
282
- @handler.stubs(:path).with(@request).returns("/production/my_handler/my_result")
283
- @handler.stubs(:params).with(@request).returns({})
280
+ handler.stubs(:model).with("my_handler").returns(stub 'model', :indirection => @model_class)
281
+ request[:http_method] = "HEAD"
282
+ request[:path] = "/production/my_handler/my_result"
283
+ request[:params] = {}
284
284
 
285
285
  @model_class.stubs(:head).returns true
286
286
  end
287
287
 
288
288
  it "should use the escaped request key" do
289
- @model_class.expects(:head).with do |key, args|
290
- key == "my_result"
291
- end.returns true
292
- @handler.process(@request, @response)
289
+ @model_class.expects(:head).with("my_result", anything).returns true
290
+ handler.process(request, response)
293
291
  end
294
292
 
295
293
  it "should not generate a response when a model head call succeeds" do
296
- @handler.expects(:set_response).never
297
- @handler.process(@request, @response)
294
+ handler.expects(:set_response).never
295
+ handler.process(request, response)
298
296
  end
299
297
 
300
298
  it "should return a 404 when the model head call returns false" do
301
- @handler.expects(:set_response).with { |response, body, status| status == 404 }
299
+ handler.expects(:set_response).with(anything, anything, 404)
302
300
  @model_class.stubs(:head).returns(false)
303
- @handler.process(@request, @response)
301
+ handler.process(request, response)
304
302
  end
305
303
  end
306
304
 
@@ -308,10 +306,10 @@ describe Puppet::Network::HTTP::Handler do
308
306
  before do
309
307
  Puppet::Indirector::Indirection.expects(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
310
308
 
311
- @result1 = mock 'result1'
312
- @result2 = mock 'results'
309
+ result1 = mock 'result1'
310
+ result2 = mock 'results'
313
311
 
314
- @result = [@result1, @result2]
312
+ @result = [result1, result2]
315
313
  @model_class.stubs(:render_multiple).returns "my rendered instances"
316
314
  @indirection.stubs(:search).returns(@result)
317
315
 
@@ -323,54 +321,52 @@ describe Puppet::Network::HTTP::Handler do
323
321
  end
324
322
 
325
323
  it "should use the indirection request to find the model" do
326
- @handler.do_search("my_handler", "my_result", {}, @request, @response)
324
+ handler.do_search("my_handler", "my_result", {}, request, response)
327
325
  end
328
326
 
329
327
  it "should use a common method for determining the request parameters" do
330
- @indirection.expects(:search).with do |key, args|
331
- args[:foo] == :baz and args[:bar] == :xyzzy
332
- end.returns @result
333
- @handler.do_search("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
328
+ @indirection.expects(:search).with(anything, has_entries(:foo => :baz, :bar => :xyzzy)).returns @result
329
+ handler.do_search("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, request, response)
334
330
  end
335
331
 
336
332
  it "should use the default status when a model search call succeeds" do
337
333
  @indirection.stubs(:search).returns(@result)
338
- @handler.do_search("my_handler", "my_result", {}, @request, @response)
334
+ handler.do_search("my_handler", "my_result", {}, request, response)
339
335
  end
340
336
 
341
337
  it "should set the content type to the first format returned by the accept header" do
342
- @handler.expects(:accept_header).with(@request).returns "one,two"
343
- @handler.expects(:set_content_type).with(@response, @oneformat)
338
+ handler.expects(:accept_header).with(request).returns "one,two"
339
+ handler.expects(:set_content_type).with(response, @oneformat)
344
340
 
345
- @handler.do_search("my_handler", "my_result", {}, @request, @response)
341
+ handler.do_search("my_handler", "my_result", {}, request, response)
346
342
  end
347
343
 
348
344
  it "should return a list of serialized objects when a model search call succeeds" do
349
- @handler.expects(:accept_header).with(@request).returns "one,two"
345
+ handler.expects(:accept_header).with(request).returns "one,two"
350
346
 
351
347
  @indirection.stubs(:search).returns(@result)
352
348
 
353
349
  @model_class.expects(:render_multiple).with(@oneformat, @result).returns "my rendered instances"
354
350
 
355
- @handler.expects(:set_response).with { |response, data| data == "my rendered instances" }
356
- @handler.do_search("my_handler", "my_result", {}, @request, @response)
351
+ handler.expects(:set_response).with(anything, "my rendered instances")
352
+ handler.do_search("my_handler", "my_result", {}, request, response)
357
353
  end
358
354
 
359
355
  it "should return [] when searching returns an empty array" do
360
- @handler.expects(:accept_header).with(@request).returns "one,two"
356
+ handler.expects(:accept_header).with(request).returns "one,two"
361
357
  @indirection.stubs(:search).returns([])
362
358
  @model_class.expects(:render_multiple).with(@oneformat, []).returns "[]"
363
359
 
364
360
 
365
- @handler.expects(:set_response).with { |response, data| data == "[]" }
366
- @handler.do_search("my_handler", "my_result", {}, @request, @response)
361
+ handler.expects(:set_response).with(anything, "[]")
362
+ handler.do_search("my_handler", "my_result", {}, request, response)
367
363
  end
368
364
 
369
365
  it "should return a 404 when searching returns nil" do
370
366
  @model_class.stubs(:name).returns "my name"
371
- @handler.expects(:set_response).with { |response, body, status| status == 404 }
367
+ handler.expects(:set_response).with(anything, anything, 404)
372
368
  @indirection.stubs(:search).returns(nil)
373
- @handler.do_search("my_handler", "my_result", {}, @request, @response)
369
+ handler.do_search("my_handler", "my_result", {}, request, response)
374
370
  end
375
371
  end
376
372
 
@@ -383,43 +379,39 @@ describe Puppet::Network::HTTP::Handler do
383
379
  end
384
380
 
385
381
  it "should use the indirection request to find the model" do
386
- @handler.do_destroy("my_handler", "my_result", {}, @request, @response)
382
+ handler.do_destroy("my_handler", "my_result", {}, request, response)
387
383
  end
388
384
 
389
385
  it "should use the escaped request key to destroy the instance in the model" do
390
- @indirection.expects(:destroy).with do |key, args|
391
- key == "foo bar"
392
- end
393
- @handler.do_destroy("my_handler", "foo bar", {}, @request, @response)
386
+ @indirection.expects(:destroy).with("foo bar", anything)
387
+ handler.do_destroy("my_handler", "foo bar", {}, request, response)
394
388
  end
395
389
 
396
390
  it "should use a common method for determining the request parameters" do
397
- @indirection.expects(:destroy).with do |key, args|
398
- args[:foo] == :baz and args[:bar] == :xyzzy
399
- end
400
- @handler.do_destroy("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
391
+ @indirection.expects(:destroy).with(anything, has_entries(:foo => :baz, :bar => :xyzzy))
392
+ handler.do_destroy("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, request, response)
401
393
  end
402
394
 
403
395
  it "should use the default status code a model destroy call succeeds" do
404
- @handler.expects(:set_response).with { |response, body, status| status.nil? }
405
- @handler.do_destroy("my_handler", "my_result", {}, @request, @response)
396
+ handler.expects(:set_response).with(anything, anything, nil)
397
+ handler.do_destroy("my_handler", "my_result", {}, request, response)
406
398
  end
407
399
 
408
400
  it "should return a yaml-encoded result when a model destroy call succeeds" do
409
401
  @result = stub 'result', :to_yaml => "the result"
410
402
  @indirection.expects(:destroy).returns(@result)
411
403
 
412
- @handler.expects(:set_response).with { |response, body, status| body == "the result" }
404
+ handler.expects(:set_response).with(anything, "the result", anything)
413
405
 
414
- @handler.do_destroy("my_handler", "my_result", {}, @request, @response)
406
+ handler.do_destroy("my_handler", "my_result", {}, request, response)
415
407
  end
416
408
  end
417
409
 
418
410
  describe "when saving a model instance" do
419
411
  before do
420
412
  Puppet::Indirector::Indirection.stubs(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
421
- @handler.stubs(:body).returns('my stuff')
422
- @handler.stubs(:content_type_header).returns("text/yaml")
413
+ handler.stubs(:body).returns('my stuff')
414
+ handler.stubs(:content_type_header).returns("text/yaml")
423
415
 
424
416
  @result = stub 'result', :render => "the result"
425
417
 
@@ -434,50 +426,50 @@ describe Puppet::Network::HTTP::Handler do
434
426
  end
435
427
 
436
428
  it "should use the indirection request to find the model" do
437
- @handler.do_save("my_handler", "my_result", {}, @request, @response)
429
+ handler.do_save("my_handler", "my_result", {}, request, response)
438
430
  end
439
431
 
440
432
  it "should use the 'body' hook to retrieve the body of the request" do
441
- @handler.expects(:body).returns "my body"
442
- @model_class.expects(:convert_from).with { |format, body| body == "my body" }.returns @model_instance
433
+ handler.expects(:body).returns "my body"
434
+ @model_class.expects(:convert_from).with(anything, "my body").returns @model_instance
443
435
 
444
- @handler.do_save("my_handler", "my_result", {}, @request, @response)
436
+ handler.do_save("my_handler", "my_result", {}, request, response)
445
437
  end
446
438
 
447
439
  it "should fail to save model if data is not specified" do
448
- @handler.stubs(:body).returns('')
440
+ handler.stubs(:body).returns('')
449
441
 
450
- lambda { @handler.do_save("my_handler", "my_result", {}, @request, @response) }.should raise_error(ArgumentError)
442
+ lambda { handler.do_save("my_handler", "my_result", {}, request, response) }.should raise_error(ArgumentError)
451
443
  end
452
444
 
453
445
  it "should use a common method for determining the request parameters" do
454
446
  @indirection.expects(:save).with(@model_instance, 'key').once
455
- @handler.do_save("my_handler", "key", {}, @request, @response)
447
+ handler.do_save("my_handler", "key", {}, request, response)
456
448
  end
457
449
 
458
450
  it "should use the default status when a model save call succeeds" do
459
- @handler.expects(:set_response).with { |response, body, status| status.nil? }
460
- @handler.do_save("my_handler", "my_result", {}, @request, @response)
451
+ handler.expects(:set_response).with(anything, anything, nil)
452
+ handler.do_save("my_handler", "my_result", {}, request, response)
461
453
  end
462
454
 
463
455
  it "should return the yaml-serialized result when a model save call succeeds" do
464
456
  @indirection.stubs(:save).returns(@model_instance)
465
457
  @model_instance.expects(:to_yaml).returns('foo')
466
- @handler.do_save("my_handler", "my_result", {}, @request, @response)
458
+ handler.do_save("my_handler", "my_result", {}, request, response)
467
459
  end
468
460
 
469
461
  it "should set the content to yaml" do
470
- @handler.expects(:set_content_type).with(@response, @yamlformat)
471
- @handler.do_save("my_handler", "my_result", {}, @request, @response)
462
+ handler.expects(:set_content_type).with(response, @yamlformat)
463
+ handler.do_save("my_handler", "my_result", {}, request, response)
472
464
  end
473
465
 
474
466
  it "should use the content-type header to know the body format" do
475
- @handler.expects(:content_type_header).returns("text/format")
467
+ handler.expects(:content_type_header).returns("text/format")
476
468
  Puppet::Network::FormatHandler.stubs(:mime).with("text/format").returns @format
477
469
 
478
- @model_class.expects(:convert_from).with { |format, body| format == "format" }.returns @model_instance
470
+ @model_class.expects(:convert_from).with("format", anything).returns @model_instance
479
471
 
480
- @handler.do_save("my_handler", "my_result", {}, @request, @response)
472
+ handler.do_save("my_handler", "my_result", {}, request, response)
481
473
  end
482
474
  end
483
475
  end
@@ -486,19 +478,55 @@ describe Puppet::Network::HTTP::Handler do
486
478
  it "should use a look-up from the ip address" do
487
479
  Resolv.expects(:getname).with("1.2.3.4").returns("host.domain.com")
488
480
 
489
- @handler.resolve_node(:ip => "1.2.3.4")
481
+ handler.resolve_node(:ip => "1.2.3.4")
490
482
  end
491
483
 
492
484
  it "should return the look-up result" do
493
485
  Resolv.stubs(:getname).with("1.2.3.4").returns("host.domain.com")
494
486
 
495
- @handler.resolve_node(:ip => "1.2.3.4").should == "host.domain.com"
487
+ handler.resolve_node(:ip => "1.2.3.4").should == "host.domain.com"
496
488
  end
497
489
 
498
490
  it "should return the ip address if resolving fails" do
499
491
  Resolv.stubs(:getname).with("1.2.3.4").raises(RuntimeError, "no such host")
500
492
 
501
- @handler.resolve_node(:ip => "1.2.3.4").should == "1.2.3.4"
493
+ handler.resolve_node(:ip => "1.2.3.4").should == "1.2.3.4"
494
+ end
495
+ end
496
+
497
+ class TestingHandler
498
+ include Puppet::Network::HTTP::Handler
499
+
500
+ def accept_header(request)
501
+ request[:accept_header]
502
+ end
503
+
504
+ def content_type_header(request)
505
+ request[:content_type_header]
506
+ end
507
+
508
+ def set_content_type(response, format)
509
+ "my_result"
510
+ end
511
+
512
+ def set_response(response, body, status = 200)
513
+ "my_result"
514
+ end
515
+
516
+ def http_method(request)
517
+ request[:http_method]
518
+ end
519
+
520
+ def path(request)
521
+ request[:path]
522
+ end
523
+
524
+ def params(request)
525
+ request[:params]
526
+ end
527
+
528
+ def client_cert(request)
529
+ request[:client_cert]
502
530
  end
503
531
  end
504
532
  end