Skip to content

Commit e3ba689

Browse files
committed
Execution Hanging Detection
Increasing code coverage Signed-off-by: Rodrigo Nardi <rnardi@netdef.org>
1 parent 642605b commit e3ba689

2 files changed

Lines changed: 95 additions & 4 deletions

File tree

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# slack_bot_spec.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2023 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
describe TimeoutExecution do
12+
let(:timeout_execution) { described_class.instance }
13+
let(:finished_instance) { Github::PlanExecution::Finished.new({}) }
14+
15+
before do
16+
allow(Github::PlanExecution::Finished).to receive(:new).and_return(finished_instance)
17+
end
18+
19+
context 'when timeout is called, but still running' do
20+
let(:check_suite) { create(:check_suite) }
21+
22+
before do
23+
allow(CheckSuite).to receive(:find).and_return(check_suite)
24+
allow(check_suite).to receive(:finished?).and_return(true)
25+
end
26+
27+
it 'calls timeout job' do
28+
expect(described_class.timeout(check_suite.id)).to be_falsey
29+
end
30+
end
31+
32+
context 'when timeout is called, but hanged' do
33+
let(:check_suite) { create(:check_suite) }
34+
35+
before do
36+
allow(CheckSuite).to receive(:find).and_return(check_suite)
37+
allow(check_suite).to receive(:finished?).and_return(false)
38+
allow(check_suite).to receive(:last_job_updated_at_timer).and_return(Time.now.utc - 3.hours)
39+
allow(finished_instance).to receive(:finished).and_return([200, 'Finished'])
40+
end
41+
42+
it 'calls timeout job' do
43+
expect(described_class.timeout(check_suite.id)).to be_truthy
44+
end
45+
end
46+
47+
context 'when timeout is called and rescheduled' do
48+
let(:check_suite) { create(:check_suite) }
49+
50+
before do
51+
allow(CheckSuite).to receive(:find).and_return(check_suite)
52+
allow(check_suite).to receive(:finished?).and_return(false)
53+
allow(check_suite).to receive(:last_job_updated_at_timer).and_return(Time.now.utc + 3.hours)
54+
allow(TimeoutExecution).to receive_message_chain(:delay, :timeout).and_return(true)
55+
end
56+
57+
it 'calls timeout job' do
58+
expect(described_class.timeout(check_suite.id)).to be_falsey
59+
end
60+
end
61+
62+
context 'when timeout is called, last update in 2 hour ago' do
63+
let(:check_suite) { create(:check_suite) }
64+
65+
before do
66+
allow(CheckSuite).to receive(:find).and_return(check_suite)
67+
allow(check_suite).to receive(:finished?).and_return(false)
68+
allow(check_suite).to receive(:last_job_updated_at_timer).and_return(Time.now.utc - 3.hours)
69+
end
70+
71+
it 'calls timeout job' do
72+
expect(TimeoutExecution).to receive(:timeout)
73+
expect(described_class.timeout(check_suite.id)).to be_falsey
74+
end
75+
end
76+
77+
78+
# context 'when timeout is called and rescheduled' do
79+
# let(:check_suite) { create(:check_suite) }
80+
#
81+
# before do
82+
# allow(CheckSuite).to receive(:find).and_return(check_suite)
83+
# allow(check_suite).to receive(:finished?).and_return(true)
84+
# end
85+
#
86+
# it 'calls timeout job' do
87+
# expect(described_class.timeout(check_suite.id)).to be_falsey
88+
# end
89+
# end
90+
end

workers/timeout_execution.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ def timeout(check_suite_id)
1818

1919
@logger.info("Timeout execution for check_suite_id: #{check_suite_id} -> finished? #{check_suite.finished?}")
2020

21-
return if check_suite.finished?
22-
23-
return if check_suite.last_job_updated_at_timer > 2.hour.ago.utc
21+
return false if check_suite.finished?
22+
return rescheduling([], check_suite_id) if check_suite.last_job_updated_at_timer > 2.hour.ago.utc
2423

2524
@logger.info("Calling Github::PlanExecution::Finished.new(#{check_suite.bamboo_ci_ref}).finished")
2625

@@ -33,7 +32,7 @@ def timeout(check_suite_id)
3332
end
3433

3534
def rescheduling(resp, check_suite_id)
36-
return if resp == [200, 'Finished']
35+
return true if resp == [200, 'Finished']
3736

3837
@logger.info("Rescheduling check_suite_id: #{check_suite_id}")
3938

@@ -42,6 +41,8 @@ def rescheduling(resp, check_suite_id)
4241
TimeoutExecution
4342
.delay(run_at: 2.hours.from_now.utc, queue: 'timeout_execution')
4443
.timeout(check_suite_id)
44+
45+
false
4546
end
4647
end
4748
end

0 commit comments

Comments
 (0)