puppet 0.13.6 → 0.16.0

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 (149) hide show
  1. data/CHANGELOG +57 -0
  2. data/Rakefile +38 -410
  3. data/bin/puppet +14 -12
  4. data/bin/puppetca +1 -3
  5. data/bin/puppetd +25 -7
  6. data/bin/puppetdoc +161 -104
  7. data/bin/puppetmasterd +4 -4
  8. data/conf/epm.list +8 -0
  9. data/conf/redhat/client.init +6 -1
  10. data/conf/redhat/no-chuser-0.15.1.patch +38 -0
  11. data/conf/redhat/puppet.spec +20 -5
  12. data/conf/redhat/puppetd.conf +1 -1
  13. data/conf/redhat/puppetmasterd.conf +1 -1
  14. data/conf/redhat/server.init +2 -4
  15. data/examples/code/snippets/{casestatement → casestatement.pp} +12 -1
  16. data/examples/code/snippets/selectorvalues.pp +15 -0
  17. data/examples/code/snippets/singleselector.pp +22 -0
  18. data/examples/code/snippets/tag.pp +9 -0
  19. data/ext/module_puppet +1 -1
  20. data/install.rb +303 -303
  21. data/lib/puppet.rb +7 -9
  22. data/lib/puppet/client.rb +18 -5
  23. data/lib/puppet/client/dipper.rb +12 -10
  24. data/lib/puppet/client/master.rb +113 -41
  25. data/lib/puppet/client/pelement.rb +20 -0
  26. data/lib/puppet/config.rb +113 -6
  27. data/lib/puppet/element.rb +1 -3
  28. data/lib/puppet/event.rb +12 -23
  29. data/lib/puppet/filetype.rb +93 -5
  30. data/lib/puppet/inifile.rb +201 -0
  31. data/lib/puppet/log.rb +18 -6
  32. data/lib/puppet/parameter.rb +80 -29
  33. data/lib/puppet/parser/ast.rb +6 -4
  34. data/lib/puppet/parser/ast/caseopt.rb +13 -4
  35. data/lib/puppet/parser/ast/casestatement.rb +2 -2
  36. data/lib/puppet/parser/ast/component.rb +4 -14
  37. data/lib/puppet/parser/ast/hostclass.rb +1 -1
  38. data/lib/puppet/parser/ast/leaf.rb +12 -0
  39. data/lib/puppet/parser/ast/node.rb +4 -4
  40. data/lib/puppet/parser/ast/objectdef.rb +5 -51
  41. data/lib/puppet/parser/ast/selector.rb +2 -0
  42. data/lib/puppet/parser/ast/tag.rb +26 -0
  43. data/lib/puppet/parser/interpreter.rb +89 -74
  44. data/lib/puppet/parser/lexer.rb +4 -3
  45. data/lib/puppet/parser/parser.rb +440 -378
  46. data/lib/puppet/parser/scope.rb +844 -887
  47. data/lib/puppet/server.rb +12 -1
  48. data/lib/puppet/server/authconfig.rb +166 -0
  49. data/lib/puppet/server/authstore.rb +8 -6
  50. data/lib/puppet/server/ca.rb +23 -26
  51. data/lib/puppet/server/filebucket.rb +24 -23
  52. data/lib/puppet/server/fileserver.rb +116 -47
  53. data/lib/puppet/server/master.rb +58 -19
  54. data/lib/puppet/server/pelement.rb +176 -0
  55. data/lib/puppet/server/rights.rb +78 -0
  56. data/lib/puppet/server/servlet.rb +19 -6
  57. data/lib/puppet/sslcertificates.rb +4 -2
  58. data/lib/puppet/sslcertificates/ca.rb +66 -34
  59. data/lib/puppet/storage.rb +20 -26
  60. data/lib/puppet/transaction.rb +49 -92
  61. data/lib/puppet/type.rb +142 -35
  62. data/lib/puppet/type/cron.rb +29 -14
  63. data/lib/puppet/type/exec.rb +92 -35
  64. data/lib/puppet/type/group.rb +29 -11
  65. data/lib/puppet/type/nameservice.rb +50 -1
  66. data/lib/puppet/type/nameservice/netinfo.rb +68 -1
  67. data/lib/puppet/type/nameservice/objectadd.rb +1 -0
  68. data/lib/puppet/type/package.rb +150 -109
  69. data/lib/puppet/type/package/apple.rb +27 -0
  70. data/lib/puppet/type/package/apt.rb +1 -0
  71. data/lib/puppet/type/package/darwinport.rb +97 -0
  72. data/lib/puppet/type/package/dpkg.rb +10 -2
  73. data/lib/puppet/type/package/freebsd.rb +19 -0
  74. data/lib/puppet/type/package/{bsd.rb → openbsd.rb} +36 -7
  75. data/lib/puppet/type/package/ports.rb +98 -0
  76. data/lib/puppet/type/package/rpm.rb +43 -7
  77. data/lib/puppet/type/package/sun.rb +53 -36
  78. data/lib/puppet/type/package/yum.rb +5 -16
  79. data/lib/puppet/type/parsedtype.rb +41 -29
  80. data/lib/puppet/type/parsedtype/host.rb +13 -5
  81. data/lib/puppet/type/parsedtype/mount.rb +250 -0
  82. data/lib/puppet/type/parsedtype/port.rb +8 -6
  83. data/lib/puppet/type/pfile.rb +284 -30
  84. data/lib/puppet/type/pfile/checksum.rb +96 -68
  85. data/lib/puppet/type/pfile/content.rb +16 -13
  86. data/lib/puppet/type/pfile/ensure.rb +64 -126
  87. data/lib/puppet/type/pfile/group.rb +12 -5
  88. data/lib/puppet/type/pfile/mode.rb +16 -4
  89. data/lib/puppet/type/pfile/source.rb +47 -73
  90. data/lib/puppet/type/pfile/target.rb +81 -0
  91. data/lib/puppet/type/pfile/uid.rb +10 -3
  92. data/lib/puppet/type/pfilebucket.rb +12 -3
  93. data/lib/puppet/type/schedule.rb +5 -1
  94. data/lib/puppet/type/service.rb +138 -66
  95. data/lib/puppet/type/service/debian.rb +9 -3
  96. data/lib/puppet/type/service/init.rb +51 -56
  97. data/lib/puppet/type/service/smf.rb +16 -6
  98. data/lib/puppet/type/state.rb +71 -32
  99. data/lib/puppet/type/symlink.rb +12 -7
  100. data/lib/puppet/type/tidy.rb +5 -1
  101. data/lib/puppet/type/user.rb +116 -20
  102. data/lib/puppet/type/yumrepo.rb +314 -0
  103. data/lib/puppet/util.rb +84 -14
  104. data/test/client/client.rb +41 -18
  105. data/test/client/master.rb +50 -4
  106. data/test/executables/puppetbin.rb +31 -4
  107. data/test/executables/puppetca.rb +18 -2
  108. data/test/language/ast.rb +201 -31
  109. data/test/language/interpreter.rb +8 -2
  110. data/test/{parser → language}/lexer.rb +1 -1
  111. data/test/language/node.rb +84 -0
  112. data/test/{parser → language}/parser.rb +1 -1
  113. data/test/language/scope.rb +101 -2
  114. data/test/language/snippets.rb +23 -2
  115. data/test/other/config.rb +99 -1
  116. data/test/other/filetype.rb +95 -0
  117. data/test/other/inifile.rb +114 -0
  118. data/test/other/log.rb +3 -2
  119. data/test/other/transactions.rb +55 -10
  120. data/test/puppet/utiltest.rb +25 -1
  121. data/test/puppettest.rb +140 -46
  122. data/test/server/authconfig.rb +56 -0
  123. data/test/server/bucket.rb +32 -18
  124. data/test/server/fileserver.rb +75 -30
  125. data/test/server/master.rb +27 -4
  126. data/test/server/pelement.rb +298 -0
  127. data/test/server/rights.rb +41 -0
  128. data/test/server/server.rb +2 -2
  129. data/test/tagging/tagging.rb +100 -1
  130. data/test/types/basic.rb +3 -3
  131. data/test/types/cron.rb +24 -1
  132. data/test/types/exec.rb +99 -1
  133. data/test/types/file.rb +298 -2
  134. data/test/types/filebucket.rb +4 -15
  135. data/test/types/filesources.rb +43 -14
  136. data/test/types/group.rb +1 -13
  137. data/test/types/mount.rb +277 -0
  138. data/test/types/package.rb +164 -33
  139. data/test/types/parameter.rb +107 -0
  140. data/test/types/port.rb +2 -1
  141. data/test/types/service.rb +37 -2
  142. data/test/types/state.rb +92 -0
  143. data/test/types/symlink.rb +30 -2
  144. data/test/types/tidy.rb +2 -14
  145. data/test/types/type.rb +35 -1
  146. data/test/types/user.rb +110 -1
  147. data/test/types/yumrepo.rb +95 -0
  148. metadata +316 -290
  149. data/test/types/filetype.rb +0 -160
@@ -0,0 +1,114 @@
1
+ if __FILE__ == $0
2
+ $:.unshift '..'
3
+ $:.unshift '../../lib'
4
+ $puppetbase = "../.."
5
+ end
6
+
7
+ require 'puppet'
8
+ require 'puppet/inifile'
9
+ require 'puppettest'
10
+ require 'test/unit'
11
+
12
+ class TestFileType < Test::Unit::TestCase
13
+ include TestPuppet
14
+
15
+ def setup
16
+ super
17
+ @file = Puppet::IniConfig::File.new
18
+ end
19
+
20
+ def teardown
21
+ @file = nil
22
+ super
23
+ end
24
+
25
+ def test_simple
26
+ fname = mkfile("[main]\nkey1=value1\n# Comment\nkey2=value2")
27
+ assert_nothing_raised {
28
+ @file.read(fname)
29
+ }
30
+ s = get_section('main')
31
+ assert_entries(s, { 'key1' => 'value1', 'key2' => 'value2' })
32
+ @file['main']['key2'] = 'newvalue2'
33
+ @file['main']['key3'] = 'newvalue3'
34
+ text = s.format
35
+ assert_equal("[main]\nkey1=value1\n# Comment\nkey2=newvalue2\nkey3=newvalue3\n",
36
+ s.format)
37
+ end
38
+
39
+ def test_multi
40
+ fmain = mkfile("[main]\nkey1=main.value1\n# Comment\nkey2=main.value2")
41
+ fsub = mkfile("[sub1]\nkey1=sub1 value1\n\n" +
42
+ "[sub2]\nkey1=sub2.value1")
43
+ main_mtime = File::stat(fmain).mtime
44
+ assert_nothing_raised {
45
+ @file.read(fmain)
46
+ @file.read(fsub)
47
+ }
48
+ main = get_section('main')
49
+ assert_entries(main,
50
+ { 'key1' => 'main.value1', 'key2' => 'main.value2' })
51
+ sub1 = get_section('sub1')
52
+ assert_entries(sub1, { 'key1' => 'sub1 value1' })
53
+ sub2 = get_section('sub2')
54
+ assert_entries(sub2, { 'key1' => 'sub2.value1' })
55
+ [main, sub1, sub2].each { |s| assert( !s.dirty? ) }
56
+ sub1['key1'] = 'sub1 newvalue1'
57
+ sub2['key2'] = 'sub2 newvalue2'
58
+ assert(! main.dirty?)
59
+ [sub1, sub2].each { |s| assert( s.dirty? ) }
60
+ @file.store
61
+ [main, sub1, sub2].each { |s| assert( !s.dirty? ) }
62
+ assert( File.exists?(fmain) )
63
+ assert( File.exists?(fsub) )
64
+ assert_equal(main_mtime, File::stat(fmain).mtime)
65
+ subtext = File.read(fsub)
66
+ assert_equal("[sub1]\nkey1=sub1 newvalue1\n\n" +
67
+ "[sub2]\nkey1=sub2.value1\nkey2=sub2 newvalue2\n",
68
+ subtext)
69
+ end
70
+
71
+ def test_format_nil
72
+ fname = mkfile("[main]\nkey1=value1\n# Comment\nkey2=value2\n" +
73
+ "# Comment2\n")
74
+ assert_nothing_raised {
75
+ @file.read(fname)
76
+ }
77
+ s = get_section('main')
78
+ s['key2'] = nil
79
+ s['key3'] = nil
80
+ text = s.format
81
+ assert_equal("[main]\nkey1=value1\n# Comment\n# Comment2\n",
82
+ s.format)
83
+ end
84
+
85
+ def test_whitespace
86
+ fname = mkfile("[main]\n key1=v1\nkey2 =v2\n")
87
+ assert_nothing_raised {
88
+ @file.read(fname)
89
+ }
90
+ s = get_section('main')
91
+ assert_equal('v1', s['key1'])
92
+ assert_equal('v2', s['key2'])
93
+ end
94
+
95
+ def assert_entries(section, hash)
96
+ hash.each do |k, v|
97
+ assert_equal(v, section[k],
98
+ "Expected <#{v}> for #{section.name}[#{k}] " +
99
+ "but got <#{section[k]}>")
100
+ end
101
+ end
102
+
103
+ def get_section(name)
104
+ result = @file[name]
105
+ assert_not_nil(result)
106
+ return result
107
+ end
108
+
109
+ def mkfile(content)
110
+ file = tempfile()
111
+ File.open(file, "w") { |f| f.print(content) }
112
+ return file
113
+ end
114
+ end
@@ -9,7 +9,7 @@ require 'puppet'
9
9
  require 'puppettest'
10
10
  require 'test/unit'
11
11
 
12
- # $Id: log.rb 914 2006-02-15 21:04:14Z luke $
12
+ # $Id: log.rb 1120 2006-04-19 23:38:25Z luke $
13
13
 
14
14
  class TestLog < Test::Unit::TestCase
15
15
  include TestPuppet
@@ -37,6 +37,7 @@ class TestLog < Test::Unit::TestCase
37
37
 
38
38
  def mkmsgs(levels)
39
39
  levels.collect { |level|
40
+ next if level == :alert
40
41
  assert_nothing_raised() {
41
42
  Puppet::Log.new(
42
43
  :level => level,
@@ -66,7 +67,7 @@ class TestLog < Test::Unit::TestCase
66
67
  count = of.readlines.length
67
68
  }
68
69
  }
69
- assert(count == levels.length)
70
+ assert(count == levels.length - 1) # skip alert
70
71
  end
71
72
 
72
73
  def test_syslog
@@ -8,7 +8,7 @@ require 'puppet'
8
8
  require 'puppettest'
9
9
  require 'test/unit'
10
10
 
11
- # $Id: transactions.rb 965 2006-03-02 07:30:14Z luke $
11
+ # $Id: transactions.rb 1113 2006-04-17 16:15:33Z luke $
12
12
 
13
13
  class TestTransactions < Test::Unit::TestCase
14
14
  include FileTesting
@@ -33,12 +33,6 @@ class TestTransactions < Test::Unit::TestCase
33
33
  end
34
34
  end
35
35
 
36
- def teardown
37
- stopservices
38
- #print "\n\n" if Puppet[:debug]
39
- super
40
- end
41
-
42
36
  def newfile(hash = {})
43
37
  tmpfile = tempfile()
44
38
  File.open(tmpfile, "w") { |f| f.puts rand(100) }
@@ -60,7 +54,6 @@ class TestTransactions < Test::Unit::TestCase
60
54
  File.chown(nil, firstgr, tmpfile)
61
55
  end
62
56
 
63
- @@tmpfiles.push tmpfile
64
57
  hash[:name] = tmpfile
65
58
  assert_nothing_raised() {
66
59
  return Puppet.type(:file).create(hash)
@@ -74,7 +67,7 @@ class TestTransactions < Test::Unit::TestCase
74
67
  :type => "init",
75
68
  :path => File.join($puppetbase,"examples/root/etc/init.d"),
76
69
  :hasstatus => true,
77
- :check => [:running]
70
+ :check => [:ensure]
78
71
  )
79
72
  }
80
73
  end
@@ -147,7 +140,7 @@ class TestTransactions < Test::Unit::TestCase
147
140
  component = newcomp("service",service)
148
141
 
149
142
  assert_nothing_raised() {
150
- service[:running] = 1
143
+ service[:ensure] = 1
151
144
  }
152
145
  service.retrieve
153
146
  assert(service.insync?, "Service did not start")
@@ -232,4 +225,56 @@ class TestTransactions < Test::Unit::TestCase
232
225
 
233
226
  end
234
227
 
228
+ # Make sure that multiple subscriptions get triggered.
229
+ def test_multisubs
230
+ path = tempfile()
231
+ file1 = tempfile()
232
+ file2 = tempfile()
233
+ file = Puppet.type(:file).create(
234
+ :path => path,
235
+ :ensure => "file"
236
+ )
237
+ exec1 = Puppet.type(:exec).create(
238
+ :path => ENV["PATH"],
239
+ :command => "touch %s" % file1,
240
+ :refreshonly => true,
241
+ :subscribe => [:file, path]
242
+ )
243
+ exec2 = Puppet.type(:exec).create(
244
+ :path => ENV["PATH"],
245
+ :command => "touch %s" % file2,
246
+ :refreshonly => true,
247
+ :subscribe => [:file, path]
248
+ )
249
+
250
+ assert_apply(file, exec1, exec2)
251
+ assert(FileTest.exists?(file1), "File 1 did not get created")
252
+ assert(FileTest.exists?(file2), "File 2 did not get created")
253
+ end
254
+
255
+ # Make sure that a failed trigger doesn't result in other events not
256
+ # getting triggered.
257
+ def test_failedrefreshes
258
+ path = tempfile()
259
+ newfile = tempfile()
260
+ file = Puppet.type(:file).create(
261
+ :path => path,
262
+ :ensure => "file"
263
+ )
264
+ svc = Puppet.type(:service).create(
265
+ :name => "thisservicedoesnotexist",
266
+ :subscribe => [:file, path]
267
+ )
268
+ exec = Puppet.type(:exec).create(
269
+ :path => ENV["PATH"],
270
+ :command => "touch %s" % newfile,
271
+ :logoutput => true,
272
+ :refreshonly => true,
273
+ :subscribe => [:file, path]
274
+ )
275
+
276
+ assert_apply(file, svc, exec)
277
+ assert(FileTest.exists?(path), "File did not get created")
278
+ assert(FileTest.exists?(newfile), "Refresh file did not get created")
279
+ end
235
280
  end
@@ -157,6 +157,30 @@ class TestPuppetUtil < Test::Unit::TestCase
157
157
  assert_equal(oldmask, File.umask, "Umask was not reset")
158
158
  end
159
159
 
160
+ def test_benchmark
161
+ path = tempfile()
162
+ str = "yayness"
163
+ File.open(path, "w") do |f| f.print "yayness" end
164
+
165
+ # First test it with the normal args
166
+ assert_nothing_raised do
167
+ val = Puppet::Util.benchmark(:notice, "Read file") do
168
+ File.read(path)
169
+ end
170
+
171
+ assert_equal(str, val)
172
+ end
173
+
174
+ # Now test it with a passed object
175
+ assert_nothing_raised do
176
+ val = Puppet::Util.benchmark(Puppet, :notice, "Read file") do
177
+ File.read(path)
178
+ end
179
+
180
+ assert_equal(str, val)
181
+ end
182
+ end
183
+
160
184
  unless Process.uid == 0
161
185
  $stderr.puts "Run as root to perform Utility tests"
162
186
  def test_nothing
@@ -267,4 +291,4 @@ class TestPuppetUtil < Test::Unit::TestCase
267
291
  end
268
292
  end
269
293
 
270
- # $Id: utiltest.rb 967 2006-03-02 20:28:45Z luke $
294
+ # $Id: utiltest.rb 1098 2006-04-10 22:13:10Z luke $
@@ -24,6 +24,7 @@ module TestPuppet
24
24
  end
25
25
 
26
26
  def setup
27
+ @memoryatstart = Puppet::Util.memory
27
28
  if defined? @@testcount
28
29
  @@testcount += 1
29
30
  else
@@ -34,6 +35,13 @@ module TestPuppet
34
35
  self.class.to_s + "configdir" + @@testcount.to_s + "/"
35
36
  )
36
37
 
38
+ unless defined? $user and $group
39
+ $user = nonrootuser().uid.to_s
40
+ $group = nonrootgroup().gid.to_s
41
+ end
42
+ Puppet[:user] = $user
43
+ Puppet[:group] = $group
44
+
37
45
  Puppet[:confdir] = @configpath
38
46
  Puppet[:vardir] = @configpath
39
47
 
@@ -44,6 +52,8 @@ module TestPuppet
44
52
  @@tmpfiles = [@configpath, tmpdir()]
45
53
  @@tmppids = []
46
54
 
55
+ @@cleaners = []
56
+
47
57
  if $0 =~ /.+\.rb/ or Puppet[:debug]
48
58
  Puppet::Log.newdestination :console
49
59
  Puppet::Log.level = :debug
@@ -90,14 +100,21 @@ module TestPuppet
90
100
  def stopservices
91
101
  if stype = Puppet::Type.type(:service)
92
102
  stype.each { |service|
93
- service[:running] = false
103
+ service[:ensure] = :stopped
94
104
  service.evaluate
95
105
  }
96
106
  end
97
107
  end
98
108
 
109
+ def cleanup(&block)
110
+ @@cleaners << block
111
+ end
112
+
99
113
  def teardown
100
114
  stopservices
115
+
116
+ @@cleaners.each { |cleaner| cleaner.call() }
117
+
101
118
  @@tmpfiles.each { |file|
102
119
  if FileTest.exists?(file)
103
120
  system("chmod -R 755 %s" % file)
@@ -115,6 +132,14 @@ module TestPuppet
115
132
  Puppet::Storage.clear
116
133
  Puppet.clear
117
134
 
135
+ @memoryatend = Puppet::Util.memory
136
+ diff = @memoryatend - @memoryatstart
137
+
138
+ if diff > 1000
139
+ Puppet.info "%s#%s memory growth (%s to %s): %s" %
140
+ [self.class, @method_name, @memoryatstart, @memoryatend, diff]
141
+ end
142
+
118
143
  # reset all of the logs
119
144
  Puppet::Log.close
120
145
 
@@ -129,23 +154,24 @@ module TestPuppet
129
154
  end
130
155
 
131
156
  def tempfile
132
- if defined? @tmpfilenum
133
- @tmpfilenum += 1
157
+ if defined? @@tmpfilenum
158
+ @@tmpfilenum += 1
134
159
  else
135
- @tmpfilenum = 1
160
+ @@tmpfilenum = 1
136
161
  end
137
- f = File.join(self.tmpdir(), self.class.to_s + "testfile" + @tmpfilenum.to_s)
162
+
163
+ f = File.join(self.tmpdir(), self.class.to_s + "testfile" + @@tmpfilenum.to_s)
138
164
  @@tmpfiles << f
139
165
  return f
140
166
  end
141
167
 
142
168
  def tstdir
143
- if defined? @testdirnum
144
- @testdirnum += 1
169
+ if defined? @@testdirnum
170
+ @@testdirnum += 1
145
171
  else
146
- @testdirnum = 1
172
+ @@testdirnum = 1
147
173
  end
148
- d = File.join(self.tmpdir(), self.class.to_s + "testdir" + @testdirnum.to_s)
174
+ d = File.join(self.tmpdir(), self.class.to_s + "testdir" + @@testdirnum.to_s)
149
175
  @@tmpfiles << d
150
176
  return d
151
177
  end
@@ -285,6 +311,15 @@ module TestPuppet
285
311
 
286
312
  return files
287
313
  end
314
+
315
+ # wrap how to retrieve the masked mode
316
+ def filemode(file)
317
+ File.stat(file).mode & 007777
318
+ end
319
+
320
+ def memory
321
+ Puppet::Util.memory
322
+ end
288
323
  end
289
324
 
290
325
 
@@ -322,7 +357,7 @@ module ServerTest
322
357
  handlers = {
323
358
  :CA => {}, # so that certs autogenerate
324
359
  :Master => {
325
- :File => mktestmanifest(),
360
+ :Manifest => mktestmanifest(),
326
361
  :UseNodes => false
327
362
  },
328
363
  }
@@ -433,6 +468,7 @@ module ExeTest
433
468
  File.unlink(pidfile)
434
469
  end
435
470
 
471
+ return unless running
436
472
  if running or pid
437
473
  runningpid = nil
438
474
  %x{#{ps}}.chomp.split(/\n/).each { |line|
@@ -443,12 +479,6 @@ module ExeTest
443
479
  end
444
480
  }
445
481
 
446
- if running
447
- assert(runningpid, "Process is not running")
448
- assert_equal(pid, runningpid, "PIDs are not equal")
449
- else
450
- return
451
- end
452
482
  end
453
483
 
454
484
  # we default to mandating that it's running, but teardown
@@ -708,28 +738,44 @@ module ParserTesting
708
738
  end
709
739
 
710
740
  def classobj(name, args = {})
711
- unless args.include?(:name)
712
- args[:type] = nameobj(name)
713
- end
714
- unless args.include?(:code)
715
- args[:code] = AST::ASTArray.new(
716
- :file => tempfile(),
717
- :line => rand(100),
718
- :children => [
719
- varobj("%svar" % name, "%svalue" % name),
720
- fileobj("/%s" % name)
721
- ]
722
- )
723
- end
741
+ args[:type] ||= nameobj(name)
742
+ args[:code] ||= AST::ASTArray.new(
743
+ :file => __FILE__,
744
+ :line => __LINE__,
745
+ :children => [
746
+ varobj("%svar" % name, "%svalue" % name),
747
+ fileobj("/%s" % name)
748
+ ]
749
+ )
724
750
  assert_nothing_raised("Could not create class %s" % name) {
725
751
  return AST::ClassDef.new(args)
726
752
  }
727
753
  end
728
754
 
755
+ def tagobj(*names)
756
+ args = {}
757
+ newnames = names.collect do |name|
758
+ if name.is_a? AST
759
+ name
760
+ else
761
+ nameobj(name)
762
+ end
763
+ end
764
+ args[:type] = astarray(*newnames)
765
+ assert_nothing_raised("Could not create tag %s" % names.inspect) {
766
+ return AST::Tag.new(args)
767
+ }
768
+ end
769
+
729
770
  def compobj(name, args = {})
730
771
  args[:file] ||= tempfile()
731
772
  args[:line] ||= rand(100)
732
773
  args[:type] ||= nameobj(name)
774
+ args[:args] ||= AST::ASTArray.new(
775
+ :file => tempfile(),
776
+ :line => rand(100),
777
+ :children => []
778
+ )
733
779
  args[:code] ||= AST::ASTArray.new(
734
780
  :file => tempfile(),
735
781
  :line => rand(100),
@@ -765,7 +811,17 @@ module ParserTesting
765
811
  }
766
812
  end
767
813
 
768
- def nodeobj(name)
814
+ def typeobj(name)
815
+ assert_nothing_raised("Could not create type %s" % name) {
816
+ return AST::Type.new(
817
+ :file => tempfile(),
818
+ :line => rand(100),
819
+ :value => name
820
+ )
821
+ }
822
+ end
823
+
824
+ def nodedef(name)
769
825
  assert_nothing_raised("Could not create node %s" % name) {
770
826
  return AST::NodeDef.new(
771
827
  :file => tempfile(),
@@ -824,6 +880,16 @@ module ParserTesting
824
880
  }
825
881
  end
826
882
 
883
+ def varref(name)
884
+ assert_nothing_raised("Could not create %s variable" % name) {
885
+ return AST::Variable.new(
886
+ :file => __FILE__,
887
+ :line => __LINE__,
888
+ :value => name
889
+ )
890
+ }
891
+ end
892
+
827
893
  def argobj(name, value)
828
894
  assert_nothing_raised("Could not create %s compargument" % name) {
829
895
  return AST::CompArgument.new(
@@ -831,6 +897,32 @@ module ParserTesting
831
897
  )
832
898
  }
833
899
  end
900
+
901
+ def defaultobj(type, params)
902
+ pary = []
903
+ params.each { |p,v|
904
+ pary << AST::ObjectParam.new(
905
+ :file => __FILE__,
906
+ :line => __LINE__,
907
+ :param => nameobj(p),
908
+ :value => stringobj(v)
909
+ )
910
+ }
911
+ past = AST::ASTArray.new(
912
+ :file => __FILE__,
913
+ :line => __LINE__,
914
+ :children => pary
915
+ )
916
+
917
+ assert_nothing_raised("Could not create defaults for %s" % type) {
918
+ return AST::TypeDefaults.new(
919
+ :file => __FILE__,
920
+ :line => __LINE__,
921
+ :type => typeobj(type),
922
+ :params => past
923
+ )
924
+ }
925
+ end
834
926
  end
835
927
 
836
928
  class PuppetTestSuite
@@ -853,24 +945,26 @@ class PuppetTestSuite
853
945
 
854
946
  def initialize(name)
855
947
  path = File.join(self.class.basedir, name)
856
- unless FileTest.directory?(path)
857
- puts "TestSuites are directories containing test cases"
948
+ if FileTest.directory?(path)
949
+ # load each of the files
950
+ Dir.entries(path).collect { |file|
951
+ File.join(path,file)
952
+ }.find_all { |file|
953
+ FileTest.file?(file) and file =~ /\.rb$/
954
+ }.sort { |a,b|
955
+ # in the order they were modified, so the last modified files
956
+ # are loaded and thus displayed last
957
+ File.stat(b) <=> File.stat(a)
958
+ }.each { |file|
959
+ require file
960
+ }
961
+ elsif FileTest.file?(path) && path =~ /\.rb$/
962
+ require path
963
+ else
964
+ puts "TestSuites are directories or files containing test cases"
858
965
  puts "no such directory: %s" % path
859
966
  exit(65)
860
967
  end
861
-
862
- # load each of the files
863
- Dir.entries(path).collect { |file|
864
- File.join(path,file)
865
- }.find_all { |file|
866
- FileTest.file?(file) and file =~ /\.rb$/
867
- }.sort { |a,b|
868
- # in the order they were modified, so the last modified files
869
- # are loaded and thus displayed last
870
- File.stat(b) <=> File.stat(a)
871
- }.each { |file|
872
- require file
873
- }
874
968
  end
875
969
  end
876
970
 
@@ -901,4 +995,4 @@ def failers
901
995
  }
902
996
  end
903
997
 
904
- # $Id: puppettest.rb 967 2006-03-02 20:28:45Z luke $
998
+ # $Id: puppettest.rb 1113 2006-04-17 16:15:33Z luke $