diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 14:10:13 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 14:10:13 +0300 |
commit | 0ea3fcec397b69815975647f5e2aa5fe944a8486 (patch) | |
tree | 7979381b89d26011bcf9bdc989a40fcc2f1ed4ff /spec/lib/gitlab/sidekiq_status_spec.rb | |
parent | 72123183a20411a36d607d70b12d57c484394c8e (diff) |
Add latest changes from gitlab-org/gitlab@15-1-stable-eev15.1.0-rc42
Diffstat (limited to 'spec/lib/gitlab/sidekiq_status_spec.rb')
-rw-r--r-- | spec/lib/gitlab/sidekiq_status_spec.rb | 203 |
1 files changed, 120 insertions, 83 deletions
diff --git a/spec/lib/gitlab/sidekiq_status_spec.rb b/spec/lib/gitlab/sidekiq_status_spec.rb index c94deb8e008..027697db7e1 100644 --- a/spec/lib/gitlab/sidekiq_status_spec.rb +++ b/spec/lib/gitlab/sidekiq_status_spec.rb @@ -3,138 +3,175 @@ require 'spec_helper' RSpec.describe Gitlab::SidekiqStatus, :clean_gitlab_redis_queues, :clean_gitlab_redis_shared_state do - describe '.set' do - it 'stores the job ID' do - described_class.set('123') + shared_examples 'tracking status in redis' do + describe '.set' do + it 'stores the job ID' do + described_class.set('123') + + key = described_class.key_for('123') + + with_redis do |redis| + expect(redis.exists(key)).to eq(true) + expect(redis.ttl(key) > 0).to eq(true) + expect(redis.get(key)).to eq('1') + end + end - key = described_class.key_for('123') + it 'allows overriding the expiration time' do + described_class.set('123', described_class::DEFAULT_EXPIRATION * 2) + + key = described_class.key_for('123') - Sidekiq.redis do |redis| - expect(redis.exists(key)).to eq(true) - expect(redis.ttl(key) > 0).to eq(true) - expect(redis.get(key)).to eq('1') + with_redis do |redis| + expect(redis.exists(key)).to eq(true) + expect(redis.ttl(key) > described_class::DEFAULT_EXPIRATION).to eq(true) + expect(redis.get(key)).to eq('1') + end end - end - it 'allows overriding the expiration time' do - described_class.set('123', described_class::DEFAULT_EXPIRATION * 2) + it 'does not store anything with a nil expiry' do + described_class.set('123', nil) - key = described_class.key_for('123') + key = described_class.key_for('123') - Sidekiq.redis do |redis| - expect(redis.exists(key)).to eq(true) - expect(redis.ttl(key) > described_class::DEFAULT_EXPIRATION).to eq(true) - expect(redis.get(key)).to eq('1') + with_redis do |redis| + expect(redis.exists(key)).to eq(false) + end end end - it 'does not store anything with a nil expiry' do - described_class.set('123', nil) + describe '.unset' do + it 'removes the job ID' do + described_class.set('123') + described_class.unset('123') - key = described_class.key_for('123') + key = described_class.key_for('123') - Sidekiq.redis do |redis| - expect(redis.exists(key)).to eq(false) + with_redis do |redis| + expect(redis.exists(key)).to eq(false) + end end end - end - describe '.unset' do - it 'removes the job ID' do - described_class.set('123') - described_class.unset('123') + describe '.all_completed?' do + it 'returns true if all jobs have been completed' do + expect(described_class.all_completed?(%w(123))).to eq(true) + end - key = described_class.key_for('123') + it 'returns false if a job has not yet been completed' do + described_class.set('123') - Sidekiq.redis do |redis| - expect(redis.exists(key)).to eq(false) + expect(described_class.all_completed?(%w(123 456))).to eq(false) end end - end - describe '.all_completed?' do - it 'returns true if all jobs have been completed' do - expect(described_class.all_completed?(%w(123))).to eq(true) - end + describe '.running?' do + it 'returns true if job is running' do + described_class.set('123') - it 'returns false if a job has not yet been completed' do - described_class.set('123') + expect(described_class.running?('123')).to be(true) + end - expect(described_class.all_completed?(%w(123 456))).to eq(false) + it 'returns false if job is not found' do + expect(described_class.running?('123')).to be(false) + end end - end - describe '.running?' do - it 'returns true if job is running' do - described_class.set('123') + describe '.num_running' do + it 'returns 0 if all jobs have been completed' do + expect(described_class.num_running(%w(123))).to eq(0) + end + + it 'returns 2 if two jobs are still running' do + described_class.set('123') + described_class.set('456') - expect(described_class.running?('123')).to be(true) + expect(described_class.num_running(%w(123 456 789))).to eq(2) + end end - it 'returns false if job is not found' do - expect(described_class.running?('123')).to be(false) + describe '.num_completed' do + it 'returns 1 if all jobs have been completed' do + expect(described_class.num_completed(%w(123))).to eq(1) + end + + it 'returns 1 if a job has not yet been completed' do + described_class.set('123') + described_class.set('456') + + expect(described_class.num_completed(%w(123 456 789))).to eq(1) + end end - end - describe '.num_running' do - it 'returns 0 if all jobs have been completed' do - expect(described_class.num_running(%w(123))).to eq(0) + describe '.completed_jids' do + it 'returns the completed job' do + expect(described_class.completed_jids(%w(123))).to eq(['123']) + end + + it 'returns only the jobs completed' do + described_class.set('123') + described_class.set('456') + + expect(described_class.completed_jids(%w(123 456 789))).to eq(['789']) + end end - it 'returns 2 if two jobs are still running' do - described_class.set('123') - described_class.set('456') + describe '.job_status' do + it 'returns an array of boolean values' do + described_class.set('123') + described_class.set('456') + described_class.unset('123') - expect(described_class.num_running(%w(123 456 789))).to eq(2) + expect(described_class.job_status(%w(123 456 789))).to eq([false, true, false]) + end + + it 'handles an empty array' do + expect(described_class.job_status([])).to eq([]) + end end end - describe '.num_completed' do - it 'returns 1 if all jobs have been completed' do - expect(described_class.num_completed(%w(123))).to eq(1) + context 'with multi-store feature flags turned on' do + def with_redis(&block) + Gitlab::Redis::SidekiqStatus.with(&block) end - it 'returns 1 if a job has not yet been completed' do - described_class.set('123') - described_class.set('456') + it 'uses Gitlab::Redis::SidekiqStatus.with' do + expect(Gitlab::Redis::SidekiqStatus).to receive(:with).and_call_original + expect(Sidekiq).not_to receive(:redis) - expect(described_class.num_completed(%w(123 456 789))).to eq(1) + described_class.job_status(%w(123 456 789)) end - end - describe '.key_for' do - it 'returns the key for a job ID' do - key = described_class.key_for('123') + it_behaves_like 'tracking status in redis' + end - expect(key).to be_an_instance_of(String) - expect(key).to include('123') + context 'when both multi-store feature flags are off' do + def with_redis(&block) + Sidekiq.redis(&block) end - end - describe '.completed_jids' do - it 'returns the completed job' do - expect(described_class.completed_jids(%w(123))).to eq(['123']) + before do + stub_feature_flags(use_primary_and_secondary_stores_for_sidekiq_status: false) + stub_feature_flags(use_primary_store_as_default_for_sidekiq_status: false) end - it 'returns only the jobs completed' do - described_class.set('123') - described_class.set('456') + it 'uses Sidekiq.redis' do + expect(Sidekiq).to receive(:redis).and_call_original + expect(Gitlab::Redis::SidekiqStatus).not_to receive(:with) - expect(described_class.completed_jids(%w(123 456 789))).to eq(['789']) + described_class.job_status(%w(123 456 789)) end - end - describe '.job_status' do - it 'returns an array of boolean values' do - described_class.set('123') - described_class.set('456') - described_class.unset('123') + it_behaves_like 'tracking status in redis' + end - expect(described_class.job_status(%w(123 456 789))).to eq([false, true, false]) - end + describe '.key_for' do + it 'returns the key for a job ID' do + key = described_class.key_for('123') - it 'handles an empty array' do - expect(described_class.job_status([])).to eq([]) + expect(key).to be_an_instance_of(String) + expect(key).to include('123') end end end |