diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
commit | 9f46488805e86b1bc341ea1620b866016c2ce5ed (patch) | |
tree | f9748c7e287041e37d6da49e0a29c9511dc34768 /spec/lib/gitlab/exclusive_lease_spec.rb | |
parent | dfc92d081ea0332d69c8aca2f0e745cb48ae5e6d (diff) | |
download | gitlab-ce-9f46488805e86b1bc341ea1620b866016c2ce5ed.tar.gz |
Add latest changes from gitlab-org/gitlab@13-0-stable-ee
Diffstat (limited to 'spec/lib/gitlab/exclusive_lease_spec.rb')
-rw-r--r-- | spec/lib/gitlab/exclusive_lease_spec.rb | 82 |
1 files changed, 73 insertions, 9 deletions
diff --git a/spec/lib/gitlab/exclusive_lease_spec.rb b/spec/lib/gitlab/exclusive_lease_spec.rb index 0739f622af5..2c0bb23a0b6 100644 --- a/spec/lib/gitlab/exclusive_lease_spec.rb +++ b/spec/lib/gitlab/exclusive_lease_spec.rb @@ -21,6 +21,27 @@ describe Gitlab::ExclusiveLease, :clean_gitlab_redis_shared_state do end end + describe '.redis_shared_state_key' do + it 'provides a namespaced key' do + expect(described_class.redis_shared_state_key(unique_key)) + .to start_with(described_class::PREFIX) + .and include(unique_key) + end + end + + describe '.ensure_prefixed_key' do + it 'does not double prefix a key' do + prefixed = described_class.redis_shared_state_key(unique_key) + + expect(described_class.ensure_prefixed_key(unique_key)) + .to eq(described_class.ensure_prefixed_key(prefixed)) + end + + it 'raises errors when there is no key' do + expect { described_class.ensure_prefixed_key(nil) }.to raise_error(described_class::NoKey) + end + end + describe '#renew' do it 'returns true when we have the existing lease' do lease = described_class.new(unique_key, timeout: 3600) @@ -61,18 +82,61 @@ describe Gitlab::ExclusiveLease, :clean_gitlab_redis_shared_state do end end - describe '.cancel' do - it 'can cancel a lease' do - uuid = new_lease(unique_key) - expect(uuid).to be_present - expect(new_lease(unique_key)).to eq(false) + describe 'cancellation' do + def new_lease(key) + described_class.new(key, timeout: 3600) + end - described_class.cancel(unique_key, uuid) - expect(new_lease(unique_key)).to be_present + shared_examples 'cancelling a lease' do + let(:lease) { new_lease(unique_key) } + + it 'releases the held lease' do + uuid = lease.try_obtain + expect(uuid).to be_present + expect(new_lease(unique_key).try_obtain).to eq(false) + + cancel_lease(uuid) + + expect(new_lease(unique_key).try_obtain).to be_present + end end - def new_lease(key) - described_class.new(key, timeout: 3600).try_obtain + describe '.cancel' do + def cancel_lease(uuid) + described_class.cancel(release_key, uuid) + end + + context 'when called with the unprefixed key' do + it_behaves_like 'cancelling a lease' do + let(:release_key) { unique_key } + end + end + + context 'when called with the prefixed key' do + it_behaves_like 'cancelling a lease' do + let(:release_key) { described_class.redis_shared_state_key(unique_key) } + end + end + + it 'does not raise errors when given a nil key' do + expect { described_class.cancel(nil, nil) }.not_to raise_error + end + end + + describe '#cancel' do + def cancel_lease(_uuid) + lease.cancel + end + + it_behaves_like 'cancelling a lease' + + it 'is safe to call even if the lease was never obtained' do + lease = new_lease(unique_key) + + lease.cancel + + expect(new_lease(unique_key).try_obtain).to be_present + end end end |