puppet 2.7.6 → 2.7.8

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 (206) hide show
  1. data/CHANGELOG +168 -0
  2. data/conf/auth.conf +5 -4
  3. data/conf/redhat/puppet.spec +16 -1
  4. data/conf/solaris/pkginfo +2 -2
  5. data/conf/suse/puppet.spec +9 -3
  6. data/ext/upload_facts.rb +120 -0
  7. data/install.rb +11 -16
  8. data/lib/puppet.rb +1 -1
  9. data/lib/puppet/application/agent.rb +0 -3
  10. data/lib/puppet/application/apply.rb +0 -3
  11. data/lib/puppet/application/queue.rb +21 -1
  12. data/lib/puppet/defaults.rb +6 -4
  13. data/lib/puppet/face/file/store.rb +1 -1
  14. data/lib/puppet/feature/base.rb +2 -1
  15. data/lib/puppet/file_bucket/dipper.rb +3 -2
  16. data/lib/puppet/file_serving/content.rb +1 -1
  17. data/lib/puppet/file_serving/metadata.rb +5 -2
  18. data/lib/puppet/indirector/facts/inventory_service.rb +20 -0
  19. data/lib/puppet/indirector/file_bucket_file/file.rb +3 -2
  20. data/lib/puppet/indirector/report/processor.rb +1 -1
  21. data/lib/puppet/network/handler/filebucket.rb +2 -0
  22. data/lib/puppet/network/handler/fileserver.rb +1 -1
  23. data/lib/puppet/network/handler/master.rb +1 -0
  24. data/lib/puppet/network/handler/report.rb +2 -0
  25. data/lib/puppet/network/handler/runner.rb +1 -0
  26. data/lib/puppet/network/handler/status.rb +2 -0
  27. data/lib/puppet/network/http/mongrel/rest.rb +8 -1
  28. data/lib/puppet/network/http_server.rb +3 -0
  29. data/lib/puppet/network/http_server/mongrel.rb +129 -0
  30. data/lib/puppet/network/rest_authconfig.rb +12 -4
  31. data/lib/puppet/parameter.rb +18 -0
  32. data/lib/puppet/parser/compiler.rb +1 -1
  33. data/lib/puppet/parser/grammar.ra +1 -1
  34. data/lib/puppet/parser/parser.rb +360 -350
  35. data/lib/puppet/property.rb +3 -3
  36. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  37. data/lib/puppet/provider/exec/windows.rb +6 -7
  38. data/lib/puppet/provider/file/windows.rb +9 -2
  39. data/lib/puppet/provider/group/aix.rb +8 -8
  40. data/lib/puppet/provider/group/groupadd.rb +1 -3
  41. data/lib/puppet/provider/group/ldap.rb +8 -10
  42. data/lib/puppet/provider/group/windows_adsi.rb +8 -2
  43. data/lib/puppet/provider/package/aix.rb +1 -1
  44. data/lib/puppet/provider/package/macports.rb +3 -3
  45. data/lib/puppet/provider/package/msi.rb +12 -5
  46. data/lib/puppet/provider/package/nim.rb +1 -1
  47. data/lib/puppet/provider/package/pkgdmg.rb +3 -3
  48. data/lib/puppet/provider/package/ports.rb +1 -1
  49. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +560 -0
  50. data/lib/puppet/provider/service/base.rb +2 -2
  51. data/lib/puppet/provider/service/bsd.rb +4 -3
  52. data/lib/puppet/provider/service/daemontools.rb +25 -25
  53. data/lib/puppet/provider/service/debian.rb +6 -4
  54. data/lib/puppet/provider/service/freebsd.rb +1 -1
  55. data/lib/puppet/provider/service/gentoo.rb +4 -3
  56. data/lib/puppet/provider/service/init.rb +3 -8
  57. data/lib/puppet/provider/service/launchd.rb +129 -96
  58. data/lib/puppet/provider/service/redhat.rb +2 -3
  59. data/lib/puppet/provider/service/runit.rb +20 -20
  60. data/lib/puppet/provider/service/smf.rb +8 -7
  61. data/lib/puppet/provider/service/src.rb +5 -6
  62. data/lib/puppet/provider/service/systemd.rb +1 -1
  63. data/lib/puppet/provider/service/upstart.rb +3 -5
  64. data/lib/puppet/provider/service/windows.rb +7 -7
  65. data/lib/puppet/provider/sshkey/parsed.rb +2 -3
  66. data/lib/puppet/provider/user/aix.rb +21 -21
  67. data/lib/puppet/provider/user/hpux.rb +3 -1
  68. data/lib/puppet/provider/user/ldap.rb +7 -7
  69. data/lib/puppet/provider/user/user_role_add.rb +10 -6
  70. data/lib/puppet/provider/user/useradd.rb +3 -1
  71. data/lib/puppet/provider/user/windows_adsi.rb +4 -3
  72. data/lib/puppet/rb_tree_map.rb +388 -0
  73. data/lib/puppet/reference/configuration.rb +7 -7
  74. data/lib/puppet/reference/indirection.rb +5 -6
  75. data/lib/puppet/reference/metaparameter.rb +3 -1
  76. data/lib/puppet/reference/network.rb +8 -8
  77. data/lib/puppet/reference/providers.rb +17 -21
  78. data/lib/puppet/reference/type.rb +12 -9
  79. data/lib/puppet/resource.rb +2 -5
  80. data/lib/puppet/resource/catalog.rb +1 -1
  81. data/lib/puppet/ssl/certificate_request.rb +70 -0
  82. data/lib/puppet/ssl/host.rb +6 -0
  83. data/lib/puppet/transaction.rb +158 -55
  84. data/lib/puppet/transaction/event_manager.rb +1 -1
  85. data/lib/puppet/type.rb +60 -30
  86. data/lib/puppet/type/augeas.rb +83 -49
  87. data/lib/puppet/type/computer.rb +1 -1
  88. data/lib/puppet/type/cron.rb +11 -11
  89. data/lib/puppet/type/exec.rb +28 -21
  90. data/lib/puppet/type/file.rb +17 -7
  91. data/lib/puppet/type/file/content.rb +2 -2
  92. data/lib/puppet/type/file/ensure.rb +15 -12
  93. data/lib/puppet/type/file/mode.rb +30 -5
  94. data/lib/puppet/type/file/source.rb +11 -10
  95. data/lib/puppet/type/file/target.rb +2 -2
  96. data/lib/puppet/type/filebucket.rb +1 -1
  97. data/lib/puppet/type/group.rb +4 -5
  98. data/lib/puppet/type/host.rb +1 -1
  99. data/lib/puppet/type/interface.rb +13 -10
  100. data/lib/puppet/type/k5login.rb +6 -6
  101. data/lib/puppet/type/macauthorization.rb +37 -36
  102. data/lib/puppet/type/maillist.rb +2 -2
  103. data/lib/puppet/type/mcx.rb +6 -6
  104. data/lib/puppet/type/mount.rb +3 -2
  105. data/lib/puppet/type/notify.rb +1 -1
  106. data/lib/puppet/type/package.rb +24 -23
  107. data/lib/puppet/type/router.rb +4 -1
  108. data/lib/puppet/type/schedule.rb +52 -44
  109. data/lib/puppet/type/scheduled_task.rb +222 -0
  110. data/lib/puppet/type/selmodule.rb +10 -6
  111. data/lib/puppet/type/service.rb +11 -11
  112. data/lib/puppet/type/ssh_authorized_key.rb +2 -5
  113. data/lib/puppet/type/sshkey.rb +1 -1
  114. data/lib/puppet/type/stage.rb +1 -1
  115. data/lib/puppet/type/tidy.rb +10 -8
  116. data/lib/puppet/type/user.rb +61 -53
  117. data/lib/puppet/type/vlan.rb +4 -4
  118. data/lib/puppet/type/whit.rb +6 -2
  119. data/lib/puppet/type/yumrepo.rb +33 -31
  120. data/lib/puppet/type/zfs.rb +34 -32
  121. data/lib/puppet/type/zone.rb +21 -19
  122. data/lib/puppet/type/zpool.rb +3 -3
  123. data/lib/puppet/util.rb +24 -6
  124. data/lib/puppet/util/adsi.rb +12 -7
  125. data/lib/puppet/util/checksums.rb +1 -1
  126. data/lib/puppet/util/diff.rb +1 -1
  127. data/lib/puppet/util/nagios_maker.rb +2 -2
  128. data/lib/puppet/util/reference.rb +16 -17
  129. data/lib/puppet/util/settings/file_setting.rb +14 -2
  130. data/lib/puppet/util/windows/security.rb +96 -32
  131. data/spec/integration/file_serving/terminus_helper_spec.rb +1 -1
  132. data/spec/integration/indirector/direct_file_server_spec.rb +9 -15
  133. data/spec/integration/indirector/file_content/file_server_spec.rb +1 -1
  134. data/spec/integration/indirector/file_metadata/file_server_spec.rb +1 -1
  135. data/spec/integration/provider/package_spec.rb +4 -0
  136. data/spec/integration/provider/service/init_spec.rb +8 -2
  137. data/spec/integration/reference/providers_spec.rb +1 -1
  138. data/spec/integration/ssl/certificate_request_spec.rb +1 -2
  139. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -2
  140. data/spec/integration/ssl/host_spec.rb +1 -2
  141. data/spec/integration/transaction_spec.rb +25 -17
  142. data/spec/integration/type/exec_spec.rb +77 -0
  143. data/spec/integration/type/file_spec.rb +322 -2
  144. data/spec/integration/util/windows/security_spec.rb +393 -230
  145. data/spec/integration/util_spec.rb +16 -0
  146. data/spec/lib/puppet_spec/files.rb +3 -7
  147. data/spec/unit/application/apply_spec.rb +0 -9
  148. data/spec/unit/application/inspect_spec.rb +1 -0
  149. data/spec/unit/configurer/downloader_spec.rb +3 -3
  150. data/spec/unit/face/certificate_spec.rb +6 -2
  151. data/spec/unit/file_bucket/dipper_spec.rb +67 -10
  152. data/spec/unit/file_bucket/file_spec.rb +22 -28
  153. data/spec/unit/file_serving/content_spec.rb +1 -1
  154. data/spec/unit/file_serving/metadata_spec.rb +30 -3
  155. data/spec/unit/indirector/facts/inventory_service_spec.rb +22 -0
  156. data/spec/unit/indirector/file_bucket_file/file_spec.rb +21 -24
  157. data/spec/unit/indirector/node/store_configs_spec.rb +1 -0
  158. data/spec/unit/indirector/resource/ral_spec.rb +1 -1
  159. data/spec/unit/indirector/resource_type/parser_spec.rb +2 -2
  160. data/spec/unit/indirector/rest_spec.rb +1 -1
  161. data/spec/unit/network/handler/ca_spec.rb +1 -1
  162. data/spec/unit/network/http/mongrel/rest_spec.rb +54 -25
  163. data/spec/unit/parameter_spec.rb +36 -0
  164. data/spec/unit/parser/parser_spec.rb +4 -0
  165. data/spec/unit/property_spec.rb +2 -2
  166. data/spec/unit/provider/exec/windows_spec.rb +2 -8
  167. data/spec/unit/provider/file/posix_spec.rb +6 -0
  168. data/spec/unit/provider/file/windows_spec.rb +18 -0
  169. data/spec/unit/provider/group/windows_adsi_spec.rb +22 -6
  170. data/spec/unit/provider/mount/parsed_spec.rb +1 -1
  171. data/spec/unit/provider/package/msi_spec.rb +2 -2
  172. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +1571 -0
  173. data/spec/unit/provider/service/launchd_spec.rb +143 -130
  174. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +5 -0
  175. data/spec/unit/provider/user/user_role_add_spec.rb +39 -9
  176. data/spec/unit/provider/user/useradd_spec.rb +1 -1
  177. data/spec/unit/provider/user/windows_adsi_spec.rb +8 -1
  178. data/spec/unit/rb_tree_map_spec.rb +572 -0
  179. data/spec/unit/resource/catalog_spec.rb +1 -1
  180. data/spec/unit/simple_graph_spec.rb +9 -9
  181. data/spec/unit/ssl/host_spec.rb +60 -12
  182. data/spec/unit/transaction/report_spec.rb +3 -3
  183. data/spec/unit/transaction_spec.rb +394 -11
  184. data/spec/unit/type/exec_spec.rb +35 -15
  185. data/spec/unit/type/file/content_spec.rb +11 -10
  186. data/spec/unit/type/file/mode_spec.rb +73 -19
  187. data/spec/unit/type/file/source_spec.rb +1 -1
  188. data/spec/unit/type/file_spec.rb +15 -0
  189. data/spec/unit/type/group_spec.rb +1 -1
  190. data/spec/unit/type/mount_spec.rb +5 -5
  191. data/spec/unit/type/resources_spec.rb +3 -3
  192. data/spec/unit/type/scheduled_task_spec.rb +102 -0
  193. data/spec/unit/type/ssh_authorized_key_spec.rb +2 -3
  194. data/spec/unit/type/user_spec.rb +2 -1
  195. data/spec/unit/type_spec.rb +48 -4
  196. data/spec/unit/util/adsi_spec.rb +18 -7
  197. data/spec/unit/util/checksums_spec.rb +20 -2
  198. data/spec/unit/util/execution_stub_spec.rb +10 -5
  199. data/spec/unit/util/logging_spec.rb +6 -6
  200. data/spec/unit/util/rdoc/parser_spec.rb +1 -1
  201. data/spec/unit/util/reference_spec.rb +29 -0
  202. data/spec/unit/util/settings/file_setting_spec.rb +8 -2
  203. data/spec/unit/util_spec.rb +115 -0
  204. data/test/other/transactions.rb +5 -11
  205. data/test/ral/type/exec.rb +1 -1
  206. metadata +24 -11
@@ -0,0 +1,572 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'spec_helper'
4
+
5
+ require 'puppet/rb_tree_map'
6
+
7
+ describe Puppet::RbTreeMap do
8
+ describe "#push" do
9
+ it "should allow a new element to be added" do
10
+ subject[5] = 'foo'
11
+ subject.size.should == 1
12
+
13
+ subject[5].should == 'foo'
14
+ end
15
+
16
+ it "should replace the old value if the key is in tree already" do
17
+ subject[0] = 10
18
+ subject[0] = 20
19
+
20
+ subject[0].should == 20
21
+ subject.size.should == 1
22
+ end
23
+
24
+ it "should be able to add a large number of elements" do
25
+ (1..1000).each {|i| subject[i] = i.to_s}
26
+
27
+ subject.size.should == 1000
28
+ end
29
+
30
+ it "should create a root node if the tree was empty" do
31
+ subject.instance_variable_get(:@root).should be_nil
32
+
33
+ subject[5] = 'foo'
34
+
35
+ subject.instance_variable_get(:@root).should be_a(Puppet::RbTreeMap::Node)
36
+ end
37
+ end
38
+
39
+ describe "#size" do
40
+ it "should be 0 for en empty tree" do
41
+ subject.size.should == 0
42
+ end
43
+
44
+ it "should correctly report the size for a non-empty tree" do
45
+ (1..10).each {|i| subject[i] = i.to_s}
46
+
47
+ subject.size.should == 10
48
+ end
49
+ end
50
+
51
+ describe "#has_key?" do
52
+ it "should be true if the tree contains the key" do
53
+ subject[1] = 2
54
+
55
+ subject.should be_has_key(1)
56
+ end
57
+
58
+ it "should be true if the tree contains the key and its value is nil" do
59
+ subject[0] = nil
60
+
61
+ subject.should be_has_key(0)
62
+ end
63
+
64
+ it "should be false if the tree does not contain the key" do
65
+ subject[1] = 2
66
+
67
+ subject.should_not be_has_key(2)
68
+ end
69
+
70
+ it "should be false if the tree is empty" do
71
+ subject.should_not be_has_key(5)
72
+ end
73
+ end
74
+
75
+ describe "#get" do
76
+ it "should return the value at the key" do
77
+ subject[1] = 2
78
+ subject[3] = 4
79
+
80
+ subject.get(1).should == 2
81
+ subject.get(3).should == 4
82
+ end
83
+
84
+ it "should return nil if the tree is empty" do
85
+ subject[1].should be_nil
86
+ end
87
+
88
+ it "should return nil if the key is not in the tree" do
89
+ subject[1] = 2
90
+
91
+ subject[3].should be_nil
92
+ end
93
+
94
+ it "should return nil if the value at the key is nil" do
95
+ subject[1] = nil
96
+
97
+ subject[1].should be_nil
98
+ end
99
+ end
100
+
101
+ describe "#min_key" do
102
+ it "should return the smallest key in the tree" do
103
+ [4,8,12,3,6,2,-4,7].each do |i|
104
+ subject[i] = i.to_s
105
+ end
106
+
107
+ subject.min_key.should == -4
108
+ end
109
+
110
+ it "should return nil if the tree is empty" do
111
+ subject.min_key.should be_nil
112
+ end
113
+ end
114
+
115
+ describe "#max_key" do
116
+ it "should return the largest key in the tree" do
117
+ [4,8,12,3,6,2,-4,7].each do |i|
118
+ subject[i] = i.to_s
119
+ end
120
+
121
+ subject.max_key.should == 12
122
+ end
123
+
124
+ it "should return nil if the tree is empty" do
125
+ subject.max_key.should be_nil
126
+ end
127
+ end
128
+
129
+ describe "#delete" do
130
+ before :each do
131
+ subject[1] = '1'
132
+ subject[0] = '0'
133
+ subject[2] = '2'
134
+ end
135
+
136
+ it "should return the value at the key deleted" do
137
+ subject.delete(0).should == '0'
138
+ subject.delete(1).should == '1'
139
+ subject.delete(2).should == '2'
140
+ subject.size.should == 0
141
+ end
142
+
143
+ it "should be able to delete the last node" do
144
+ tree = described_class.new
145
+ tree[1] = '1'
146
+
147
+ tree.delete(1).should == '1'
148
+ tree.should be_empty
149
+ end
150
+
151
+ it "should be able to delete the root node" do
152
+ subject.delete(1).should == '1'
153
+
154
+ subject.size.should == 2
155
+
156
+ subject.to_hash.should == {
157
+ :node => {
158
+ :key => 2,
159
+ :value => '2',
160
+ :color => :black,
161
+ },
162
+ :left => {
163
+ :node => {
164
+ :key => 0,
165
+ :value => '0',
166
+ :color => :red,
167
+ }
168
+ }
169
+ }
170
+ end
171
+
172
+ it "should be able to delete the left child" do
173
+ subject.delete(0).should == '0'
174
+
175
+ subject.size.should == 2
176
+
177
+ subject.to_hash.should == {
178
+ :node => {
179
+ :key => 2,
180
+ :value => '2',
181
+ :color => :black,
182
+ },
183
+ :left => {
184
+ :node => {
185
+ :key => 1,
186
+ :value => '1',
187
+ :color => :red,
188
+ }
189
+ }
190
+ }
191
+ end
192
+
193
+ it "should be able to delete the right child" do
194
+ subject.delete(2).should == '2'
195
+
196
+ subject.size.should == 2
197
+
198
+ subject.to_hash.should == {
199
+ :node => {
200
+ :key => 1,
201
+ :value => '1',
202
+ :color => :black,
203
+ },
204
+ :left => {
205
+ :node => {
206
+ :key => 0,
207
+ :value => '0',
208
+ :color => :red,
209
+ }
210
+ }
211
+ }
212
+ end
213
+
214
+ it "should be able to delete the left child if it is a subtree" do
215
+ (3..6).each {|i| subject[i] = i.to_s}
216
+
217
+ subject.delete(1).should == '1'
218
+
219
+ subject.to_hash.should == {
220
+ :node => {
221
+ :key => 5,
222
+ :value => '5',
223
+ :color => :black,
224
+ },
225
+ :left => {
226
+ :node => {
227
+ :key => 3,
228
+ :value => '3',
229
+ :color => :red,
230
+ },
231
+ :left => {
232
+ :node => {
233
+ :key => 2,
234
+ :value => '2',
235
+ :color => :black,
236
+ },
237
+ :left => {
238
+ :node => {
239
+ :key => 0,
240
+ :value => '0',
241
+ :color => :red,
242
+ },
243
+ },
244
+ },
245
+ :right => {
246
+ :node => {
247
+ :key => 4,
248
+ :value => '4',
249
+ :color => :black,
250
+ },
251
+ },
252
+ },
253
+ :right => {
254
+ :node => {
255
+ :key => 6,
256
+ :value => '6',
257
+ :color => :black,
258
+ },
259
+ },
260
+ }
261
+ end
262
+
263
+ it "should be able to delete the right child if it is a subtree" do
264
+ (3..6).each {|i| subject[i] = i.to_s}
265
+
266
+ subject.delete(5).should == '5'
267
+
268
+ subject.to_hash.should == {
269
+ :node => {
270
+ :key => 3,
271
+ :value => '3',
272
+ :color => :black,
273
+ },
274
+ :left => {
275
+ :node => {
276
+ :key => 1,
277
+ :value => '1',
278
+ :color => :red,
279
+ },
280
+ :left => {
281
+ :node => {
282
+ :key => 0,
283
+ :value => '0',
284
+ :color => :black,
285
+ },
286
+ },
287
+ :right => {
288
+ :node => {
289
+ :key => 2,
290
+ :value => '2',
291
+ :color => :black,
292
+ },
293
+ },
294
+ },
295
+ :right => {
296
+ :node => {
297
+ :key => 6,
298
+ :value => '6',
299
+ :color => :black,
300
+ },
301
+ :left => {
302
+ :node => {
303
+ :key => 4,
304
+ :value => '4',
305
+ :color => :red,
306
+ },
307
+ },
308
+ },
309
+ }
310
+ end
311
+
312
+ it "should return nil if the tree is empty" do
313
+ tree = described_class.new
314
+
315
+ tree.delete(14).should be_nil
316
+
317
+ tree.size.should == 0
318
+ end
319
+
320
+ it "should return nil if the key is not in the tree" do
321
+ (0..4).each {|i| subject[i] = i.to_s}
322
+
323
+ subject.delete(2.5).should be_nil
324
+ subject.size.should == 5
325
+ end
326
+
327
+ it "should return nil if the key is larger than the maximum key" do
328
+ subject.delete(100).should be_nil
329
+ subject.size.should == 3
330
+ end
331
+
332
+ it "should return nil if the key is smaller than the minimum key" do
333
+ subject.delete(-1).should be_nil
334
+ subject.size.should == 3
335
+ end
336
+ end
337
+
338
+ describe "#empty?" do
339
+ it "should return true if the tree is empty" do
340
+ subject.should be_empty
341
+ end
342
+
343
+ it "should return false if the tree is not empty" do
344
+ subject[5] = 10
345
+
346
+ subject.should_not be_empty
347
+ end
348
+ end
349
+
350
+ describe "#delete_min" do
351
+ it "should delete the smallest element of the tree" do
352
+ (1..15).each {|i| subject[i] = i.to_s}
353
+
354
+ subject.delete_min.should == '1'
355
+ subject.size.should == 14
356
+ end
357
+
358
+ it "should return nil if the tree is empty" do
359
+ subject.delete_min.should be_nil
360
+ end
361
+ end
362
+
363
+ describe "#delete_max" do
364
+ it "should delete the largest element of the tree" do
365
+ (1..15).each {|i| subject[i] = i.to_s}
366
+
367
+ subject.delete_max.should == '15'
368
+ subject.size.should == 14
369
+ end
370
+
371
+ it "should return nil if the tree is empty" do
372
+ subject.delete_max.should be_nil
373
+ end
374
+ end
375
+
376
+ describe "#each" do
377
+ it "should yield each pair in the tree in order if a block is provided" do
378
+ # Insert in reverse to demonstrate they aren't being yielded in insertion order
379
+ (1..5).to_a.reverse.each {|i| subject[i] = i.to_s}
380
+
381
+ nodes = []
382
+ subject.each do |key,value|
383
+ nodes << [key,value]
384
+ end
385
+
386
+ nodes.should == (1..5).map {|i| [i, i.to_s]}
387
+ end
388
+
389
+ it "should do nothing if the tree is empty" do
390
+ subject.each do |key,value|
391
+ raise "each on an empty tree incorrectly yielded #{key}, #{value}"
392
+ end
393
+ end
394
+ end
395
+
396
+ describe "#isred" do
397
+ it "should return true if the node is red" do
398
+ node = Puppet::RbTreeMap::Node.new(1,2)
399
+ node.color = :red
400
+
401
+ subject.send(:isred, node).should == true
402
+ end
403
+
404
+ it "should return false if the node is black" do
405
+ node = Puppet::RbTreeMap::Node.new(1,2)
406
+ node.color = :black
407
+
408
+ subject.send(:isred, node).should == false
409
+ end
410
+
411
+ it "should return false if the node is nil" do
412
+ subject.send(:isred, nil).should == false
413
+ end
414
+ end
415
+ end
416
+
417
+ describe Puppet::RbTreeMap::Node do
418
+ let(:tree) { Puppet::RbTreeMap.new }
419
+ let(:subject) { tree.instance_variable_get(:@root) }
420
+
421
+ before :each do
422
+ (1..3).each {|i| tree[i] = i.to_s}
423
+ end
424
+
425
+ describe "#red?" do
426
+ it "should return true if the node is red" do
427
+ subject.color = :red
428
+
429
+ subject.should be_red
430
+ end
431
+
432
+ it "should return false if the node is black" do
433
+ subject.color = :black
434
+
435
+ subject.should_not be_red
436
+ end
437
+ end
438
+
439
+ describe "#colorflip" do
440
+ it "should switch the color of the node and its children" do
441
+ subject.color.should == :black
442
+ subject.left.color.should == :black
443
+ subject.right.color.should == :black
444
+
445
+ subject.colorflip
446
+
447
+ subject.color.should == :red
448
+ subject.left.color.should == :red
449
+ subject.right.color.should == :red
450
+ end
451
+ end
452
+
453
+ describe "#rotate_left" do
454
+ it "should rotate the tree once to the left" do
455
+ (4..7).each {|i| tree[i] = i.to_s}
456
+
457
+ root = tree.instance_variable_get(:@root)
458
+
459
+ root.rotate_left
460
+
461
+ tree.to_hash.should == {
462
+ :node => {
463
+ :key => 6,
464
+ :value => '6',
465
+ :color => :black,
466
+ },
467
+ :left => {
468
+ :node => {
469
+ :key => 4,
470
+ :value => '4',
471
+ :color => :red,
472
+ },
473
+ :left => {
474
+ :node => {
475
+ :key => 2,
476
+ :value => '2',
477
+ :color => :black,
478
+ },
479
+ :left => {
480
+ :node => {
481
+ :key => 1,
482
+ :value => '1',
483
+ :color => :black,
484
+ },
485
+ },
486
+ :right => {
487
+ :node => {
488
+ :key => 3,
489
+ :value => '3',
490
+ :color => :black,
491
+ },
492
+ },
493
+ },
494
+ :right => {
495
+ :node => {
496
+ :key => 5,
497
+ :value => '5',
498
+ :color => :black,
499
+ },
500
+ },
501
+ },
502
+ :right => {
503
+ :node => {
504
+ :key => 7,
505
+ :value => '7',
506
+ :color => :black,
507
+ },
508
+ },
509
+ }
510
+ end
511
+ end
512
+
513
+ describe "#rotate_right" do
514
+ it "should rotate the tree once to the right" do
515
+ (4..7).each {|i| tree[i] = i.to_s}
516
+
517
+ root = tree.instance_variable_get(:@root)
518
+
519
+ root.rotate_right
520
+
521
+ tree.to_hash.should == {
522
+ :node => {
523
+ :key => 2,
524
+ :value => '2',
525
+ :color => :black,
526
+ },
527
+ :left => {
528
+ :node => {
529
+ :key => 1,
530
+ :value => '1',
531
+ :color => :black,
532
+ },
533
+ },
534
+ :right => {
535
+ :node => {
536
+ :key => 4,
537
+ :value => '4',
538
+ :color => :red,
539
+ },
540
+ :left => {
541
+ :node => {
542
+ :key => 3,
543
+ :value => '3',
544
+ :color => :black,
545
+ },
546
+ },
547
+ :right => {
548
+ :node => {
549
+ :key => 6,
550
+ :value => '6',
551
+ :color => :black,
552
+ },
553
+ :left => {
554
+ :node => {
555
+ :key => 5,
556
+ :value => '5',
557
+ :color => :black,
558
+ },
559
+ },
560
+ :right => {
561
+ :node => {
562
+ :key => 7,
563
+ :value => '7',
564
+ :color => :black,
565
+ },
566
+ },
567
+ },
568
+ },
569
+ }
570
+ end
571
+ end
572
+ end