win32-taskscheduler 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,42 +1,45 @@
1
- require 'ffi'
2
-
3
- module Windows
4
- module Helper
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
- buf = FFI::MemoryPointer.new(:char, 1024)
18
-
19
- flags = FORMAT_MESSAGE_IGNORE_INSERTS |
20
- FORMAT_MESSAGE_FROM_SYSTEM |
21
- FORMAT_MESSAGE_MAX_WIDTH_MASK
22
-
23
- # 0x0409 == MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
24
- # We use English for errors because Ruby uses English for errors.
25
- len = FormatMessage(flags, nil, err , 0x0409, buf, buf.size, nil)
26
-
27
- function + ': ' + buf.read_string(len).strip
28
- end
29
-
30
- def ole_error(function, err)
31
- regex = /OLE error code:(.*?)\sin/
32
- match = regex.match(err.to_s)
33
-
34
- if match
35
- error = match.captures.first.hex
36
- win_error(function, error)
37
- else
38
- msg
39
- end
40
- end
41
- end
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
@@ -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.1', 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 = nil
680
- @task = nil
681
- @trigger = nil
682
- end
683
-
684
- def self.shutdown
685
- @@host = nil
686
- @@user = nil
687
- @@elevated = nil
688
- end
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