-
Notifications
You must be signed in to change notification settings - Fork 17
/
task_monitor_spec.rb
78 lines (73 loc) · 2.38 KB
/
task_monitor_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
require 'spec_helper'
describe PerfectQueue::TaskMonitor do
describe '#kill_task' do
it 'rescues exception' do
tm = PerfectQueue::TaskMonitor.new(logger: double('logger').as_null_object)
task = double('task')
reason = double('reason')
allow(task).to receive_message_chain(:runner, :kill) \
.with(no_args).with(reason){raise}
tm.instance_variable_set(:@task, task)
expect{tm.kill_task(reason)}.to raise_error(RuntimeError)
end
end
describe '#external_task_heartbeat' do
it 'rescues exception' do
tm = PerfectQueue::TaskMonitor.new(logger: double('logger').as_null_object)
task = double('task')
reason = double('reason')
epoch = double('epoch')
allow(Time).to receive_message_chain(:now, :to_i){epoch}
ret = double('ret')
tm.instance_variable_set(:@task, task)
expect(tm.external_task_heartbeat(task){ret}).to eq(ret)
expect(tm.instance_variable_get(:@last_task_heartbeat)).to eq(epoch)
end
end
describe '#run' do
it 'rescues unknown error' do
config = {logger: double('logger').as_null_object}
force_stop = double('force_stop')
expect(force_stop).to receive(:call).with(no_args).exactly(:once)
tm = PerfectQueue::TaskMonitor.new(config, nil, force_stop)
allow(Time).to receive(:now){raise}
tm.run
end
end
describe '#task_heartbeat' do
let (:tm){ PerfectQueue::TaskMonitor.new(logger: double('logger').as_null_object) }
let (:err){ StandardError.new('heartbeat preempted') }
before do
task = double('task')
allow(task).to receive(:heartbeat!){ raise err }
tm.set_task(task, double('runner'))
end
it 'calls kill_task($!) on heartbeat error' do
expect(tm).to receive(:kill_task).with(err).exactly(:once)
tm.__send__(:task_heartbeat)
end
end
end
describe PerfectQueue::TaskMonitorHook do
let (:task) do
obj = AcquiredTask.new(double(:client).as_null_object, 'key', {}, double)
tm = TaskMonitor.new(logger: double('logger').as_null_object)
tm.set_task(obj, double('runner'))
obj
end
describe 'finish!' do
it { task.finish! }
end
describe 'release!' do
it { task.release! }
end
describe 'retry!' do
it { task.retry! }
end
describe 'cancel_request!' do
it { task.cancel_request! }
end
describe 'update_data!' do
it { task.update_data!({}) }
end
end