2019-03-30 07:15:48 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-02-07 13:00:46 +00:00
|
|
|
require 'spec_helper'
|
2015-10-21 09:29:47 +00:00
|
|
|
|
2020-06-26 09:08:59 +00:00
|
|
|
RSpec.describe StuckCiJobsWorker do
|
2018-06-28 18:51:36 +00:00
|
|
|
include ExclusiveLeaseHelpers
|
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
let(:worker_lease_key) { StuckCiJobsWorker::EXCLUSIVE_LEASE_KEY }
|
2018-06-28 18:51:36 +00:00
|
|
|
let(:worker_lease_uuid) { SecureRandom.uuid }
|
2021-09-13 18:11:46 +00:00
|
|
|
let(:worker2) { described_class.new }
|
2018-06-28 18:51:36 +00:00
|
|
|
|
|
|
|
subject(:worker) { described_class.new }
|
2015-10-21 09:29:47 +00:00
|
|
|
|
2017-02-07 22:06:16 +00:00
|
|
|
before do
|
2018-06-28 18:51:36 +00:00
|
|
|
stub_exclusive_lease(worker_lease_key, worker_lease_uuid)
|
2017-02-07 22:06:16 +00:00
|
|
|
end
|
2017-02-07 13:00:46 +00:00
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
describe '#perform' do
|
2021-09-29 21:12:32 +00:00
|
|
|
it 'enqueues a Ci::StuckBuilds::DropRunningWorker job' do
|
|
|
|
expect(Ci::StuckBuilds::DropRunningWorker).to receive(:perform_in).with(20.minutes).exactly(:once)
|
|
|
|
|
|
|
|
worker.perform
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'executes an instance of Ci::StuckBuilds::DropService' do
|
2021-09-13 18:11:46 +00:00
|
|
|
expect_next_instance_of(Ci::StuckBuilds::DropService) do |service|
|
|
|
|
expect(service).to receive(:execute).exactly(:once)
|
2019-11-01 00:06:02 +00:00
|
|
|
end
|
2017-02-07 13:00:46 +00:00
|
|
|
|
|
|
|
worker.perform
|
2017-09-02 08:06:25 +00:00
|
|
|
end
|
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
context 'with an exclusive lease' do
|
|
|
|
it 'does not execute concurrently' do
|
|
|
|
expect(worker).to receive(:remove_lease).exactly(:once)
|
|
|
|
expect(worker2).not_to receive(:remove_lease)
|
2021-06-04 15:10:25 +00:00
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
worker.perform
|
2021-06-04 15:10:25 +00:00
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
stub_exclusive_lease_taken(worker_lease_key)
|
2021-06-04 15:10:25 +00:00
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
worker2.perform
|
2021-06-04 15:10:25 +00:00
|
|
|
end
|
2018-09-27 09:17:43 +00:00
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
it 'can execute in sequence' do
|
|
|
|
expect(worker).to receive(:remove_lease).at_least(:once)
|
|
|
|
expect(worker2).to receive(:remove_lease).at_least(:once)
|
2018-09-27 09:17:43 +00:00
|
|
|
|
|
|
|
worker.perform
|
2021-09-13 18:11:46 +00:00
|
|
|
worker2.perform
|
2018-09-27 09:17:43 +00:00
|
|
|
end
|
|
|
|
|
2021-09-13 18:11:46 +00:00
|
|
|
it 'cancels exclusive leases after worker perform' do
|
|
|
|
expect_to_cancel_exclusive_lease(worker_lease_key, worker_lease_uuid)
|
2018-09-27 09:17:43 +00:00
|
|
|
|
|
|
|
worker.perform
|
|
|
|
end
|
2021-10-04 12:11:58 +00:00
|
|
|
|
|
|
|
context 'when the DropService fails' do
|
|
|
|
it 'ensures cancellation of the exclusive lease' do
|
|
|
|
expect_to_cancel_exclusive_lease(worker_lease_key, worker_lease_uuid)
|
|
|
|
|
|
|
|
allow_next_instance_of(Ci::StuckBuilds::DropService) do |service|
|
|
|
|
expect(service).to receive(:execute) do
|
|
|
|
raise 'The query timed out'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
expect { worker.perform }.to raise_error(/The query timed out/)
|
|
|
|
end
|
|
|
|
end
|
2018-09-27 09:17:43 +00:00
|
|
|
end
|
|
|
|
end
|
2017-03-01 12:56:54 +00:00
|
|
|
end
|