2
3
require 'spec_helper'
4
5
describe Puppet::Type.type(:cron), :unless => Puppet.features.microsoft_windows? do
6
@class = Puppet::Type.type(:cron)
9
@provider_class = stub 'provider_class', :ancestors => [], :name => 'fake', :suitable? => true, :supports_parameter? => true
10
@class.stubs(:defaultprovider).returns @provider_class
11
@class.stubs(:provider).returns @provider_class
13
@provider = stub 'provider', :class => @provider_class, :clean => nil
14
@provider.stubs(:is_a?).returns false
15
@provider_class.stubs(:new).returns @provider
17
@cron = @class.new( :name => "foo" )
7
@provider_class = described_class.provide(:simple) { mk_resource_methods }
8
@provider_class.stubs(:suitable?).returns true
9
described_class.stubs(:defaultprovider).returns @provider_class
20
12
it "should have :name be its namevar" do
21
@class.key_attributes.should == [:name]
13
described_class.key_attributes.should == [:name]
24
16
describe "when validating attributes" do
26
17
[:name, :provider].each do |param|
27
18
it "should have a #{param} parameter" do
28
@class.attrtype(param).should == :param
19
described_class.attrtype(param).should == :param
32
23
[:command, :special, :minute, :hour, :weekday, :month, :monthday, :environment, :user, :target].each do |property|
33
24
it "should have a #{property} property" do
34
@class.attrtype(property).should == :property
25
described_class.attrtype(property).should == :property
38
29
[:command, :minute, :hour, :weekday, :month, :monthday].each do |cronparam|
39
30
it "should have #{cronparam} of type CronParam" do
40
@class.attrclass(cronparam).ancestors.should include CronParam
31
described_class.attrclass(cronparam).ancestors.should include CronParam
47
describe "when validating attribute" do
37
describe "when validating values" do
49
39
describe "ensure" do
50
40
it "should support present as a value for ensure" do
51
proc { @class.new(:name => 'foo', :ensure => :present) }.should_not raise_error
41
proc { described_class.new(:name => 'foo', :ensure => :present) }.should_not raise_error
54
44
it "should support absent as a value for ensure" do
55
proc { @class.new(:name => 'foo', :ensure => :present) }.should_not raise_error
45
proc { described_class.new(:name => 'foo', :ensure => :present) }.should_not raise_error
48
it "should not support other values" do
49
proc { described_class.new(:name => 'foo', :ensure => :foo) }.should raise_error(Puppet::Error, /Invalid value/)
59
53
describe "minute" do
61
54
it "should support absent" do
62
proc { @class.new(:name => 'foo', :minute => 'absent') }.should_not raise_error
55
proc { described_class.new(:name => 'foo', :minute => 'absent') }.should_not raise_error
65
58
it "should support *" do
66
proc { @class.new(:name => 'foo', :minute => '*') }.should_not raise_error
59
proc { described_class.new(:name => 'foo', :minute => '*') }.should_not raise_error
69
62
it "should translate absent to :absent" do
70
@class.new(:name => 'foo', :minute => 'absent')[:minute].should == :absent
63
described_class.new(:name => 'foo', :minute => 'absent')[:minute].should == :absent
73
66
it "should translate * to :absent" do
74
@class.new(:name => 'foo', :minute => '*')[:minute].should == :absent
67
described_class.new(:name => 'foo', :minute => '*')[:minute].should == :absent
77
70
it "should support valid single values" do
78
proc { @class.new(:name => 'foo', :minute => '0') }.should_not raise_error
79
proc { @class.new(:name => 'foo', :minute => '1') }.should_not raise_error
80
proc { @class.new(:name => 'foo', :minute => '59') }.should_not raise_error
71
proc { described_class.new(:name => 'foo', :minute => '0') }.should_not raise_error
72
proc { described_class.new(:name => 'foo', :minute => '1') }.should_not raise_error
73
proc { described_class.new(:name => 'foo', :minute => '59') }.should_not raise_error
83
76
it "should not support non numeric characters" do
84
proc { @class.new(:name => 'foo', :minute => 'z59') }.should raise_error(Puppet::Error)
85
proc { @class.new(:name => 'foo', :minute => '5z9') }.should raise_error(Puppet::Error)
86
proc { @class.new(:name => 'foo', :minute => '59z') }.should raise_error(Puppet::Error)
77
proc { described_class.new(:name => 'foo', :minute => 'z59') }.should raise_error(Puppet::Error, /z59 is not a valid minute/)
78
proc { described_class.new(:name => 'foo', :minute => '5z9') }.should raise_error(Puppet::Error, /5z9 is not a valid minute/)
79
proc { described_class.new(:name => 'foo', :minute => '59z') }.should raise_error(Puppet::Error, /59z is not a valid minute/)
89
82
it "should not support single values out of range" do
91
proc { @class.new(:name => 'foo', :minute => '-1') }.should raise_error(Puppet::Error)
92
proc { @class.new(:name => 'foo', :minute => '60') }.should raise_error(Puppet::Error)
93
proc { @class.new(:name => 'foo', :minute => '61') }.should raise_error(Puppet::Error)
94
proc { @class.new(:name => 'foo', :minute => '120') }.should raise_error(Puppet::Error)
84
proc { described_class.new(:name => 'foo', :minute => '-1') }.should raise_error(Puppet::Error, /-1 is not a valid minute/)
85
proc { described_class.new(:name => 'foo', :minute => '60') }.should raise_error(Puppet::Error, /60 is not a valid minute/)
86
proc { described_class.new(:name => 'foo', :minute => '61') }.should raise_error(Puppet::Error, /61 is not a valid minute/)
87
proc { described_class.new(:name => 'foo', :minute => '120') }.should raise_error(Puppet::Error, /120 is not a valid minute/)
97
90
it "should support valid multiple values" do
98
proc { @class.new(:name => 'foo', :minute => ['0','1','59'] ) }.should_not raise_error
99
proc { @class.new(:name => 'foo', :minute => ['40','30','20'] ) }.should_not raise_error
100
proc { @class.new(:name => 'foo', :minute => ['10','30','20'] ) }.should_not raise_error
91
proc { described_class.new(:name => 'foo', :minute => ['0','1','59'] ) }.should_not raise_error
92
proc { described_class.new(:name => 'foo', :minute => ['40','30','20'] ) }.should_not raise_error
93
proc { described_class.new(:name => 'foo', :minute => ['10','30','20'] ) }.should_not raise_error
103
96
it "should not support multiple values if at least one is invalid" do
105
proc { @class.new(:name => 'foo', :minute => ['0','1','60'] ) }.should raise_error(Puppet::Error)
106
proc { @class.new(:name => 'foo', :minute => ['0','120','59'] ) }.should raise_error(Puppet::Error)
107
proc { @class.new(:name => 'foo', :minute => ['-1','1','59'] ) }.should raise_error(Puppet::Error)
98
proc { described_class.new(:name => 'foo', :minute => ['0','1','60'] ) }.should raise_error(Puppet::Error, /60 is not a valid minute/)
99
proc { described_class.new(:name => 'foo', :minute => ['0','120','59'] ) }.should raise_error(Puppet::Error, /120 is not a valid minute/)
100
proc { described_class.new(:name => 'foo', :minute => ['-1','1','59'] ) }.should raise_error(Puppet::Error, /-1 is not a valid minute/)
109
proc { @class.new(:name => 'foo', :minute => ['0','61','62'] ) }.should raise_error(Puppet::Error)
102
proc { described_class.new(:name => 'foo', :minute => ['0','61','62'] ) }.should raise_error(Puppet::Error, /(61|62) is not a valid minute/)
111
proc { @class.new(:name => 'foo', :minute => ['-1','61','62'] ) }.should raise_error(Puppet::Error)
104
proc { described_class.new(:name => 'foo', :minute => ['-1','61','62'] ) }.should raise_error(Puppet::Error, /(-1|61|62) is not a valid minute/)
114
107
it "should support valid step syntax" do
115
proc { @class.new(:name => 'foo', :minute => '*/2' ) }.should_not raise_error
116
proc { @class.new(:name => 'foo', :minute => '10-16/2' ) }.should_not raise_error
108
proc { described_class.new(:name => 'foo', :minute => '*/2' ) }.should_not raise_error
109
proc { described_class.new(:name => 'foo', :minute => '10-16/2' ) }.should_not raise_error
119
112
it "should not support invalid steps" do
120
proc { @class.new(:name => 'foo', :minute => '*/A' ) }.should raise_error(Puppet::Error)
121
proc { @class.new(:name => 'foo', :minute => '*/2A' ) }.should raise_error(Puppet::Error)
113
proc { described_class.new(:name => 'foo', :minute => '*/A' ) }.should raise_error(Puppet::Error, /\*\/A is not a valid minute/)
114
proc { described_class.new(:name => 'foo', :minute => '*/2A' ) }.should raise_error(Puppet::Error, /\*\/2A is not a valid minute/)
122
115
# As it turns out cron does not complaining about steps that exceed the valid range
123
# proc { @class.new(:name => 'foo', :minute => '*/120' ) }.should raise_error(Puppet::Error)
116
# proc { described_class.new(:name => 'foo', :minute => '*/120' ) }.should raise_error(Puppet::Error, /is not a valid minute/)
128
120
describe "hour" do
130
it "should support absent" do
131
proc { @class.new(:name => 'foo', :hour => 'absent') }.should_not raise_error
121
it "should support absent" do
122
proc { described_class.new(:name => 'foo', :hour => 'absent') }.should_not raise_error
134
125
it "should support *" do
135
proc { @class.new(:name => 'foo', :hour => '*') }.should_not raise_error
126
proc { described_class.new(:name => 'foo', :hour => '*') }.should_not raise_error
138
129
it "should translate absent to :absent" do
139
@class.new(:name => 'foo', :hour => 'absent')[:hour].should == :absent
130
described_class.new(:name => 'foo', :hour => 'absent')[:hour].should == :absent
142
133
it "should translate * to :absent" do
143
@class.new(:name => 'foo', :hour => '*')[:hour].should == :absent
134
described_class.new(:name => 'foo', :hour => '*')[:hour].should == :absent
146
137
it "should support valid single values" do
147
proc { @class.new(:name => 'foo', :hour => '0') }.should_not raise_error
148
proc { @class.new(:name => 'foo', :hour => '11') }.should_not raise_error
149
proc { @class.new(:name => 'foo', :hour => '12') }.should_not raise_error
150
proc { @class.new(:name => 'foo', :hour => '13') }.should_not raise_error
151
proc { @class.new(:name => 'foo', :hour => '23') }.should_not raise_error
138
proc { described_class.new(:name => 'foo', :hour => '0') }.should_not raise_error
139
proc { described_class.new(:name => 'foo', :hour => '11') }.should_not raise_error
140
proc { described_class.new(:name => 'foo', :hour => '12') }.should_not raise_error
141
proc { described_class.new(:name => 'foo', :hour => '13') }.should_not raise_error
142
proc { described_class.new(:name => 'foo', :hour => '23') }.should_not raise_error
154
145
it "should not support non numeric characters" do
155
proc { @class.new(:name => 'foo', :hour => 'z15') }.should raise_error(Puppet::Error)
156
proc { @class.new(:name => 'foo', :hour => '1z5') }.should raise_error(Puppet::Error)
157
proc { @class.new(:name => 'foo', :hour => '15z') }.should raise_error(Puppet::Error)
146
proc { described_class.new(:name => 'foo', :hour => 'z15') }.should raise_error(Puppet::Error, /z15 is not a valid hour/)
147
proc { described_class.new(:name => 'foo', :hour => '1z5') }.should raise_error(Puppet::Error, /1z5 is not a valid hour/)
148
proc { described_class.new(:name => 'foo', :hour => '15z') }.should raise_error(Puppet::Error, /15z is not a valid hour/)
160
151
it "should not support single values out of range" do
161
proc { @class.new(:name => 'foo', :hour => '-1') }.should raise_error(Puppet::Error)
162
proc { @class.new(:name => 'foo', :hour => '24') }.should raise_error(Puppet::Error)
163
proc { @class.new(:name => 'foo', :hour => '120') }.should raise_error(Puppet::Error)
152
proc { described_class.new(:name => 'foo', :hour => '-1') }.should raise_error(Puppet::Error, /-1 is not a valid hour/)
153
proc { described_class.new(:name => 'foo', :hour => '24') }.should raise_error(Puppet::Error, /24 is not a valid hour/)
154
proc { described_class.new(:name => 'foo', :hour => '120') }.should raise_error(Puppet::Error, /120 is not a valid hour/)
166
157
it "should support valid multiple values" do
167
proc { @class.new(:name => 'foo', :hour => ['0','1','23'] ) }.should_not raise_error
168
proc { @class.new(:name => 'foo', :hour => ['5','16','14'] ) }.should_not raise_error
169
proc { @class.new(:name => 'foo', :hour => ['16','13','9'] ) }.should_not raise_error
158
proc { described_class.new(:name => 'foo', :hour => ['0','1','23'] ) }.should_not raise_error
159
proc { described_class.new(:name => 'foo', :hour => ['5','16','14'] ) }.should_not raise_error
160
proc { described_class.new(:name => 'foo', :hour => ['16','13','9'] ) }.should_not raise_error
172
163
it "should not support multiple values if at least one is invalid" do
174
proc { @class.new(:name => 'foo', :hour => ['0','1','24'] ) }.should raise_error(Puppet::Error)
175
proc { @class.new(:name => 'foo', :hour => ['0','-1','5'] ) }.should raise_error(Puppet::Error)
176
proc { @class.new(:name => 'foo', :hour => ['-1','1','23'] ) }.should raise_error(Puppet::Error)
165
proc { described_class.new(:name => 'foo', :hour => ['0','1','24'] ) }.should raise_error(Puppet::Error, /24 is not a valid hour/)
166
proc { described_class.new(:name => 'foo', :hour => ['0','-1','5'] ) }.should raise_error(Puppet::Error, /-1 is not a valid hour/)
167
proc { described_class.new(:name => 'foo', :hour => ['-1','1','23'] ) }.should raise_error(Puppet::Error, /-1 is not a valid hour/)
178
proc { @class.new(:name => 'foo', :hour => ['0','25','26'] ) }.should raise_error(Puppet::Error)
169
proc { described_class.new(:name => 'foo', :hour => ['0','25','26'] ) }.should raise_error(Puppet::Error, /(25|26) is not a valid hour/)
180
proc { @class.new(:name => 'foo', :hour => ['-1','24','120'] ) }.should raise_error(Puppet::Error)
171
proc { described_class.new(:name => 'foo', :hour => ['-1','24','120'] ) }.should raise_error(Puppet::Error, /(-1|24|120) is not a valid hour/)
183
174
it "should support valid step syntax" do
184
proc { @class.new(:name => 'foo', :hour => '*/2' ) }.should_not raise_error
185
proc { @class.new(:name => 'foo', :hour => '10-18/4' ) }.should_not raise_error
175
proc { described_class.new(:name => 'foo', :hour => '*/2' ) }.should_not raise_error
176
proc { described_class.new(:name => 'foo', :hour => '10-18/4' ) }.should_not raise_error
188
179
it "should not support invalid steps" do
189
proc { @class.new(:name => 'foo', :hour => '*/A' ) }.should raise_error(Puppet::Error)
190
proc { @class.new(:name => 'foo', :hour => '*/2A' ) }.should raise_error(Puppet::Error)
180
proc { described_class.new(:name => 'foo', :hour => '*/A' ) }.should raise_error(Puppet::Error, /\*\/A is not a valid hour/)
181
proc { described_class.new(:name => 'foo', :hour => '*/2A' ) }.should raise_error(Puppet::Error, /\*\/2A is not a valid hour/)
191
182
# As it turns out cron does not complaining about steps that exceed the valid range
192
# proc { @class.new(:name => 'foo', :hour => '*/26' ) }.should raise_error(Puppet::Error)
183
# proc { described_class.new(:name => 'foo', :hour => '*/26' ) }.should raise_error(Puppet::Error, /is not a valid hour/)
197
describe "weekday" do
187
describe "weekday" do
199
188
it "should support absent" do
200
proc { @class.new(:name => 'foo', :weekday => 'absent') }.should_not raise_error
189
proc { described_class.new(:name => 'foo', :weekday => 'absent') }.should_not raise_error
203
192
it "should support *" do
204
proc { @class.new(:name => 'foo', :weekday => '*') }.should_not raise_error
193
proc { described_class.new(:name => 'foo', :weekday => '*') }.should_not raise_error
207
196
it "should translate absent to :absent" do
208
@class.new(:name => 'foo', :weekday => 'absent')[:weekday].should == :absent
197
described_class.new(:name => 'foo', :weekday => 'absent')[:weekday].should == :absent
211
200
it "should translate * to :absent" do
212
@class.new(:name => 'foo', :weekday => '*')[:weekday].should == :absent
201
described_class.new(:name => 'foo', :weekday => '*')[:weekday].should == :absent
215
204
it "should support valid numeric weekdays" do
216
proc { @class.new(:name => 'foo', :weekday => '0') }.should_not raise_error
217
proc { @class.new(:name => 'foo', :weekday => '1') }.should_not raise_error
218
proc { @class.new(:name => 'foo', :weekday => '6') }.should_not raise_error
205
proc { described_class.new(:name => 'foo', :weekday => '0') }.should_not raise_error
206
proc { described_class.new(:name => 'foo', :weekday => '1') }.should_not raise_error
207
proc { described_class.new(:name => 'foo', :weekday => '6') }.should_not raise_error
219
208
# According to http://www.manpagez.com/man/5/crontab 7 is also valid (Sunday)
220
proc { @class.new(:name => 'foo', :weekday => '7') }.should_not raise_error
223
it "should support valid weekdays as words (3 character version)" do
224
proc { @class.new(:name => 'foo', :weekday => 'Monday') }.should_not raise_error
225
proc { @class.new(:name => 'foo', :weekday => 'Tuesday') }.should_not raise_error
226
proc { @class.new(:name => 'foo', :weekday => 'Wednesday') }.should_not raise_error
227
proc { @class.new(:name => 'foo', :weekday => 'Thursday') }.should_not raise_error
228
proc { @class.new(:name => 'foo', :weekday => 'Friday') }.should_not raise_error
229
proc { @class.new(:name => 'foo', :weekday => 'Saturday') }.should_not raise_error
230
proc { @class.new(:name => 'foo', :weekday => 'Sunday') }.should_not raise_error
233
it "should support valid weekdays as words (3 character version)" do
234
proc { @class.new(:name => 'foo', :weekday => 'Mon') }.should_not raise_error
235
proc { @class.new(:name => 'foo', :weekday => 'Tue') }.should_not raise_error
236
proc { @class.new(:name => 'foo', :weekday => 'Wed') }.should_not raise_error
237
proc { @class.new(:name => 'foo', :weekday => 'Thu') }.should_not raise_error
238
proc { @class.new(:name => 'foo', :weekday => 'Fri') }.should_not raise_error
239
proc { @class.new(:name => 'foo', :weekday => 'Sat') }.should_not raise_error
240
proc { @class.new(:name => 'foo', :weekday => 'Sun') }.should_not raise_error
209
proc { described_class.new(:name => 'foo', :weekday => '7') }.should_not raise_error
212
it "should support valid weekdays as words (long version)" do
213
proc { described_class.new(:name => 'foo', :weekday => 'Monday') }.should_not raise_error
214
proc { described_class.new(:name => 'foo', :weekday => 'Tuesday') }.should_not raise_error
215
proc { described_class.new(:name => 'foo', :weekday => 'Wednesday') }.should_not raise_error
216
proc { described_class.new(:name => 'foo', :weekday => 'Thursday') }.should_not raise_error
217
proc { described_class.new(:name => 'foo', :weekday => 'Friday') }.should_not raise_error
218
proc { described_class.new(:name => 'foo', :weekday => 'Saturday') }.should_not raise_error
219
proc { described_class.new(:name => 'foo', :weekday => 'Sunday') }.should_not raise_error
222
it "should support valid weekdays as words (3 character version)" do
223
proc { described_class.new(:name => 'foo', :weekday => 'Mon') }.should_not raise_error
224
proc { described_class.new(:name => 'foo', :weekday => 'Tue') }.should_not raise_error
225
proc { described_class.new(:name => 'foo', :weekday => 'Wed') }.should_not raise_error
226
proc { described_class.new(:name => 'foo', :weekday => 'Thu') }.should_not raise_error
227
proc { described_class.new(:name => 'foo', :weekday => 'Fri') }.should_not raise_error
228
proc { described_class.new(:name => 'foo', :weekday => 'Sat') }.should_not raise_error
229
proc { described_class.new(:name => 'foo', :weekday => 'Sun') }.should_not raise_error
243
232
it "should not support numeric values out of range" do
244
proc { @class.new(:name => 'foo', :weekday => '-1') }.should raise_error(Puppet::Error)
245
proc { @class.new(:name => 'foo', :weekday => '8') }.should raise_error(Puppet::Error)
233
proc { described_class.new(:name => 'foo', :weekday => '-1') }.should raise_error(Puppet::Error, /-1 is not a valid weekday/)
234
proc { described_class.new(:name => 'foo', :weekday => '8') }.should raise_error(Puppet::Error, /8 is not a valid weekday/)
248
237
it "should not support invalid weekday names" do
249
proc { @class.new(:name => 'foo', :weekday => 'Sar') }.should raise_error(Puppet::Error)
238
proc { described_class.new(:name => 'foo', :weekday => 'Sar') }.should raise_error(Puppet::Error, /Sar is not a valid weekday/)
252
241
it "should support valid multiple values" do
253
proc { @class.new(:name => 'foo', :weekday => ['0','1','6'] ) }.should_not raise_error
254
proc { @class.new(:name => 'foo', :weekday => ['Mon','Wed','Friday'] ) }.should_not raise_error
242
proc { described_class.new(:name => 'foo', :weekday => ['0','1','6'] ) }.should_not raise_error
243
proc { described_class.new(:name => 'foo', :weekday => ['Mon','Wed','Friday'] ) }.should_not raise_error
257
246
it "should not support multiple values if at least one is invalid" do
259
proc { @class.new(:name => 'foo', :weekday => ['0','1','8'] ) }.should raise_error(Puppet::Error)
260
proc { @class.new(:name => 'foo', :weekday => ['Mon','Fii','Sat'] ) }.should raise_error(Puppet::Error)
248
proc { described_class.new(:name => 'foo', :weekday => ['0','1','8'] ) }.should raise_error(Puppet::Error, /8 is not a valid weekday/)
249
proc { described_class.new(:name => 'foo', :weekday => ['Mon','Fii','Sat'] ) }.should raise_error(Puppet::Error, /Fii is not a valid weekday/)
262
proc { @class.new(:name => 'foo', :weekday => ['Mos','Fii','Sat'] ) }.should raise_error(Puppet::Error)
251
proc { described_class.new(:name => 'foo', :weekday => ['Mos','Fii','Sat'] ) }.should raise_error(Puppet::Error, /(Mos|Fii) is not a valid weekday/)
264
proc { @class.new(:name => 'foo', :weekday => ['Mos','Fii','Saa'] ) }.should raise_error(Puppet::Error)
265
proc { @class.new(:name => 'foo', :weekday => ['-1','8','11'] ) }.should raise_error(Puppet::Error)
253
proc { described_class.new(:name => 'foo', :weekday => ['Mos','Fii','Saa'] ) }.should raise_error(Puppet::Error, /(Mos|Fii|Saa) is not a valid weekday/)
254
proc { described_class.new(:name => 'foo', :weekday => ['-1','8','11'] ) }.should raise_error(Puppet::Error, /(-1|8|11) is not a valid weekday/)
268
257
it "should support valid step syntax" do
269
proc { @class.new(:name => 'foo', :weekday => '*/2' ) }.should_not raise_error
270
proc { @class.new(:name => 'foo', :weekday => '0-4/2' ) }.should_not raise_error
258
proc { described_class.new(:name => 'foo', :weekday => '*/2' ) }.should_not raise_error
259
proc { described_class.new(:name => 'foo', :weekday => '0-4/2' ) }.should_not raise_error
273
262
it "should not support invalid steps" do
274
proc { @class.new(:name => 'foo', :weekday => '*/A' ) }.should raise_error(Puppet::Error)
275
proc { @class.new(:name => 'foo', :weekday => '*/2A' ) }.should raise_error(Puppet::Error)
263
proc { described_class.new(:name => 'foo', :weekday => '*/A' ) }.should raise_error(Puppet::Error, /\*\/A is not a valid weekday/)
264
proc { described_class.new(:name => 'foo', :weekday => '*/2A' ) }.should raise_error(Puppet::Error, /\*\/2A is not a valid weekday/)
276
265
# As it turns out cron does not complaining about steps that exceed the valid range
277
# proc { @class.new(:name => 'foo', :weekday => '*/9' ) }.should raise_error(Puppet::Error)
266
# proc { described_class.new(:name => 'foo', :weekday => '*/9' ) }.should raise_error(Puppet::Error, /is not a valid weekday/)
282
270
describe "month" do
284
271
it "should support absent" do
285
proc { @class.new(:name => 'foo', :month => 'absent') }.should_not raise_error
272
proc { described_class.new(:name => 'foo', :month => 'absent') }.should_not raise_error
288
275
it "should support *" do
289
proc { @class.new(:name => 'foo', :month => '*') }.should_not raise_error
276
proc { described_class.new(:name => 'foo', :month => '*') }.should_not raise_error
292
279
it "should translate absent to :absent" do
293
@class.new(:name => 'foo', :month => 'absent')[:month].should == :absent
280
described_class.new(:name => 'foo', :month => 'absent')[:month].should == :absent
296
283
it "should translate * to :absent" do
297
@class.new(:name => 'foo', :month => '*')[:month].should == :absent
284
described_class.new(:name => 'foo', :month => '*')[:month].should == :absent
300
287
it "should support valid numeric values" do
301
proc { @class.new(:name => 'foo', :month => '1') }.should_not raise_error
302
proc { @class.new(:name => 'foo', :month => '12') }.should_not raise_error
288
proc { described_class.new(:name => 'foo', :month => '1') }.should_not raise_error
289
proc { described_class.new(:name => 'foo', :month => '12') }.should_not raise_error
305
292
it "should support valid months as words" do
306
proc { @class.new(:name => 'foo', :month => 'January') }.should_not raise_error
307
proc { @class.new(:name => 'foo', :month => 'February') }.should_not raise_error
308
proc { @class.new(:name => 'foo', :month => 'March') }.should_not raise_error
309
proc { @class.new(:name => 'foo', :month => 'April') }.should_not raise_error
310
proc { @class.new(:name => 'foo', :month => 'May') }.should_not raise_error
311
proc { @class.new(:name => 'foo', :month => 'June') }.should_not raise_error
312
proc { @class.new(:name => 'foo', :month => 'July') }.should_not raise_error
313
proc { @class.new(:name => 'foo', :month => 'August') }.should_not raise_error
314
proc { @class.new(:name => 'foo', :month => 'September') }.should_not raise_error
315
proc { @class.new(:name => 'foo', :month => 'October') }.should_not raise_error
316
proc { @class.new(:name => 'foo', :month => 'November') }.should_not raise_error
317
proc { @class.new(:name => 'foo', :month => 'December') }.should_not raise_error
293
proc { described_class.new(:name => 'foo', :month => 'January') }.should_not raise_error
294
proc { described_class.new(:name => 'foo', :month => 'February') }.should_not raise_error
295
proc { described_class.new(:name => 'foo', :month => 'March') }.should_not raise_error
296
proc { described_class.new(:name => 'foo', :month => 'April') }.should_not raise_error
297
proc { described_class.new(:name => 'foo', :month => 'May') }.should_not raise_error
298
proc { described_class.new(:name => 'foo', :month => 'June') }.should_not raise_error
299
proc { described_class.new(:name => 'foo', :month => 'July') }.should_not raise_error
300
proc { described_class.new(:name => 'foo', :month => 'August') }.should_not raise_error
301
proc { described_class.new(:name => 'foo', :month => 'September') }.should_not raise_error
302
proc { described_class.new(:name => 'foo', :month => 'October') }.should_not raise_error
303
proc { described_class.new(:name => 'foo', :month => 'November') }.should_not raise_error
304
proc { described_class.new(:name => 'foo', :month => 'December') }.should_not raise_error
320
307
it "should support valid months as words (3 character short version)" do
321
proc { @class.new(:name => 'foo', :month => 'Jan') }.should_not raise_error
322
proc { @class.new(:name => 'foo', :month => 'Feb') }.should_not raise_error
323
proc { @class.new(:name => 'foo', :month => 'Mar') }.should_not raise_error
324
proc { @class.new(:name => 'foo', :month => 'Apr') }.should_not raise_error
325
proc { @class.new(:name => 'foo', :month => 'May') }.should_not raise_error
326
proc { @class.new(:name => 'foo', :month => 'Jun') }.should_not raise_error
327
proc { @class.new(:name => 'foo', :month => 'Jul') }.should_not raise_error
328
proc { @class.new(:name => 'foo', :month => 'Aug') }.should_not raise_error
329
proc { @class.new(:name => 'foo', :month => 'Sep') }.should_not raise_error
330
proc { @class.new(:name => 'foo', :month => 'Oct') }.should_not raise_error
331
proc { @class.new(:name => 'foo', :month => 'Nov') }.should_not raise_error
332
proc { @class.new(:name => 'foo', :month => 'Dec') }.should_not raise_error
308
proc { described_class.new(:name => 'foo', :month => 'Jan') }.should_not raise_error
309
proc { described_class.new(:name => 'foo', :month => 'Feb') }.should_not raise_error
310
proc { described_class.new(:name => 'foo', :month => 'Mar') }.should_not raise_error
311
proc { described_class.new(:name => 'foo', :month => 'Apr') }.should_not raise_error
312
proc { described_class.new(:name => 'foo', :month => 'May') }.should_not raise_error
313
proc { described_class.new(:name => 'foo', :month => 'Jun') }.should_not raise_error
314
proc { described_class.new(:name => 'foo', :month => 'Jul') }.should_not raise_error
315
proc { described_class.new(:name => 'foo', :month => 'Aug') }.should_not raise_error
316
proc { described_class.new(:name => 'foo', :month => 'Sep') }.should_not raise_error
317
proc { described_class.new(:name => 'foo', :month => 'Oct') }.should_not raise_error
318
proc { described_class.new(:name => 'foo', :month => 'Nov') }.should_not raise_error
319
proc { described_class.new(:name => 'foo', :month => 'Dec') }.should_not raise_error
335
322
it "should not support numeric values out of range" do
336
proc { @class.new(:name => 'foo', :month => '-1') }.should raise_error(Puppet::Error)
337
proc { @class.new(:name => 'foo', :month => '0') }.should raise_error(Puppet::Error)
338
proc { @class.new(:name => 'foo', :month => '13') }.should raise_error(Puppet::Error)
323
proc { described_class.new(:name => 'foo', :month => '-1') }.should raise_error(Puppet::Error, /-1 is not a valid month/)
324
proc { described_class.new(:name => 'foo', :month => '0') }.should raise_error(Puppet::Error, /0 is not a valid month/)
325
proc { described_class.new(:name => 'foo', :month => '13') }.should raise_error(Puppet::Error, /13 is not a valid month/)
341
328
it "should not support words that are not valid months" do
342
proc { @class.new(:name => 'foo', :month => 'Jal') }.should raise_error(Puppet::Error)
329
proc { described_class.new(:name => 'foo', :month => 'Jal') }.should raise_error(Puppet::Error, /Jal is not a valid month/)
345
332
it "should not support single values out of range" do
347
proc { @class.new(:name => 'foo', :month => '-1') }.should raise_error(Puppet::Error)
348
proc { @class.new(:name => 'foo', :month => '60') }.should raise_error(Puppet::Error)
349
proc { @class.new(:name => 'foo', :month => '61') }.should raise_error(Puppet::Error)
350
proc { @class.new(:name => 'foo', :month => '120') }.should raise_error(Puppet::Error)
334
proc { described_class.new(:name => 'foo', :month => '-1') }.should raise_error(Puppet::Error, /-1 is not a valid month/)
335
proc { described_class.new(:name => 'foo', :month => '60') }.should raise_error(Puppet::Error, /60 is not a valid month/)
336
proc { described_class.new(:name => 'foo', :month => '61') }.should raise_error(Puppet::Error, /61 is not a valid month/)
337
proc { described_class.new(:name => 'foo', :month => '120') }.should raise_error(Puppet::Error, /120 is not a valid month/)
353
340
it "should support valid multiple values" do
354
proc { @class.new(:name => 'foo', :month => ['1','9','12'] ) }.should_not raise_error
355
proc { @class.new(:name => 'foo', :month => ['Jan','March','Jul'] ) }.should_not raise_error
341
proc { described_class.new(:name => 'foo', :month => ['1','9','12'] ) }.should_not raise_error
342
proc { described_class.new(:name => 'foo', :month => ['Jan','March','Jul'] ) }.should_not raise_error
358
345
it "should not support multiple values if at least one is invalid" do
360
proc { @class.new(:name => 'foo', :month => ['0','1','12'] ) }.should raise_error(Puppet::Error)
361
proc { @class.new(:name => 'foo', :month => ['1','13','10'] ) }.should raise_error(Puppet::Error)
362
proc { @class.new(:name => 'foo', :month => ['Jan','Feb','Jxx'] ) }.should raise_error(Puppet::Error)
347
proc { described_class.new(:name => 'foo', :month => ['0','1','12'] ) }.should raise_error(Puppet::Error, /0 is not a valid month/)
348
proc { described_class.new(:name => 'foo', :month => ['1','13','10'] ) }.should raise_error(Puppet::Error, /13 is not a valid month/)
349
proc { described_class.new(:name => 'foo', :month => ['Jan','Feb','Jxx'] ) }.should raise_error(Puppet::Error, /Jxx is not a valid month/)
364
proc { @class.new(:name => 'foo', :month => ['Jan','Fex','Jux'] ) }.should raise_error(Puppet::Error)
351
proc { described_class.new(:name => 'foo', :month => ['Jan','Fex','Jux'] ) }.should raise_error(Puppet::Error, /(Fex|Jux) is not a valid month/)
366
proc { @class.new(:name => 'foo', :month => ['-1','0','13'] ) }.should raise_error(Puppet::Error)
367
proc { @class.new(:name => 'foo', :month => ['Jax','Fex','Aux'] ) }.should raise_error(Puppet::Error)
353
proc { described_class.new(:name => 'foo', :month => ['-1','0','13'] ) }.should raise_error(Puppet::Error, /(-1|0|13) is not a valid month/)
354
proc { described_class.new(:name => 'foo', :month => ['Jax','Fex','Aux'] ) }.should raise_error(Puppet::Error, /(Jax|Fex|Aux) is not a valid month/)
370
357
it "should support valid step syntax" do
371
proc { @class.new(:name => 'foo', :month => '*/2' ) }.should_not raise_error
372
proc { @class.new(:name => 'foo', :month => '1-12/3' ) }.should_not raise_error
358
proc { described_class.new(:name => 'foo', :month => '*/2' ) }.should_not raise_error
359
proc { described_class.new(:name => 'foo', :month => '1-12/3' ) }.should_not raise_error
375
362
it "should not support invalid steps" do
376
proc { @class.new(:name => 'foo', :month => '*/A' ) }.should raise_error(Puppet::Error)
377
proc { @class.new(:name => 'foo', :month => '*/2A' ) }.should raise_error(Puppet::Error)
363
proc { described_class.new(:name => 'foo', :month => '*/A' ) }.should raise_error(Puppet::Error, /\*\/A is not a valid month/)
364
proc { described_class.new(:name => 'foo', :month => '*/2A' ) }.should raise_error(Puppet::Error, /\*\/2A is not a valid month/)
378
365
# As it turns out cron does not complaining about steps that exceed the valid range
379
# proc { @class.new(:name => 'foo', :month => '*/13' ) }.should raise_error(Puppet::Error)
366
# proc { described_class.new(:name => 'foo', :month => '*/13' ) }.should raise_error(Puppet::Error, /is not a valid month/)
384
370
describe "monthday" do
386
371
it "should support absent" do
387
proc { @class.new(:name => 'foo', :monthday => 'absent') }.should_not raise_error
372
proc { described_class.new(:name => 'foo', :monthday => 'absent') }.should_not raise_error
390
375
it "should support *" do
391
proc { @class.new(:name => 'foo', :monthday => '*') }.should_not raise_error
376
proc { described_class.new(:name => 'foo', :monthday => '*') }.should_not raise_error
394
379
it "should translate absent to :absent" do
395
@class.new(:name => 'foo', :monthday => 'absent')[:monthday].should == :absent
380
described_class.new(:name => 'foo', :monthday => 'absent')[:monthday].should == :absent
398
383
it "should translate * to :absent" do
399
@class.new(:name => 'foo', :monthday => '*')[:monthday].should == :absent
384
described_class.new(:name => 'foo', :monthday => '*')[:monthday].should == :absent
402
387
it "should support valid single values" do
403
proc { @class.new(:name => 'foo', :monthday => '1') }.should_not raise_error
404
proc { @class.new(:name => 'foo', :monthday => '30') }.should_not raise_error
405
proc { @class.new(:name => 'foo', :monthday => '31') }.should_not raise_error
388
proc { described_class.new(:name => 'foo', :monthday => '1') }.should_not raise_error
389
proc { described_class.new(:name => 'foo', :monthday => '30') }.should_not raise_error
390
proc { described_class.new(:name => 'foo', :monthday => '31') }.should_not raise_error
408
393
it "should not support non numeric characters" do
409
proc { @class.new(:name => 'foo', :monthday => 'z23') }.should raise_error(Puppet::Error)
410
proc { @class.new(:name => 'foo', :monthday => '2z3') }.should raise_error(Puppet::Error)
411
proc { @class.new(:name => 'foo', :monthday => '23z') }.should raise_error(Puppet::Error)
394
proc { described_class.new(:name => 'foo', :monthday => 'z23') }.should raise_error(Puppet::Error, /z23 is not a valid monthday/)
395
proc { described_class.new(:name => 'foo', :monthday => '2z3') }.should raise_error(Puppet::Error, /2z3 is not a valid monthday/)
396
proc { described_class.new(:name => 'foo', :monthday => '23z') }.should raise_error(Puppet::Error, /23z is not a valid monthday/)
414
399
it "should not support single values out of range" do
415
proc { @class.new(:name => 'foo', :monthday => '-1') }.should raise_error(Puppet::Error)
416
proc { @class.new(:name => 'foo', :monthday => '0') }.should raise_error(Puppet::Error)
417
proc { @class.new(:name => 'foo', :monthday => '32') }.should raise_error(Puppet::Error)
400
proc { described_class.new(:name => 'foo', :monthday => '-1') }.should raise_error(Puppet::Error, /-1 is not a valid monthday/)
401
proc { described_class.new(:name => 'foo', :monthday => '0') }.should raise_error(Puppet::Error, /0 is not a valid monthday/)
402
proc { described_class.new(:name => 'foo', :monthday => '32') }.should raise_error(Puppet::Error, /32 is not a valid monthday/)
420
405
it "should support valid multiple values" do
421
proc { @class.new(:name => 'foo', :monthday => ['1','23','31'] ) }.should_not raise_error
422
proc { @class.new(:name => 'foo', :monthday => ['31','23','1'] ) }.should_not raise_error
423
proc { @class.new(:name => 'foo', :monthday => ['1','31','23'] ) }.should_not raise_error
406
proc { described_class.new(:name => 'foo', :monthday => ['1','23','31'] ) }.should_not raise_error
407
proc { described_class.new(:name => 'foo', :monthday => ['31','23','1'] ) }.should_not raise_error
408
proc { described_class.new(:name => 'foo', :monthday => ['1','31','23'] ) }.should_not raise_error
426
411
it "should not support multiple values if at least one is invalid" do
428
proc { @class.new(:name => 'foo', :monthday => ['1','23','32'] ) }.should raise_error(Puppet::Error)
429
proc { @class.new(:name => 'foo', :monthday => ['-1','12','23'] ) }.should raise_error(Puppet::Error)
430
proc { @class.new(:name => 'foo', :monthday => ['13','32','30'] ) }.should raise_error(Puppet::Error)
413
proc { described_class.new(:name => 'foo', :monthday => ['1','23','32'] ) }.should raise_error(Puppet::Error, /32 is not a valid monthday/)
414
proc { described_class.new(:name => 'foo', :monthday => ['-1','12','23'] ) }.should raise_error(Puppet::Error, /-1 is not a valid monthday/)
415
proc { described_class.new(:name => 'foo', :monthday => ['13','32','30'] ) }.should raise_error(Puppet::Error, /32 is not a valid monthday/)
432
proc { @class.new(:name => 'foo', :monthday => ['-1','0','23'] ) }.should raise_error(Puppet::Error)
417
proc { described_class.new(:name => 'foo', :monthday => ['-1','0','23'] ) }.should raise_error(Puppet::Error, /(-1|0) is not a valid monthday/)
434
proc { @class.new(:name => 'foo', :monthday => ['-1','0','32'] ) }.should raise_error(Puppet::Error)
419
proc { described_class.new(:name => 'foo', :monthday => ['-1','0','32'] ) }.should raise_error(Puppet::Error, /(-1|0|32) is not a valid monthday/)
437
422
it "should support valid step syntax" do
438
proc { @class.new(:name => 'foo', :monthday => '*/2' ) }.should_not raise_error
439
proc { @class.new(:name => 'foo', :monthday => '10-16/2' ) }.should_not raise_error
423
proc { described_class.new(:name => 'foo', :monthday => '*/2' ) }.should_not raise_error
424
proc { described_class.new(:name => 'foo', :monthday => '10-16/2' ) }.should_not raise_error
442
427
it "should not support invalid steps" do
443
proc { @class.new(:name => 'foo', :monthday => '*/A' ) }.should raise_error(Puppet::Error)
444
proc { @class.new(:name => 'foo', :monthday => '*/2A' ) }.should raise_error(Puppet::Error)
428
proc { described_class.new(:name => 'foo', :monthday => '*/A' ) }.should raise_error(Puppet::Error, /\*\/A is not a valid monthday/)
429
proc { described_class.new(:name => 'foo', :monthday => '*/2A' ) }.should raise_error(Puppet::Error, /\*\/2A is not a valid monthday/)
445
430
# As it turns out cron does not complaining about steps that exceed the valid range
446
# proc { @class.new(:name => 'foo', :monthday => '*/32' ) }.should raise_error(Puppet::Error)
431
# proc { described_class.new(:name => 'foo', :monthday => '*/32' ) }.should raise_error(Puppet::Error, /is not a valid monthday/)
451
435
describe "environment" do
453
436
it "it should accept an :environment that looks like a path" do
455
@cron[:environment] = 'PATH=/bin:/usr/bin:/usr/sbin'
438
described_class.new(:name => 'foo',:environment => 'PATH=/bin:/usr/bin:/usr/sbin')
456
439
end.should_not raise_error
459
442
it "should not accept environment variables that do not contain '='" do
461
@cron[:environment] = "INVALID"
462
end.should raise_error(Puppet::Error)
444
described_class.new(:name => 'foo',:environment => 'INVALID')
445
end.should raise_error(Puppet::Error, /Invalid environment setting "INVALID"/)
465
448
it "should accept empty environment variables that do not contain '='" do
467
@cron[:environment] = "MAILTO="
450
described_class.new(:name => 'foo',:environment => 'MAILTO=')
468
451
end.should_not raise_error(Puppet::Error)
471
454
it "should accept 'absent'" do
473
@cron[:environment] = 'absent'
456
described_class.new(:name => 'foo',:environment => 'absent')
474
457
end.should_not raise_error(Puppet::Error)
463
describe "when autorequiring resources" do
466
@user_bob = Puppet::Type.type(:user).new(:name => 'bob', :ensure => :present)
467
@user_alice = Puppet::Type.type(:user).new(:name => 'alice', :ensure => :present)
468
@catalog = Puppet::Resource::Catalog.new
469
@catalog.add_resource @user_bob, @user_alice
472
it "should autorequire the user" do
473
@resource = described_class.new(:name => 'dummy', :command => '/usr/bin/uptime', :user => 'alice')
474
@catalog.add_resource @resource
475
req = @resource.autorequire
477
req[0].target.must == @resource
478
req[0].source.must == @user_alice
481
482
it "should require a command when adding an entry" do
482
entry = @class.new(:name => "test_entry", :ensure => :present)
483
expect { entry.value(:command) }.should raise_error(/No command/)
483
entry = described_class.new(:name => "test_entry", :ensure => :present)
484
expect { entry.value(:command) }.should raise_error(Puppet::Error, /No command/)
486
487
it "should not require a command when removing an entry" do
487
entry = @class.new(:name => "test_entry", :ensure => :absent)
488
entry = described_class.new(:name => "test_entry", :ensure => :absent)
488
489
entry.value(:command).should == nil
492
it "should default to user => root if Etc.getpwuid(Process.uid) returns nil (#12357)" do
493
Etc.expects(:getpwuid).returns(nil)
494
entry = described_class.new(:name => "test_entry", :ensure => :present)
495
entry.value(:user).should eql "root"