rufus-scheduler 3.0.8 → 3.2.0

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.
@@ -1,1049 +0,0 @@
1
-
2
- #
3
- # Specifying rufus-scheduler
4
- #
5
- # Wed Apr 17 06:00:59 JST 2013
6
- #
7
-
8
- require 'spec_helper'
9
-
10
-
11
- describe Rufus::Scheduler do
12
-
13
- describe '#initialize' do
14
-
15
- it 'starts the scheduler thread' do
16
-
17
- scheduler = Rufus::Scheduler.new
18
-
19
- t = Thread.list.find { |t|
20
- t[:name] == "rufus_scheduler_#{scheduler.object_id}_scheduler"
21
- }
22
-
23
- expect(t[:rufus_scheduler]).to eq(scheduler)
24
- end
25
-
26
- it 'sets :name and :rufus_scheduler in the scheduler thread local vars' do
27
-
28
- scheduler = Rufus::Scheduler.new
29
-
30
- expect(scheduler.thread[:name]).to eq(
31
- "rufus_scheduler_#{scheduler.object_id}_scheduler"
32
- )
33
- expect(scheduler.thread[:rufus_scheduler]).to eq(
34
- scheduler
35
- )
36
- end
37
-
38
- it 'accepts a :frequency => integer option' do
39
-
40
- scheduler = Rufus::Scheduler.new(:frequency => 2)
41
-
42
- expect(scheduler.frequency).to eq(2)
43
- end
44
-
45
- it 'accepts a :frequency => "2h1m" option' do
46
-
47
- scheduler = Rufus::Scheduler.new(:frequency => '2h1m')
48
-
49
- expect(scheduler.frequency).to eq(3600 * 2 + 60)
50
- end
51
-
52
- it 'accepts a :thread_name option' do
53
-
54
- scheduler = Rufus::Scheduler.new(:thread_name => 'oliphant')
55
-
56
- t = Thread.list.find { |t| t[:name] == 'oliphant' }
57
-
58
- expect(t[:rufus_scheduler]).to eq(scheduler)
59
- end
60
-
61
- #it 'accepts a :min_work_threads option' do
62
- # scheduler = Rufus::Scheduler.new(:min_work_threads => 9)
63
- # scheduler.min_work_threads.should == 9
64
- #end
65
-
66
- it 'accepts a :max_work_threads option' do
67
-
68
- scheduler = Rufus::Scheduler.new(:max_work_threads => 9)
69
-
70
- expect(scheduler.max_work_threads).to eq(9)
71
- end
72
- end
73
-
74
- before :each do
75
- @scheduler = Rufus::Scheduler.new
76
- end
77
- after :each do
78
- @scheduler.shutdown
79
- end
80
-
81
- describe 'a schedule method' do
82
-
83
- it 'passes the job to its block when it triggers' do
84
-
85
- j = nil
86
- job = @scheduler.schedule_in('0s') { |jj| j = jj }
87
-
88
- sleep 0.4
89
-
90
- expect(j).to eq(job)
91
- end
92
-
93
- it 'passes the trigger time as second block argument' do
94
-
95
- t = nil
96
- @scheduler.schedule_in('0s') { |jj, tt| t = tt }
97
-
98
- sleep 0.4
99
-
100
- expect(t.class).to eq(Time)
101
- end
102
-
103
- class MyHandler
104
- attr_reader :counter
105
- def initialize
106
- @counter = 0
107
- end
108
- def call(job, time)
109
- @counter = @counter + 1
110
- end
111
- end
112
-
113
- it 'accepts a callable object instead of a block' do
114
-
115
- mh = MyHandler.new
116
-
117
- @scheduler.schedule_in('0s', mh)
118
-
119
- sleep 0.4
120
-
121
- expect(mh.counter).to eq(1)
122
- end
123
-
124
- class MyOtherHandler
125
- attr_reader :counter
126
- def initialize
127
- @counter = 0
128
- end
129
- def call
130
- @counter = @counter + 1
131
- end
132
- end
133
-
134
- it 'accepts a callable obj instead of a block (#call with no args)' do
135
-
136
- job = @scheduler.schedule_in('0s', MyOtherHandler.new)
137
-
138
- sleep 0.4
139
-
140
- expect(job.handler.counter).to eq(1)
141
- end
142
-
143
- it 'accepts a class as callable' do
144
-
145
- job =
146
- @scheduler.schedule_in('0s', Class.new do
147
- attr_reader :value
148
- def call
149
- @value = 7
150
- end
151
- end)
152
-
153
- sleep 0.4
154
-
155
- expect(job.handler.value).to eq(7)
156
- end
157
-
158
- it 'raises if the scheduler is shutting down' do
159
-
160
- @scheduler.shutdown
161
-
162
- expect {
163
- @scheduler.in('0s') { puts 'hhhhhhhhhhhello!!' }
164
- }.to raise_error(Rufus::Scheduler::NotRunningError)
165
- end
166
- end
167
-
168
- describe '#in / #at' do
169
-
170
- # scheduler.in(2.hours.from_now) { ... }
171
-
172
- it 'accepts point in time and duration indifferently (#in)' do
173
-
174
- seen = false
175
-
176
- t = Time.now + 1
177
-
178
- @scheduler.in(t) { seen = true }
179
-
180
- sleep 0.1 while seen != true
181
- end
182
-
183
- it 'accepts point in time and duration indifferently (#at)' do
184
-
185
- seen = false
186
-
187
- t = 1
188
-
189
- @scheduler.at(t) { seen = true }
190
-
191
- sleep 0.1 while seen != true
192
- end
193
- end
194
-
195
- describe '#schedule' do
196
-
197
- it 'accepts a duration and schedules an InJob' do
198
-
199
- j = @scheduler.schedule '1s' do; end
200
-
201
- expect(j.class).to eq(Rufus::Scheduler::InJob)
202
- expect(j.original).to eq('1s')
203
- end
204
-
205
- it 'accepts a point in time and schedules an AtJob' do
206
-
207
- j = @scheduler.schedule '2070/12/24 23:00' do; end
208
-
209
- expect(j.class).to eq(Rufus::Scheduler::AtJob)
210
- expect(j.next_time.strftime('%Y %m %d')).to eq('2070 12 24')
211
- end
212
-
213
- it 'accepts a cron string and schedules a CronJob' do
214
-
215
- j = @scheduler.schedule '* * * * *' do; end
216
-
217
- expect(j.class).to eq(Rufus::Scheduler::CronJob)
218
- end
219
- end
220
-
221
- describe '#repeat' do
222
-
223
- it 'accepts a duration and schedules an EveryJob' do
224
-
225
- j = @scheduler.repeat '1s' do; end
226
-
227
- expect(j.class).to eq(Rufus::Scheduler::EveryJob)
228
- end
229
-
230
- it 'accepts a cron string and schedules a CronJob' do
231
-
232
- j = @scheduler.repeat '* * * * *' do; end
233
-
234
- expect(j.class).to eq(Rufus::Scheduler::CronJob)
235
- end
236
- end
237
-
238
- describe '#unschedule(job_or_work_id)' do
239
-
240
- it 'accepts job ids' do
241
-
242
- job = @scheduler.schedule_in '10d' do; end
243
-
244
- expect(job.unscheduled_at).to eq(nil)
245
-
246
- @scheduler.unschedule(job.id)
247
-
248
- expect(job.unscheduled_at).not_to eq(nil)
249
- end
250
-
251
- it 'accepts jobs' do
252
-
253
- job = @scheduler.schedule_in '10d' do; end
254
-
255
- expect(job.unscheduled_at).to eq(nil)
256
-
257
- @scheduler.unschedule(job)
258
-
259
- expect(job.unscheduled_at).not_to eq(nil)
260
- end
261
-
262
- it 'carefully unschedules repeat jobs' do
263
-
264
- counter = 0
265
-
266
- job =
267
- @scheduler.schedule_every '0.5s' do
268
- counter = counter + 1
269
- end
270
-
271
- sleep 1.5
272
- c = counter
273
-
274
- @scheduler.unschedule(job)
275
-
276
- sleep 1.5
277
- expect(counter).to eq(c)
278
- end
279
- end
280
-
281
- describe '#uptime' do
282
-
283
- it 'returns the uptime as a float' do
284
-
285
- expect(@scheduler.uptime).to be >= 0.0
286
- end
287
- end
288
-
289
- describe '#uptime_s' do
290
-
291
- it 'returns the uptime as a human readable string' do
292
-
293
- sleep 1
294
-
295
- expect(@scheduler.uptime_s).to match(/^[12]s\d+$/)
296
- end
297
- end
298
-
299
- describe '#join' do
300
-
301
- it 'joins the scheduler thread' do
302
-
303
- t = Thread.new { @scheduler.join; Thread.current['a'] = 'over' }
304
-
305
- expect(t['a']).to eq(nil)
306
-
307
- @scheduler.shutdown
308
-
309
- sleep(1)
310
-
311
- expect(t['a']).to eq('over')
312
- end
313
- end
314
-
315
- describe '#job(job_id)' do
316
-
317
- it 'returns nil if there is no corresponding Job instance' do
318
-
319
- expect(@scheduler.job('nada')).to eq(nil)
320
- end
321
-
322
- it 'returns the corresponding Job instance' do
323
-
324
- job_id = @scheduler.in '10d' do; end
325
-
326
- sleep(1) # give it some time to get scheduled
327
-
328
- expect(@scheduler.job(job_id).job_id).to eq(job_id)
329
- end
330
- end
331
-
332
- # describe '#find_by_tag(t)' do
333
- #
334
- # it 'returns an empty list when there are no jobs with the given tag' do
335
- #
336
- # @scheduler.find_by_tag('nada').should == []
337
- # end
338
- #
339
- # it 'returns all the jobs with the given tag' do
340
- #
341
- # @scheduler.in '10d', :tag => 't0' do; end
342
- # @scheduler.every '2h', :tag => %w[ t0 t1 ] do; end
343
- # @scheduler.every '3h' do; end
344
- #
345
- # @scheduler.find_by_tag('t0').map(&:original).should ==
346
- # %w[ 2h 10d ]
347
- # @scheduler.find_by_tag('t1').map(&:original).should ==
348
- # %w[ 2h ]
349
- # @scheduler.find_by_tag('t1', 't0').map(&:original).sort.should ==
350
- # %w[ 2h ]
351
- # end
352
- # end
353
-
354
- describe '#threads' do
355
-
356
- it 'just lists the main thread (scheduler thread) when no job is scheduled' do
357
-
358
- expect(@scheduler.threads).to eq([ @scheduler.thread ])
359
- end
360
-
361
- it 'lists all the threads a scheduler uses' do
362
-
363
- @scheduler.in '0s' do
364
- sleep(2)
365
- end
366
-
367
- sleep 0.4
368
-
369
- expect(@scheduler.threads.size).to eq(2)
370
- end
371
- end
372
-
373
- describe '#work_threads(:all | :vacant)' do
374
-
375
- it 'returns an empty array when the scheduler has not yet done anything' do
376
-
377
- expect(@scheduler.work_threads).to eq([])
378
- expect(@scheduler.work_threads(:all)).to eq([])
379
- expect(@scheduler.work_threads(:vacant)).to eq([])
380
- end
381
-
382
- it 'lists the [vacant] work threads in the pool' do
383
-
384
- @scheduler.in '0s' do
385
- sleep(0.2)
386
- end
387
- @scheduler.in '0s' do
388
- sleep(2.0)
389
- end
390
-
391
- sleep 0.7
392
-
393
- if @scheduler.work_threads.size == 1
394
- expect(@scheduler.work_threads.size).to eq(1)
395
- expect(@scheduler.work_threads(:all).size).to eq(1)
396
- expect(@scheduler.work_threads(:vacant).size).to eq(0)
397
- else
398
- expect(@scheduler.work_threads.size).to eq(2)
399
- expect(@scheduler.work_threads(:all).size).to eq(2)
400
- expect(@scheduler.work_threads(:vacant).size).to eq(1)
401
- end
402
- end
403
- end
404
-
405
- describe '#work_threads(:active)' do
406
-
407
- it 'returns [] when there are no jobs running' do
408
-
409
- expect(@scheduler.work_threads(:active)).to eq([])
410
- end
411
-
412
- it 'returns the list of threads of the running jobs' do
413
-
414
- job =
415
- @scheduler.schedule_in('0s') do
416
- sleep 1
417
- end
418
-
419
- sleep 0.4
420
-
421
- expect(@scheduler.work_threads(:active).size).to eq(1)
422
-
423
- t = @scheduler.work_threads(:active).first
424
-
425
- expect(t.class).to eq(Thread)
426
- expect(t[@scheduler.thread_key]).to eq(true)
427
- expect(t[:rufus_scheduler_job]).to eq(job)
428
- expect(t[:rufus_scheduler_time]).not_to eq(nil)
429
- end
430
-
431
- it 'does not return threads from other schedulers' do
432
-
433
- scheduler = Rufus::Scheduler.new
434
-
435
- job =
436
- @scheduler.schedule_in('0s') do
437
- sleep(1)
438
- end
439
-
440
- sleep 0.4
441
-
442
- expect(scheduler.work_threads(:active)).to eq([])
443
-
444
- scheduler.shutdown
445
- end
446
- end
447
-
448
- #describe '#min_work_threads' do
449
- # it 'returns the min job thread count' do
450
- # @scheduler.min_work_threads.should == 3
451
- # end
452
- #end
453
- #describe '#min_work_threads=' do
454
- # it 'sets the min job thread count' do
455
- # @scheduler.min_work_threads = 1
456
- # @scheduler.min_work_threads.should == 1
457
- # end
458
- #end
459
-
460
- describe '#max_work_threads' do
461
-
462
- it 'returns the max job thread count' do
463
-
464
- expect(@scheduler.max_work_threads).to eq(28)
465
- end
466
- end
467
-
468
- describe '#max_work_threads=' do
469
-
470
- it 'sets the max job thread count' do
471
-
472
- @scheduler.max_work_threads = 14
473
-
474
- expect(@scheduler.max_work_threads).to eq(14)
475
- end
476
- end
477
-
478
- #describe '#kill_all_work_threads' do
479
- #
480
- # it 'kills all the work threads' do
481
- #
482
- # @scheduler.in '0s' do; sleep(5); end
483
- # @scheduler.in '0s' do; sleep(5); end
484
- # @scheduler.in '0s' do; sleep(5); end
485
- #
486
- # sleep 0.5
487
- #
488
- # @scheduler.work_threads.size.should == 3
489
- #
490
- # @scheduler.send(:kill_all_work_threads)
491
- #
492
- # sleep 0.5
493
- #
494
- # @scheduler.work_threads.size.should == 0
495
- # end
496
- #end
497
-
498
- describe '#running_jobs' do
499
-
500
- it 'returns [] when there are no running jobs' do
501
-
502
- expect(@scheduler.running_jobs).to eq([])
503
- end
504
-
505
- it 'returns a list of running Job instances' do
506
-
507
- job =
508
- @scheduler.schedule_in('0s') do
509
- sleep(1)
510
- end
511
-
512
- sleep 0.4
513
-
514
- expect(job.running?).to eq(true)
515
- expect(@scheduler.running_jobs).to eq([ job ])
516
- end
517
-
518
- it 'does not return twice the same job' do
519
-
520
- job =
521
- @scheduler.schedule_every('0.3s') do
522
- sleep(5)
523
- end
524
-
525
- sleep 1.5
526
-
527
- expect(job.running?).to eq(true)
528
- expect(@scheduler.running_jobs).to eq([ job ])
529
- end
530
- end
531
-
532
- describe '#running_jobs(:tag/:tags => x)' do
533
-
534
- it 'returns a list of running jobs filtered by tag' do
535
-
536
- @scheduler.in '0.1s', :tag => 't0' do
537
- sleep 3
538
- end
539
- @scheduler.in '0.2s', :tag => 't1' do
540
- sleep 3
541
- end
542
-
543
- sleep 0.4
544
-
545
- expect(@scheduler.running_jobs(:tag => 't0').map(&:original)).to eq(
546
- %w[ 0.1s ]
547
- )
548
- expect(@scheduler.running_jobs(:tag => 't1').map(&:original)).to eq(
549
- %w[ 0.2s ]
550
- )
551
- expect(@scheduler.running_jobs(:tags => %w[ t0 t1 ]).map(&:original)).to eq(
552
- []
553
- )
554
- end
555
- end
556
-
557
- describe '#occurrences(time0, time1)' do
558
-
559
- it 'returns a { job => [ times ] } of job occurrences' do
560
-
561
- j0 = @scheduler.schedule_in '7m' do; end
562
- j1 = @scheduler.schedule_at '10m' do; end
563
- j2 = @scheduler.schedule_every '5m' do; end
564
- j3 = @scheduler.schedule_interval '5m' do; end
565
- j4 = @scheduler.schedule_cron '* * * * *' do; end
566
-
567
- h = @scheduler.occurrences(Time.now + 4 * 60, Time.now + 11 * 60)
568
-
569
- expect(h.size).to eq(5)
570
- expect(h[j0]).to eq([ j0.next_time ])
571
- expect(h[j1]).to eq([ j1.next_time ])
572
- expect(h[j2].size).to eq(2)
573
- expect(h[j3].size).to eq(2)
574
- expect(h[j4].size).to eq(7)
575
- end
576
-
577
- it 'returns a [ [ time, job ], ... ] of job occurrences when :timeline' do
578
-
579
- j0 = @scheduler.schedule_in '5m' do; end
580
- j1 = @scheduler.schedule_in '10m' do; end
581
-
582
- a =
583
- @scheduler.occurrences(Time.now + 4 * 60, Time.now + 11 * 60, :timeline)
584
-
585
- expect(a[0][0]).to be_within_1s_of(Time.now + 5 * 60)
586
- expect(a[0][1]).to eq(j0)
587
- expect(a[1][0]).to be_within_1s_of(Time.now + 10 * 60)
588
- expect(a[1][1]).to eq(j1)
589
- end
590
-
591
- it 'respects :first_at for repeat jobs' do
592
-
593
- j0 = @scheduler.schedule_every '5m', :first_in => '10m' do; end
594
-
595
- h = @scheduler.occurrences(Time.now + 4 * 60, Time.now + 16 * 60)
596
-
597
- expect(h[j0][0]).to be_within_1s_of(Time.now + 10 * 60)
598
- expect(h[j0][1]).to be_within_1s_of(Time.now + 15 * 60)
599
- end
600
-
601
- it 'respects :times for repeat jobs' do
602
-
603
- j0 = @scheduler.schedule_every '1m', :times => 10 do; end
604
-
605
- h = @scheduler.occurrences(Time.now + 4 * 60, Time.now + 16 * 60)
606
-
607
- expect(h[j0].size).to eq(6)
608
- end
609
- end
610
-
611
- describe '#timeline(time0, time1)' do
612
-
613
- it 'returns a [ [ time, job ], ... ] of job occurrences' do
614
-
615
- j0 = @scheduler.schedule_in '5m' do; end
616
- j1 = @scheduler.schedule_in '10m' do; end
617
-
618
- a = @scheduler.timeline(Time.now + 4 * 60, Time.now + 11 * 60)
619
-
620
- expect(a[0][0]).to be_within_1s_of(Time.now + 5 * 60)
621
- expect(a[0][1]).to eq(j0)
622
- expect(a[1][0]).to be_within_1s_of(Time.now + 10 * 60)
623
- expect(a[1][1]).to eq(j1)
624
- end
625
- end
626
-
627
- #--
628
- # management methods
629
- #++
630
-
631
- describe '#shutdown' do
632
-
633
- it 'blanks the uptime' do
634
-
635
- @scheduler.shutdown
636
-
637
- expect(@scheduler.uptime).to eq(nil)
638
- end
639
-
640
- it 'shuts the scheduler down' do
641
-
642
- @scheduler.shutdown
643
-
644
- sleep 0.100
645
- sleep 0.400 if RUBY_VERSION < '1.9.0'
646
-
647
- t = Thread.list.find { |t|
648
- t[:name] == "rufus_scheduler_#{@scheduler.object_id}"
649
- }
650
-
651
- expect(t).to eq(nil)
652
- end
653
-
654
- it 'has a #stop alias' do
655
-
656
- @scheduler.stop
657
-
658
- expect(@scheduler.uptime).to eq(nil)
659
- end
660
-
661
- #it 'has a #close alias'
662
- end
663
-
664
- describe '#shutdown(:wait)' do
665
-
666
- it 'shuts down and blocks until all the jobs ended their current runs' do
667
-
668
- counter = 0
669
-
670
- @scheduler.in '0s' do
671
- sleep 1
672
- counter = counter + 1
673
- end
674
-
675
- sleep 0.4
676
-
677
- @scheduler.shutdown(:wait)
678
-
679
- expect(counter).to eq(1)
680
- expect(@scheduler.uptime).to eq(nil)
681
- expect(@scheduler.running_jobs).to eq([])
682
- expect(@scheduler.threads).to eq([])
683
- end
684
- end
685
-
686
- describe '#shutdown(:kill)' do
687
-
688
- it 'kills all the jobs and then shuts down' do
689
-
690
- counter = 0
691
-
692
- @scheduler.in '0s' do
693
- sleep 1
694
- counter = counter + 1
695
- end
696
- @scheduler.at Time.now + 0.3 do
697
- sleep 1
698
- counter = counter + 1
699
- end
700
-
701
- sleep 0.4
702
-
703
- @scheduler.shutdown(:kill)
704
-
705
- sleep 1.4
706
-
707
- expect(counter).to eq(0)
708
- expect(@scheduler.uptime).to eq(nil)
709
- expect(@scheduler.running_jobs).to eq([])
710
- expect(@scheduler.threads).to eq([])
711
- end
712
- end
713
-
714
- describe '#pause' do
715
-
716
- it 'pauses the scheduler' do
717
-
718
- job = @scheduler.schedule_in '1s' do; end
719
-
720
- @scheduler.pause
721
-
722
- sleep(3)
723
-
724
- expect(job.last_time).to eq(nil)
725
- end
726
- end
727
-
728
- describe '#resume' do
729
-
730
- it 'works' do
731
-
732
- job = @scheduler.schedule_in '2s' do; end
733
-
734
- @scheduler.pause
735
- sleep(1)
736
- @scheduler.resume
737
- sleep(2)
738
-
739
- expect(job.last_time).not_to eq(nil)
740
- end
741
- end
742
-
743
- describe '#paused?' do
744
-
745
- it 'returns true if the scheduler is paused' do
746
-
747
- @scheduler.pause
748
- expect(@scheduler.paused?).to eq(true)
749
- end
750
-
751
- it 'returns false if the scheduler is not paused' do
752
-
753
- expect(@scheduler.paused?).to eq(false)
754
-
755
- @scheduler.pause
756
- @scheduler.resume
757
-
758
- expect(@scheduler.paused?).to eq(false)
759
- end
760
- end
761
-
762
- describe '#down?' do
763
-
764
- it 'returns true when the scheduler is down' do
765
-
766
- @scheduler.shutdown
767
-
768
- expect(@scheduler.down?).to eq(true)
769
- end
770
-
771
- it 'returns false when the scheduler is up' do
772
-
773
- expect(@scheduler.down?).to eq(false)
774
- end
775
- end
776
-
777
- describe '#up?' do
778
-
779
- it 'returns true when the scheduler is up' do
780
-
781
- expect(@scheduler.up?).to eq(true)
782
- end
783
- end
784
-
785
- #--
786
- # job methods
787
- #++
788
-
789
- describe '#jobs' do
790
-
791
- it 'is empty at the beginning' do
792
-
793
- expect(@scheduler.jobs).to eq([])
794
- end
795
-
796
- it 'returns the list of scheduled jobs' do
797
-
798
- @scheduler.in '10d' do; end
799
- @scheduler.in '1w' do; end
800
-
801
- sleep(1)
802
-
803
- jobs = @scheduler.jobs
804
-
805
- expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 10d 1w ])
806
- end
807
-
808
- it 'returns all the jobs (even those pending reschedule)' do
809
-
810
- @scheduler.in '0s', :blocking => true do
811
- sleep 2
812
- end
813
-
814
- sleep 0.4
815
-
816
- expect(@scheduler.jobs.size).to eq(1)
817
- end
818
-
819
- it 'does not return unscheduled jobs' do
820
-
821
- job =
822
- @scheduler.schedule_in '0s', :blocking => true do
823
- sleep 2
824
- end
825
-
826
- sleep 0.4
827
-
828
- job.unschedule
829
-
830
- expect(@scheduler.jobs.size).to eq(0)
831
- end
832
- end
833
-
834
- describe '#jobs(:tag / :tags => x)' do
835
-
836
- it 'returns [] when there are no jobs with the corresponding tag' do
837
-
838
- expect(@scheduler.jobs(:tag => 'nada')).to eq([])
839
- expect(@scheduler.jobs(:tags => %w[ nada hello ])).to eq([])
840
- end
841
-
842
- it 'returns the jobs with the corresponding tag' do
843
-
844
- @scheduler.in '10d', :tag => 't0' do; end
845
- @scheduler.every '2h', :tag => %w[ t0 t1 ] do; end
846
- @scheduler.every '3h' do; end
847
-
848
- expect(@scheduler.jobs(:tags => 't0').map(&:original).sort).to eq(
849
- %w[ 10d 2h ]
850
- )
851
- expect(@scheduler.jobs(:tags => 't1').map(&:original).sort).to eq(
852
- %w[ 2h ]
853
- )
854
- expect(@scheduler.jobs(:tags => [ 't1', 't0' ]).map(&:original).sort).to eq(
855
- %w[ 2h ]
856
- )
857
- end
858
- end
859
-
860
- describe '#every_jobs' do
861
-
862
- it 'returns EveryJob instances' do
863
-
864
- @scheduler.at '2030/12/12 12:10:00' do; end
865
- @scheduler.in '10d' do; end
866
- @scheduler.every '5m' do; end
867
-
868
- jobs = @scheduler.every_jobs
869
-
870
- expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 5m ])
871
- end
872
- end
873
-
874
- describe '#at_jobs' do
875
-
876
- it 'returns AtJob instances' do
877
-
878
- @scheduler.at '2030/12/12 12:10:00' do; end
879
- @scheduler.in '10d' do; end
880
- @scheduler.every '5m' do; end
881
-
882
- jobs = @scheduler.at_jobs
883
-
884
- expect(jobs.collect { |j| j.original }.sort).to eq([ '2030/12/12 12:10:00' ])
885
- end
886
- end
887
-
888
- describe '#in_jobs' do
889
-
890
- it 'returns InJob instances' do
891
-
892
- @scheduler.at '2030/12/12 12:10:00' do; end
893
- @scheduler.in '10d' do; end
894
- @scheduler.every '5m' do; end
895
-
896
- jobs = @scheduler.in_jobs
897
-
898
- expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 10d ])
899
- end
900
- end
901
-
902
- describe '#cron_jobs' do
903
-
904
- it 'returns CronJob instances' do
905
-
906
- @scheduler.at '2030/12/12 12:10:00' do; end
907
- @scheduler.in '10d' do; end
908
- @scheduler.every '5m' do; end
909
- @scheduler.cron '* * * * *' do; end
910
-
911
- jobs = @scheduler.cron_jobs
912
-
913
- expect(jobs.collect { |j| j.original }.sort).to eq([ '* * * * *' ])
914
- end
915
- end
916
-
917
- describe '#interval_jobs' do
918
-
919
- it 'returns IntervalJob instances' do
920
-
921
- @scheduler.at '2030/12/12 12:10:00' do; end
922
- @scheduler.in '10d' do; end
923
- @scheduler.every '5m' do; end
924
- @scheduler.cron '* * * * *' do; end
925
- @scheduler.interval '7m' do; end
926
-
927
- jobs = @scheduler.interval_jobs
928
-
929
- expect(jobs.collect { |j| j.original }.sort).to eq(%w[ 7m ])
930
- end
931
- end
932
-
933
- #--
934
- # callbacks
935
- #++
936
-
937
- describe '#on_pre_trigger' do
938
-
939
- it 'is called right before a job triggers' do
940
-
941
- $out = []
942
-
943
- def @scheduler.on_pre_trigger(job)
944
- $out << "pre #{job.id}"
945
- end
946
-
947
- job_id =
948
- @scheduler.in '0.5s' do |job|
949
- $out << job.id
950
- end
951
-
952
- sleep 0.7
953
-
954
- expect($out).to eq([ "pre #{job_id}", job_id ])
955
- end
956
-
957
- it 'accepts the job and the triggerTime as argument' do
958
-
959
- $tt = nil
960
-
961
- def @scheduler.on_pre_trigger(job, trigger_time)
962
- $tt = trigger_time
963
- end
964
-
965
- start = Time.now
966
-
967
- @scheduler.in '0.5s' do; end
968
-
969
- sleep 0.7
970
-
971
- expect($tt.class).to eq(Time)
972
- expect($tt).to be > start
973
- expect($tt).to be < Time.now
974
- end
975
-
976
- context 'when it returns false' do
977
-
978
- it 'prevents the job from triggering' do
979
-
980
- $out = []
981
-
982
- def @scheduler.on_pre_trigger(job)
983
- $out << "pre #{job.id}"
984
- false
985
- end
986
-
987
- job_id =
988
- @scheduler.in '0.5s' do |job|
989
- $out << job.id
990
- end
991
-
992
- sleep 0.7
993
-
994
- expect($out).to eq([ "pre #{job_id}" ])
995
- end
996
- end
997
- end
998
-
999
- describe '#on_post_trigger' do
1000
-
1001
- it 'is called right after a job triggers' do
1002
-
1003
- $out = []
1004
-
1005
- def @scheduler.on_post_trigger(job)
1006
- $out << "post #{job.id}"
1007
- end
1008
-
1009
- job_id =
1010
- @scheduler.in '0.5s' do |job|
1011
- $out << job.id
1012
- end
1013
-
1014
- sleep 0.7
1015
-
1016
- expect($out).to eq([ job_id, "post #{job_id}" ])
1017
- end
1018
- end
1019
-
1020
- #--
1021
- # misc
1022
- #++
1023
-
1024
- describe '.singleton / .s' do
1025
-
1026
- before(:each) do
1027
-
1028
- Rufus::Scheduler.class_eval { @singleton = nil } # ;-)
1029
- end
1030
-
1031
- it 'returns a singleton instance of the scheduler' do
1032
-
1033
- s0 = Rufus::Scheduler.singleton
1034
- s1 = Rufus::Scheduler.s
1035
-
1036
- expect(s0.class).to eq(Rufus::Scheduler)
1037
- expect(s1.object_id).to eq(s0.object_id)
1038
- end
1039
-
1040
- it 'accepts initialization parameters' do
1041
-
1042
- s = Rufus::Scheduler.singleton(:max_work_threads => 77)
1043
- s = Rufus::Scheduler.singleton(:max_work_threads => 42)
1044
-
1045
- expect(s.max_work_threads).to eq(77)
1046
- end
1047
- end
1048
- end
1049
-