puppet 0.18.4 → 0.22.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. data/CHANGELOG +288 -0
  2. data/README +2 -2
  3. data/Rakefile +78 -5
  4. data/bin/puppet +28 -36
  5. data/bin/puppetca +81 -38
  6. data/bin/puppetd +65 -62
  7. data/bin/puppetdoc +409 -140
  8. data/bin/puppetmasterd +59 -47
  9. data/bin/puppetrun +38 -23
  10. data/conf/freebsd/puppetd +26 -0
  11. data/conf/freebsd/puppetmasterd +26 -0
  12. data/conf/gentoo/conf.d/puppet +5 -0
  13. data/conf/gentoo/conf.d/puppetmaster +12 -0
  14. data/conf/gentoo/init.d/puppet +38 -0
  15. data/conf/gentoo/init.d/puppetmaster +50 -0
  16. data/conf/gentoo/puppet/fileserver.conf +12 -0
  17. data/conf/gentoo/puppet/puppetca.conf +29 -0
  18. data/conf/gentoo/puppet/puppetd.conf +29 -0
  19. data/conf/gentoo/puppet/puppetmasterd.conf +29 -0
  20. data/conf/redhat/client.init +10 -5
  21. data/conf/redhat/client.sysconfig +1 -1
  22. data/conf/redhat/fileserver.conf +2 -2
  23. data/conf/redhat/logrotate +1 -1
  24. data/conf/redhat/no-lockdir.patch +13 -0
  25. data/conf/redhat/puppet.spec +65 -8
  26. data/conf/redhat/puppetd.conf +0 -4
  27. data/conf/redhat/server.init +3 -6
  28. data/conf/solaris/pkginfo +1 -1
  29. data/conf/solaris/smf/svc-puppetd +2 -2
  30. data/conf/suse/client.init +142 -0
  31. data/conf/suse/puppet.spec +221 -0
  32. data/conf/suse/server.init +162 -0
  33. data/examples/code/mac_automount.pp +16 -0
  34. data/examples/root/bin/sleeper +3 -5
  35. data/examples/root/etc/init.d/sleeper +8 -2
  36. data/examples/root/etc/puppet/fileserver.conf +12 -2
  37. data/examples/root/etc/puppet/namespaceauth.conf +20 -0
  38. data/examples/root/etc/puppet/puppetd.conf +4 -0
  39. data/examples/root/etc/puppet/puppetmasterd.conf +6 -9
  40. data/examples/root/etc/puppet/tagmail.conf +1 -0
  41. data/ext/emacs/puppet-mode.el +46 -1
  42. data/ext/logcheck/puppet +15 -0
  43. data/ext/module_puppet +15 -23
  44. data/ext/vim/puppet.vim +4 -2
  45. data/install.rb +2 -1
  46. data/lib/puppet.rb +76 -207
  47. data/lib/puppet/configuration.rb +331 -0
  48. data/lib/puppet/daemon.rb +63 -246
  49. data/lib/puppet/dsl.rb +371 -0
  50. data/lib/puppet/element.rb +8 -26
  51. data/lib/puppet/error.rb +54 -0
  52. data/lib/puppet/event.rb +8 -243
  53. data/lib/puppet/{base64.rb → external/base64.rb} +0 -0
  54. data/lib/puppet/external/event-loop.rb +1 -0
  55. data/lib/puppet/{event-loop → external/event-loop}/better-definers.rb +0 -0
  56. data/lib/puppet/{event-loop → external/event-loop}/event-loop.rb +2 -2
  57. data/lib/puppet/{event-loop → external/event-loop}/signal-system.rb +1 -1
  58. data/lib/puppet/external/gratr.rb +33 -0
  59. data/lib/puppet/external/gratr/adjacency_graph.rb +257 -0
  60. data/lib/puppet/external/gratr/base.rb +34 -0
  61. data/lib/puppet/external/gratr/biconnected.rb +116 -0
  62. data/lib/puppet/external/gratr/chinese_postman.rb +123 -0
  63. data/lib/puppet/external/gratr/common.rb +73 -0
  64. data/lib/puppet/external/gratr/comparability.rb +92 -0
  65. data/lib/puppet/external/gratr/digraph.rb +116 -0
  66. data/lib/puppet/external/gratr/digraph_distance.rb +185 -0
  67. data/lib/puppet/external/gratr/dot.rb +90 -0
  68. data/lib/puppet/external/gratr/edge.rb +145 -0
  69. data/lib/puppet/external/gratr/graph.rb +303 -0
  70. data/lib/puppet/external/gratr/graph_api.rb +83 -0
  71. data/lib/puppet/external/gratr/import.rb +44 -0
  72. data/lib/puppet/external/gratr/labels.rb +90 -0
  73. data/lib/puppet/external/gratr/maximum_flow.rb +64 -0
  74. data/lib/puppet/external/gratr/rdot.rb +327 -0
  75. data/lib/puppet/external/gratr/search.rb +409 -0
  76. data/lib/puppet/external/gratr/strong_components.rb +127 -0
  77. data/lib/puppet/external/gratr/undirected_graph.rb +153 -0
  78. data/lib/puppet/{lock.rb → external/lock.rb} +1 -1
  79. data/lib/puppet/feature/base.rb +20 -0
  80. data/lib/puppet/feature/rails.rb +52 -0
  81. data/lib/puppet/metatype/attributes.rb +719 -0
  82. data/lib/puppet/metatype/closure.rb +111 -0
  83. data/lib/puppet/metatype/container.rb +94 -0
  84. data/lib/puppet/metatype/evaluation.rb +118 -0
  85. data/lib/puppet/metatype/instances.rb +261 -0
  86. data/lib/puppet/metatype/manager.rb +169 -0
  87. data/lib/puppet/metatype/metaparams.rb +409 -0
  88. data/lib/puppet/metatype/providers.rb +260 -0
  89. data/lib/puppet/metatype/relationships.rb +116 -0
  90. data/lib/puppet/metatype/schedules.rb +39 -0
  91. data/lib/puppet/metatype/tags.rb +39 -0
  92. data/lib/puppet/modules.rb +113 -0
  93. data/lib/puppet/network/authconfig.rb +168 -0
  94. data/lib/puppet/network/authorization.rb +84 -0
  95. data/lib/puppet/network/authstore.rb +293 -0
  96. data/lib/puppet/network/client.rb +187 -0
  97. data/lib/puppet/network/client/ca.rb +56 -0
  98. data/lib/puppet/network/client/dipper.rb +81 -0
  99. data/lib/puppet/network/client/file.rb +7 -0
  100. data/lib/puppet/network/client/logger.rb +6 -0
  101. data/lib/puppet/network/client/master.rb +644 -0
  102. data/lib/puppet/{client → network/client}/proxy.rb +3 -3
  103. data/lib/puppet/{client/reporter.rb → network/client/report.rb} +4 -7
  104. data/lib/puppet/{client/pelement.rb → network/client/resource.rb} +6 -19
  105. data/lib/puppet/network/client/runner.rb +13 -0
  106. data/lib/puppet/network/client/status.rb +5 -0
  107. data/lib/puppet/network/client_request.rb +32 -0
  108. data/lib/puppet/network/handler.rb +33 -0
  109. data/lib/puppet/{server → network/handler}/ca.rb +5 -6
  110. data/lib/puppet/network/handler/filebucket.rb +180 -0
  111. data/lib/puppet/{server → network/handler}/fileserver.rb +277 -219
  112. data/lib/puppet/{server → network/handler}/logger.rb +3 -5
  113. data/lib/puppet/{server → network/handler}/master.rb +42 -8
  114. data/lib/puppet/network/handler/report.rb +158 -0
  115. data/lib/puppet/network/handler/resource.rb +190 -0
  116. data/lib/puppet/{server → network/handler}/runner.rb +17 -18
  117. data/lib/puppet/network/handler/status.rb +13 -0
  118. data/lib/puppet/network/rights.rb +74 -0
  119. data/lib/puppet/network/server.rb +5 -0
  120. data/lib/puppet/network/server/mongrel.rb +138 -0
  121. data/lib/puppet/network/server/webrick.rb +153 -0
  122. data/lib/puppet/network/xmlrpc/client.rb +129 -0
  123. data/lib/puppet/network/xmlrpc/processor.rb +91 -0
  124. data/lib/puppet/network/xmlrpc/server.rb +20 -0
  125. data/lib/puppet/network/xmlrpc/webrick_servlet.rb +121 -0
  126. data/lib/puppet/parameter.rb +390 -346
  127. data/lib/puppet/parser/ast.rb +116 -147
  128. data/lib/puppet/parser/ast/astarray.rb +17 -33
  129. data/lib/puppet/parser/ast/branch.rb +2 -0
  130. data/lib/puppet/parser/ast/caseopt.rb +7 -12
  131. data/lib/puppet/parser/ast/casestatement.rb +23 -32
  132. data/lib/puppet/parser/ast/collection.rb +19 -80
  133. data/lib/puppet/parser/ast/collexpr.rb +81 -0
  134. data/lib/puppet/parser/ast/component.rb +160 -89
  135. data/lib/puppet/parser/ast/else.rb +30 -0
  136. data/lib/puppet/parser/ast/function.rb +9 -2
  137. data/lib/puppet/parser/ast/hostclass.rb +47 -131
  138. data/lib/puppet/parser/ast/ifstatement.rb +43 -0
  139. data/lib/puppet/parser/ast/leaf.rb +10 -21
  140. data/lib/puppet/parser/ast/node.rb +32 -79
  141. data/lib/puppet/parser/ast/resourcedef.rb +222 -0
  142. data/lib/puppet/parser/ast/{typedefaults.rb → resourcedefaults.rb} +10 -16
  143. data/lib/puppet/parser/ast/resourceoverride.rb +62 -0
  144. data/lib/puppet/parser/ast/{objectparam.rb → resourceparam.rb} +12 -6
  145. data/lib/puppet/parser/ast/resourceref.rb +44 -0
  146. data/lib/puppet/parser/ast/selector.rb +16 -8
  147. data/lib/puppet/parser/ast/tag.rb +3 -1
  148. data/lib/puppet/parser/ast/vardef.rb +8 -12
  149. data/lib/puppet/parser/collector.rb +181 -0
  150. data/lib/puppet/parser/functions.rb +191 -36
  151. data/lib/puppet/parser/interpreter.rb +802 -380
  152. data/lib/puppet/parser/lexer.rb +86 -19
  153. data/lib/puppet/parser/parser.rb +1123 -960
  154. data/lib/puppet/parser/resource.rb +353 -0
  155. data/lib/puppet/parser/resource/param.rb +57 -0
  156. data/lib/puppet/parser/resource/reference.rb +71 -0
  157. data/lib/puppet/parser/scope.rb +573 -1000
  158. data/lib/puppet/parser/templatewrapper.rb +54 -0
  159. data/lib/puppet/pgraph.rb +208 -0
  160. data/lib/puppet/propertychange.rb +143 -0
  161. data/lib/puppet/provider.rb +302 -0
  162. data/lib/puppet/provider/cron/crontab.rb +187 -0
  163. data/lib/puppet/provider/group/groupadd.rb +29 -0
  164. data/lib/puppet/provider/group/netinfo.rb +12 -0
  165. data/lib/puppet/provider/group/pw.rb +31 -0
  166. data/lib/puppet/provider/host/netinfo.rb +18 -0
  167. data/lib/puppet/provider/host/parsed.rb +73 -0
  168. data/lib/puppet/provider/mount.rb +57 -0
  169. data/lib/puppet/provider/mount/netinfo.rb +38 -0
  170. data/lib/puppet/provider/mount/parsed.rb +37 -0
  171. data/lib/puppet/provider/nameservice.rb +344 -0
  172. data/lib/puppet/provider/nameservice/netinfo.rb +210 -0
  173. data/lib/puppet/provider/nameservice/objectadd.rb +45 -0
  174. data/lib/puppet/provider/nameservice/pw.rb +22 -0
  175. data/lib/puppet/provider/package/apple.rb +53 -0
  176. data/lib/puppet/provider/package/apt.rb +119 -0
  177. data/lib/puppet/provider/package/aptitude.rb +30 -0
  178. data/lib/puppet/provider/package/aptrpm.rb +79 -0
  179. data/lib/puppet/provider/package/blastwave.rb +114 -0
  180. data/lib/puppet/provider/package/darwinport.rb +88 -0
  181. data/lib/puppet/provider/package/dpkg.rb +109 -0
  182. data/lib/puppet/provider/package/freebsd.rb +43 -0
  183. data/lib/puppet/provider/package/gem.rb +104 -0
  184. data/lib/puppet/provider/package/openbsd.rb +93 -0
  185. data/lib/puppet/provider/package/pkgdmg.rb +119 -0
  186. data/lib/puppet/provider/package/portage.rb +112 -0
  187. data/lib/puppet/provider/package/ports.rb +94 -0
  188. data/lib/puppet/provider/package/rpm.rb +125 -0
  189. data/lib/puppet/provider/package/rug.rb +53 -0
  190. data/lib/puppet/provider/package/sun.rb +168 -0
  191. data/lib/puppet/provider/package/sunfreeware.rb +9 -0
  192. data/lib/puppet/provider/package/up2date.rb +45 -0
  193. data/lib/puppet/provider/package/yum.rb +54 -0
  194. data/lib/puppet/provider/parsedfile.rb +342 -0
  195. data/lib/puppet/provider/port/parsed.rb +174 -0
  196. data/lib/puppet/provider/service/base.rb +136 -0
  197. data/lib/puppet/provider/service/debian.rb +32 -0
  198. data/lib/puppet/provider/service/gentoo.rb +49 -0
  199. data/lib/puppet/{type → provider}/service/init.rb +42 -40
  200. data/lib/puppet/provider/service/redhat.rb +59 -0
  201. data/lib/puppet/{type → provider}/service/smf.rb +24 -13
  202. data/lib/puppet/provider/sshkey/parsed.rb +36 -0
  203. data/lib/puppet/provider/user/netinfo.rb +106 -0
  204. data/lib/puppet/provider/user/pw.rb +41 -0
  205. data/lib/puppet/provider/user/useradd.rb +67 -0
  206. data/lib/puppet/provider/zone/solaris.rb +208 -0
  207. data/lib/puppet/rails.rb +102 -66
  208. data/lib/puppet/rails/database/001_add_indexes.rb +38 -0
  209. data/lib/puppet/rails/database/schema.rb +89 -0
  210. data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +62 -0
  211. data/lib/puppet/rails/external/tagging/init.rb +5 -0
  212. data/lib/puppet/rails/external/tagging/tag.rb +50 -0
  213. data/lib/puppet/rails/external/tagging/tagging.rb +12 -0
  214. data/lib/puppet/rails/fact_name.rb +7 -0
  215. data/lib/puppet/rails/fact_value.rb +5 -0
  216. data/lib/puppet/rails/host.rb +95 -46
  217. data/lib/puppet/rails/param_name.rb +28 -0
  218. data/lib/puppet/rails/param_value.rb +5 -0
  219. data/lib/puppet/rails/puppet_class.rb +9 -0
  220. data/lib/puppet/rails/resource.rb +95 -0
  221. data/lib/puppet/rails/source_file.rb +5 -0
  222. data/lib/puppet/relationship.rb +63 -0
  223. data/lib/puppet/reports/log.rb +14 -0
  224. data/lib/puppet/reports/rrdgraph.rb +114 -10
  225. data/lib/puppet/reports/store.rb +64 -0
  226. data/lib/puppet/reports/tagmail.rb +144 -71
  227. data/lib/puppet/sslcertificates.rb +38 -5
  228. data/lib/puppet/sslcertificates/ca.rb +142 -37
  229. data/lib/puppet/sslcertificates/certificate.rb +3 -3
  230. data/lib/puppet/sslcertificates/inventory.rb +53 -0
  231. data/lib/puppet/sslcertificates/support.rb +128 -0
  232. data/lib/puppet/transaction.rb +568 -189
  233. data/lib/puppet/transaction/report.rb +14 -3
  234. data/lib/puppet/transportable.rb +18 -10
  235. data/lib/puppet/type.rb +279 -2299
  236. data/lib/puppet/type/component.rb +63 -63
  237. data/lib/puppet/type/cron.rb +294 -710
  238. data/lib/puppet/type/exec.rb +185 -129
  239. data/lib/puppet/type/group.rb +38 -89
  240. data/lib/puppet/type/host.rb +110 -0
  241. data/lib/puppet/type/mount.rb +189 -0
  242. data/lib/puppet/type/notify.rb +47 -0
  243. data/lib/puppet/type/package.rb +129 -257
  244. data/lib/puppet/type/parsedtype.rb +172 -297
  245. data/lib/puppet/type/pfile.rb +540 -319
  246. data/lib/puppet/type/pfile/checksum.rb +103 -76
  247. data/lib/puppet/type/pfile/content.rb +16 -10
  248. data/lib/puppet/type/pfile/ensure.rb +52 -34
  249. data/lib/puppet/type/pfile/group.rb +25 -18
  250. data/lib/puppet/type/pfile/mode.rb +7 -4
  251. data/lib/puppet/type/pfile/{uid.rb → owner.rb} +21 -17
  252. data/lib/puppet/type/pfile/source.rb +119 -124
  253. data/lib/puppet/type/pfile/target.rb +29 -45
  254. data/lib/puppet/type/pfile/type.rb +2 -2
  255. data/lib/puppet/type/pfilebucket.rb +18 -14
  256. data/lib/puppet/type/port.rb +121 -0
  257. data/lib/puppet/type/property.rb +530 -0
  258. data/lib/puppet/type/resources.rb +150 -0
  259. data/lib/puppet/type/schedule.rb +38 -22
  260. data/lib/puppet/type/service.rb +70 -326
  261. data/lib/puppet/type/sshkey.rb +76 -0
  262. data/lib/puppet/type/tidy.rb +197 -97
  263. data/lib/puppet/type/user.rb +107 -183
  264. data/lib/puppet/type/yumrepo.rb +53 -34
  265. data/lib/puppet/type/zone.rb +55 -208
  266. data/lib/puppet/util.rb +239 -201
  267. data/lib/puppet/util/autoload.rb +107 -0
  268. data/lib/puppet/util/classgen.rb +208 -0
  269. data/lib/puppet/{config.rb → util/config.rb} +102 -54
  270. data/lib/puppet/util/docs.rb +104 -0
  271. data/lib/puppet/util/errors.rb +55 -0
  272. data/lib/puppet/util/execution.rb +22 -0
  273. data/lib/puppet/util/feature.rb +76 -0
  274. data/lib/puppet/util/fileparsing.rb +380 -0
  275. data/lib/puppet/util/filetype.rb +300 -0
  276. data/lib/puppet/util/graph.rb +39 -0
  277. data/lib/puppet/util/inifile.rb +209 -0
  278. data/lib/puppet/util/loadedfile.rb +71 -0
  279. data/lib/puppet/util/log.rb +549 -0
  280. data/lib/puppet/util/logging.rb +20 -0
  281. data/lib/puppet/util/metaid.rb +22 -0
  282. data/lib/puppet/util/methodhelper.rb +37 -0
  283. data/lib/puppet/util/metric.rb +160 -0
  284. data/lib/puppet/util/package.rb +31 -0
  285. data/lib/puppet/util/pidlock.rb +68 -0
  286. data/lib/puppet/util/plist.rb +24 -0
  287. data/lib/puppet/util/plist/generator.rb +226 -0
  288. data/lib/puppet/util/plist/parser.rb +227 -0
  289. data/lib/puppet/util/posix.rb +87 -0
  290. data/lib/puppet/util/provider_features.rb +170 -0
  291. data/lib/puppet/util/rails/collection_merger.rb +42 -0
  292. data/lib/puppet/util/storage.rb +103 -0
  293. data/lib/puppet/util/subclass_loader.rb +83 -0
  294. data/lib/puppet/util/suidmanager.rb +86 -0
  295. data/lib/puppet/util/variables.rb +39 -0
  296. data/lib/puppet/util/warnings.rb +15 -0
  297. data/test/Rakefile +97 -0
  298. data/test/certmgr/ca.rb +81 -0
  299. data/test/certmgr/certmgr.rb +77 -50
  300. data/test/certmgr/inventory.rb +79 -0
  301. data/test/certmgr/support.rb +81 -0
  302. data/test/executables/filebucket.rb +49 -0
  303. data/test/executables/puppetbin.rb +28 -12
  304. data/test/executables/puppetca.rb +75 -54
  305. data/test/executables/puppetd.rb +10 -13
  306. data/test/executables/puppetmasterd.rb +12 -17
  307. data/test/executables/puppetmodule.rb +18 -17
  308. data/test/language/ast.rb +242 -798
  309. data/test/language/ast/casestatement.rb +104 -0
  310. data/test/language/ast/component.rb +133 -0
  311. data/test/language/ast/hostclass.rb +162 -0
  312. data/test/language/ast/selector.rb +62 -0
  313. data/test/language/ast/variable.rb +31 -0
  314. data/test/language/collector.rb +369 -0
  315. data/test/language/functions.rb +305 -18
  316. data/test/language/interpreter.rb +894 -125
  317. data/test/language/lexer.rb +98 -12
  318. data/test/language/node.rb +37 -53
  319. data/test/language/parser.rb +455 -148
  320. data/test/language/resource.rb +535 -0
  321. data/test/language/scope.rb +451 -561
  322. data/test/language/snippets.rb +101 -111
  323. data/test/language/transportable.rb +6 -8
  324. data/test/lib/mocha.rb +19 -0
  325. data/test/lib/mocha/any_instance_method.rb +35 -0
  326. data/test/lib/mocha/auto_verify.rb +113 -0
  327. data/test/lib/mocha/central.rb +35 -0
  328. data/test/lib/mocha/class_method.rb +62 -0
  329. data/test/lib/mocha/expectation.rb +295 -0
  330. data/test/lib/mocha/expectation_error.rb +6 -0
  331. data/test/lib/mocha/infinite_range.rb +27 -0
  332. data/test/lib/mocha/inspect.rb +37 -0
  333. data/test/lib/mocha/instance_method.rb +8 -0
  334. data/test/lib/mocha/metaclass.rb +7 -0
  335. data/test/lib/mocha/mock.rb +20 -0
  336. data/test/lib/mocha/mock_methods.rb +122 -0
  337. data/test/lib/mocha/object.rb +100 -0
  338. data/test/lib/mocha/pretty_parameters.rb +28 -0
  339. data/test/lib/mocha/setup_and_teardown.rb +23 -0
  340. data/test/lib/mocha/standalone.rb +30 -0
  341. data/test/lib/mocha/test_case_adapter.rb +49 -0
  342. data/test/lib/mocha_standalone.rb +2 -0
  343. data/test/lib/puppettest.rb +294 -0
  344. data/test/lib/puppettest/certificates.rb +61 -0
  345. data/test/lib/puppettest/exetest.rb +123 -0
  346. data/test/lib/puppettest/fakes.rb +194 -0
  347. data/test/lib/puppettest/fileparsing.rb +33 -0
  348. data/test/lib/puppettest/filetesting.rb +231 -0
  349. data/test/lib/puppettest/graph.rb +41 -0
  350. data/test/lib/puppettest/parsertesting.rb +392 -0
  351. data/test/lib/puppettest/railstesting.rb +56 -0
  352. data/test/lib/puppettest/reporttesting.rb +19 -0
  353. data/test/lib/puppettest/resourcetesting.rb +73 -0
  354. data/test/lib/puppettest/servertest.rb +72 -0
  355. data/test/lib/puppettest/support.rb +8 -0
  356. data/test/lib/puppettest/support/assertions.rb +101 -0
  357. data/test/lib/puppettest/support/helpers.rb +23 -0
  358. data/test/lib/puppettest/support/resources.rb +37 -0
  359. data/test/lib/puppettest/support/utils.rb +160 -0
  360. data/test/lib/puppettest/testcase.rb +48 -0
  361. data/test/lib/rake/puppet_test_loader.rb +17 -0
  362. data/test/lib/rake/puppet_testtask.rb +17 -0
  363. data/test/lib/spec.rb +8 -0
  364. data/test/lib/spec/callback.rb +11 -0
  365. data/test/lib/spec/callback/callback_container.rb +60 -0
  366. data/test/lib/spec/callback/extensions/module.rb +24 -0
  367. data/test/lib/spec/callback/extensions/object.rb +37 -0
  368. data/test/lib/spec/deprecated.rb +3 -0
  369. data/test/lib/spec/expectations.rb +59 -0
  370. data/test/lib/spec/expectations/differs/default.rb +62 -0
  371. data/test/lib/spec/expectations/errors.rb +6 -0
  372. data/test/lib/spec/expectations/extensions.rb +3 -0
  373. data/test/lib/spec/expectations/extensions/object.rb +109 -0
  374. data/test/lib/spec/expectations/extensions/proc.rb +57 -0
  375. data/test/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  376. data/test/lib/spec/expectations/handler.rb +47 -0
  377. data/test/lib/spec/expectations/should.rb +5 -0
  378. data/test/lib/spec/expectations/should/base.rb +64 -0
  379. data/test/lib/spec/expectations/should/change.rb +69 -0
  380. data/test/lib/spec/expectations/should/have.rb +128 -0
  381. data/test/lib/spec/expectations/should/not.rb +74 -0
  382. data/test/lib/spec/expectations/should/should.rb +81 -0
  383. data/test/lib/spec/expectations/sugar.rb +47 -0
  384. data/test/lib/spec/matchers.rb +160 -0
  385. data/test/lib/spec/matchers/be.rb +161 -0
  386. data/test/lib/spec/matchers/be_close.rb +37 -0
  387. data/test/lib/spec/matchers/change.rb +120 -0
  388. data/test/lib/spec/matchers/eql.rb +43 -0
  389. data/test/lib/spec/matchers/equal.rb +43 -0
  390. data/test/lib/spec/matchers/has.rb +44 -0
  391. data/test/lib/spec/matchers/have.rb +140 -0
  392. data/test/lib/spec/matchers/include.rb +50 -0
  393. data/test/lib/spec/matchers/match.rb +41 -0
  394. data/test/lib/spec/matchers/raise_error.rb +100 -0
  395. data/test/lib/spec/matchers/respond_to.rb +35 -0
  396. data/test/lib/spec/matchers/satisfy.rb +47 -0
  397. data/test/lib/spec/matchers/throw_symbol.rb +75 -0
  398. data/test/lib/spec/mocks.rb +232 -0
  399. data/test/lib/spec/mocks/argument_expectation.rb +132 -0
  400. data/test/lib/spec/mocks/error_generator.rb +85 -0
  401. data/test/lib/spec/mocks/errors.rb +10 -0
  402. data/test/lib/spec/mocks/extensions/object.rb +3 -0
  403. data/test/lib/spec/mocks/message_expectation.rb +231 -0
  404. data/test/lib/spec/mocks/methods.rb +40 -0
  405. data/test/lib/spec/mocks/mock.rb +26 -0
  406. data/test/lib/spec/mocks/mock_handler.rb +166 -0
  407. data/test/lib/spec/mocks/order_group.rb +29 -0
  408. data/test/lib/spec/rake/spectask.rb +173 -0
  409. data/test/lib/spec/rake/verify_rcov.rb +47 -0
  410. data/test/lib/spec/runner.rb +132 -0
  411. data/test/lib/spec/runner/backtrace_tweaker.rb +55 -0
  412. data/test/lib/spec/runner/command_line.rb +34 -0
  413. data/test/lib/spec/runner/context.rb +154 -0
  414. data/test/lib/spec/runner/context_eval.rb +142 -0
  415. data/test/lib/spec/runner/context_runner.rb +55 -0
  416. data/test/lib/spec/runner/drb_command_line.rb +21 -0
  417. data/test/lib/spec/runner/execution_context.rb +17 -0
  418. data/test/lib/spec/runner/extensions/kernel.rb +17 -0
  419. data/test/lib/spec/runner/extensions/object.rb +32 -0
  420. data/test/lib/spec/runner/formatter.rb +5 -0
  421. data/test/lib/spec/runner/formatter/base_text_formatter.rb +118 -0
  422. data/test/lib/spec/runner/formatter/html_formatter.rb +219 -0
  423. data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +27 -0
  424. data/test/lib/spec/runner/formatter/rdoc_formatter.rb +22 -0
  425. data/test/lib/spec/runner/formatter/specdoc_formatter.rb +23 -0
  426. data/test/lib/spec/runner/heckle_runner.rb +71 -0
  427. data/test/lib/spec/runner/heckle_runner_win.rb +10 -0
  428. data/test/lib/spec/runner/option_parser.rb +224 -0
  429. data/test/lib/spec/runner/reporter.rb +105 -0
  430. data/test/lib/spec/runner/spec_matcher.rb +25 -0
  431. data/test/lib/spec/runner/spec_parser.rb +41 -0
  432. data/test/lib/spec/runner/spec_should_raise_handler.rb +74 -0
  433. data/test/lib/spec/runner/specification.rb +114 -0
  434. data/test/lib/spec/translator.rb +87 -0
  435. data/test/lib/spec/version.rb +30 -0
  436. data/test/lib/stubba.rb +2 -0
  437. data/test/network/authconfig.rb +72 -0
  438. data/test/network/authorization.rb +138 -0
  439. data/test/network/authstore.rb +450 -0
  440. data/test/network/client/ca.rb +38 -0
  441. data/test/{client → network/client}/client.rb +107 -24
  442. data/test/network/client/dipper.rb +35 -0
  443. data/test/network/client/master.rb +627 -0
  444. data/test/{client/pelement.rb → network/client/resource.rb} +13 -29
  445. data/test/network/client_request.rb +39 -0
  446. data/test/network/daemon.rb +71 -0
  447. data/test/{server → network/handler}/bucket.rb +103 -27
  448. data/test/{server → network/handler}/ca.rb +14 -19
  449. data/test/{server → network/handler}/fileserver.rb +443 -68
  450. data/test/network/handler/handler.rb +64 -0
  451. data/test/{server → network/handler}/logger.rb +26 -26
  452. data/test/network/handler/master.rb +352 -0
  453. data/test/network/handler/report.rb +185 -0
  454. data/test/{server/pelement.rb → network/handler/resource.rb} +25 -38
  455. data/test/{server → network/handler}/runner.rb +17 -16
  456. data/test/network/rights.rb +38 -0
  457. data/test/network/server/webrick.rb +140 -0
  458. data/test/network/xmlrpc/client.rb +68 -0
  459. data/test/network/xmlrpc/processor.rb +80 -0
  460. data/test/network/xmlrpc/server.rb +28 -0
  461. data/test/network/xmlrpc/webrick_servlet.rb +26 -0
  462. data/test/other/dsl.rb +218 -0
  463. data/test/other/events.rb +22 -15
  464. data/test/other/overrides.rb +9 -14
  465. data/test/other/pgraph.rb +289 -0
  466. data/test/other/propertychange.rb +142 -0
  467. data/test/other/provider.rb +162 -0
  468. data/test/other/puppet.rb +63 -10
  469. data/test/other/relationship.rb +74 -0
  470. data/test/other/relationships.rb +199 -123
  471. data/test/other/report.rb +152 -23
  472. data/test/other/transactions.rb +824 -78
  473. data/test/puppet/conffiles.rb +16 -11
  474. data/test/puppet/defaults.rb +7 -10
  475. data/test/puppet/{error.rb → errortest.rb} +5 -8
  476. data/test/puppet/modules.rb +58 -0
  477. data/test/puppet/tc_suidmanager.rb +107 -0
  478. data/test/rails/host.rb +177 -0
  479. data/test/rails/rails.rb +27 -0
  480. data/test/rails/railsparameter.rb +62 -0
  481. data/test/rails/railsresource.rb +100 -0
  482. data/test/ral/manager/attributes.rb +296 -0
  483. data/test/ral/manager/manager.rb +55 -0
  484. data/test/ral/manager/provider.rb +54 -0
  485. data/test/ral/manager/type.rb +837 -0
  486. data/test/ral/providers/cron/crontab.rb +346 -0
  487. data/test/ral/providers/group.rb +252 -0
  488. data/test/ral/providers/host/netinfo.rb +58 -0
  489. data/test/ral/providers/host/parsed.rb +226 -0
  490. data/test/ral/providers/mount/netinfo.rb +80 -0
  491. data/test/ral/providers/mount/parsed.rb +223 -0
  492. data/test/ral/providers/nameservice.rb +33 -0
  493. data/test/ral/providers/package.rb +253 -0
  494. data/test/ral/providers/package/apt.rb +89 -0
  495. data/test/ral/providers/package/aptitude.rb +69 -0
  496. data/test/ral/providers/package/aptrpm.rb +89 -0
  497. data/test/ral/providers/package/dpkg.rb +64 -0
  498. data/test/ral/providers/parsedfile.rb +668 -0
  499. data/test/ral/providers/parsedport.rb +233 -0
  500. data/test/ral/providers/provider.rb +423 -0
  501. data/test/{types → ral/providers}/service.rb +20 -121
  502. data/test/ral/providers/service/base.rb +75 -0
  503. data/test/ral/providers/sshkey/parsed.rb +111 -0
  504. data/test/ral/providers/user.rb +567 -0
  505. data/test/ral/providers/user/useradd.rb +250 -0
  506. data/test/ral/types/basic.rb +90 -0
  507. data/test/ral/types/component.rb +113 -0
  508. data/test/ral/types/cron.rb +480 -0
  509. data/test/{types → ral/types}/exec.rb +278 -82
  510. data/test/ral/types/file.rb +1799 -0
  511. data/test/ral/types/file/target.rb +363 -0
  512. data/test/{types → ral/types}/filebucket.rb +15 -17
  513. data/test/{types → ral/types}/fileignoresource.rb +9 -15
  514. data/test/ral/types/filesources.rb +1046 -0
  515. data/test/ral/types/group.rb +169 -0
  516. data/test/ral/types/host.rb +155 -0
  517. data/test/ral/types/mount.rb +312 -0
  518. data/test/ral/types/package.rb +85 -0
  519. data/test/ral/types/parameter.rb +172 -0
  520. data/test/ral/types/port.rb +148 -0
  521. data/test/ral/types/property.rb +343 -0
  522. data/test/ral/types/resources.rb +221 -0
  523. data/test/{types → ral/types}/schedule.rb +34 -12
  524. data/test/ral/types/service.rb +37 -0
  525. data/test/{types → ral/types}/sshkey.rb +75 -65
  526. data/test/ral/types/tidy.rb +240 -0
  527. data/test/ral/types/user.rb +493 -0
  528. data/test/{types → ral/types}/yumrepo.rb +7 -11
  529. data/test/{types → ral/types}/zone.rb +45 -45
  530. data/test/tagging/tagging.rb +17 -26
  531. data/test/util/autoload.rb +130 -0
  532. data/test/util/classgen.rb +227 -0
  533. data/test/{other → util}/config.rb +373 -113
  534. data/test/util/execution.rb +34 -0
  535. data/test/util/features.rb +94 -0
  536. data/test/util/fileparsing.rb +677 -0
  537. data/test/{other → util}/filetype.rb +9 -12
  538. data/test/util/graph.rb +108 -0
  539. data/test/{other → util}/inifile.rb +24 -11
  540. data/test/util/loadedfile.rb +106 -0
  541. data/test/{other → util}/log.rb +96 -50
  542. data/test/{other → util}/metrics.rb +7 -17
  543. data/test/util/package.rb +27 -0
  544. data/test/util/pidlock.rb +126 -0
  545. data/test/util/posixtest.rb +173 -0
  546. data/test/util/storage.rb +123 -0
  547. data/test/util/subclass_loader.rb +100 -0
  548. data/test/util/utiltest.rb +368 -0
  549. metadata +449 -169
  550. data/examples/code/classing +0 -35
  551. data/examples/code/failers/badclassnoparam +0 -10
  552. data/examples/code/failers/badclassparam +0 -10
  553. data/examples/code/failers/badcompnoparam +0 -9
  554. data/examples/code/failers/badcompparam +0 -9
  555. data/examples/code/failers/badtypeparam +0 -3
  556. data/examples/code/failers/noobjectrvalue +0 -1
  557. data/examples/code/snippets/aliastest.pp +0 -16
  558. data/examples/code/snippets/argumentdefaults +0 -14
  559. data/examples/code/snippets/casestatement.pp +0 -58
  560. data/examples/code/snippets/classheirarchy.pp +0 -15
  561. data/examples/code/snippets/classincludes.pp +0 -17
  562. data/examples/code/snippets/classpathtest +0 -11
  563. data/examples/code/snippets/componentmetaparams.pp +0 -11
  564. data/examples/code/snippets/deepclassheirarchy.pp +0 -23
  565. data/examples/code/snippets/defineoverrides.pp +0 -17
  566. data/examples/code/snippets/dirchmod +0 -19
  567. data/examples/code/snippets/emptyclass.pp +0 -9
  568. data/examples/code/snippets/emptyexec.pp +0 -3
  569. data/examples/code/snippets/failmissingexecpath.pp +0 -13
  570. data/examples/code/snippets/falsevalues.pp +0 -3
  571. data/examples/code/snippets/filecreate +0 -11
  572. data/examples/code/snippets/implicititeration +0 -15
  573. data/examples/code/snippets/multipleinstances +0 -7
  574. data/examples/code/snippets/namevartest +0 -9
  575. data/examples/code/snippets/scopetest +0 -13
  576. data/examples/code/snippets/selectorvalues.pp +0 -42
  577. data/examples/code/snippets/simpledefaults +0 -5
  578. data/examples/code/snippets/simpleselector +0 -38
  579. data/examples/code/snippets/singleary.pp +0 -19
  580. data/examples/code/snippets/singlequote.pp +0 -11
  581. data/examples/code/snippets/singleselector.pp +0 -22
  582. data/examples/code/snippets/tag.pp +0 -9
  583. data/examples/code/snippets/tagged.pp +0 -35
  584. data/lib/puppet/client.rb +0 -177
  585. data/lib/puppet/client/ca.rb +0 -21
  586. data/lib/puppet/client/dipper.rb +0 -76
  587. data/lib/puppet/client/file.rb +0 -20
  588. data/lib/puppet/client/log.rb +0 -17
  589. data/lib/puppet/client/master.rb +0 -531
  590. data/lib/puppet/client/runner.rb +0 -17
  591. data/lib/puppet/client/status.rb +0 -7
  592. data/lib/puppet/event-loop.rb +0 -1
  593. data/lib/puppet/filetype.rb +0 -308
  594. data/lib/puppet/inifile.rb +0 -201
  595. data/lib/puppet/log.rb +0 -524
  596. data/lib/puppet/metric.rb +0 -132
  597. data/lib/puppet/networkclient.rb +0 -175
  598. data/lib/puppet/parsedfile.rb +0 -58
  599. data/lib/puppet/parser/ast/classdef.rb +0 -79
  600. data/lib/puppet/parser/ast/compdef.rb +0 -75
  601. data/lib/puppet/parser/ast/nodedef.rb +0 -73
  602. data/lib/puppet/parser/ast/objectdef.rb +0 -284
  603. data/lib/puppet/parser/ast/objectref.rb +0 -77
  604. data/lib/puppet/rails/database.rb +0 -40
  605. data/lib/puppet/rails/rails_object.rb +0 -42
  606. data/lib/puppet/rails/rails_parameter.rb +0 -5
  607. data/lib/puppet/server.rb +0 -196
  608. data/lib/puppet/server/authconfig.rb +0 -177
  609. data/lib/puppet/server/authstore.rb +0 -226
  610. data/lib/puppet/server/filebucket.rb +0 -155
  611. data/lib/puppet/server/pelement.rb +0 -188
  612. data/lib/puppet/server/report.rb +0 -184
  613. data/lib/puppet/server/rights.rb +0 -78
  614. data/lib/puppet/server/servlet.rb +0 -274
  615. data/lib/puppet/statechange.rb +0 -129
  616. data/lib/puppet/storage.rb +0 -98
  617. data/lib/puppet/type/nameservice.rb +0 -264
  618. data/lib/puppet/type/nameservice/netinfo.rb +0 -232
  619. data/lib/puppet/type/nameservice/objectadd.rb +0 -146
  620. data/lib/puppet/type/nameservice/posix.rb +0 -12
  621. data/lib/puppet/type/nameservice/pw.rb +0 -107
  622. data/lib/puppet/type/package/apple.rb +0 -41
  623. data/lib/puppet/type/package/apt.rb +0 -107
  624. data/lib/puppet/type/package/blastwave.rb +0 -136
  625. data/lib/puppet/type/package/darwinport.rb +0 -97
  626. data/lib/puppet/type/package/dpkg.rb +0 -113
  627. data/lib/puppet/type/package/freebsd.rb +0 -19
  628. data/lib/puppet/type/package/gem.rb +0 -119
  629. data/lib/puppet/type/package/openbsd.rb +0 -112
  630. data/lib/puppet/type/package/ports.rb +0 -103
  631. data/lib/puppet/type/package/rpm.rb +0 -121
  632. data/lib/puppet/type/package/sun.rb +0 -174
  633. data/lib/puppet/type/package/sunfreeware.rb +0 -7
  634. data/lib/puppet/type/package/yum.rb +0 -52
  635. data/lib/puppet/type/parsedtype/host.rb +0 -144
  636. data/lib/puppet/type/parsedtype/mount.rb +0 -271
  637. data/lib/puppet/type/parsedtype/port.rb +0 -261
  638. data/lib/puppet/type/parsedtype/sshkey.rb +0 -123
  639. data/lib/puppet/type/service/base.rb +0 -12
  640. data/lib/puppet/type/service/debian.rb +0 -46
  641. data/lib/puppet/type/service/redhat.rb +0 -38
  642. data/lib/puppet/type/state.rb +0 -393
  643. data/lib/puppet/type/symlink.rb +0 -186
  644. data/test/client/master.rb +0 -207
  645. data/test/language/rails.rb +0 -105
  646. data/test/other/parsedfile.rb +0 -58
  647. data/test/other/storage.rb +0 -100
  648. data/test/puppet/utiltest.rb +0 -299
  649. data/test/puppettest.rb +0 -1170
  650. data/test/server/authconfig.rb +0 -56
  651. data/test/server/authstore.rb +0 -218
  652. data/test/server/master.rb +0 -201
  653. data/test/server/report.rb +0 -93
  654. data/test/server/rights.rb +0 -41
  655. data/test/server/server.rb +0 -152
  656. data/test/test +0 -61
  657. data/test/types/basic.rb +0 -117
  658. data/test/types/component.rb +0 -298
  659. data/test/types/cron.rb +0 -718
  660. data/test/types/file.rb +0 -1314
  661. data/test/types/filesources.rb +0 -590
  662. data/test/types/group.rb +0 -323
  663. data/test/types/host.rb +0 -186
  664. data/test/types/mount.rb +0 -294
  665. data/test/types/package.rb +0 -538
  666. data/test/types/parameter.rb +0 -107
  667. data/test/types/port.rb +0 -201
  668. data/test/types/query.rb +0 -101
  669. data/test/types/state.rb +0 -92
  670. data/test/types/symlink.rb +0 -120
  671. data/test/types/tidy.rb +0 -102
  672. data/test/types/type.rb +0 -469
  673. data/test/types/user.rb +0 -563
@@ -0,0 +1,1799 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift("../../lib") if __FILE__ =~ /\.rb$/
4
+
5
+ require 'puppettest'
6
+ require 'fileutils'
7
+
8
+ class TestFile < Test::Unit::TestCase
9
+ include PuppetTest::FileTesting
10
+ # hmmm
11
+ # this is complicated, because we store references to the created
12
+ # objects in a central store
13
+ def mkfile(hash)
14
+ file = nil
15
+ assert_nothing_raised {
16
+ file = Puppet.type(:file).create(hash)
17
+ }
18
+ return file
19
+ end
20
+
21
+ def mktestfile
22
+ # because luke's home directory is on nfs, it can't be used for testing
23
+ # as root
24
+ tmpfile = tempfile()
25
+ File.open(tmpfile, "w") { |f| f.puts rand(100) }
26
+ @@tmpfiles.push tmpfile
27
+ mkfile(:name => tmpfile)
28
+ end
29
+
30
+ def setup
31
+ super
32
+ @file = Puppet::Type.type(:file)
33
+ $method = @method_name
34
+ end
35
+
36
+ def teardown
37
+ Puppet::Util::Storage.clear
38
+ system("rm -rf %s" % Puppet[:statefile])
39
+ super
40
+ end
41
+
42
+ def initstorage
43
+ Puppet::Util::Storage.init
44
+ Puppet::Util::Storage.load
45
+ end
46
+
47
+ def clearstorage
48
+ Puppet::Util::Storage.store
49
+ Puppet::Util::Storage.clear
50
+ end
51
+
52
+ def test_owner
53
+ file = mktestfile()
54
+
55
+ users = {}
56
+ count = 0
57
+
58
+ # collect five users
59
+ Etc.passwd { |passwd|
60
+ if count > 5
61
+ break
62
+ else
63
+ count += 1
64
+ end
65
+ users[passwd.uid] = passwd.name
66
+ }
67
+
68
+ fake = {}
69
+ # find a fake user
70
+ while true
71
+ a = rand(1000)
72
+ begin
73
+ Etc.getpwuid(a)
74
+ rescue
75
+ fake[a] = "fakeuser"
76
+ break
77
+ end
78
+ end
79
+
80
+ uid, name = users.shift
81
+ us = {}
82
+ us[uid] = name
83
+ users.each { |uid, name|
84
+ assert_apply(file)
85
+ assert_nothing_raised() {
86
+ file[:owner] = name
87
+ }
88
+ assert_nothing_raised() {
89
+ file.retrieve
90
+ }
91
+ assert_apply(file)
92
+ }
93
+ end
94
+
95
+ def test_group
96
+ file = mktestfile()
97
+ [%x{groups}.chomp.split(/ /), Process.groups].flatten.each { |group|
98
+ assert_nothing_raised() {
99
+ file[:group] = group
100
+ }
101
+ assert(file.property(:group))
102
+ assert(file.property(:group).should)
103
+ }
104
+ end
105
+
106
+ if Puppet::Util::SUIDManager.uid == 0
107
+ def test_createasuser
108
+ dir = tmpdir()
109
+
110
+ user = nonrootuser()
111
+ path = File.join(tmpdir, "createusertesting")
112
+ @@tmpfiles << path
113
+
114
+ file = nil
115
+ assert_nothing_raised {
116
+ file = Puppet.type(:file).create(
117
+ :path => path,
118
+ :owner => user.name,
119
+ :ensure => "file",
120
+ :mode => "755"
121
+ )
122
+ }
123
+
124
+ comp = newcomp("createusertest", file)
125
+
126
+ assert_events([:file_created], comp)
127
+ end
128
+
129
+ def test_nofollowlinks
130
+ basedir = tempfile()
131
+ Dir.mkdir(basedir)
132
+ file = File.join(basedir, "file")
133
+ link = File.join(basedir, "link")
134
+
135
+ File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
136
+ File.symlink(file, link)
137
+
138
+ # First test 'user'
139
+ user = nonrootuser()
140
+
141
+ inituser = File.lstat(link).uid
142
+ File.lchown(inituser, nil, link)
143
+
144
+ obj = nil
145
+ assert_nothing_raised {
146
+ obj = Puppet.type(:file).create(
147
+ :title => link,
148
+ :owner => user.name
149
+ )
150
+ }
151
+ obj.retrieve
152
+
153
+ # Make sure it defaults to managing the link
154
+ assert_events([:file_changed], obj)
155
+ assert_equal(user.uid, File.lstat(link).uid)
156
+ assert_equal(inituser, File.stat(file).uid)
157
+ File.chown(inituser, nil, file)
158
+ File.lchown(inituser, nil, link)
159
+
160
+ # Try following
161
+ obj[:links] = :follow
162
+ assert_events([:file_changed], obj)
163
+ assert_equal(user.uid, File.stat(file).uid)
164
+ assert_equal(inituser, File.lstat(link).uid)
165
+
166
+ # And then explicitly managing
167
+ File.chown(inituser, nil, file)
168
+ File.lchown(inituser, nil, link)
169
+ obj[:links] = :manage
170
+ assert_events([:file_changed], obj)
171
+ assert_equal(user.uid, File.lstat(link).uid)
172
+ assert_equal(inituser, File.stat(file).uid)
173
+
174
+ obj.delete(:owner)
175
+ obj[:links] = :ignore
176
+
177
+ # And then test 'group'
178
+ group = nonrootgroup
179
+
180
+ initgroup = File.stat(file).gid
181
+ obj[:group] = group.name
182
+
183
+ assert_events([:file_changed], obj)
184
+ assert_equal(initgroup, File.stat(file).gid)
185
+ assert_equal(group.gid, File.lstat(link).gid)
186
+ File.chown(nil, initgroup, file)
187
+ File.lchown(nil, initgroup, link)
188
+
189
+ obj[:links] = :follow
190
+ assert_events([:file_changed], obj)
191
+ assert_equal(group.gid, File.stat(file).gid)
192
+ File.chown(nil, initgroup, file)
193
+ File.lchown(nil, initgroup, link)
194
+
195
+ obj[:links] = :manage
196
+ assert_events([:file_changed], obj)
197
+ assert_equal(group.gid, File.lstat(link).gid)
198
+ assert_equal(initgroup, File.stat(file).gid)
199
+ end
200
+
201
+ def test_ownerasroot
202
+ file = mktestfile()
203
+
204
+ users = {}
205
+ count = 0
206
+
207
+ # collect five users
208
+ Etc.passwd { |passwd|
209
+ if count > 5
210
+ break
211
+ else
212
+ count += 1
213
+ end
214
+ next if passwd.uid < 0
215
+ users[passwd.uid] = passwd.name
216
+ }
217
+
218
+ fake = {}
219
+ # find a fake user
220
+ while true
221
+ a = rand(1000)
222
+ begin
223
+ Etc.getpwuid(a)
224
+ rescue
225
+ fake[a] = "fakeuser"
226
+ break
227
+ end
228
+ end
229
+
230
+ users.each { |uid, name|
231
+ assert_nothing_raised() {
232
+ file[:owner] = name
233
+ }
234
+ changes = []
235
+ assert_nothing_raised() {
236
+ changes << file.evaluate
237
+ }
238
+ assert(changes.length > 0)
239
+ assert_apply(file)
240
+ file.retrieve
241
+ assert(file.insync?())
242
+ assert_nothing_raised() {
243
+ file[:owner] = uid
244
+ }
245
+ assert_apply(file)
246
+ file.retrieve
247
+ # make sure changing to number doesn't cause a sync
248
+ assert(file.insync?())
249
+ }
250
+
251
+ # We no longer raise an error here, because we check at run time
252
+ #fake.each { |uid, name|
253
+ # assert_raise(Puppet::Error) {
254
+ # file[:owner] = name
255
+ # }
256
+ # assert_raise(Puppet::Error) {
257
+ # file[:owner] = uid
258
+ # }
259
+ #}
260
+ end
261
+
262
+ def test_groupasroot
263
+ file = mktestfile()
264
+ [%x{groups}.chomp.split(/ /), Process.groups].flatten.each { |group|
265
+ next unless Puppet::Util.gid(group) # grr.
266
+ assert_nothing_raised() {
267
+ file[:group] = group
268
+ }
269
+ assert(file.property(:group))
270
+ assert(file.property(:group).should)
271
+ assert_apply(file)
272
+ file.retrieve
273
+ assert(file.insync?())
274
+ assert_nothing_raised() {
275
+ file.delete(:group)
276
+ }
277
+ }
278
+ end
279
+
280
+ if Facter.value(:operatingsystem) == "Darwin"
281
+ def test_sillyowner
282
+ file = tempfile()
283
+ File.open(file, "w") { |f| f.puts "" }
284
+ File.chown(-2, nil, file)
285
+
286
+ assert(File.stat(file).uid > 120000, "eh?")
287
+ user = nonrootuser
288
+ obj = Puppet::Type.newfile(
289
+ :path => file,
290
+ :owner => user.name
291
+ )
292
+
293
+ assert_apply(obj)
294
+
295
+ assert_equal(user.uid, File.stat(file).uid)
296
+ end
297
+ end
298
+ else
299
+ $stderr.puts "Run as root for complete owner and group testing"
300
+ end
301
+
302
+ def test_create
303
+ %w{a b c d}.collect { |name| tempfile() + name.to_s }.each { |path|
304
+ file =nil
305
+ assert_nothing_raised() {
306
+ file = Puppet.type(:file).create(
307
+ :name => path,
308
+ :ensure => "file"
309
+ )
310
+ }
311
+ assert_events([:file_created], file)
312
+ assert_events([], file)
313
+ assert(FileTest.file?(path), "File does not exist")
314
+ assert(file.insync?())
315
+ @@tmpfiles.push path
316
+ }
317
+ end
318
+
319
+ def test_create_dir
320
+ basedir = tempfile()
321
+ Dir.mkdir(basedir)
322
+ %w{a b c d}.collect { |name| "#{basedir}/%s" % name }.each { |path|
323
+ file = nil
324
+ assert_nothing_raised() {
325
+ file = Puppet.type(:file).create(
326
+ :name => path,
327
+ :ensure => "directory"
328
+ )
329
+ }
330
+ assert(! FileTest.directory?(path), "Directory %s already exists" %
331
+ [path])
332
+ assert_events([:directory_created], file)
333
+ assert_events([], file)
334
+ assert(file.insync?())
335
+ assert(FileTest.directory?(path))
336
+ @@tmpfiles.push path
337
+ }
338
+ end
339
+
340
+ def test_modes
341
+ file = mktestfile
342
+ # Set it to something else initially
343
+ File.chmod(0775, file.title)
344
+ [0644,0755,0777,0641].each { |mode|
345
+ assert_nothing_raised() {
346
+ file[:mode] = mode
347
+ }
348
+ assert_events([:file_changed], file)
349
+ assert_events([], file)
350
+
351
+ assert(file.insync?())
352
+
353
+ assert_nothing_raised() {
354
+ file.delete(:mode)
355
+ }
356
+ }
357
+ end
358
+
359
+ def test_checksums
360
+ types = %w{md5 md5lite timestamp time}
361
+ exists = "/tmp/sumtest-exists"
362
+ nonexists = "/tmp/sumtest-nonexists"
363
+
364
+ @@tmpfiles << exists
365
+ @@tmpfiles << nonexists
366
+
367
+ # try it both with files that exist and ones that don't
368
+ files = [exists, nonexists]
369
+ initstorage
370
+ File.open(exists,File::CREAT|File::TRUNC|File::WRONLY) { |of|
371
+ of.puts "initial text"
372
+ }
373
+ types.each { |type|
374
+ files.each { |path|
375
+ if Puppet[:debug]
376
+ Puppet.warning "Testing %s on %s" % [type,path]
377
+ end
378
+ file = nil
379
+ events = nil
380
+ # okay, we now know that we have a file...
381
+ assert_nothing_raised() {
382
+ file = Puppet.type(:file).create(
383
+ :name => path,
384
+ :ensure => "file",
385
+ :checksum => type
386
+ )
387
+ }
388
+ trans = nil
389
+
390
+ file.retrieve
391
+
392
+ if file.title !~ /nonexists/
393
+ sum = file.property(:checksum)
394
+ assert(sum.insync?, "file is not in sync")
395
+ end
396
+
397
+ events = assert_apply(file)
398
+
399
+ assert(! events.include?(:file_changed),
400
+ "File incorrectly changed")
401
+ assert_events([], file)
402
+
403
+ # We have to sleep because the time resolution of the time-based
404
+ # mechanisms is greater than one second
405
+ sleep 1 if type =~ /time/
406
+
407
+ assert_nothing_raised() {
408
+ File.open(path,File::CREAT|File::TRUNC|File::WRONLY) { |of|
409
+ of.puts "some more text, yo"
410
+ }
411
+ }
412
+ Puppet.type(:file).clear
413
+
414
+ # now recreate the file
415
+ assert_nothing_raised() {
416
+ file = Puppet.type(:file).create(
417
+ :name => path,
418
+ :checksum => type
419
+ )
420
+ }
421
+ trans = nil
422
+
423
+ assert_events([:file_changed], file)
424
+
425
+ # Run it a few times to make sure we aren't getting
426
+ # spurious changes.
427
+ assert_nothing_raised do
428
+ file.property(:checksum).retrieve
429
+ end
430
+ assert(file.property(:checksum).insync?,
431
+ "checksum is not in sync")
432
+
433
+ sleep 1.1 if type =~ /time/
434
+ assert_nothing_raised() {
435
+ File.unlink(path)
436
+ File.open(path,File::CREAT|File::TRUNC|File::WRONLY) { |of|
437
+ # We have to put a certain amount of text in here or
438
+ # the md5-lite test fails
439
+ 2.times {
440
+ of.puts rand(100)
441
+ }
442
+ of.flush
443
+ }
444
+ }
445
+ assert_events([:file_changed], file)
446
+
447
+ # verify that we're actually getting notified when a file changes
448
+ assert_nothing_raised() {
449
+ Puppet.type(:file).clear
450
+ }
451
+
452
+ if path =~ /nonexists/
453
+ File.unlink(path)
454
+ end
455
+ }
456
+ }
457
+ end
458
+
459
+ def cyclefile(path)
460
+ # i had problems with using :name instead of :path
461
+ [:name,:path].each { |param|
462
+ file = nil
463
+ changes = nil
464
+ comp = nil
465
+ trans = nil
466
+
467
+ initstorage
468
+ assert_nothing_raised {
469
+ file = Puppet.type(:file).create(
470
+ param => path,
471
+ :recurse => true,
472
+ :checksum => "md5"
473
+ )
474
+ }
475
+ comp = Puppet.type(:component).create(
476
+ :name => "component"
477
+ )
478
+ comp.push file
479
+ assert_nothing_raised {
480
+ trans = comp.evaluate
481
+ }
482
+ assert_nothing_raised {
483
+ trans.evaluate
484
+ }
485
+ clearstorage
486
+ Puppet::Type.allclear
487
+ }
488
+ end
489
+
490
+ def test_localrecurse
491
+ # Create a test directory
492
+ path = tempfile()
493
+ dir = @file.create :path => path, :mode => 0755, :recurse => true
494
+
495
+ Dir.mkdir(path)
496
+
497
+ # Make sure we return nothing when there are no children
498
+ ret = nil
499
+ assert_nothing_raised() { ret = dir.localrecurse(true) }
500
+ assert_equal([], ret, "empty dir returned children")
501
+
502
+ # Now make a file and make sure we get it
503
+ test = File.join(path, "file")
504
+ File.open(test, "w") { |f| f.puts "yay" }
505
+ assert_nothing_raised() { ret = dir.localrecurse(true) }
506
+ fileobj = @file[test]
507
+ assert(fileobj, "child object was not created")
508
+ assert_equal([fileobj], ret, "child object was not returned")
509
+
510
+ # And that it inherited our recurse setting
511
+ assert_equal(true, fileobj[:recurse], "file did not inherit recurse")
512
+
513
+ # Make sure it's not returned again
514
+ assert_nothing_raised() { ret = dir.localrecurse(true) }
515
+ assert_equal([], ret, "child object was returned twice")
516
+
517
+ # Now just for completion, make sure we will return many files
518
+ files = []
519
+ 10.times do |i|
520
+ f = File.join(path, i.to_s)
521
+ files << f
522
+ File.open(f, "w") do |o| o.puts "" end
523
+ end
524
+ assert_nothing_raised() { ret = dir.localrecurse(true) }
525
+ assert_equal(files.sort, ret.collect { |f| f.title }.sort,
526
+ "child object was returned twice")
527
+
528
+ # Clean everything up and start over
529
+ files << test
530
+ files.each do |f| File.unlink(f) end
531
+
532
+ # Now make sure we correctly ignore things
533
+ dir[:ignore] = "*.out"
534
+ bad = File.join(path, "test.out")
535
+ good = File.join(path, "yayness")
536
+ [good, bad].each do |f|
537
+ File.open(f, "w") { |o| o.puts "" }
538
+ end
539
+
540
+ assert_nothing_raised() { ret = dir.localrecurse(true) }
541
+ assert_equal([good], ret.collect { |f| f.title }, "ignore failed")
542
+
543
+ # Now make sure purging works
544
+ dir[:purge] = true
545
+ dir[:ignore] = "svn"
546
+
547
+ assert_nothing_raised() { ret = dir.localrecurse(true) }
548
+ assert_equal([bad], ret.collect { |f| f.title }, "purge failed")
549
+
550
+ badobj = @file[bad]
551
+ assert(badobj, "did not create bad object")
552
+ end
553
+
554
+ def test_recurse
555
+ basedir = tempfile()
556
+ FileUtils.mkdir_p(basedir)
557
+
558
+ # Create our file
559
+ dir = nil
560
+ assert_nothing_raised {
561
+ dir = Puppet.type(:file).create(
562
+ :path => basedir,
563
+ :check => %w{owner mode group}
564
+ )
565
+ }
566
+
567
+ return_nil = false
568
+
569
+ # and monkey-patch it
570
+ [:localrecurse, :linkrecurse].each do |m|
571
+ dir.meta_def(m) do |recurse|
572
+ if return_nil # for testing nil return, of course
573
+ return nil
574
+ else
575
+ return [recurse]
576
+ end
577
+ end
578
+ end
579
+
580
+ # We have to special-case this, because it returns a list of
581
+ # found files.
582
+ dir.meta_def(:sourcerecurse) do |recurse|
583
+ if return_nil # for testing nil return, of course
584
+ return nil
585
+ else
586
+ return [recurse], []
587
+ end
588
+ end
589
+
590
+ # First try it with recurse set to false
591
+ dir[:recurse] = false
592
+ assert_nothing_raised do
593
+ assert_nil(dir.recurse)
594
+ end
595
+
596
+ # Now try it with the different valid positive values
597
+ [true, "true", "inf", 50].each do |value|
598
+ assert_nothing_raised { dir[:recurse] = value}
599
+
600
+ # Now make sure the methods are called appropriately
601
+ ret = nil
602
+ assert_nothing_raised do
603
+ ret = dir.recurse
604
+ end
605
+
606
+ # We should only call the localrecurse method, so make sure
607
+ # that's the case
608
+ if value == 50
609
+ # Make sure our counter got decremented
610
+ assert_equal([49], ret, "did not call localrecurse")
611
+ else
612
+ assert_equal([true], ret, "did not call localrecurse")
613
+ end
614
+ end
615
+
616
+ # Make sure it doesn't recurse when we've set recurse to false
617
+ [false, "false"].each do |value|
618
+ assert_nothing_raised { dir[:recurse] = value }
619
+
620
+ ret = nil
621
+ assert_nothing_raised() { ret = dir.recurse }
622
+ assert_nil(ret)
623
+ end
624
+ dir[:recurse] = true
625
+
626
+ # Now add a target, so we do the linking thing
627
+ dir[:target] = tempfile()
628
+ ret = nil
629
+ assert_nothing_raised { ret = dir.recurse }
630
+ assert_equal([true, true], ret, "did not call linkrecurse")
631
+
632
+ # And add a source, and make sure we call that
633
+ dir[:source] = tempfile()
634
+ assert_nothing_raised { ret = dir.recurse }
635
+ assert_equal([true, true, true], ret, "did not call linkrecurse")
636
+
637
+ # Lastly, make sure we correctly handle returning nil
638
+ return_nil = true
639
+ assert_nothing_raised { ret = dir.recurse }
640
+ end
641
+
642
+ def test_recurse?
643
+ file = Puppet::Type.type(:file).create :path => tempfile
644
+
645
+ # Make sure we default to false
646
+ assert(! file.recurse?, "Recurse defaulted to true")
647
+
648
+ [true, "true", 10, "inf"].each do |value|
649
+ file[:recurse] = value
650
+ assert(file.recurse?, "%s did not cause recursion" % value)
651
+ end
652
+
653
+ [false, "false", 0].each do |value|
654
+ file[:recurse] = value
655
+ assert(! file.recurse?, "%s caused recursion" % value)
656
+ end
657
+ end
658
+
659
+ def test_recursion
660
+ basedir = tempfile()
661
+ subdir = File.join(basedir, "subdir")
662
+ tmpfile = File.join(basedir,"testing")
663
+ FileUtils.mkdir_p(subdir)
664
+
665
+ dir = nil
666
+ [true, "true", "inf", 50].each do |value|
667
+ assert_nothing_raised {
668
+ dir = Puppet.type(:file).create(
669
+ :path => basedir,
670
+ :recurse => value,
671
+ :check => %w{owner mode group}
672
+ )
673
+ }
674
+
675
+ children = nil
676
+
677
+ assert_nothing_raised {
678
+ children = dir.eval_generate
679
+ }
680
+
681
+ assert_equal([subdir], children.collect {|c| c.title },
682
+ "Incorrect generated children")
683
+
684
+ dir.class[subdir].remove
685
+
686
+ File.open(tmpfile, "w") { |f| f.puts "yayness" }
687
+
688
+ assert_nothing_raised {
689
+ children = dir.eval_generate
690
+ }
691
+
692
+ assert_equal([subdir, tmpfile].sort, children.collect {|c| c.title }.sort,
693
+ "Incorrect generated children")
694
+
695
+ File.unlink(tmpfile)
696
+ #system("rm -rf %s" % basedir)
697
+ Puppet.type(:file).clear
698
+ end
699
+ end
700
+
701
+ def test_filetype_retrieval
702
+ file = nil
703
+
704
+ # Verify it retrieves files of type directory
705
+ assert_nothing_raised {
706
+ file = Puppet.type(:file).create(
707
+ :name => tmpdir(),
708
+ :check => :type
709
+ )
710
+ }
711
+
712
+ assert_nothing_raised {
713
+ file.evaluate
714
+ }
715
+
716
+ assert_equal("directory", file.property(:type).is)
717
+
718
+ # And then check files
719
+ assert_nothing_raised {
720
+ file = Puppet.type(:file).create(
721
+ :name => tempfile(),
722
+ :ensure => "file"
723
+ )
724
+ }
725
+
726
+ assert_apply(file)
727
+ file[:check] = "type"
728
+ assert_apply(file)
729
+
730
+ assert_equal("file", file.property(:type).is)
731
+
732
+ file[:type] = "directory"
733
+
734
+ assert_nothing_raised { file.retrieve }
735
+
736
+ # The 'retrieve' method sets @should to @is, so they're never
737
+ # out of sync. It's a read-only class.
738
+ assert(file.insync?)
739
+ end
740
+
741
+ def test_remove
742
+ basedir = tempfile()
743
+ subdir = File.join(basedir, "this")
744
+ FileUtils.mkdir_p(subdir)
745
+
746
+ dir = nil
747
+ assert_nothing_raised {
748
+ dir = Puppet.type(:file).create(
749
+ :path => basedir,
750
+ :recurse => true,
751
+ :check => %w{owner mode group}
752
+ )
753
+ }
754
+
755
+ assert_nothing_raised {
756
+ dir.eval_generate
757
+ }
758
+
759
+ obj = nil
760
+ assert_nothing_raised {
761
+ obj = Puppet.type(:file)[subdir]
762
+ }
763
+
764
+ assert(obj, "Could not retrieve subdir object")
765
+
766
+ assert_nothing_raised {
767
+ obj.remove(true)
768
+ }
769
+
770
+ assert_nothing_raised {
771
+ obj = Puppet.type(:file)[subdir]
772
+ }
773
+
774
+ assert_nil(obj, "Retrieved removed object")
775
+ end
776
+
777
+ def test_path
778
+ dir = tempfile()
779
+
780
+ path = File.join(dir, "subdir")
781
+
782
+ assert_nothing_raised("Could not make file") {
783
+ FileUtils.mkdir_p(File.dirname(path))
784
+ File.open(path, "w") { |f| f.puts "yayness" }
785
+ }
786
+
787
+ file = nil
788
+ dirobj = nil
789
+ assert_nothing_raised("Could not make file object") {
790
+ dirobj = Puppet.type(:file).create(
791
+ :path => dir,
792
+ :recurse => true,
793
+ :check => %w{mode owner group}
794
+ )
795
+ }
796
+
797
+ assert_nothing_raised {
798
+ dirobj.eval_generate
799
+ }
800
+
801
+ assert_nothing_raised {
802
+ file = dirobj.class[path]
803
+ }
804
+
805
+ assert(file, "Could not retrieve file object")
806
+
807
+ assert_equal("/%s" % file.ref, file.path)
808
+ end
809
+
810
+ def test_autorequire
811
+ basedir = tempfile()
812
+ subfile = File.join(basedir, "subfile")
813
+
814
+ baseobj = Puppet.type(:file).create(
815
+ :name => basedir,
816
+ :ensure => "directory"
817
+ )
818
+
819
+ subobj = Puppet.type(:file).create(
820
+ :name => subfile,
821
+ :ensure => "file"
822
+ )
823
+ edge = nil
824
+ assert_nothing_raised do
825
+ edge = subobj.autorequire.shift
826
+ end
827
+ assert_equal(baseobj, edge.source, "file did not require its parent dir")
828
+ assert_equal(subobj, edge.target, "file did not require its parent dir")
829
+ end
830
+
831
+ def test_content
832
+ file = tempfile()
833
+ str = "This is some content"
834
+
835
+ obj = nil
836
+ assert_nothing_raised {
837
+ obj = Puppet.type(:file).create(
838
+ :name => file,
839
+ :content => str
840
+ )
841
+ }
842
+
843
+ assert(!obj.insync?, "Object is incorrectly in sync")
844
+
845
+ assert_events([:file_created], obj)
846
+
847
+ obj.retrieve
848
+
849
+ assert(obj.insync?, "Object is not in sync")
850
+
851
+ text = File.read(file)
852
+
853
+ assert_equal(str, text, "Content did not copy correctly")
854
+
855
+ newstr = "Another string, yo"
856
+
857
+ obj[:content] = newstr
858
+
859
+ assert(!obj.insync?, "Object is incorrectly in sync")
860
+
861
+ assert_events([:file_changed], obj)
862
+
863
+ text = File.read(file)
864
+
865
+ assert_equal(newstr, text, "Content did not copy correctly")
866
+
867
+ obj.retrieve
868
+ assert(obj.insync?, "Object is not in sync")
869
+ end
870
+
871
+ # Unfortunately, I know this fails
872
+ def disabled_test_recursivemkdir
873
+ path = tempfile()
874
+ subpath = File.join(path, "this", "is", "a", "dir")
875
+ file = nil
876
+ assert_nothing_raised {
877
+ file = Puppet.type(:file).create(
878
+ :name => subpath,
879
+ :ensure => "directory",
880
+ :recurse => true
881
+ )
882
+ }
883
+
884
+ comp = newcomp("yay", file)
885
+ comp.finalize
886
+ assert_apply(comp)
887
+ #assert_events([:directory_created], comp)
888
+
889
+ assert(FileTest.directory?(subpath), "Did not create directory")
890
+ end
891
+
892
+ # Make sure that content updates the checksum on the same run
893
+ def test_checksumchange_for_content
894
+ dest = tempfile()
895
+ File.open(dest, "w") { |f| f.puts "yayness" }
896
+
897
+ file = nil
898
+ assert_nothing_raised {
899
+ file = Puppet.type(:file).create(
900
+ :name => dest,
901
+ :checksum => "md5",
902
+ :content => "This is some content"
903
+ )
904
+ }
905
+
906
+ file.retrieve
907
+
908
+ assert_events([:file_changed], file)
909
+ file.retrieve
910
+ assert_events([], file)
911
+ end
912
+
913
+ # Make sure that content updates the checksum on the same run
914
+ def test_checksumchange_for_ensure
915
+ dest = tempfile()
916
+
917
+ file = nil
918
+ assert_nothing_raised {
919
+ file = Puppet.type(:file).create(
920
+ :name => dest,
921
+ :checksum => "md5",
922
+ :ensure => "file"
923
+ )
924
+ }
925
+
926
+ file.retrieve
927
+
928
+ assert_events([:file_created], file)
929
+ file.retrieve
930
+ assert_events([], file)
931
+ end
932
+
933
+ # Make sure that content gets used before ensure
934
+ def test_contentbeatsensure
935
+ dest = tempfile()
936
+
937
+ file = nil
938
+ assert_nothing_raised {
939
+ file = Puppet.type(:file).create(
940
+ :name => dest,
941
+ :ensure => "file",
942
+ :content => "this is some content, yo"
943
+ )
944
+ }
945
+
946
+ file.retrieve
947
+
948
+ assert_events([:file_created], file)
949
+ file.retrieve
950
+ assert_events([], file)
951
+ assert_events([], file)
952
+ end
953
+
954
+ # Make sure that content gets used before ensure
955
+ def test_deletion_beats_source
956
+ dest = tempfile()
957
+ source = tempfile()
958
+ File.open(source, "w") { |f| f.puts "yay" }
959
+
960
+ file = nil
961
+ assert_nothing_raised {
962
+ file = Puppet.type(:file).create(
963
+ :name => dest,
964
+ :ensure => :absent,
965
+ :source => source
966
+ )
967
+ }
968
+
969
+ file.retrieve
970
+
971
+ assert_events([], file)
972
+ assert(! FileTest.exists?(dest), "file was copied during deletion")
973
+
974
+ # Now create the dest, and make sure it gets deleted
975
+ File.open(dest, "w") { |f| f.puts "boo" }
976
+ assert_events([:file_removed], file)
977
+ assert(! FileTest.exists?(dest), "file was not deleted during deletion")
978
+ end
979
+
980
+ def test_nameandpath
981
+ path = tempfile()
982
+
983
+ file = nil
984
+ assert_nothing_raised {
985
+ file = Puppet.type(:file).create(
986
+ :title => "fileness",
987
+ :path => path,
988
+ :content => "this is some content"
989
+ )
990
+ }
991
+
992
+ assert_apply(file)
993
+
994
+ assert(FileTest.exists?(path))
995
+ end
996
+
997
+ # Make sure that a missing group isn't fatal at object instantiation time.
998
+ def test_missinggroup
999
+ file = nil
1000
+ assert_nothing_raised {
1001
+ file = Puppet.type(:file).create(
1002
+ :path => tempfile(),
1003
+ :group => "fakegroup"
1004
+ )
1005
+ }
1006
+
1007
+ assert(file.property(:group), "Group property failed")
1008
+ end
1009
+
1010
+ def test_modecreation
1011
+ path = tempfile()
1012
+ file = Puppet.type(:file).create(
1013
+ :path => path,
1014
+ :ensure => "file",
1015
+ :mode => "0777"
1016
+ )
1017
+ assert_equal(0777, file.should(:mode),
1018
+ "Mode did not get set correctly")
1019
+ assert_apply(file)
1020
+ assert_equal(0777, File.stat(path).mode & 007777,
1021
+ "file mode is incorrect")
1022
+ File.unlink(path)
1023
+ file[:ensure] = "directory"
1024
+ assert_apply(file)
1025
+ assert_equal(0777, File.stat(path).mode & 007777,
1026
+ "directory mode is incorrect")
1027
+ end
1028
+
1029
+ def test_followlinks
1030
+ File.umask(0022)
1031
+
1032
+ basedir = tempfile()
1033
+ Dir.mkdir(basedir)
1034
+ file = File.join(basedir, "file")
1035
+ link = File.join(basedir, "link")
1036
+
1037
+ File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
1038
+ File.symlink(file, link)
1039
+
1040
+ obj = nil
1041
+ assert_nothing_raised {
1042
+ obj = Puppet.type(:file).create(
1043
+ :path => link,
1044
+ :mode => "755"
1045
+ )
1046
+ }
1047
+ obj.retrieve
1048
+
1049
+ assert_events([], obj)
1050
+
1051
+ # Assert that we default to not following links
1052
+ assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
1053
+
1054
+ # Assert that we can manage the link directly, but modes still don't change
1055
+ obj[:links] = :manage
1056
+ assert_events([], obj)
1057
+
1058
+ assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
1059
+
1060
+ obj[:links] = :follow
1061
+ assert_events([:file_changed], obj)
1062
+
1063
+ assert_equal("%o" % 0755, "%o" % (File.stat(file).mode & 007777))
1064
+
1065
+ # Now verify that content and checksum don't update, either
1066
+ obj.delete(:mode)
1067
+ obj[:checksum] = "md5"
1068
+ obj[:links] = :ignore
1069
+
1070
+ assert_events([], obj)
1071
+ File.open(file, "w") { |f| f.puts "more text" }
1072
+ assert_events([], obj)
1073
+ obj[:links] = :follow
1074
+ assert_events([], obj)
1075
+ File.open(file, "w") { |f| f.puts "even more text" }
1076
+ assert_events([:file_changed], obj)
1077
+
1078
+ obj.delete(:checksum)
1079
+ obj[:content] = "this is some content"
1080
+ obj[:links] = :ignore
1081
+
1082
+ assert_events([], obj)
1083
+ File.open(file, "w") { |f| f.puts "more text" }
1084
+ assert_events([], obj)
1085
+ obj[:links] = :follow
1086
+ assert_events([:file_changed], obj)
1087
+ end
1088
+
1089
+ # If both 'ensure' and 'content' are used, make sure that all of the other
1090
+ # properties are handled correctly.
1091
+ def test_contentwithmode
1092
+ path = tempfile()
1093
+
1094
+ file = nil
1095
+ assert_nothing_raised {
1096
+ file = Puppet.type(:file).create(
1097
+ :path => path,
1098
+ :ensure => "file",
1099
+ :content => "some text\n",
1100
+ :mode => 0755
1101
+ )
1102
+ }
1103
+
1104
+ assert_apply(file)
1105
+ assert_equal("%o" % 0755, "%o" % (File.stat(path).mode & 007777))
1106
+ end
1107
+
1108
+ def test_backupmodes
1109
+ File.umask(0022)
1110
+
1111
+ file = tempfile()
1112
+ newfile = tempfile()
1113
+
1114
+ File.open(file, "w", 0411) { |f| f.puts "yayness" }
1115
+
1116
+ obj = nil
1117
+ assert_nothing_raised {
1118
+ obj = Puppet::Type.type(:file).create(
1119
+ :path => file, :content => "rahness\n", :backup => ".puppet-bak"
1120
+ )
1121
+ }
1122
+
1123
+ assert_apply(obj)
1124
+
1125
+ backupfile = file + obj[:backup]
1126
+ @@tmpfiles << backupfile
1127
+ assert(FileTest.exists?(backupfile),
1128
+ "Backup file %s does not exist" % backupfile)
1129
+
1130
+ assert_equal(0411, filemode(backupfile),
1131
+ "File mode is wrong for backupfile")
1132
+
1133
+ bucket = "bucket"
1134
+ bpath = tempfile()
1135
+ Dir.mkdir(bpath)
1136
+ Puppet::Type.type(:filebucket).create(
1137
+ :title => bucket, :path => bpath
1138
+ )
1139
+
1140
+ obj[:backup] = bucket
1141
+ obj[:content] = "New content"
1142
+ assert_apply(obj)
1143
+
1144
+ md5 = "18cc17fa3047fcc691fdf49c0a7f539a"
1145
+ dir, file, pathfile = Puppet::Network::Handler.filebucket.paths(bpath, md5)
1146
+
1147
+ assert_equal(0440, filemode(file))
1148
+ end
1149
+
1150
+ def test_largefilechanges
1151
+ source = tempfile()
1152
+ dest = tempfile()
1153
+
1154
+ # Now make a large file
1155
+ File.open(source, "w") { |f|
1156
+ 500.times { |i| f.puts "line %s" % i }
1157
+ }
1158
+
1159
+ obj = Puppet::Type.type(:file).create(
1160
+ :title => dest, :source => source
1161
+ )
1162
+
1163
+ assert_events([:file_created], obj)
1164
+
1165
+ File.open(source, File::APPEND|File::WRONLY) { |f| f.puts "another line" }
1166
+
1167
+ assert_events([:file_changed], obj)
1168
+
1169
+ # Now modify the dest file
1170
+ File.open(dest, File::APPEND|File::WRONLY) { |f| f.puts "one more line" }
1171
+
1172
+ assert_events([:file_changed, :file_changed], obj)
1173
+
1174
+ end
1175
+
1176
+ def test_replacefilewithlink
1177
+ path = tempfile()
1178
+ link = tempfile()
1179
+
1180
+ File.open(path, "w") { |f| f.puts "yay" }
1181
+ File.open(link, "w") { |f| f.puts "a file" }
1182
+
1183
+ file = nil
1184
+ assert_nothing_raised {
1185
+ file = Puppet.type(:file).create(
1186
+ :ensure => path,
1187
+ :path => link
1188
+ )
1189
+ }
1190
+
1191
+ assert_events([:link_created], file)
1192
+
1193
+ assert(FileTest.symlink?(link), "Link was not created")
1194
+
1195
+ assert_equal(path, File.readlink(link), "Link was created incorrectly")
1196
+ end
1197
+
1198
+ def test_file_with_spaces
1199
+ dir = tempfile()
1200
+ Dir.mkdir(dir)
1201
+ source = File.join(dir, "file spaces")
1202
+ dest = File.join(dir, "another space")
1203
+
1204
+ File.open(source, "w") { |f| f.puts :yay }
1205
+ obj = Puppet::Type.type(:file).create(
1206
+ :path => dest,
1207
+ :source => source
1208
+ )
1209
+ assert(obj, "Did not create file")
1210
+
1211
+ assert_apply(obj)
1212
+
1213
+ assert(FileTest.exists?(dest), "File did not get created")
1214
+ end
1215
+
1216
+ def test_present_matches_anything
1217
+ path = tempfile()
1218
+
1219
+ file = Puppet::Type.newfile(:path => path, :ensure => :present)
1220
+
1221
+ file.retrieve
1222
+ assert(! file.insync?, "File incorrectly in sync")
1223
+
1224
+ # Now make a file
1225
+ File.open(path, "w") { |f| f.puts "yay" }
1226
+
1227
+ file.retrieve
1228
+ assert(file.insync?, "File not in sync")
1229
+
1230
+ # Now make a directory
1231
+ File.unlink(path)
1232
+ Dir.mkdir(path)
1233
+
1234
+ file.retrieve
1235
+ assert(file.insync?, "Directory not considered 'present'")
1236
+
1237
+ Dir.rmdir(path)
1238
+
1239
+ # Now make a link
1240
+ file[:links] = :manage
1241
+
1242
+ otherfile = tempfile()
1243
+ File.symlink(otherfile, path)
1244
+
1245
+ file.retrieve
1246
+ assert(file.insync?, "Symlink not considered 'present'")
1247
+ File.unlink(path)
1248
+
1249
+ # Now set some content, and make sure it works
1250
+ file[:content] = "yayness"
1251
+
1252
+ assert_apply(file)
1253
+
1254
+ assert_equal("yayness", File.read(path), "Content did not get set correctly")
1255
+ end
1256
+
1257
+ # Make sure unmanaged files are purged.
1258
+ def test_purge
1259
+ sourcedir = tempfile()
1260
+ destdir = tempfile()
1261
+ Dir.mkdir(sourcedir)
1262
+ Dir.mkdir(destdir)
1263
+ sourcefile = File.join(sourcedir, "sourcefile")
1264
+ dsourcefile = File.join(destdir, "sourcefile")
1265
+ localfile = File.join(destdir, "localfile")
1266
+ purgee = File.join(destdir, "to_be_purged")
1267
+ File.open(sourcefile, "w") { |f| f.puts "funtest" }
1268
+ # this file should get removed
1269
+ File.open(purgee, "w") { |f| f.puts "footest" }
1270
+
1271
+ lfobj = Puppet::Type.newfile(
1272
+ :title => "localfile",
1273
+ :path => localfile,
1274
+ :content => "rahtest"
1275
+ )
1276
+
1277
+
1278
+ destobj = Puppet::Type.newfile(:title => "destdir", :path => destdir,
1279
+ :source => sourcedir,
1280
+ :recurse => true)
1281
+
1282
+ comp = newcomp(lfobj, destobj)
1283
+ assert_apply(comp)
1284
+
1285
+ assert(FileTest.exists?(dsourcefile), "File did not get copied")
1286
+ assert(FileTest.exists?(localfile), "File did not get created")
1287
+ assert(FileTest.exists?(purgee), "File got prematurely purged")
1288
+
1289
+ assert_nothing_raised { destobj[:purge] = true }
1290
+ assert_apply(comp)
1291
+
1292
+ assert(FileTest.exists?(dsourcefile), "Source file got purged")
1293
+ assert(FileTest.exists?(localfile), "Local file got purged")
1294
+ assert(! FileTest.exists?(purgee), "File did not get purged")
1295
+ end
1296
+
1297
+ # Testing #274. Make sure target can be used without 'ensure'.
1298
+ def test_target_without_ensure
1299
+ source = tempfile()
1300
+ dest = tempfile()
1301
+ File.open(source, "w") { |f| f.puts "funtest" }
1302
+
1303
+ obj = nil
1304
+ assert_nothing_raised {
1305
+ obj = Puppet::Type.newfile(:path => dest, :target => source)
1306
+ }
1307
+
1308
+ assert_apply(obj)
1309
+ end
1310
+
1311
+ def test_autorequire_owner_and_group
1312
+ file = tempfile()
1313
+ comp = nil
1314
+ user = nil
1315
+ group =nil
1316
+ home = nil
1317
+ ogroup = nil
1318
+ assert_nothing_raised {
1319
+ user = Puppet.type(:user).create(
1320
+ :name => "pptestu",
1321
+ :home => file,
1322
+ :gid => "pptestg"
1323
+ )
1324
+ home = Puppet.type(:file).create(
1325
+ :path => file,
1326
+ :owner => "pptestu",
1327
+ :group => "pptestg",
1328
+ :ensure => "directory"
1329
+ )
1330
+ group = Puppet.type(:group).create(
1331
+ :name => "pptestg"
1332
+ )
1333
+ comp = newcomp(user, group, home)
1334
+ }
1335
+
1336
+ # Now make sure we get a relationship for each of these
1337
+ rels = nil
1338
+ assert_nothing_raised { rels = home.autorequire }
1339
+ assert(rels.detect { |e| e.source == user }, "owner was not autorequired")
1340
+ assert(rels.detect { |e| e.source == group }, "group was not autorequired")
1341
+ end
1342
+
1343
+ # Testing #309 -- //my/file => /my/file
1344
+ def test_slash_deduplication
1345
+ ["/my/////file/for//testing", "//my/file/for/testing///",
1346
+ "/my/file/for/testing"].each do |path|
1347
+ file = nil
1348
+ assert_nothing_raised do
1349
+ file = Puppet::Type.newfile(:path => path)
1350
+ end
1351
+
1352
+ assert_equal("/my/file/for/testing", file.title)
1353
+ assert_equal(file, Puppet::Type.type(:file)["/my/file/for/testing"])
1354
+ Puppet::Type.type(:file).clear
1355
+ end
1356
+ end
1357
+
1358
+ # Testing #304
1359
+ def test_links_to_directories
1360
+ link = tempfile()
1361
+ file = tempfile()
1362
+ dir = tempfile()
1363
+ Dir.mkdir(dir)
1364
+
1365
+ bucket = Puppet::Type.newfilebucket :name => "main"
1366
+ File.symlink(dir, link)
1367
+ File.open(file, "w") { |f| f.puts "" }
1368
+ assert_equal(dir, File.readlink(link))
1369
+ obj = Puppet::Type.newfile :path => link, :ensure => :link,
1370
+ :target => file, :recurse => false, :backup => "main"
1371
+
1372
+ assert_apply(obj)
1373
+
1374
+ assert_equal(file, File.readlink(link))
1375
+ end
1376
+
1377
+ # Testing #303
1378
+ def test_nobackups_with_links
1379
+ link = tempfile()
1380
+ new = tempfile()
1381
+
1382
+ File.open(link, "w") { |f| f.puts "old" }
1383
+ File.open(new, "w") { |f| f.puts "new" }
1384
+ obj = Puppet::Type.newfile :path => link, :ensure => :link,
1385
+ :target => new, :recurse => true, :backup => false
1386
+
1387
+ assert_nothing_raised do
1388
+ obj.handlebackup
1389
+ end
1390
+
1391
+ bfile = [link, "puppet-bak"].join(".")
1392
+
1393
+ assert(! FileTest.exists?(bfile), "Backed up when told not to")
1394
+
1395
+ assert_apply(obj)
1396
+
1397
+ assert(! FileTest.exists?(bfile), "Backed up when told not to")
1398
+ end
1399
+
1400
+ # Make sure we consistently handle backups for all cases.
1401
+ def test_ensure_with_backups
1402
+ # We've got three file types, so make sure we can replace any type
1403
+ # with the other type and that backups are done correctly.
1404
+ types = [:file, :directory, :link]
1405
+
1406
+ dir = tempfile()
1407
+ path = File.join(dir, "test")
1408
+ linkdest = tempfile()
1409
+ creators = {
1410
+ :file => proc { File.open(path, "w") { |f| f.puts "initial" } },
1411
+ :directory => proc { Dir.mkdir(path) },
1412
+ :link => proc { File.symlink(linkdest, path) }
1413
+ }
1414
+
1415
+ bucket = Puppet::Type.newfilebucket :name => "main", :path => tempfile()
1416
+
1417
+ obj = Puppet::Type.newfile :path => path, :force => true,
1418
+ :links => :manage
1419
+
1420
+ Puppet[:trace] = true
1421
+ ["main", false].each do |backup|
1422
+ obj[:backup] = backup
1423
+ obj.finish
1424
+ types.each do |should|
1425
+ types.each do |is|
1426
+ # It makes no sense to replace a directory with a directory
1427
+ # next if should == :directory and is == :directory
1428
+
1429
+ Dir.mkdir(dir)
1430
+
1431
+ # Make the thing
1432
+ creators[is].call
1433
+
1434
+ obj[:ensure] = should
1435
+
1436
+ if should == :link
1437
+ obj[:target] = linkdest
1438
+ else
1439
+ if obj.property(:target)
1440
+ obj.delete(:target)
1441
+ end
1442
+ end
1443
+
1444
+ # First try just removing the initial data
1445
+ assert_nothing_raised do
1446
+ obj.remove_existing(should)
1447
+ end
1448
+
1449
+ unless is == should
1450
+ # Make sure the original is gone
1451
+ assert(! FileTest.exists?(obj[:path]),
1452
+ "remove_existing did not work: " +
1453
+ "did not remove %s with %s" % [is, should])
1454
+ end
1455
+ FileUtils.rmtree(obj[:path])
1456
+
1457
+ # Now make it again
1458
+ creators[is].call
1459
+
1460
+ property = obj.property(:ensure)
1461
+
1462
+ property.retrieve
1463
+ unless property.insync?
1464
+ assert_nothing_raised do
1465
+ property.sync
1466
+ end
1467
+ end
1468
+ FileUtils.rmtree(dir)
1469
+ end
1470
+ end
1471
+ end
1472
+ end
1473
+
1474
+ if Process.uid == 0
1475
+ # Testing #364.
1476
+ def test_writing_in_directories_with_no_write_access
1477
+ # Make a directory that our user does not have access to
1478
+ dir = tempfile()
1479
+ Dir.mkdir(dir)
1480
+
1481
+ # Get a fake user
1482
+ user = nonrootuser
1483
+ # and group
1484
+ group = nonrootgroup
1485
+
1486
+ # First try putting a file in there
1487
+ path = File.join(dir, "file")
1488
+ file = Puppet::Type.newfile :path => path, :owner => user.name, :group => group.name, :content => "testing"
1489
+
1490
+ # Make sure we can create it
1491
+ assert_apply(file)
1492
+ assert(FileTest.exists?(path), "File did not get created")
1493
+ # And that it's owned correctly
1494
+ assert_equal(user.uid, File.stat(path).uid, "File has the wrong owner")
1495
+ assert_equal(group.gid, File.stat(path).gid, "File has the wrong group")
1496
+
1497
+ assert_equal("testing", File.read(path), "file has the wrong content")
1498
+
1499
+ # Now make a dir
1500
+ subpath = File.join(dir, "subdir")
1501
+ subdir = Puppet::Type.newfile :path => subpath, :owner => user.name, :group => group.name, :ensure => :directory
1502
+ # Make sure we can create it
1503
+ assert_apply(subdir)
1504
+ assert(FileTest.directory?(subpath), "File did not get created")
1505
+ # And that it's owned correctly
1506
+ assert_equal(user.uid, File.stat(subpath).uid, "File has the wrong owner")
1507
+ assert_equal(group.gid, File.stat(subpath).gid, "File has the wrong group")
1508
+
1509
+ assert_equal("testing", File.read(path), "file has the wrong content")
1510
+ end
1511
+ end
1512
+
1513
+ # #366
1514
+ def test_replace_aliases
1515
+ file = Puppet::Type.newfile :path => tempfile()
1516
+ file[:replace] = :yes
1517
+ assert_equal(:true, file[:replace], ":replace did not alias :true to :yes")
1518
+ file[:replace] = :no
1519
+ assert_equal(:false, file[:replace], ":replace did not alias :false to :no")
1520
+ end
1521
+
1522
+ # #365 -- make sure generated files also use filebuckets.
1523
+ def test_recursive_filebuckets
1524
+ source = tempfile()
1525
+ dest = tempfile()
1526
+ s1 = File.join(source, "1")
1527
+ sdir = File.join(source, "dir")
1528
+ s2 = File.join(sdir, "2")
1529
+ Dir.mkdir(source)
1530
+ Dir.mkdir(sdir)
1531
+ [s1, s2].each { |file| File.open(file, "w") { |f| f.puts "yay: %s" % File.basename(file) } }
1532
+
1533
+ sums = {}
1534
+ [s1, s2].each do |f|
1535
+ sums[File.basename(f)] = Digest::MD5.hexdigest(File.read(f))
1536
+ end
1537
+
1538
+ dfiles = [File.join(dest, "1"), File.join(dest, "dir", "2")]
1539
+
1540
+ bpath = tempfile
1541
+ bucket = Puppet::Type.type(:filebucket).create :name => "rtest", :path => bpath
1542
+ dipper = bucket.bucket
1543
+ dipper = Puppet::Network::Handler.filebucket.new(
1544
+ :Path => bpath
1545
+ )
1546
+ assert(dipper, "did not receive bucket client")
1547
+ file = Puppet::Type.newfile :path => dest, :source => source, :recurse => true, :backup => "rtest"
1548
+
1549
+ assert_apply(file)
1550
+ dfiles.each do |f|
1551
+ assert(FileTest.exists?(f), "destfile %s was not created" % f)
1552
+ end
1553
+
1554
+ # Now modify the source files to make sure things get backed up correctly
1555
+ [s1, s2].each { |sf| File.open(sf, "w") { |f|
1556
+ f.puts "boo: %s" % File.basename(sf)
1557
+ } }
1558
+
1559
+ assert_apply(file)
1560
+ dfiles.each do |f|
1561
+ assert_equal("boo: %s\n" % File.basename(f), File.read(f),
1562
+ "file was not copied correctly")
1563
+ end
1564
+
1565
+ # Make sure we didn't just copy the files over to backup locations
1566
+ dfiles.each do |f|
1567
+ assert(! FileTest.exists?(f + "rtest"),
1568
+ "file %s was copied for backup instead of bucketed" % File.basename(f))
1569
+ end
1570
+
1571
+ # Now make sure we can get the source sums from the bucket
1572
+ sums.each do |f, sum|
1573
+ result = nil
1574
+ assert_nothing_raised do
1575
+ result = dipper.getfile(sum)
1576
+ end
1577
+ assert(result, "file %s was not backed to filebucket" % f)
1578
+ assert_equal("yay: %s\n" % f, result, "file backup was not correct")
1579
+ end
1580
+ end
1581
+
1582
+ def test_backup
1583
+ path = tempfile()
1584
+ file = Puppet::Type.newfile :path => path, :content => "yay"
1585
+
1586
+ [false, :false, "false"].each do |val|
1587
+ assert_nothing_raised do
1588
+ file[:backup] = val
1589
+ end
1590
+ assert_equal(false, file[:backup], "%s did not translate" % val.inspect)
1591
+ end
1592
+ [true, :true, "true", ".puppet-bak"].each do |val|
1593
+ assert_nothing_raised do
1594
+ file[:backup] = val
1595
+ end
1596
+ assert_equal(".puppet-bak", file[:backup], "%s did not translate" % val.inspect)
1597
+ end
1598
+
1599
+ # Now try a non-bucket string
1600
+ assert_nothing_raised do
1601
+ file[:backup] = ".bak"
1602
+ end
1603
+ assert_equal(".bak", file[:backup], ".bak did not translate")
1604
+
1605
+ # Now try a non-existent bucket
1606
+ assert_nothing_raised do
1607
+ file[:backup] = "main"
1608
+ end
1609
+ assert_equal("main", file[:backup], "bucket name was not retained")
1610
+ assert_equal("main", file.bucket, "file's bucket was not set")
1611
+
1612
+ # And then an existing bucket
1613
+ obj = Puppet::Type.type(:filebucket).create :name => "testing"
1614
+ bucket = obj.bucket
1615
+
1616
+ assert_nothing_raised do
1617
+ file[:backup] = "testing"
1618
+ end
1619
+ assert_equal("testing", file[:backup], "backup value was reset")
1620
+ assert_equal(obj.bucket, file.bucket, "file's bucket was not set")
1621
+ end
1622
+
1623
+ def test_pathbuilder
1624
+ dir = tempfile()
1625
+ Dir.mkdir(dir)
1626
+ file = File.join(dir, "file")
1627
+ File.open(file, "w") { |f| f.puts "" }
1628
+ obj = Puppet::Type.newfile :path => dir, :recurse => true, :mode => 0755
1629
+
1630
+ assert_equal("/%s" % obj.ref, obj.path)
1631
+
1632
+ list = obj.eval_generate
1633
+ fileobj = obj.class[file]
1634
+ assert(fileobj, "did not generate file object")
1635
+ assert_equal("/%s" % fileobj.ref, fileobj.path, "did not generate correct subfile path")
1636
+ end
1637
+
1638
+ # Testing #403
1639
+ def test_removal_with_content_set
1640
+ path = tempfile()
1641
+ File.open(path, "w") { |f| f.puts "yay" }
1642
+ file = Puppet::Type.newfile(:name => path, :ensure => :absent, :content => "foo")
1643
+
1644
+ assert_apply(file)
1645
+ assert(! FileTest.exists?(path), "File was not removed")
1646
+ end
1647
+
1648
+ # Testing #434
1649
+ def test_stripping_extra_slashes_during_lookup
1650
+ file = Puppet::Type.newfile(:path => "/one/two")
1651
+ %w{/one/two/ /one/two /one//two //one//two//}.each do |path|
1652
+ assert(Puppet::Type.type(:file)[path], "could not look up file via path %s" % path)
1653
+ end
1654
+ end
1655
+
1656
+ # Testing #438
1657
+ def test_creating_properties_conflict
1658
+ file = tempfile()
1659
+ first = tempfile()
1660
+ second = tempfile()
1661
+ params = [:content, :source, :target]
1662
+ params.each do |param|
1663
+ assert_nothing_raised("%s conflicted with ensure" % [param]) do
1664
+ Puppet::Type.newfile(:path => file, param => first, :ensure => :file)
1665
+ end
1666
+ Puppet::Type.type(:file).clear
1667
+ params.each do |other|
1668
+ next if other == param
1669
+ assert_raise(Puppet::Error, "%s and %s did not conflict" % [param, other]) do
1670
+ Puppet::Type.newfile(:path => file, other => first, param => second)
1671
+ end
1672
+ end
1673
+ end
1674
+ end
1675
+
1676
+ # Testing #508
1677
+ if Process.uid == 0
1678
+ def test_files_replace_with_right_attrs
1679
+ source = tempfile()
1680
+ File.open(source, "w") { |f|
1681
+ f.puts "some text"
1682
+ }
1683
+ File.chmod(0755, source)
1684
+ user = nonrootuser
1685
+ group = nonrootgroup
1686
+ path = tempfile()
1687
+ good = {:uid => user.uid, :gid => group.gid, :mode => 0640}
1688
+
1689
+ run = Proc.new do |obj, msg|
1690
+ assert_apply(obj)
1691
+ stat = File.stat(obj[:path])
1692
+ good.each do |should, sval|
1693
+ if should == :mode
1694
+ current = filemode(obj[:path])
1695
+ else
1696
+ current = stat.send(should)
1697
+ end
1698
+ assert_equal(sval, current,
1699
+ "Attr %s was not correct %s" % [should, msg])
1700
+ end
1701
+ end
1702
+
1703
+ file = Puppet::Type.newfile(:path => path, :owner => user.name,
1704
+ :group => group.name, :mode => 0640, :backup => false)
1705
+ {:source => source, :content => "some content"}.each do |attr, value|
1706
+ file[attr] = value
1707
+ # First create the file
1708
+ run.call(file, "upon creation with %s" % attr)
1709
+
1710
+ # Now change something so that we replace the file
1711
+ case attr
1712
+ when :source:
1713
+ File.open(source, "w") { |f| f.puts "some different text" }
1714
+ when :content: file[:content] = "something completely different"
1715
+ else
1716
+ raise "invalid attr %s" % attr
1717
+ end
1718
+
1719
+ # Run it again
1720
+ run.call(file, "after modification with %s" % attr)
1721
+
1722
+ # Now remove the file and the attr
1723
+ file.delete(attr)
1724
+ File.unlink(path)
1725
+ end
1726
+ end
1727
+ end
1728
+
1729
+ # #505
1730
+ def test_numeric_recurse
1731
+ dir = tempfile()
1732
+ subdir = File.join(dir, "subdir")
1733
+ other = File.join(subdir, "deeper")
1734
+ file = File.join(other, "file")
1735
+ [dir, subdir, other].each { |d| Dir.mkdir(d) }
1736
+ File.open(file, "w") { |f| f.puts "yay" }
1737
+ File.chmod(0644, file)
1738
+ obj = Puppet::Type.newfile(:path => dir, :mode => 0750, :recurse => "2")
1739
+
1740
+ children = nil
1741
+ assert_nothing_raised("Failure when recursing") do
1742
+ children = obj.eval_generate
1743
+ end
1744
+ assert(obj.class[subdir], "did not create subdir object")
1745
+ children.each do |c|
1746
+ assert_nothing_raised("Failure when recursing on %s" % c) do
1747
+ others = c.eval_generate
1748
+ end
1749
+ end
1750
+ oobj = obj.class[other]
1751
+ assert(oobj, "did not create other object")
1752
+
1753
+ assert_nothing_raised do
1754
+ assert_nil(oobj.eval_generate, "recursed too far")
1755
+ end
1756
+ end
1757
+
1758
+ # Make sure we default to the "puppet" filebucket, rather than a string
1759
+ def test_backup_defaults_to_bucket
1760
+ path = tempfile
1761
+ file = Puppet::Type.newfile(:path => path, :content => 'some content')
1762
+ file.finish
1763
+
1764
+ assert_instance_of(Puppet::Network::Client::Dipper, file.bucket,
1765
+ "did not default to a filebucket for backups")
1766
+ assert_equal(Puppet::Type.type(:filebucket)["puppet"].bucket, file.bucket,
1767
+ "did not default to the 'puppet' filebucket")
1768
+ end
1769
+
1770
+ # #515 - make sure 'ensure' other than "link" is deleted during recursion
1771
+ def test_ensure_deleted_during_recursion
1772
+ dir = tempfile()
1773
+ Dir.mkdir(dir)
1774
+ file = File.join(dir, "file")
1775
+ File.open(file, "w") { |f| f.puts "asdfasdf" }
1776
+
1777
+ obj = Puppet::Type.newfile(:path => dir, :ensure => :directory,
1778
+ :recurse => true)
1779
+
1780
+ children = nil
1781
+ assert_nothing_raised do
1782
+ children = obj.eval_generate
1783
+ end
1784
+ fobj = obj.class[file]
1785
+ assert(fobj, "did not create file object")
1786
+ assert(fobj.should(:ensure) != :directory, "ensure was passed to child")
1787
+ end
1788
+
1789
+ # #567
1790
+ def test_missing_files_are_in_sync
1791
+ file = tempfile
1792
+ obj = Puppet::Type.newfile(:path => file, :mode => 0755)
1793
+
1794
+ changes = obj.evaluate
1795
+ assert(changes.empty?, "Missing file with no ensure resulted in changes")
1796
+ end
1797
+ end
1798
+
1799
+ # $Id: file.rb 2436 2007-04-30 17:29:02Z luke $