diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-29 21:12:32 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-29 21:12:32 +0000 |
commit | 42a29f3879305e8bec27b29586e1c9f1ce02bbcf (patch) | |
tree | 5423a331a7d28137e50a4224e2320b469ee58eec /spec | |
parent | fef5449973e2097fbedd92980d78dc4baf54afd6 (diff) | |
download | gitlab-ce-42a29f3879305e8bec27b29586e1c9f1ce02bbcf.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/features/boards/new_issue_spec.rb | 2 | ||||
-rw-r--r-- | spec/features/boards/reload_boards_on_browser_back_spec.rb | 4 | ||||
-rw-r--r-- | spec/features/groups/board_spec.rb | 2 | ||||
-rw-r--r-- | spec/features/issues/related_issues_spec.rb | 48 | ||||
-rw-r--r-- | spec/services/ci/stuck_builds/drop_running_service_spec.rb | 65 | ||||
-rw-r--r-- | spec/services/ci/stuck_builds/drop_service_spec.rb | 46 | ||||
-rw-r--r-- | spec/support/helpers/feature_flag_helpers.rb | 2 | ||||
-rw-r--r-- | spec/support/shared_examples/ci/stuck_builds_shared_examples.rb | 38 | ||||
-rw-r--r-- | spec/tooling/quality/test_level_spec.rb | 18 | ||||
-rw-r--r-- | spec/workers/ci/stuck_builds/drop_running_worker_spec.rb | 70 | ||||
-rw-r--r-- | spec/workers/stuck_ci_jobs_worker_spec.rb | 8 |
11 files changed, 227 insertions, 76 deletions
diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb index 020d80775d2..f88d31bda88 100644 --- a/spec/features/boards/new_issue_spec.rb +++ b/spec/features/boards/new_issue_spec.rb @@ -68,7 +68,7 @@ RSpec.describe 'Issue Boards new issue', :js do wait_for_requests - page.within(first('.board .issue-count-badge-count')) do + page.within(first('.board [data-testid="issue-count-badge"]')) do expect(page).to have_content('1') end diff --git a/spec/features/boards/reload_boards_on_browser_back_spec.rb b/spec/features/boards/reload_boards_on_browser_back_spec.rb index 36682036d48..6a09e3c9506 100644 --- a/spec/features/boards/reload_boards_on_browser_back_spec.rb +++ b/spec/features/boards/reload_boards_on_browser_back_spec.rb @@ -16,7 +16,7 @@ RSpec.describe 'Ensure Boards do not show stale data on browser back', :js do visit project_board_path(project, board) wait_for_requests - page.within(first('.board .issue-count-badge-count')) do + page.within(first('.board [data-testid="issue-count-badge"]')) do expect(page).to have_content('0') end end @@ -35,7 +35,7 @@ RSpec.describe 'Ensure Boards do not show stale data on browser back', :js do page.go_back wait_for_requests - page.within(first('.board .issue-count-badge-count')) do + page.within(first('.board [data-testid="issue-count-badge"]')) do expect(page).to have_content('1') end diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb index afe36dabcb5..aece6d790b5 100644 --- a/spec/features/groups/board_spec.rb +++ b/spec/features/groups/board_spec.rb @@ -24,7 +24,7 @@ RSpec.describe 'Group Boards' do it 'adds an issue to the backlog' do page.within(find('.board', match: :first)) do issue_title = 'New Issue' - find(:css, '.issue-count-badge-add-button').click + click_button 'New issue' wait_for_requests diff --git a/spec/features/issues/related_issues_spec.rb b/spec/features/issues/related_issues_spec.rb index 837859bbe26..a8933ed9c30 100644 --- a/spec/features/issues/related_issues_spec.rb +++ b/spec/features/issues/related_issues_spec.rb @@ -41,13 +41,13 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end end context 'when logged in but not a member' do before do - gitlab_sign_in(user) + sign_in(user) end it 'shows widget when internal project' do @@ -57,7 +57,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end it 'does not show widget when private project' do @@ -76,7 +76,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end it 'shows widget on their own public issue' do @@ -86,13 +86,13 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end end context 'when logged in and a guest' do before do - gitlab_sign_in(user) + sign_in(user) end it 'shows widget when internal project' do @@ -103,7 +103,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end it 'shows widget when private project' do @@ -114,7 +114,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end it 'shows widget when public project' do @@ -125,13 +125,13 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).not_to have_selector('.js-issue-count-badge-add-button') + expect(page).not_to have_button 'Add a related issue' end end context 'when logged in and a reporter' do before do - gitlab_sign_in(user) + sign_in(user) end it 'shows widget when internal project' do @@ -142,7 +142,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).to have_selector('.js-issue-count-badge-add-button') + expect(page).to have_button 'Add a related issue' end it 'shows widget when private project' do @@ -153,7 +153,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).to have_selector('.js-issue-count-badge-add-button') + expect(page).to have_button 'Add a related issue' end it 'shows widget when public project' do @@ -164,7 +164,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).to have_selector('.js-issue-count-badge-add-button') + expect(page).to have_button 'Add a related issue' end it 'shows widget on their own public issue' do @@ -175,7 +175,7 @@ RSpec.describe 'Related issues', :js do visit project_issue_path(project, issue) expect(page).to have_css('.related-issues-block') - expect(page).to have_selector('.js-issue-count-badge-add-button') + expect(page).to have_button 'Add a related issue' end end end @@ -186,7 +186,7 @@ RSpec.describe 'Related issues', :js do before do project.add_guest(user) - gitlab_sign_in(user) + sign_in(user) end context 'visiting some issue someone else created' do @@ -216,7 +216,7 @@ RSpec.describe 'Related issues', :js do before do project.add_maintainer(user) project_b.add_maintainer(user) - gitlab_sign_in(user) + sign_in(user) end context 'without existing related issues' do @@ -230,7 +230,7 @@ RSpec.describe 'Related issues', :js do end it 'add related issue' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set "#{issue_b.to_reference(project)} " find('.js-add-issuable-form-add-button').click @@ -247,7 +247,7 @@ RSpec.describe 'Related issues', :js do end it 'add cross-project related issue' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set "#{issue_project_b_a.to_reference(project)} " find('.js-add-issuable-form-add-button').click @@ -261,7 +261,7 @@ RSpec.describe 'Related issues', :js do end it 'pressing enter should submit the form' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set "#{issue_project_b_a.to_reference(project)} " find('.js-add-issuable-form-input').native.send_key(:enter) @@ -275,7 +275,7 @@ RSpec.describe 'Related issues', :js do end it 'disallows duplicate entries' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set 'duplicate duplicate duplicate' items = all('.js-add-issuable-form-token-list-item') @@ -288,7 +288,7 @@ RSpec.describe 'Related issues', :js do it 'allows us to remove pending issues' do # Tests against https://gitlab.com/gitlab-org/gitlab/issues/11625 - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set 'issue1 issue2 issue3 ' items = all('.js-add-issuable-form-token-list-item') @@ -351,7 +351,7 @@ RSpec.describe 'Related issues', :js do end it 'add related issue' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set "##{issue_d.iid} " find('.js-add-issuable-form-add-button').click @@ -367,7 +367,7 @@ RSpec.describe 'Related issues', :js do end it 'add invalid related issue' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set "#9999999 " find('.js-add-issuable-form-add-button').click @@ -382,7 +382,7 @@ RSpec.describe 'Related issues', :js do end it 'add unauthorized related issue' do - find('.js-issue-count-badge-add-button').click + click_button 'Add a related issue' find('.js-add-issuable-form-input').set "#{issue_project_unauthorized_a.to_reference(project)} " find('.js-add-issuable-form-add-button').click diff --git a/spec/services/ci/stuck_builds/drop_running_service_spec.rb b/spec/services/ci/stuck_builds/drop_running_service_spec.rb new file mode 100644 index 00000000000..d2132914a02 --- /dev/null +++ b/spec/services/ci/stuck_builds/drop_running_service_spec.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::StuckBuilds::DropRunningService do + let!(:runner) { create :ci_runner } + let!(:job) { create :ci_build, runner: runner } + let(:created_at) { } + let(:updated_at) { } + + subject(:service) { described_class.new } + + before do + job_attributes = { status: status } + job_attributes[:created_at] = created_at if created_at + job_attributes[:updated_at] = updated_at if updated_at + job.update!(job_attributes) + end + + context 'when job is running' do + let(:status) { 'running' } + + context 'when job was updated_at more than an hour ago' do + let(:updated_at) { 2.hours.ago } + + it_behaves_like 'job is dropped' + end + + context 'when job was updated in less than 1 hour ago' do + let(:updated_at) { 30.minutes.ago } + + it_behaves_like 'job is unchanged' + end + end + + %w(success skipped failed canceled scheduled pending).each do |status| + context "when job is #{status}" do + let(:status) { status } + let(:updated_at) { 2.days.ago } + + context 'when created_at is the same as updated_at' do + let(:created_at) { 2.days.ago } + + it_behaves_like 'job is unchanged' + end + + context 'when created_at is before updated_at' do + let(:created_at) { 3.days.ago } + + it_behaves_like 'job is unchanged' + end + end + end + + context 'for deleted project' do + let(:status) { 'running' } + let(:updated_at) { 2.days.ago } + + before do + job.project.update!(pending_delete: true) + end + + it_behaves_like 'job is dropped' + end +end diff --git a/spec/services/ci/stuck_builds/drop_service_spec.rb b/spec/services/ci/stuck_builds/drop_service_spec.rb index 8dfd1bc1b3d..4aca19ae7b9 100644 --- a/spec/services/ci/stuck_builds/drop_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_service_spec.rb @@ -17,48 +17,6 @@ RSpec.describe Ci::StuckBuilds::DropService do job.update!(job_attributes) end - shared_examples 'job is dropped' do - it 'changes status' do - expect(service).to receive(:drop).exactly(3).times.and_call_original - expect(service).to receive(:drop_stuck).exactly(:once).and_call_original - - service.execute - job.reload - - expect(job).to be_failed - expect(job).to be_stuck_or_timeout_failure - end - - context 'when job have data integrity problem' do - it "does drop the job and logs the reason" do - job.update_columns(yaml_variables: '[{"key" => "value"}]') - - expect(Gitlab::ErrorTracking).to receive(:track_exception) - .with(anything, a_hash_including(build_id: job.id)) - .once - .and_call_original - - service.execute - job.reload - - expect(job).to be_failed - expect(job).to be_data_integrity_failure - end - end - end - - shared_examples 'job is unchanged' do - it 'does not change status' do - expect(service).to receive(:drop).exactly(3).times.and_call_original - expect(service).to receive(:drop_stuck).exactly(:once).and_call_original - - service.execute - job.reload - - expect(job.status).to eq(status) - end - end - context 'when job is pending' do let(:status) { 'pending' } @@ -195,7 +153,7 @@ RSpec.describe Ci::StuckBuilds::DropService do context 'when job was updated_at more than an hour ago' do let(:updated_at) { 2.hours.ago } - it_behaves_like 'job is dropped' + it_behaves_like 'job is unchanged' end context 'when job was updated in less than 1 hour ago' do @@ -238,7 +196,7 @@ RSpec.describe Ci::StuckBuilds::DropService do job.project.update!(pending_delete: true) end - it_behaves_like 'job is dropped' + it_behaves_like 'job is unchanged' end describe 'drop stale scheduled builds' do diff --git a/spec/support/helpers/feature_flag_helpers.rb b/spec/support/helpers/feature_flag_helpers.rb index 51ba9039b70..4e57002a7c6 100644 --- a/spec/support/helpers/feature_flag_helpers.rb +++ b/spec/support/helpers/feature_flag_helpers.rb @@ -71,7 +71,7 @@ module FeatureFlagHelpers end def add_linked_issue_button - find('.js-issue-count-badge-add-button') + find_button 'Add a related issue' end def remove_linked_issue_button diff --git a/spec/support/shared_examples/ci/stuck_builds_shared_examples.rb b/spec/support/shared_examples/ci/stuck_builds_shared_examples.rb new file mode 100644 index 00000000000..2f26dac46e2 --- /dev/null +++ b/spec/support/shared_examples/ci/stuck_builds_shared_examples.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'job is dropped' do + it 'changes status' do + service.execute + job.reload + + expect(job).to be_failed + expect(job).to be_stuck_or_timeout_failure + end + + context 'when job has data integrity problem' do + it 'drops the job and logs the reason' do + job.update_columns(yaml_variables: '[{"key" => "value"}]') + + expect(Gitlab::ErrorTracking) + .to receive(:track_exception) + .with(anything, a_hash_including(build_id: job.id)) + .once + .and_call_original + + service.execute + job.reload + + expect(job).to be_failed + expect(job).to be_data_integrity_failure + end + end +end + +RSpec.shared_examples 'job is unchanged' do + it 'does not change status' do + service.execute + job.reload + + expect(job.status).to eq(status) + end +end diff --git a/spec/tooling/quality/test_level_spec.rb b/spec/tooling/quality/test_level_spec.rb index 89abe337347..0623a67a60e 100644 --- a/spec/tooling/quality/test_level_spec.rb +++ b/spec/tooling/quality/test_level_spec.rb @@ -63,7 +63,14 @@ RSpec.describe Quality::TestLevel do context 'with a prefix' do it 'returns a pattern' do expect(described_class.new('ee/').pattern(:system)) - .to eq("ee/spec/{features}{,/**/}*_spec.rb") + .to eq("{ee/}spec/{features}{,/**/}*_spec.rb") + end + end + + context 'with several prefixes' do + it 'returns a pattern' do + expect(described_class.new(['', 'ee/', 'jh/']).pattern(:system)) + .to eq("{,ee/,jh/}spec/{features}{,/**/}*_spec.rb") end end @@ -138,7 +145,14 @@ RSpec.describe Quality::TestLevel do context 'with a prefix' do it 'returns a regexp' do expect(described_class.new('ee/').regexp(:system)) - .to eq(%r{ee/spec/(features)}) + .to eq(%r{(ee/)spec/(features)}) + end + end + + context 'with several prefixes' do + it 'returns a regexp' do + expect(described_class.new(['', 'ee/', 'jh/']).regexp(:system)) + .to eq(%r{(|ee/|jh/)spec/(features)}) end end diff --git a/spec/workers/ci/stuck_builds/drop_running_worker_spec.rb b/spec/workers/ci/stuck_builds/drop_running_worker_spec.rb new file mode 100644 index 00000000000..68b0696145a --- /dev/null +++ b/spec/workers/ci/stuck_builds/drop_running_worker_spec.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::StuckBuilds::DropRunningWorker do + include ExclusiveLeaseHelpers + + let(:worker_lease_key) { Ci::StuckBuilds::DropRunningWorker::EXCLUSIVE_LEASE_KEY } + let(:worker_lease_uuid) { SecureRandom.uuid } + let(:worker2) { described_class.new } + + subject(:worker) { described_class.new } + + before do + stub_exclusive_lease(worker_lease_key, worker_lease_uuid) + end + + describe '#perform' do + it_behaves_like 'an idempotent worker' + + it 'executes an instance of Ci::StuckBuilds::DropRunningService' do + expect_next_instance_of(Ci::StuckBuilds::DropRunningService) do |service| + expect(service).to receive(:execute).exactly(:once) + end + + worker.perform + end + + 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) + + worker.perform + + stub_exclusive_lease_taken(worker_lease_key) + + worker2.perform + end + + it 'can execute in sequence' do + expect(worker).to receive(:remove_lease).at_least(:once) + expect(worker2).to receive(:remove_lease).at_least(:once) + + worker.perform + worker2.perform + end + + it 'cancels exclusive leases after worker perform' do + expect_to_cancel_exclusive_lease(worker_lease_key, worker_lease_uuid) + + worker.perform + end + + context 'when the DropRunningService 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::DropRunningService) do |service| + allow(service).to receive(:execute) do + raise 'The query timed out' + end + end + + expect { worker.perform }.to raise_error(/The query timed out/) + end + end + end + end +end diff --git a/spec/workers/stuck_ci_jobs_worker_spec.rb b/spec/workers/stuck_ci_jobs_worker_spec.rb index e0a5d3c6c1c..ca7d2a7016b 100644 --- a/spec/workers/stuck_ci_jobs_worker_spec.rb +++ b/spec/workers/stuck_ci_jobs_worker_spec.rb @@ -16,7 +16,13 @@ RSpec.describe StuckCiJobsWorker do end describe '#perform' do - it 'executes an instance of Ci::StuckBuildsDropService' do + 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 expect_next_instance_of(Ci::StuckBuilds::DropService) do |service| expect(service).to receive(:execute).exactly(:once) end |