win32-taskscheduler 0.3.1 → 0.3.2
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGES +108 -93
- data/MANIFEST +10 -9
- data/README +72 -68
- data/Rakefile +34 -37
- data/certs/djberg96_pub.pem +21 -0
- data/examples/taskscheduler_example.rb +56 -56
- data/lib/win32-taskscheduler.rb +1 -0
- data/lib/win32/taskscheduler.rb +1383 -1368
- data/lib/win32/windows/helper.rb +45 -42
- data/test/test_taskscheduler.rb +690 -689
- data/win32-taskscheduler.gemspec +33 -34
- metadata +51 -21
- metadata.gz.sig +0 -0
data/lib/win32/windows/helper.rb
CHANGED
@@ -1,42 +1,45 @@
|
|
1
|
-
require 'ffi'
|
2
|
-
|
3
|
-
module Windows
|
4
|
-
module
|
5
|
-
extend FFI::Library
|
6
|
-
|
7
|
-
FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
|
8
|
-
FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
|
9
|
-
FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF
|
10
|
-
|
11
|
-
ffi_lib :kernel32
|
12
|
-
|
13
|
-
attach_function :FormatMessage, :FormatMessageA,
|
14
|
-
[:ulong, :pointer, :ulong, :ulong, :pointer, :ulong, :pointer], :ulong
|
15
|
-
|
16
|
-
def win_error(function, err=FFI.errno)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module Windows
|
4
|
+
module TaskSchedulerHelper
|
5
|
+
extend FFI::Library
|
6
|
+
|
7
|
+
FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
|
8
|
+
FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
|
9
|
+
FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF
|
10
|
+
|
11
|
+
ffi_lib :kernel32
|
12
|
+
|
13
|
+
attach_function :FormatMessage, :FormatMessageA,
|
14
|
+
[:ulong, :pointer, :ulong, :ulong, :pointer, :ulong, :pointer], :ulong
|
15
|
+
|
16
|
+
def win_error(function, err=FFI.errno)
|
17
|
+
err_msg = ''
|
18
|
+
flags = FORMAT_MESSAGE_IGNORE_INSERTS |
|
19
|
+
FORMAT_MESSAGE_FROM_SYSTEM |
|
20
|
+
FORMAT_MESSAGE_MAX_WIDTH_MASK
|
21
|
+
|
22
|
+
# 0x0409 == MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
|
23
|
+
# We use English for errors because Ruby uses English for errors.
|
24
|
+
|
25
|
+
FFI::MemoryPointer.new(:char, 1024) do |buf|
|
26
|
+
len = FormatMessage(flags, nil, err , 0x0409, buf, buf.size, nil)
|
27
|
+
err_msg = function + ': ' + buf.read_string(len).strip
|
28
|
+
end
|
29
|
+
|
30
|
+
err_msg
|
31
|
+
end
|
32
|
+
|
33
|
+
def ole_error(function, err)
|
34
|
+
regex = /OLE error code:(.*?)\sin/
|
35
|
+
match = regex.match(err.to_s)
|
36
|
+
|
37
|
+
if match
|
38
|
+
error = match.captures.first.hex
|
39
|
+
win_error(function, error)
|
40
|
+
else
|
41
|
+
"#{function}: #{err.to_s}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/test/test_taskscheduler.rb
CHANGED
@@ -1,689 +1,690 @@
|
|
1
|
-
##########################################################################
|
2
|
-
# test_taskscheduler.rb
|
3
|
-
#
|
4
|
-
# Test suite for the win32-taskscheduler package. You should run this
|
5
|
-
# via the 'rake test' task.
|
6
|
-
##########################################################################
|
7
|
-
require 'win32/taskscheduler'
|
8
|
-
require 'win32/security'
|
9
|
-
require 'socket'
|
10
|
-
require 'test-unit'
|
11
|
-
require 'etc'
|
12
|
-
include Win32
|
13
|
-
|
14
|
-
class TC_TaskScheduler < Test::Unit::TestCase
|
15
|
-
def self.startup
|
16
|
-
@@host = Socket.gethostname
|
17
|
-
@@user = Etc.getlogin
|
18
|
-
@@elevated = Win32::Security.elevated_security?
|
19
|
-
end
|
20
|
-
|
21
|
-
def setup
|
22
|
-
@task = 'foo'
|
23
|
-
|
24
|
-
@trigger = {
|
25
|
-
:start_year => 2015,
|
26
|
-
:start_month => 4,
|
27
|
-
:start_day => 11,
|
28
|
-
:start_hour => 7,
|
29
|
-
:start_minute => 14,
|
30
|
-
:trigger_type => TaskScheduler::DAILY,
|
31
|
-
:type => { :days_interval => 1 }
|
32
|
-
}
|
33
|
-
|
34
|
-
@ts = TaskScheduler.new
|
35
|
-
end
|
36
|
-
|
37
|
-
# Helper method
|
38
|
-
def setup_task
|
39
|
-
@ts.new_work_item(@task, @trigger)
|
40
|
-
@ts.activate(@task)
|
41
|
-
end
|
42
|
-
|
43
|
-
test "version constant is set to expected value" do
|
44
|
-
assert_equal('0.3.
|
45
|
-
end
|
46
|
-
|
47
|
-
test "account_information method basic functionality" do
|
48
|
-
assert_respond_to(@ts, :account_information)
|
49
|
-
end
|
50
|
-
|
51
|
-
test "account_information returns the task owner" do
|
52
|
-
setup_task
|
53
|
-
assert_equal("#{@@host}\\#{@@user}", @ts.account_information)
|
54
|
-
end
|
55
|
-
|
56
|
-
test "account_information returns nil if no task has been activated" do
|
57
|
-
assert_nil(@ts.account_information)
|
58
|
-
end
|
59
|
-
|
60
|
-
test "account_information does not accept any arguments" do
|
61
|
-
assert_raise(ArgumentError){ @ts.account_information('foo') }
|
62
|
-
end
|
63
|
-
|
64
|
-
test "set_account_information basic functionality" do
|
65
|
-
assert_respond_to(@ts, :set_account_information)
|
66
|
-
end
|
67
|
-
|
68
|
-
test "set_account_information works as expected" do
|
69
|
-
setup_task
|
70
|
-
#assert_nothing_raised{ @ts.set_account_information(@@user, 'XXXX') }
|
71
|
-
#assert_equal('test', @ts.account_information)
|
72
|
-
end
|
73
|
-
|
74
|
-
test "set_account_information requires two arguments" do
|
75
|
-
setup_task
|
76
|
-
assert_raise(ArgumentError){ @ts.set_account_information }
|
77
|
-
assert_raise(ArgumentError){ @ts.set_account_information('x') }
|
78
|
-
assert_raise(ArgumentError){ @ts.set_account_information('x', 'y', 'z') }
|
79
|
-
end
|
80
|
-
|
81
|
-
test "arguments to set_account_information must be strings" do
|
82
|
-
setup_task
|
83
|
-
assert_raise(TypeError){ @ts.set_account_information(1, 'XXX') }
|
84
|
-
assert_raise(TypeError){ @ts.set_account_information('x', 1) }
|
85
|
-
end
|
86
|
-
|
87
|
-
test "activate method basic functionality" do
|
88
|
-
assert_respond_to(@ts, :activate)
|
89
|
-
end
|
90
|
-
|
91
|
-
test "activate behaves as expected" do
|
92
|
-
@ts.new_work_item(@task, @trigger)
|
93
|
-
assert_nothing_raised{ @ts.activate(@task) }
|
94
|
-
end
|
95
|
-
|
96
|
-
test "calling activate on the same object multiple times has no effect" do
|
97
|
-
@ts.new_work_item(@task, @trigger)
|
98
|
-
assert_nothing_raised{ @ts.activate(@task) }
|
99
|
-
assert_nothing_raised{ @ts.activate(@task) }
|
100
|
-
end
|
101
|
-
|
102
|
-
test "activate requires a single argument" do
|
103
|
-
assert_raise(ArgumentError){ @ts.activate }
|
104
|
-
assert_raise(ArgumentError){ @ts.activate('foo', 'bar') }
|
105
|
-
end
|
106
|
-
|
107
|
-
test "activate requires a string argument" do
|
108
|
-
assert_raise(TypeError){ @ts.activate(1) }
|
109
|
-
end
|
110
|
-
|
111
|
-
test "attempting to activate a bad task results in an error" do
|
112
|
-
assert_raise(TaskScheduler::Error){ @ts.activate('bogus') }
|
113
|
-
end
|
114
|
-
|
115
|
-
test "application_name basic functionality" do
|
116
|
-
assert_respond_to(@ts, :application_name)
|
117
|
-
end
|
118
|
-
|
119
|
-
test "application_name returns a string or nil" do
|
120
|
-
setup_task
|
121
|
-
assert_nothing_raised{ @ts.application_name }
|
122
|
-
assert_kind_of([String, NilClass], @ts.application_name)
|
123
|
-
end
|
124
|
-
|
125
|
-
test "application_name does not accept any arguments" do
|
126
|
-
assert_raises(ArgumentError){ @ts.application_name('bogus') }
|
127
|
-
end
|
128
|
-
|
129
|
-
test "application_name= basic functionality" do
|
130
|
-
assert_respond_to(@ts, :application_name=)
|
131
|
-
end
|
132
|
-
|
133
|
-
test "application_name= works as expected" do
|
134
|
-
setup_task
|
135
|
-
assert_nothing_raised{ @ts.application_name = "notepad.exe" }
|
136
|
-
assert_equal("notepad.exe", @ts.application_name)
|
137
|
-
end
|
138
|
-
|
139
|
-
test "application_name= requires a string argument" do
|
140
|
-
assert_raise(TypeError){ @ts.application_name = 1 }
|
141
|
-
end
|
142
|
-
|
143
|
-
test "comment method basic functionality" do
|
144
|
-
assert_respond_to(@ts, :comment)
|
145
|
-
end
|
146
|
-
|
147
|
-
test "comment method returns a string" do
|
148
|
-
setup_task
|
149
|
-
assert_nothing_raised{ @ts.comment }
|
150
|
-
assert_kind_of(String, @ts.comment)
|
151
|
-
end
|
152
|
-
|
153
|
-
test "comment method does not accept any arguments" do
|
154
|
-
assert_raise(ArgumentError){ @ts.comment('test') }
|
155
|
-
end
|
156
|
-
|
157
|
-
test "comment= method basic functionality" do
|
158
|
-
assert_respond_to(@ts, :comment=)
|
159
|
-
end
|
160
|
-
|
161
|
-
test "comment= works as expected" do
|
162
|
-
setup_task
|
163
|
-
assert_nothing_raised{ @ts.comment = "test" }
|
164
|
-
assert_equal("test", @ts.comment)
|
165
|
-
end
|
166
|
-
|
167
|
-
test "comment= method requires a string argument" do
|
168
|
-
assert_raise(TypeError){ @ts.comment = 1 }
|
169
|
-
end
|
170
|
-
|
171
|
-
test "creator method basic functionality" do
|
172
|
-
setup_task
|
173
|
-
assert_respond_to(@ts, :creator)
|
174
|
-
assert_nothing_raised{ @ts.creator }
|
175
|
-
assert_kind_of(String, @ts.creator)
|
176
|
-
end
|
177
|
-
|
178
|
-
test "creator method returns expected value" do
|
179
|
-
setup_task
|
180
|
-
assert_equal('', @ts.creator)
|
181
|
-
end
|
182
|
-
|
183
|
-
test "creator method does not accept any arguments" do
|
184
|
-
assert_raise(ArgumentError){ @ts.creator('foo') }
|
185
|
-
end
|
186
|
-
|
187
|
-
test "creator= method basic functionality" do
|
188
|
-
assert_respond_to(@ts, :creator=)
|
189
|
-
end
|
190
|
-
|
191
|
-
test "creator= method works as expected" do
|
192
|
-
setup_task
|
193
|
-
assert_nothing_raised{ @ts.creator = "Test Creator" }
|
194
|
-
assert_equal("Test Creator", @ts.creator)
|
195
|
-
end
|
196
|
-
|
197
|
-
test "creator= method requires a string argument" do
|
198
|
-
assert_raise(TypeError){ @ts.creator = 1 }
|
199
|
-
end
|
200
|
-
|
201
|
-
test "delete method basic functionality" do
|
202
|
-
assert_respond_to(@ts, :delete)
|
203
|
-
end
|
204
|
-
|
205
|
-
test "delete method works as expected" do
|
206
|
-
setup_task
|
207
|
-
assert_nothing_raised{ @ts.delete(@task) }
|
208
|
-
assert_false(@ts.exists?(@task))
|
209
|
-
end
|
210
|
-
|
211
|
-
test "delete method requires a single argument" do
|
212
|
-
assert_raise(ArgumentError){ @ts.delete }
|
213
|
-
end
|
214
|
-
|
215
|
-
test "delete method raises an error if the task does not exist" do
|
216
|
-
assert_raise(TaskScheduler::Error){ @ts.delete("foofoo") }
|
217
|
-
end
|
218
|
-
|
219
|
-
test "enum basic functionality" do
|
220
|
-
assert_respond_to(@ts, :enum)
|
221
|
-
assert_nothing_raised{ @ts.enum }
|
222
|
-
end
|
223
|
-
|
224
|
-
test "enum method returns an array of strings" do
|
225
|
-
assert_kind_of(Array, @ts.enum)
|
226
|
-
assert_kind_of(String, @ts.enum.first)
|
227
|
-
end
|
228
|
-
|
229
|
-
test "tasks is an alias for enum" do
|
230
|
-
assert_respond_to(@ts, :tasks)
|
231
|
-
assert_alias_method(@ts, :tasks, :enum)
|
232
|
-
end
|
233
|
-
|
234
|
-
test "enum method does not accept any arguments" do
|
235
|
-
assert_raise(ArgumentError){ @ts.enum(1) }
|
236
|
-
end
|
237
|
-
|
238
|
-
test "exists? basic functionality" do
|
239
|
-
assert_respond_to(@ts, :exists?)
|
240
|
-
assert_boolean(@ts.exists?(@task))
|
241
|
-
end
|
242
|
-
|
243
|
-
test "exists? returns expected value" do
|
244
|
-
setup_task
|
245
|
-
assert_true(@ts.exists?(@task))
|
246
|
-
assert_false(@ts.exists?('bogusXYZ'))
|
247
|
-
end
|
248
|
-
|
249
|
-
test "exists? method requires a single argument" do
|
250
|
-
assert_raise(ArgumentError){ @ts.exists? }
|
251
|
-
assert_raise(ArgumentError){ @ts.exists?('foo', 'bar') }
|
252
|
-
end
|
253
|
-
|
254
|
-
test "exit_code basic functionality" do
|
255
|
-
setup_task
|
256
|
-
assert_respond_to(@ts, :exit_code)
|
257
|
-
assert_nothing_raised{ @ts.exit_code }
|
258
|
-
assert_kind_of(Fixnum, @ts.exit_code)
|
259
|
-
end
|
260
|
-
|
261
|
-
test "exit_code takes no arguments" do
|
262
|
-
assert_raise(ArgumentError){ @ts.exit_code(true) }
|
263
|
-
assert_raise(NoMethodError){ @ts.exit_code = 1 }
|
264
|
-
end
|
265
|
-
|
266
|
-
test "machine= basic functionality" do
|
267
|
-
assert_respond_to(@ts, :machine=)
|
268
|
-
end
|
269
|
-
|
270
|
-
test "machine= works as expected" do
|
271
|
-
omit_unless(@@elevated)
|
272
|
-
setup_task
|
273
|
-
assert_nothing_raised{ @ts.machine = @@host }
|
274
|
-
assert_equal(@@host, @ts.machine)
|
275
|
-
end
|
276
|
-
|
277
|
-
test "host= is an alias for machine=" do
|
278
|
-
assert_alias_method(@ts, :machine=, :host=)
|
279
|
-
end
|
280
|
-
|
281
|
-
test "set_machine basic functionality" do
|
282
|
-
assert_respond_to(@ts, :set_machine)
|
283
|
-
end
|
284
|
-
|
285
|
-
test "set_host is an alias for set_machine" do
|
286
|
-
assert_alias_method(@ts, :set_machine, :set_host)
|
287
|
-
end
|
288
|
-
|
289
|
-
test "max_run_time basic functionality" do
|
290
|
-
assert_respond_to(@ts, :max_run_time)
|
291
|
-
end
|
292
|
-
|
293
|
-
test "max_run_time works as expected" do
|
294
|
-
setup_task
|
295
|
-
assert_nothing_raised{ @ts.max_run_time }
|
296
|
-
assert_kind_of(Fixnum, @ts.max_run_time)
|
297
|
-
end
|
298
|
-
|
299
|
-
test "max_run_time accepts no arguments" do
|
300
|
-
assert_raise(ArgumentError){ @ts.max_run_time(true) }
|
301
|
-
end
|
302
|
-
|
303
|
-
test "max_run_time= basic functionality" do
|
304
|
-
assert_respond_to(@ts, :max_run_time=)
|
305
|
-
end
|
306
|
-
|
307
|
-
test "max_run_time= works as expected" do
|
308
|
-
setup_task
|
309
|
-
assert_nothing_raised{ @ts.max_run_time = 20000 }
|
310
|
-
assert_equal(20000, @ts.max_run_time)
|
311
|
-
end
|
312
|
-
|
313
|
-
test "max_run_time= requires a numeric argument" do
|
314
|
-
assert_raise(TypeError){ @ts.max_run_time = true }
|
315
|
-
end
|
316
|
-
|
317
|
-
test "most_recent_run_time basic functionality" do
|
318
|
-
setup_task
|
319
|
-
assert_respond_to(@ts, :most_recent_run_time)
|
320
|
-
assert_nothing_raised{ @ts.most_recent_run_time }
|
321
|
-
end
|
322
|
-
|
323
|
-
test "most_recent_run_time is nil if task hasn't run" do
|
324
|
-
setup_task
|
325
|
-
assert_nil(@ts.most_recent_run_time)
|
326
|
-
end
|
327
|
-
|
328
|
-
test "most_recent_run_time does not accept any arguments" do
|
329
|
-
assert_raise(ArgumentError){ @ts.most_recent_run_time(true) }
|
330
|
-
assert_raise(NoMethodError){ @ts.most_recent_run_time = Time.now }
|
331
|
-
end
|
332
|
-
|
333
|
-
test "new_work_item basic functionality" do
|
334
|
-
assert_respond_to(@ts, :new_work_item)
|
335
|
-
end
|
336
|
-
|
337
|
-
test "new_work_item accepts a trigger/hash" do
|
338
|
-
assert_nothing_raised{ @ts.new_work_item('bar', @trigger) }
|
339
|
-
end
|
340
|
-
|
341
|
-
test "new_work_item fails if a bogus trigger key is present" do
|
342
|
-
assert_raise(ArgumentError){ @ts.new_work_item('test', {:bogus => 1}) }
|
343
|
-
end
|
344
|
-
|
345
|
-
test "new_task is an alias for new_work_item" do
|
346
|
-
assert_respond_to(@ts, :new_task)
|
347
|
-
assert_alias_method(@ts, :new_task, :new_work_item)
|
348
|
-
end
|
349
|
-
|
350
|
-
test "new_work_item requires a task name and a trigger" do
|
351
|
-
assert_raise(ArgumentError){ @ts.new_work_item }
|
352
|
-
assert_raise(ArgumentError){ @ts.new_work_item('bar') }
|
353
|
-
end
|
354
|
-
|
355
|
-
test "new_work_item expects a string for the first argument" do
|
356
|
-
assert_raise(TypeError){ @ts.new_work_item(1, @trigger) }
|
357
|
-
end
|
358
|
-
|
359
|
-
test "new_work_item expects a hash for the second argument" do
|
360
|
-
assert_raise(TypeError){ @ts.new_work_item(@task, 1) }
|
361
|
-
end
|
362
|
-
|
363
|
-
test "next_run_time basic functionality" do
|
364
|
-
assert_respond_to(@ts, :next_run_time)
|
365
|
-
end
|
366
|
-
|
367
|
-
test "next_run_time returns a Time object" do
|
368
|
-
setup_task
|
369
|
-
assert_nothing_raised{ @ts.next_run_time }
|
370
|
-
assert_kind_of(Time, @ts.next_run_time)
|
371
|
-
end
|
372
|
-
|
373
|
-
test "next_run_time does not take any arguments" do
|
374
|
-
assert_raise(ArgumentError){ @ts.next_run_time(true) }
|
375
|
-
assert_raise(NoMethodError){ @ts.next_run_time = Time.now }
|
376
|
-
end
|
377
|
-
|
378
|
-
test "parameters basic functionality" do
|
379
|
-
setup_task
|
380
|
-
assert_respond_to(@ts, :parameters)
|
381
|
-
assert_nothing_raised{ @ts.parameters }
|
382
|
-
end
|
383
|
-
|
384
|
-
test "parameters method does not take any arguments" do
|
385
|
-
assert_raise(ArgumentError){ @ts.parameters('test') }
|
386
|
-
end
|
387
|
-
|
388
|
-
test "parameters= basic functionality" do
|
389
|
-
assert_respond_to(@ts, :parameters=)
|
390
|
-
end
|
391
|
-
|
392
|
-
test "parameters= works as expected" do
|
393
|
-
setup_task
|
394
|
-
assert_nothing_raised{ @ts.parameters = "somefile.txt" }
|
395
|
-
assert_equal("somefile.txt", @ts.parameters)
|
396
|
-
end
|
397
|
-
|
398
|
-
test "parameters= requires a string argument" do
|
399
|
-
assert_raise(ArgumentError){ @ts.send(:parameters=) }
|
400
|
-
assert_raise(TypeError){ @ts.parameters = 1 }
|
401
|
-
end
|
402
|
-
|
403
|
-
test "priority basic functionality" do
|
404
|
-
assert_respond_to(@ts, :priority)
|
405
|
-
end
|
406
|
-
|
407
|
-
test "priority returns the expected value" do
|
408
|
-
setup_task
|
409
|
-
assert_nothing_raised{ @ts.priority }
|
410
|
-
assert_kind_of(String, @ts.priority)
|
411
|
-
end
|
412
|
-
|
413
|
-
test "priority method does not accept any arguments" do
|
414
|
-
assert_raise(ArgumentError){ @ts.priority(true) }
|
415
|
-
end
|
416
|
-
|
417
|
-
test "priority= basic functionality" do
|
418
|
-
assert_respond_to(@ts, :priority=)
|
419
|
-
end
|
420
|
-
|
421
|
-
test "priority= works as expected" do
|
422
|
-
setup_task
|
423
|
-
assert_nothing_raised{ @ts.priority = TaskScheduler::NORMAL }
|
424
|
-
assert_equal('normal', @ts.priority)
|
425
|
-
end
|
426
|
-
|
427
|
-
test "priority= requires a numeric argument" do
|
428
|
-
assert_raise(TypeError){ @ts.priority = 'alpha' }
|
429
|
-
end
|
430
|
-
|
431
|
-
# TODO: Find a harmless way to test this.
|
432
|
-
test "run basic functionality" do
|
433
|
-
assert_respond_to(@ts, :run)
|
434
|
-
end
|
435
|
-
|
436
|
-
test "run does not accept any arguments" do
|
437
|
-
assert_raise(ArgumentError){ @ts.run(true) }
|
438
|
-
assert_raise(NoMethodError){ @ts.run = true }
|
439
|
-
end
|
440
|
-
|
441
|
-
test "save basic functionality" do
|
442
|
-
assert_respond_to(@ts, :save)
|
443
|
-
end
|
444
|
-
|
445
|
-
test "status basic functionality" do
|
446
|
-
setup_task
|
447
|
-
assert_respond_to(@ts, :status)
|
448
|
-
assert_nothing_raised{ @ts.status }
|
449
|
-
assert_kind_of(String, @ts.status)
|
450
|
-
end
|
451
|
-
|
452
|
-
test "status returns the expected value" do
|
453
|
-
setup_task
|
454
|
-
assert_equal('ready', @ts.status)
|
455
|
-
end
|
456
|
-
|
457
|
-
test "status does not accept any arguments" do
|
458
|
-
assert_raise(ArgumentError){ @ts.status(true) }
|
459
|
-
end
|
460
|
-
|
461
|
-
test "terminate basic functionality" do
|
462
|
-
assert_respond_to(@ts, :terminate)
|
463
|
-
end
|
464
|
-
|
465
|
-
test "terminate does not accept any arguments" do
|
466
|
-
assert_raise(ArgumentError){ @ts.terminate(true) }
|
467
|
-
assert_raise(NoMethodError){ @ts.terminate = true }
|
468
|
-
end
|
469
|
-
|
470
|
-
test "calling terminate on a task that isn't running raises an error" do
|
471
|
-
assert_raise(TaskScheduler::Error){ @ts.terminate }
|
472
|
-
end
|
473
|
-
|
474
|
-
test "trigger basic functionality" do
|
475
|
-
setup_task
|
476
|
-
assert_respond_to(@ts, :trigger)
|
477
|
-
assert_nothing_raised{ @ts.trigger(0) }
|
478
|
-
end
|
479
|
-
|
480
|
-
test "trigger returns a hash object" do
|
481
|
-
setup_task
|
482
|
-
assert_kind_of(Hash, @ts.trigger(0))
|
483
|
-
end
|
484
|
-
|
485
|
-
test "trigger requires an index" do
|
486
|
-
assert_raises(ArgumentError){ @ts.trigger }
|
487
|
-
end
|
488
|
-
|
489
|
-
test "trigger raises an error if the index is invalid" do
|
490
|
-
assert_raises(TaskScheduler::Error){ @ts.trigger(9999) }
|
491
|
-
end
|
492
|
-
|
493
|
-
test "trigger= basic functionality" do
|
494
|
-
assert_respond_to(@ts, :trigger=)
|
495
|
-
end
|
496
|
-
|
497
|
-
test "trigger= works as expected" do
|
498
|
-
setup_task
|
499
|
-
assert_nothing_raised{ @ts.trigger = @trigger }
|
500
|
-
end
|
501
|
-
|
502
|
-
test "trigger= requires a hash argument" do
|
503
|
-
assert_raises(TypeError){ @ts.trigger = 'blah' }
|
504
|
-
end
|
505
|
-
|
506
|
-
test "add_trigger basic functionality" do
|
507
|
-
assert_respond_to(@ts, :add_trigger)
|
508
|
-
end
|
509
|
-
|
510
|
-
test "add_trigger works as expected" do
|
511
|
-
setup_task
|
512
|
-
assert_nothing_raised{ @ts.add_trigger(0, @trigger) }
|
513
|
-
end
|
514
|
-
|
515
|
-
test "add_trigger requires two arguments" do
|
516
|
-
assert_raises(ArgumentError){ @ts.add_trigger }
|
517
|
-
assert_raises(ArgumentError){ @ts.add_trigger(0) }
|
518
|
-
end
|
519
|
-
|
520
|
-
test "add_trigger reqiuires an integer for the first argument" do
|
521
|
-
assert_raises(TypeError){ @ts.add_trigger('foo', @trigger) }
|
522
|
-
end
|
523
|
-
|
524
|
-
test "add_trigger reqiuires a hash for the second argument" do
|
525
|
-
assert_raises(TypeError){ @ts.add_trigger(0, 'foo') }
|
526
|
-
end
|
527
|
-
|
528
|
-
test "trigger_count basic functionality" do
|
529
|
-
setup_task
|
530
|
-
assert_respond_to(@ts, :trigger_count)
|
531
|
-
assert_nothing_raised{ @ts.trigger_count }
|
532
|
-
assert_kind_of(Fixnum, @ts.trigger_count)
|
533
|
-
end
|
534
|
-
|
535
|
-
test "trigger_count returns the expected value" do
|
536
|
-
setup_task
|
537
|
-
assert_equal(1, @ts.trigger_count)
|
538
|
-
end
|
539
|
-
|
540
|
-
test "trigger_count does not accept any arguments" do
|
541
|
-
assert_raise(ArgumentError){ @ts.trigger_count(true) }
|
542
|
-
assert_raise(NoMethodError){ @ts.trigger_count = 1 }
|
543
|
-
end
|
544
|
-
|
545
|
-
test "delete_trigger basic functionality" do
|
546
|
-
assert_respond_to(@ts, :delete_trigger)
|
547
|
-
end
|
548
|
-
|
549
|
-
test "delete_trigger works as expected" do
|
550
|
-
setup_task
|
551
|
-
assert_nothing_raised{ @ts.delete_trigger(0) }
|
552
|
-
assert_equal(0, @ts.trigger_count)
|
553
|
-
end
|
554
|
-
|
555
|
-
test "passing a bad index to delete_trigger will raise an error" do
|
556
|
-
assert_raise(TaskScheduler::Error){ @ts.delete_trigger(9999) }
|
557
|
-
end
|
558
|
-
|
559
|
-
test "delete_trigger requires at least one argument" do
|
560
|
-
assert_raise(ArgumentError){ @ts.delete_trigger }
|
561
|
-
end
|
562
|
-
|
563
|
-
test "trigger_string basic functionality" do
|
564
|
-
setup_task
|
565
|
-
assert_respond_to(@ts, :trigger_string)
|
566
|
-
assert_nothing_raised{ @ts.trigger_string(0) }
|
567
|
-
end
|
568
|
-
|
569
|
-
test "trigger_string returns the expected value" do
|
570
|
-
setup_task
|
571
|
-
assert_equal('Starting 2015-04-11T07:14:00', @ts.trigger_string(0))
|
572
|
-
end
|
573
|
-
|
574
|
-
test "trigger_string requires a single argument" do
|
575
|
-
assert_raise(ArgumentError){ @ts.trigger_string }
|
576
|
-
assert_raise(ArgumentError){ @ts.trigger_string(0, 0) }
|
577
|
-
end
|
578
|
-
|
579
|
-
test "trigger_string requires a numeric argument" do
|
580
|
-
assert_raise(TypeError){ @ts.trigger_string('alpha') }
|
581
|
-
end
|
582
|
-
|
583
|
-
test "trigger_string raises an error if the index is invalid" do
|
584
|
-
assert_raise(TaskScheduler::Error){ @ts.trigger_string(9999) }
|
585
|
-
end
|
586
|
-
|
587
|
-
test "working_directory basic functionality" do
|
588
|
-
setup_task
|
589
|
-
assert_respond_to(@ts, :working_directory)
|
590
|
-
assert_nothing_raised{ @ts.working_directory }
|
591
|
-
assert_kind_of(String, @ts.working_directory)
|
592
|
-
end
|
593
|
-
|
594
|
-
test "working_directory takes no arguments" do
|
595
|
-
assert_raise(ArgumentError){ @ts.working_directory(true) }
|
596
|
-
end
|
597
|
-
|
598
|
-
test "working_directory= basic functionality" do
|
599
|
-
assert_respond_to(@ts, :working_directory=)
|
600
|
-
end
|
601
|
-
|
602
|
-
test "working_directory= works as expected" do
|
603
|
-
setup_task
|
604
|
-
assert_nothing_raised{ @ts.working_directory = "C:\\" }
|
605
|
-
end
|
606
|
-
|
607
|
-
test "working_directory= requires a string argument" do
|
608
|
-
setup_task
|
609
|
-
assert_raise(TypeError){ @ts.working_directory = 1 }
|
610
|
-
end
|
611
|
-
|
612
|
-
test "expected day constants are defined" do
|
613
|
-
assert_not_nil(TaskScheduler::MONDAY)
|
614
|
-
assert_not_nil(TaskScheduler::TUESDAY)
|
615
|
-
assert_not_nil(TaskScheduler::WEDNESDAY)
|
616
|
-
assert_not_nil(TaskScheduler::THURSDAY)
|
617
|
-
assert_not_nil(TaskScheduler::FRIDAY)
|
618
|
-
assert_not_nil(TaskScheduler::SATURDAY)
|
619
|
-
assert_not_nil(TaskScheduler::SUNDAY)
|
620
|
-
end
|
621
|
-
|
622
|
-
test "expected month constants are defined" do
|
623
|
-
assert_not_nil(TaskScheduler::JANUARY)
|
624
|
-
assert_not_nil(TaskScheduler::FEBRUARY)
|
625
|
-
assert_not_nil(TaskScheduler::MARCH)
|
626
|
-
assert_not_nil(TaskScheduler::APRIL)
|
627
|
-
assert_not_nil(TaskScheduler::MAY)
|
628
|
-
assert_not_nil(TaskScheduler::JUNE)
|
629
|
-
assert_not_nil(TaskScheduler::JULY)
|
630
|
-
assert_not_nil(TaskScheduler::AUGUST)
|
631
|
-
assert_not_nil(TaskScheduler::SEPTEMBER)
|
632
|
-
assert_not_nil(TaskScheduler::OCTOBER)
|
633
|
-
assert_not_nil(TaskScheduler::NOVEMBER)
|
634
|
-
assert_not_nil(TaskScheduler::DECEMBER)
|
635
|
-
end
|
636
|
-
|
637
|
-
test "expected repeat constants are defined" do
|
638
|
-
assert_not_nil(TaskScheduler::ONCE)
|
639
|
-
assert_not_nil(TaskScheduler::DAILY)
|
640
|
-
assert_not_nil(TaskScheduler::WEEKLY)
|
641
|
-
assert_not_nil(TaskScheduler::MONTHLYDATE)
|
642
|
-
assert_not_nil(TaskScheduler::MONTHLYDOW)
|
643
|
-
end
|
644
|
-
|
645
|
-
test "expected start constants are defined" do
|
646
|
-
assert_not_nil(TaskScheduler::ON_IDLE)
|
647
|
-
assert_not_nil(TaskScheduler::AT_SYSTEMSTART)
|
648
|
-
assert_not_nil(TaskScheduler::AT_LOGON)
|
649
|
-
end
|
650
|
-
|
651
|
-
test "expected flag constants are defined" do
|
652
|
-
assert_not_nil(TaskScheduler::INTERACTIVE)
|
653
|
-
assert_not_nil(TaskScheduler::DELETE_WHEN_DONE)
|
654
|
-
assert_not_nil(TaskScheduler::DISABLED)
|
655
|
-
assert_not_nil(TaskScheduler::START_ONLY_IF_IDLE)
|
656
|
-
assert_not_nil(TaskScheduler::KILL_ON_IDLE_END)
|
657
|
-
assert_not_nil(TaskScheduler::DONT_START_IF_ON_BATTERIES)
|
658
|
-
assert_not_nil(TaskScheduler::KILL_IF_GOING_ON_BATTERIES)
|
659
|
-
assert_not_nil(TaskScheduler::HIDDEN)
|
660
|
-
assert_not_nil(TaskScheduler::RESTART_ON_IDLE_RESUME)
|
661
|
-
assert_not_nil(TaskScheduler::SYSTEM_REQUIRED)
|
662
|
-
assert_not_nil(TaskScheduler::FLAG_HAS_END_DATE)
|
663
|
-
assert_not_nil(TaskScheduler::FLAG_KILL_AT_DURATION_END)
|
664
|
-
assert_not_nil(TaskScheduler::FLAG_DISABLED)
|
665
|
-
assert_not_nil(TaskScheduler::MAX_RUN_TIMES)
|
666
|
-
end
|
667
|
-
|
668
|
-
test "expected priority constants are defined" do
|
669
|
-
assert_not_nil(TaskScheduler::IDLE)
|
670
|
-
assert_not_nil(TaskScheduler::NORMAL)
|
671
|
-
assert_not_nil(TaskScheduler::HIGH)
|
672
|
-
assert_not_nil(TaskScheduler::REALTIME)
|
673
|
-
assert_not_nil(TaskScheduler::ABOVE_NORMAL)
|
674
|
-
assert_not_nil(TaskScheduler::BELOW_NORMAL)
|
675
|
-
end
|
676
|
-
|
677
|
-
def teardown
|
678
|
-
@ts.delete(@task) if @ts.exists?(@task)
|
679
|
-
@ts
|
680
|
-
@
|
681
|
-
@
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
@@
|
687
|
-
@@
|
688
|
-
|
689
|
-
end
|
1
|
+
##########################################################################
|
2
|
+
# test_taskscheduler.rb
|
3
|
+
#
|
4
|
+
# Test suite for the win32-taskscheduler package. You should run this
|
5
|
+
# via the 'rake test' task.
|
6
|
+
##########################################################################
|
7
|
+
require 'win32/taskscheduler'
|
8
|
+
require 'win32/security'
|
9
|
+
require 'socket'
|
10
|
+
require 'test-unit'
|
11
|
+
require 'etc'
|
12
|
+
include Win32
|
13
|
+
|
14
|
+
class TC_TaskScheduler < Test::Unit::TestCase
|
15
|
+
def self.startup
|
16
|
+
@@host = Socket.gethostname
|
17
|
+
@@user = Etc.getlogin
|
18
|
+
@@elevated = Win32::Security.elevated_security?
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup
|
22
|
+
@task = 'foo'
|
23
|
+
|
24
|
+
@trigger = {
|
25
|
+
:start_year => 2015,
|
26
|
+
:start_month => 4,
|
27
|
+
:start_day => 11,
|
28
|
+
:start_hour => 7,
|
29
|
+
:start_minute => 14,
|
30
|
+
:trigger_type => TaskScheduler::DAILY,
|
31
|
+
:type => { :days_interval => 1 }
|
32
|
+
}
|
33
|
+
|
34
|
+
@ts = TaskScheduler.new
|
35
|
+
end
|
36
|
+
|
37
|
+
# Helper method
|
38
|
+
def setup_task
|
39
|
+
@ts.new_work_item(@task, @trigger)
|
40
|
+
@ts.activate(@task)
|
41
|
+
end
|
42
|
+
|
43
|
+
test "version constant is set to expected value" do
|
44
|
+
assert_equal('0.3.2', TaskScheduler::VERSION)
|
45
|
+
end
|
46
|
+
|
47
|
+
test "account_information method basic functionality" do
|
48
|
+
assert_respond_to(@ts, :account_information)
|
49
|
+
end
|
50
|
+
|
51
|
+
test "account_information returns the task owner" do
|
52
|
+
setup_task
|
53
|
+
assert_equal("#{@@host}\\#{@@user}", @ts.account_information)
|
54
|
+
end
|
55
|
+
|
56
|
+
test "account_information returns nil if no task has been activated" do
|
57
|
+
assert_nil(@ts.account_information)
|
58
|
+
end
|
59
|
+
|
60
|
+
test "account_information does not accept any arguments" do
|
61
|
+
assert_raise(ArgumentError){ @ts.account_information('foo') }
|
62
|
+
end
|
63
|
+
|
64
|
+
test "set_account_information basic functionality" do
|
65
|
+
assert_respond_to(@ts, :set_account_information)
|
66
|
+
end
|
67
|
+
|
68
|
+
test "set_account_information works as expected" do
|
69
|
+
setup_task
|
70
|
+
#assert_nothing_raised{ @ts.set_account_information(@@user, 'XXXX') }
|
71
|
+
#assert_equal('test', @ts.account_information)
|
72
|
+
end
|
73
|
+
|
74
|
+
test "set_account_information requires two arguments" do
|
75
|
+
setup_task
|
76
|
+
assert_raise(ArgumentError){ @ts.set_account_information }
|
77
|
+
assert_raise(ArgumentError){ @ts.set_account_information('x') }
|
78
|
+
assert_raise(ArgumentError){ @ts.set_account_information('x', 'y', 'z') }
|
79
|
+
end
|
80
|
+
|
81
|
+
test "arguments to set_account_information must be strings" do
|
82
|
+
setup_task
|
83
|
+
assert_raise(TypeError){ @ts.set_account_information(1, 'XXX') }
|
84
|
+
assert_raise(TypeError){ @ts.set_account_information('x', 1) }
|
85
|
+
end
|
86
|
+
|
87
|
+
test "activate method basic functionality" do
|
88
|
+
assert_respond_to(@ts, :activate)
|
89
|
+
end
|
90
|
+
|
91
|
+
test "activate behaves as expected" do
|
92
|
+
@ts.new_work_item(@task, @trigger)
|
93
|
+
assert_nothing_raised{ @ts.activate(@task) }
|
94
|
+
end
|
95
|
+
|
96
|
+
test "calling activate on the same object multiple times has no effect" do
|
97
|
+
@ts.new_work_item(@task, @trigger)
|
98
|
+
assert_nothing_raised{ @ts.activate(@task) }
|
99
|
+
assert_nothing_raised{ @ts.activate(@task) }
|
100
|
+
end
|
101
|
+
|
102
|
+
test "activate requires a single argument" do
|
103
|
+
assert_raise(ArgumentError){ @ts.activate }
|
104
|
+
assert_raise(ArgumentError){ @ts.activate('foo', 'bar') }
|
105
|
+
end
|
106
|
+
|
107
|
+
test "activate requires a string argument" do
|
108
|
+
assert_raise(TypeError){ @ts.activate(1) }
|
109
|
+
end
|
110
|
+
|
111
|
+
test "attempting to activate a bad task results in an error" do
|
112
|
+
assert_raise(TaskScheduler::Error){ @ts.activate('bogus') }
|
113
|
+
end
|
114
|
+
|
115
|
+
test "application_name basic functionality" do
|
116
|
+
assert_respond_to(@ts, :application_name)
|
117
|
+
end
|
118
|
+
|
119
|
+
test "application_name returns a string or nil" do
|
120
|
+
setup_task
|
121
|
+
assert_nothing_raised{ @ts.application_name }
|
122
|
+
assert_kind_of([String, NilClass], @ts.application_name)
|
123
|
+
end
|
124
|
+
|
125
|
+
test "application_name does not accept any arguments" do
|
126
|
+
assert_raises(ArgumentError){ @ts.application_name('bogus') }
|
127
|
+
end
|
128
|
+
|
129
|
+
test "application_name= basic functionality" do
|
130
|
+
assert_respond_to(@ts, :application_name=)
|
131
|
+
end
|
132
|
+
|
133
|
+
test "application_name= works as expected" do
|
134
|
+
setup_task
|
135
|
+
assert_nothing_raised{ @ts.application_name = "notepad.exe" }
|
136
|
+
assert_equal("notepad.exe", @ts.application_name)
|
137
|
+
end
|
138
|
+
|
139
|
+
test "application_name= requires a string argument" do
|
140
|
+
assert_raise(TypeError){ @ts.application_name = 1 }
|
141
|
+
end
|
142
|
+
|
143
|
+
test "comment method basic functionality" do
|
144
|
+
assert_respond_to(@ts, :comment)
|
145
|
+
end
|
146
|
+
|
147
|
+
test "comment method returns a string" do
|
148
|
+
setup_task
|
149
|
+
assert_nothing_raised{ @ts.comment }
|
150
|
+
assert_kind_of(String, @ts.comment)
|
151
|
+
end
|
152
|
+
|
153
|
+
test "comment method does not accept any arguments" do
|
154
|
+
assert_raise(ArgumentError){ @ts.comment('test') }
|
155
|
+
end
|
156
|
+
|
157
|
+
test "comment= method basic functionality" do
|
158
|
+
assert_respond_to(@ts, :comment=)
|
159
|
+
end
|
160
|
+
|
161
|
+
test "comment= works as expected" do
|
162
|
+
setup_task
|
163
|
+
assert_nothing_raised{ @ts.comment = "test" }
|
164
|
+
assert_equal("test", @ts.comment)
|
165
|
+
end
|
166
|
+
|
167
|
+
test "comment= method requires a string argument" do
|
168
|
+
assert_raise(TypeError){ @ts.comment = 1 }
|
169
|
+
end
|
170
|
+
|
171
|
+
test "creator method basic functionality" do
|
172
|
+
setup_task
|
173
|
+
assert_respond_to(@ts, :creator)
|
174
|
+
assert_nothing_raised{ @ts.creator }
|
175
|
+
assert_kind_of(String, @ts.creator)
|
176
|
+
end
|
177
|
+
|
178
|
+
test "creator method returns expected value" do
|
179
|
+
setup_task
|
180
|
+
assert_equal('', @ts.creator)
|
181
|
+
end
|
182
|
+
|
183
|
+
test "creator method does not accept any arguments" do
|
184
|
+
assert_raise(ArgumentError){ @ts.creator('foo') }
|
185
|
+
end
|
186
|
+
|
187
|
+
test "creator= method basic functionality" do
|
188
|
+
assert_respond_to(@ts, :creator=)
|
189
|
+
end
|
190
|
+
|
191
|
+
test "creator= method works as expected" do
|
192
|
+
setup_task
|
193
|
+
assert_nothing_raised{ @ts.creator = "Test Creator" }
|
194
|
+
assert_equal("Test Creator", @ts.creator)
|
195
|
+
end
|
196
|
+
|
197
|
+
test "creator= method requires a string argument" do
|
198
|
+
assert_raise(TypeError){ @ts.creator = 1 }
|
199
|
+
end
|
200
|
+
|
201
|
+
test "delete method basic functionality" do
|
202
|
+
assert_respond_to(@ts, :delete)
|
203
|
+
end
|
204
|
+
|
205
|
+
test "delete method works as expected" do
|
206
|
+
setup_task
|
207
|
+
assert_nothing_raised{ @ts.delete(@task) }
|
208
|
+
assert_false(@ts.exists?(@task))
|
209
|
+
end
|
210
|
+
|
211
|
+
test "delete method requires a single argument" do
|
212
|
+
assert_raise(ArgumentError){ @ts.delete }
|
213
|
+
end
|
214
|
+
|
215
|
+
test "delete method raises an error if the task does not exist" do
|
216
|
+
assert_raise(TaskScheduler::Error){ @ts.delete("foofoo") }
|
217
|
+
end
|
218
|
+
|
219
|
+
test "enum basic functionality" do
|
220
|
+
assert_respond_to(@ts, :enum)
|
221
|
+
assert_nothing_raised{ @ts.enum }
|
222
|
+
end
|
223
|
+
|
224
|
+
test "enum method returns an array of strings" do
|
225
|
+
assert_kind_of(Array, @ts.enum)
|
226
|
+
assert_kind_of(String, @ts.enum.first)
|
227
|
+
end
|
228
|
+
|
229
|
+
test "tasks is an alias for enum" do
|
230
|
+
assert_respond_to(@ts, :tasks)
|
231
|
+
assert_alias_method(@ts, :tasks, :enum)
|
232
|
+
end
|
233
|
+
|
234
|
+
test "enum method does not accept any arguments" do
|
235
|
+
assert_raise(ArgumentError){ @ts.enum(1) }
|
236
|
+
end
|
237
|
+
|
238
|
+
test "exists? basic functionality" do
|
239
|
+
assert_respond_to(@ts, :exists?)
|
240
|
+
assert_boolean(@ts.exists?(@task))
|
241
|
+
end
|
242
|
+
|
243
|
+
test "exists? returns expected value" do
|
244
|
+
setup_task
|
245
|
+
assert_true(@ts.exists?(@task))
|
246
|
+
assert_false(@ts.exists?('bogusXYZ'))
|
247
|
+
end
|
248
|
+
|
249
|
+
test "exists? method requires a single argument" do
|
250
|
+
assert_raise(ArgumentError){ @ts.exists? }
|
251
|
+
assert_raise(ArgumentError){ @ts.exists?('foo', 'bar') }
|
252
|
+
end
|
253
|
+
|
254
|
+
test "exit_code basic functionality" do
|
255
|
+
setup_task
|
256
|
+
assert_respond_to(@ts, :exit_code)
|
257
|
+
assert_nothing_raised{ @ts.exit_code }
|
258
|
+
assert_kind_of(Fixnum, @ts.exit_code)
|
259
|
+
end
|
260
|
+
|
261
|
+
test "exit_code takes no arguments" do
|
262
|
+
assert_raise(ArgumentError){ @ts.exit_code(true) }
|
263
|
+
assert_raise(NoMethodError){ @ts.exit_code = 1 }
|
264
|
+
end
|
265
|
+
|
266
|
+
test "machine= basic functionality" do
|
267
|
+
assert_respond_to(@ts, :machine=)
|
268
|
+
end
|
269
|
+
|
270
|
+
test "machine= works as expected" do
|
271
|
+
omit_unless(@@elevated)
|
272
|
+
setup_task
|
273
|
+
assert_nothing_raised{ @ts.machine = @@host }
|
274
|
+
assert_equal(@@host, @ts.machine)
|
275
|
+
end
|
276
|
+
|
277
|
+
test "host= is an alias for machine=" do
|
278
|
+
assert_alias_method(@ts, :machine=, :host=)
|
279
|
+
end
|
280
|
+
|
281
|
+
test "set_machine basic functionality" do
|
282
|
+
assert_respond_to(@ts, :set_machine)
|
283
|
+
end
|
284
|
+
|
285
|
+
test "set_host is an alias for set_machine" do
|
286
|
+
assert_alias_method(@ts, :set_machine, :set_host)
|
287
|
+
end
|
288
|
+
|
289
|
+
test "max_run_time basic functionality" do
|
290
|
+
assert_respond_to(@ts, :max_run_time)
|
291
|
+
end
|
292
|
+
|
293
|
+
test "max_run_time works as expected" do
|
294
|
+
setup_task
|
295
|
+
assert_nothing_raised{ @ts.max_run_time }
|
296
|
+
assert_kind_of(Fixnum, @ts.max_run_time)
|
297
|
+
end
|
298
|
+
|
299
|
+
test "max_run_time accepts no arguments" do
|
300
|
+
assert_raise(ArgumentError){ @ts.max_run_time(true) }
|
301
|
+
end
|
302
|
+
|
303
|
+
test "max_run_time= basic functionality" do
|
304
|
+
assert_respond_to(@ts, :max_run_time=)
|
305
|
+
end
|
306
|
+
|
307
|
+
test "max_run_time= works as expected" do
|
308
|
+
setup_task
|
309
|
+
assert_nothing_raised{ @ts.max_run_time = 20000 }
|
310
|
+
assert_equal(20000, @ts.max_run_time)
|
311
|
+
end
|
312
|
+
|
313
|
+
test "max_run_time= requires a numeric argument" do
|
314
|
+
assert_raise(TypeError){ @ts.max_run_time = true }
|
315
|
+
end
|
316
|
+
|
317
|
+
test "most_recent_run_time basic functionality" do
|
318
|
+
setup_task
|
319
|
+
assert_respond_to(@ts, :most_recent_run_time)
|
320
|
+
assert_nothing_raised{ @ts.most_recent_run_time }
|
321
|
+
end
|
322
|
+
|
323
|
+
test "most_recent_run_time is nil if task hasn't run" do
|
324
|
+
setup_task
|
325
|
+
assert_nil(@ts.most_recent_run_time)
|
326
|
+
end
|
327
|
+
|
328
|
+
test "most_recent_run_time does not accept any arguments" do
|
329
|
+
assert_raise(ArgumentError){ @ts.most_recent_run_time(true) }
|
330
|
+
assert_raise(NoMethodError){ @ts.most_recent_run_time = Time.now }
|
331
|
+
end
|
332
|
+
|
333
|
+
test "new_work_item basic functionality" do
|
334
|
+
assert_respond_to(@ts, :new_work_item)
|
335
|
+
end
|
336
|
+
|
337
|
+
test "new_work_item accepts a trigger/hash" do
|
338
|
+
assert_nothing_raised{ @ts.new_work_item('bar', @trigger) }
|
339
|
+
end
|
340
|
+
|
341
|
+
test "new_work_item fails if a bogus trigger key is present" do
|
342
|
+
assert_raise(ArgumentError){ @ts.new_work_item('test', {:bogus => 1}) }
|
343
|
+
end
|
344
|
+
|
345
|
+
test "new_task is an alias for new_work_item" do
|
346
|
+
assert_respond_to(@ts, :new_task)
|
347
|
+
assert_alias_method(@ts, :new_task, :new_work_item)
|
348
|
+
end
|
349
|
+
|
350
|
+
test "new_work_item requires a task name and a trigger" do
|
351
|
+
assert_raise(ArgumentError){ @ts.new_work_item }
|
352
|
+
assert_raise(ArgumentError){ @ts.new_work_item('bar') }
|
353
|
+
end
|
354
|
+
|
355
|
+
test "new_work_item expects a string for the first argument" do
|
356
|
+
assert_raise(TypeError){ @ts.new_work_item(1, @trigger) }
|
357
|
+
end
|
358
|
+
|
359
|
+
test "new_work_item expects a hash for the second argument" do
|
360
|
+
assert_raise(TypeError){ @ts.new_work_item(@task, 1) }
|
361
|
+
end
|
362
|
+
|
363
|
+
test "next_run_time basic functionality" do
|
364
|
+
assert_respond_to(@ts, :next_run_time)
|
365
|
+
end
|
366
|
+
|
367
|
+
test "next_run_time returns a Time object" do
|
368
|
+
setup_task
|
369
|
+
assert_nothing_raised{ @ts.next_run_time }
|
370
|
+
assert_kind_of(Time, @ts.next_run_time)
|
371
|
+
end
|
372
|
+
|
373
|
+
test "next_run_time does not take any arguments" do
|
374
|
+
assert_raise(ArgumentError){ @ts.next_run_time(true) }
|
375
|
+
assert_raise(NoMethodError){ @ts.next_run_time = Time.now }
|
376
|
+
end
|
377
|
+
|
378
|
+
test "parameters basic functionality" do
|
379
|
+
setup_task
|
380
|
+
assert_respond_to(@ts, :parameters)
|
381
|
+
assert_nothing_raised{ @ts.parameters }
|
382
|
+
end
|
383
|
+
|
384
|
+
test "parameters method does not take any arguments" do
|
385
|
+
assert_raise(ArgumentError){ @ts.parameters('test') }
|
386
|
+
end
|
387
|
+
|
388
|
+
test "parameters= basic functionality" do
|
389
|
+
assert_respond_to(@ts, :parameters=)
|
390
|
+
end
|
391
|
+
|
392
|
+
test "parameters= works as expected" do
|
393
|
+
setup_task
|
394
|
+
assert_nothing_raised{ @ts.parameters = "somefile.txt" }
|
395
|
+
assert_equal("somefile.txt", @ts.parameters)
|
396
|
+
end
|
397
|
+
|
398
|
+
test "parameters= requires a string argument" do
|
399
|
+
assert_raise(ArgumentError){ @ts.send(:parameters=) }
|
400
|
+
assert_raise(TypeError){ @ts.parameters = 1 }
|
401
|
+
end
|
402
|
+
|
403
|
+
test "priority basic functionality" do
|
404
|
+
assert_respond_to(@ts, :priority)
|
405
|
+
end
|
406
|
+
|
407
|
+
test "priority returns the expected value" do
|
408
|
+
setup_task
|
409
|
+
assert_nothing_raised{ @ts.priority }
|
410
|
+
assert_kind_of(String, @ts.priority)
|
411
|
+
end
|
412
|
+
|
413
|
+
test "priority method does not accept any arguments" do
|
414
|
+
assert_raise(ArgumentError){ @ts.priority(true) }
|
415
|
+
end
|
416
|
+
|
417
|
+
test "priority= basic functionality" do
|
418
|
+
assert_respond_to(@ts, :priority=)
|
419
|
+
end
|
420
|
+
|
421
|
+
test "priority= works as expected" do
|
422
|
+
setup_task
|
423
|
+
assert_nothing_raised{ @ts.priority = TaskScheduler::NORMAL }
|
424
|
+
assert_equal('normal', @ts.priority)
|
425
|
+
end
|
426
|
+
|
427
|
+
test "priority= requires a numeric argument" do
|
428
|
+
assert_raise(TypeError){ @ts.priority = 'alpha' }
|
429
|
+
end
|
430
|
+
|
431
|
+
# TODO: Find a harmless way to test this.
|
432
|
+
test "run basic functionality" do
|
433
|
+
assert_respond_to(@ts, :run)
|
434
|
+
end
|
435
|
+
|
436
|
+
test "run does not accept any arguments" do
|
437
|
+
assert_raise(ArgumentError){ @ts.run(true) }
|
438
|
+
assert_raise(NoMethodError){ @ts.run = true }
|
439
|
+
end
|
440
|
+
|
441
|
+
test "save basic functionality" do
|
442
|
+
assert_respond_to(@ts, :save)
|
443
|
+
end
|
444
|
+
|
445
|
+
test "status basic functionality" do
|
446
|
+
setup_task
|
447
|
+
assert_respond_to(@ts, :status)
|
448
|
+
assert_nothing_raised{ @ts.status }
|
449
|
+
assert_kind_of(String, @ts.status)
|
450
|
+
end
|
451
|
+
|
452
|
+
test "status returns the expected value" do
|
453
|
+
setup_task
|
454
|
+
assert_equal('ready', @ts.status)
|
455
|
+
end
|
456
|
+
|
457
|
+
test "status does not accept any arguments" do
|
458
|
+
assert_raise(ArgumentError){ @ts.status(true) }
|
459
|
+
end
|
460
|
+
|
461
|
+
test "terminate basic functionality" do
|
462
|
+
assert_respond_to(@ts, :terminate)
|
463
|
+
end
|
464
|
+
|
465
|
+
test "terminate does not accept any arguments" do
|
466
|
+
assert_raise(ArgumentError){ @ts.terminate(true) }
|
467
|
+
assert_raise(NoMethodError){ @ts.terminate = true }
|
468
|
+
end
|
469
|
+
|
470
|
+
test "calling terminate on a task that isn't running raises an error" do
|
471
|
+
assert_raise(TaskScheduler::Error){ @ts.terminate }
|
472
|
+
end
|
473
|
+
|
474
|
+
test "trigger basic functionality" do
|
475
|
+
setup_task
|
476
|
+
assert_respond_to(@ts, :trigger)
|
477
|
+
assert_nothing_raised{ @ts.trigger(0) }
|
478
|
+
end
|
479
|
+
|
480
|
+
test "trigger returns a hash object" do
|
481
|
+
setup_task
|
482
|
+
assert_kind_of(Hash, @ts.trigger(0))
|
483
|
+
end
|
484
|
+
|
485
|
+
test "trigger requires an index" do
|
486
|
+
assert_raises(ArgumentError){ @ts.trigger }
|
487
|
+
end
|
488
|
+
|
489
|
+
test "trigger raises an error if the index is invalid" do
|
490
|
+
assert_raises(TaskScheduler::Error){ @ts.trigger(9999) }
|
491
|
+
end
|
492
|
+
|
493
|
+
test "trigger= basic functionality" do
|
494
|
+
assert_respond_to(@ts, :trigger=)
|
495
|
+
end
|
496
|
+
|
497
|
+
test "trigger= works as expected" do
|
498
|
+
setup_task
|
499
|
+
assert_nothing_raised{ @ts.trigger = @trigger }
|
500
|
+
end
|
501
|
+
|
502
|
+
test "trigger= requires a hash argument" do
|
503
|
+
assert_raises(TypeError){ @ts.trigger = 'blah' }
|
504
|
+
end
|
505
|
+
|
506
|
+
test "add_trigger basic functionality" do
|
507
|
+
assert_respond_to(@ts, :add_trigger)
|
508
|
+
end
|
509
|
+
|
510
|
+
test "add_trigger works as expected" do
|
511
|
+
setup_task
|
512
|
+
assert_nothing_raised{ @ts.add_trigger(0, @trigger) }
|
513
|
+
end
|
514
|
+
|
515
|
+
test "add_trigger requires two arguments" do
|
516
|
+
assert_raises(ArgumentError){ @ts.add_trigger }
|
517
|
+
assert_raises(ArgumentError){ @ts.add_trigger(0) }
|
518
|
+
end
|
519
|
+
|
520
|
+
test "add_trigger reqiuires an integer for the first argument" do
|
521
|
+
assert_raises(TypeError){ @ts.add_trigger('foo', @trigger) }
|
522
|
+
end
|
523
|
+
|
524
|
+
test "add_trigger reqiuires a hash for the second argument" do
|
525
|
+
assert_raises(TypeError){ @ts.add_trigger(0, 'foo') }
|
526
|
+
end
|
527
|
+
|
528
|
+
test "trigger_count basic functionality" do
|
529
|
+
setup_task
|
530
|
+
assert_respond_to(@ts, :trigger_count)
|
531
|
+
assert_nothing_raised{ @ts.trigger_count }
|
532
|
+
assert_kind_of(Fixnum, @ts.trigger_count)
|
533
|
+
end
|
534
|
+
|
535
|
+
test "trigger_count returns the expected value" do
|
536
|
+
setup_task
|
537
|
+
assert_equal(1, @ts.trigger_count)
|
538
|
+
end
|
539
|
+
|
540
|
+
test "trigger_count does not accept any arguments" do
|
541
|
+
assert_raise(ArgumentError){ @ts.trigger_count(true) }
|
542
|
+
assert_raise(NoMethodError){ @ts.trigger_count = 1 }
|
543
|
+
end
|
544
|
+
|
545
|
+
test "delete_trigger basic functionality" do
|
546
|
+
assert_respond_to(@ts, :delete_trigger)
|
547
|
+
end
|
548
|
+
|
549
|
+
test "delete_trigger works as expected" do
|
550
|
+
setup_task
|
551
|
+
assert_nothing_raised{ @ts.delete_trigger(0) }
|
552
|
+
assert_equal(0, @ts.trigger_count)
|
553
|
+
end
|
554
|
+
|
555
|
+
test "passing a bad index to delete_trigger will raise an error" do
|
556
|
+
assert_raise(TaskScheduler::Error){ @ts.delete_trigger(9999) }
|
557
|
+
end
|
558
|
+
|
559
|
+
test "delete_trigger requires at least one argument" do
|
560
|
+
assert_raise(ArgumentError){ @ts.delete_trigger }
|
561
|
+
end
|
562
|
+
|
563
|
+
test "trigger_string basic functionality" do
|
564
|
+
setup_task
|
565
|
+
assert_respond_to(@ts, :trigger_string)
|
566
|
+
assert_nothing_raised{ @ts.trigger_string(0) }
|
567
|
+
end
|
568
|
+
|
569
|
+
test "trigger_string returns the expected value" do
|
570
|
+
setup_task
|
571
|
+
assert_equal('Starting 2015-04-11T07:14:00', @ts.trigger_string(0))
|
572
|
+
end
|
573
|
+
|
574
|
+
test "trigger_string requires a single argument" do
|
575
|
+
assert_raise(ArgumentError){ @ts.trigger_string }
|
576
|
+
assert_raise(ArgumentError){ @ts.trigger_string(0, 0) }
|
577
|
+
end
|
578
|
+
|
579
|
+
test "trigger_string requires a numeric argument" do
|
580
|
+
assert_raise(TypeError){ @ts.trigger_string('alpha') }
|
581
|
+
end
|
582
|
+
|
583
|
+
test "trigger_string raises an error if the index is invalid" do
|
584
|
+
assert_raise(TaskScheduler::Error){ @ts.trigger_string(9999) }
|
585
|
+
end
|
586
|
+
|
587
|
+
test "working_directory basic functionality" do
|
588
|
+
setup_task
|
589
|
+
assert_respond_to(@ts, :working_directory)
|
590
|
+
assert_nothing_raised{ @ts.working_directory }
|
591
|
+
assert_kind_of(String, @ts.working_directory)
|
592
|
+
end
|
593
|
+
|
594
|
+
test "working_directory takes no arguments" do
|
595
|
+
assert_raise(ArgumentError){ @ts.working_directory(true) }
|
596
|
+
end
|
597
|
+
|
598
|
+
test "working_directory= basic functionality" do
|
599
|
+
assert_respond_to(@ts, :working_directory=)
|
600
|
+
end
|
601
|
+
|
602
|
+
test "working_directory= works as expected" do
|
603
|
+
setup_task
|
604
|
+
assert_nothing_raised{ @ts.working_directory = "C:\\" }
|
605
|
+
end
|
606
|
+
|
607
|
+
test "working_directory= requires a string argument" do
|
608
|
+
setup_task
|
609
|
+
assert_raise(TypeError){ @ts.working_directory = 1 }
|
610
|
+
end
|
611
|
+
|
612
|
+
test "expected day constants are defined" do
|
613
|
+
assert_not_nil(TaskScheduler::MONDAY)
|
614
|
+
assert_not_nil(TaskScheduler::TUESDAY)
|
615
|
+
assert_not_nil(TaskScheduler::WEDNESDAY)
|
616
|
+
assert_not_nil(TaskScheduler::THURSDAY)
|
617
|
+
assert_not_nil(TaskScheduler::FRIDAY)
|
618
|
+
assert_not_nil(TaskScheduler::SATURDAY)
|
619
|
+
assert_not_nil(TaskScheduler::SUNDAY)
|
620
|
+
end
|
621
|
+
|
622
|
+
test "expected month constants are defined" do
|
623
|
+
assert_not_nil(TaskScheduler::JANUARY)
|
624
|
+
assert_not_nil(TaskScheduler::FEBRUARY)
|
625
|
+
assert_not_nil(TaskScheduler::MARCH)
|
626
|
+
assert_not_nil(TaskScheduler::APRIL)
|
627
|
+
assert_not_nil(TaskScheduler::MAY)
|
628
|
+
assert_not_nil(TaskScheduler::JUNE)
|
629
|
+
assert_not_nil(TaskScheduler::JULY)
|
630
|
+
assert_not_nil(TaskScheduler::AUGUST)
|
631
|
+
assert_not_nil(TaskScheduler::SEPTEMBER)
|
632
|
+
assert_not_nil(TaskScheduler::OCTOBER)
|
633
|
+
assert_not_nil(TaskScheduler::NOVEMBER)
|
634
|
+
assert_not_nil(TaskScheduler::DECEMBER)
|
635
|
+
end
|
636
|
+
|
637
|
+
test "expected repeat constants are defined" do
|
638
|
+
assert_not_nil(TaskScheduler::ONCE)
|
639
|
+
assert_not_nil(TaskScheduler::DAILY)
|
640
|
+
assert_not_nil(TaskScheduler::WEEKLY)
|
641
|
+
assert_not_nil(TaskScheduler::MONTHLYDATE)
|
642
|
+
assert_not_nil(TaskScheduler::MONTHLYDOW)
|
643
|
+
end
|
644
|
+
|
645
|
+
test "expected start constants are defined" do
|
646
|
+
assert_not_nil(TaskScheduler::ON_IDLE)
|
647
|
+
assert_not_nil(TaskScheduler::AT_SYSTEMSTART)
|
648
|
+
assert_not_nil(TaskScheduler::AT_LOGON)
|
649
|
+
end
|
650
|
+
|
651
|
+
test "expected flag constants are defined" do
|
652
|
+
assert_not_nil(TaskScheduler::INTERACTIVE)
|
653
|
+
assert_not_nil(TaskScheduler::DELETE_WHEN_DONE)
|
654
|
+
assert_not_nil(TaskScheduler::DISABLED)
|
655
|
+
assert_not_nil(TaskScheduler::START_ONLY_IF_IDLE)
|
656
|
+
assert_not_nil(TaskScheduler::KILL_ON_IDLE_END)
|
657
|
+
assert_not_nil(TaskScheduler::DONT_START_IF_ON_BATTERIES)
|
658
|
+
assert_not_nil(TaskScheduler::KILL_IF_GOING_ON_BATTERIES)
|
659
|
+
assert_not_nil(TaskScheduler::HIDDEN)
|
660
|
+
assert_not_nil(TaskScheduler::RESTART_ON_IDLE_RESUME)
|
661
|
+
assert_not_nil(TaskScheduler::SYSTEM_REQUIRED)
|
662
|
+
assert_not_nil(TaskScheduler::FLAG_HAS_END_DATE)
|
663
|
+
assert_not_nil(TaskScheduler::FLAG_KILL_AT_DURATION_END)
|
664
|
+
assert_not_nil(TaskScheduler::FLAG_DISABLED)
|
665
|
+
assert_not_nil(TaskScheduler::MAX_RUN_TIMES)
|
666
|
+
end
|
667
|
+
|
668
|
+
test "expected priority constants are defined" do
|
669
|
+
assert_not_nil(TaskScheduler::IDLE)
|
670
|
+
assert_not_nil(TaskScheduler::NORMAL)
|
671
|
+
assert_not_nil(TaskScheduler::HIGH)
|
672
|
+
assert_not_nil(TaskScheduler::REALTIME)
|
673
|
+
assert_not_nil(TaskScheduler::ABOVE_NORMAL)
|
674
|
+
assert_not_nil(TaskScheduler::BELOW_NORMAL)
|
675
|
+
end
|
676
|
+
|
677
|
+
def teardown
|
678
|
+
@ts.delete(@task) if @ts.exists?(@task)
|
679
|
+
@ts.delete('bar') if @ts.exists?('bar')
|
680
|
+
@ts = nil
|
681
|
+
@task = nil
|
682
|
+
@trigger = nil
|
683
|
+
end
|
684
|
+
|
685
|
+
def self.shutdown
|
686
|
+
@@host = nil
|
687
|
+
@@user = nil
|
688
|
+
@@elevated = nil
|
689
|
+
end
|
690
|
+
end
|