diff options
Diffstat (limited to 'spec/models/ci/runner_spec.rb')
-rw-r--r-- | spec/models/ci/runner_spec.rb | 171 |
1 files changed, 139 insertions, 32 deletions
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index bb9ac084ed6..d4f7db3bddd 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -532,7 +532,7 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do let_it_be(:runner3) { create(:ci_runner, creator_id: 1) } let_it_be(:runner4) { create(:ci_runner, creator_id: nil) } - it 'returns runners with creator_id \'1\'' do + it "returns runners with creator_id '1'" do is_expected.to contain_exactly(runner2, runner3) end end @@ -557,19 +557,6 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do end end - describe '.stale', :freeze_time do - subject { described_class.stale } - - let!(:runner1) { create(:ci_runner, :instance, created_at: 4.months.ago, contacted_at: 3.months.ago + 1.second) } - let!(:runner2) { create(:ci_runner, :instance, created_at: 4.months.ago, contacted_at: 3.months.ago) } - let!(:runner3) { create(:ci_runner, :instance, created_at: 3.months.ago, contacted_at: nil) } - let!(:runner4) { create(:ci_runner, :instance, created_at: 2.months.ago, contacted_at: nil) } - - it 'returns stale runners' do - is_expected.to match_array([runner2, runner3]) - end - end - describe '#stale?', :clean_gitlab_redis_cache, :freeze_time do let(:runner) { build(:ci_runner, :instance) } @@ -632,15 +619,6 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do end end - describe '.online', :freeze_time do - subject { described_class.online } - - let!(:runner1) { create(:ci_runner, :instance, contacted_at: 2.hours.ago) } - let!(:runner2) { create(:ci_runner, :instance, contacted_at: 1.second.ago) } - - it { is_expected.to match_array([runner2]) } - end - describe '#online?', :clean_gitlab_redis_cache, :freeze_time do let(:runner) { build(:ci_runner, :instance) } @@ -715,15 +693,6 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do end end - describe '.offline' do - subject { described_class.offline } - - let!(:runner1) { create(:ci_runner, :instance, contacted_at: 2.hours.ago) } - let!(:runner2) { create(:ci_runner, :instance, contacted_at: 1.second.ago) } - - it { is_expected.to eq([runner1]) } - end - describe '.with_running_builds' do subject { described_class.with_running_builds } @@ -1229,6 +1198,46 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do end end + describe '#clear_heartbeat', :freeze_time do + let!(:runner) { create(:ci_runner, :project, version: '15.0.0') } + let(:heartbeat_values) do + { + version: '15.0.1', + platform: 'darwin', + architecture: '18-bit', + ip_address: '1.1.1.1', + executor: 'shell', + revision: 'sha', + config: { 'gpus' => 'all' } + } + end + + let(:expected_attributes) { heartbeat_values.except(:executor).merge(executor_type: 'shell') } + let(:expected_cleared_attributes) { expected_attributes.to_h { |key, _| [key, nil] }.merge(config: {}) } + + it 'clears contacted at and other attributes' do + expect do + runner.heartbeat(heartbeat_values) + end.to change { runner.reload.contacted_at }.from(nil).to(Time.current) + .and change { runner.reload.uncached_contacted_at }.from(nil).to(Time.current) + + expected_attributes.each do |key, value| + expect(runner.public_send(key)).to eq(value) + expect(runner.read_attribute(key)).to eq(value) + end + + expect do + runner.clear_heartbeat + end.to change { runner.reload.contacted_at }.from(Time.current).to(nil) + .and change { runner.reload.uncached_contacted_at }.from(Time.current).to(nil) + + expected_cleared_attributes.each do |key, value| + expect(runner.public_send(key)).to eq(value) + expect(runner.read_attribute(key)).to eq(value) + end + end + end + describe '#destroy' do let(:runner) { create(:ci_runner) } @@ -2126,4 +2135,102 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do end end end + + describe 'status scopes' do + let_it_be(:online_runner) { create(:ci_runner, :instance, contacted_at: 1.second.ago) } + let_it_be(:offline_runner) { create(:ci_runner, :instance, contacted_at: 2.hours.ago) } + let_it_be(:never_contacted_runner) { create(:ci_runner, :instance, contacted_at: nil) } + + describe '.online' do + subject(:runners) { described_class.online } + + it 'returns online runners' do + expect(runners).to contain_exactly(online_runner) + end + end + + describe '.offline' do + subject(:runners) { described_class.offline } + + it 'returns offline runners' do + expect(runners).to contain_exactly(offline_runner) + end + end + + describe '.never_contacted' do + subject(:runners) { described_class.never_contacted } + + it 'returns never contacted runners' do + expect(runners).to contain_exactly(never_contacted_runner) + end + end + + describe '.stale', :freeze_time do + subject { described_class.stale } + + let!(:stale_runner1) do + create(:ci_runner, :instance, created_at: described_class.stale_deadline - 1.second, contacted_at: nil) + end + + let!(:stale_runner2) do + create(:ci_runner, :instance, created_at: 4.months.ago, contacted_at: described_class.stale_deadline - 1.second) + end + + it 'returns stale runners' do + is_expected.to contain_exactly(stale_runner1, stale_runner2) + end + end + + include_examples 'runner with status scope' + end + + describe '.available_statuses' do + subject { described_class.available_statuses } + + it { is_expected.to eq(%w[active paused online offline never_contacted stale]) } + end + + describe '.online_contact_time_deadline', :freeze_time do + subject { described_class.online_contact_time_deadline } + + it { is_expected.to eq(2.hours.ago) } + end + + describe '.stale_deadline', :freeze_time do + subject { described_class.stale_deadline } + + it { is_expected.to eq(3.months.ago) } + end + + describe '.with_runner_type' do + subject { described_class.with_runner_type(runner_type) } + + let_it_be(:instance_runner) { create(:ci_runner, :instance) } + let_it_be(:group_runner) { create(:ci_runner, :group) } + let_it_be(:project_runner) { create(:ci_runner, :project) } + + context 'with instance_type' do + let(:runner_type) { 'instance_type' } + + it { is_expected.to contain_exactly(instance_runner) } + end + + context 'with group_type' do + let(:runner_type) { 'group_type' } + + it { is_expected.to contain_exactly(group_runner) } + end + + context 'with project_type' do + let(:runner_type) { 'project_type' } + + it { is_expected.to contain_exactly(project_runner) } + end + + context 'with invalid runner type' do + let(:runner_type) { 'invalid runner type' } + + it { is_expected.to contain_exactly(instance_runner, group_runner, project_runner) } + end + end end |