Commit 88d20532 authored by Dylan Griffith's avatar Dylan Griffith

Merge branch 'add-interuptible-test-coverage' into 'master'

Add test coverage for interruptible with child pipelines

See merge request gitlab-org/gitlab!82347
parents a3fbeea9 788bf248
......@@ -7,6 +7,9 @@ module Ci
DEFAULT_STATUS = 'created'
BLOCKED_STATUS = %w[manual scheduled].freeze
AVAILABLE_STATUSES = %w[created waiting_for_resource preparing pending running success failed canceled skipped manual scheduled].freeze
# TODO: replace STARTED_STATUSES with data from BUILD_STARTED_RUNNING_STATUSES in https://gitlab.com/gitlab-org/gitlab/-/issues/273378
# see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82149#note_865508501
BUILD_STARTED_RUNNING_STATUSES = %w[running success failed].freeze
STARTED_STATUSES = %w[running success failed skipped manual scheduled].freeze
ACTIVE_STATUSES = %w[waiting_for_resource preparing pending running].freeze
COMPLETED_STATUSES = %w[success failed canceled skipped].freeze
......
......@@ -55,31 +55,88 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::CancelPendingPipelines do
context 'when the previous pipeline has a child pipeline' do
let(:child_pipeline) { create(:ci_pipeline, child_of: prev_pipeline) }
context 'when the child pipeline has an interruptible job' do
context 'when the child pipeline has interruptible running jobs' do
before do
create(:ci_build, :interruptible, :running, pipeline: child_pipeline)
create(:ci_build, :interruptible, :running, pipeline: child_pipeline)
end
it 'cancels all child pipeline builds' do
expect(build_statuses(child_pipeline)).to contain_exactly('running', 'running')
perform
expect(build_statuses(child_pipeline)).to contain_exactly('canceled', 'canceled')
end
context 'when the child pipeline includes completed interruptible jobs' do
before do
create(:ci_build, :interruptible, :failed, pipeline: child_pipeline)
create(:ci_build, :interruptible, :success, pipeline: child_pipeline)
end
it 'cancels all child pipeline builds with a cancelable_status' do
expect(build_statuses(child_pipeline)).to contain_exactly('running', 'running', 'failed', 'success')
perform
expect(build_statuses(child_pipeline)).to contain_exactly('canceled', 'canceled', 'failed', 'success')
end
end
end
it 'cancels interruptible builds of child pipeline' do
expect(build_statuses(child_pipeline)).to contain_exactly('running')
context 'when the child pipeline has started non-interruptible job' do
before do
create(:ci_build, :interruptible, :running, pipeline: child_pipeline)
# non-interruptible started
create(:ci_build, :success, pipeline: child_pipeline)
end
it 'does not cancel any child pipeline builds' do
expect(build_statuses(child_pipeline)).to contain_exactly('running', 'success')
perform
expect(build_statuses(child_pipeline)).to contain_exactly('canceled')
expect(build_statuses(child_pipeline)).to contain_exactly('running', 'success')
end
end
context 'when the child pipeline has not an interruptible job' do
context 'when the child pipeline has non-interruptible non-started job' do
before do
create(:ci_build, :running, pipeline: child_pipeline)
create(:ci_build, :interruptible, :running, pipeline: child_pipeline)
end
not_started_statuses = Ci::HasStatus::AVAILABLE_STATUSES - Ci::HasStatus::BUILD_STARTED_RUNNING_STATUSES
context 'when the jobs are cancelable' do
cancelable_not_started_statuses = Set.new(not_started_statuses).intersection(Ci::HasStatus::CANCELABLE_STATUSES)
cancelable_not_started_statuses.each do |status|
it "cancels all child pipeline builds when build status #{status} included" do
# non-interruptible but non-started
create(:ci_build, status.to_sym, pipeline: child_pipeline)
expect(build_statuses(child_pipeline)).to contain_exactly('running', status)
perform
expect(build_statuses(child_pipeline)).to contain_exactly('canceled', 'canceled')
end
end
end
context 'when the jobs are not cancelable' do
not_cancelable_not_started_statuses = not_started_statuses - Ci::HasStatus::CANCELABLE_STATUSES
not_cancelable_not_started_statuses.each do |status|
it "does not cancel child pipeline builds when build status #{status} included" do
# non-interruptible but non-started
create(:ci_build, status.to_sym, pipeline: child_pipeline)
it 'does not cancel the build of child pipeline' do
expect(build_statuses(child_pipeline)).to contain_exactly('running')
expect(build_statuses(child_pipeline)).to contain_exactly('running', status)
perform
expect(build_statuses(child_pipeline)).to contain_exactly('running')
expect(build_statuses(child_pipeline)).to contain_exactly('canceled', status)
end
end
end
end
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment