diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 16:18:24 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 16:18:24 +0300 |
commit | 0653e08efd039a5905f3fa4f6e9cef9f5d2f799c (patch) | |
tree | 4dcc884cf6d81db44adae4aa99f8ec1233a41f55 /spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb | |
parent | 744144d28e3e7fddc117924fef88de5d9674fe4c (diff) |
Add latest changes from gitlab-org/gitlab@14-3-stable-eev14.3.0-rc42
Diffstat (limited to 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb')
-rw-r--r-- | spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb | 103 |
1 files changed, 85 insertions, 18 deletions
diff --git a/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb b/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb index 440eca10a88..abbfb9cd9fa 100644 --- a/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb +++ b/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do +RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator, :aggregate_failures do let(:base_payload) do { "class" => "ARandomWorker", @@ -31,10 +31,35 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do end before do + # Settings aren't in the database in specs, but stored in memory, this is fine + # for these tests. + allow(Gitlab::CurrentSettings).to receive(:current_application_settings?).and_return(true) stub_const("TestSizeLimiterWorker", worker_class) end describe '#initialize' do + context 'configuration from application settings' do + let(:validator) { described_class.new(worker_class, job_payload) } + + it 'has the right defaults' do + expect(validator.mode).to eq(described_class::COMPRESS_MODE) + expect(validator.compression_threshold).to eq(described_class::DEFAULT_COMPRESSION_THRESHOLD_BYTES) + expect(validator.size_limit).to eq(described_class::DEFAULT_SIZE_LIMIT) + end + + it 'allows configuration through application settings' do + stub_application_setting( + sidekiq_job_limiter_mode: 'track', + sidekiq_job_limiter_compression_threshold_bytes: 1, + sidekiq_job_limiter_limit_bytes: 2 + ) + + expect(validator.mode).to eq(described_class::TRACK_MODE) + expect(validator.compression_threshold).to eq(1) + expect(validator.size_limit).to eq(2) + end + end + context 'when the input mode is valid' do it 'does not log a warning message' do expect(::Sidekiq.logger).not_to receive(:warn) @@ -58,7 +83,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do it 'defaults to track mode' do expect(::Sidekiq.logger).not_to receive(:warn) - validator = described_class.new(TestSizeLimiterWorker, job_payload) + validator = described_class.new(TestSizeLimiterWorker, job_payload, mode: nil) expect(validator.mode).to eql('track') end @@ -74,10 +99,12 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do end context 'when the size input is invalid' do - it 'defaults to 0 and logs a warning message' do + it 'logs a warning message' do expect(::Sidekiq.logger).to receive(:warn).with('Invalid Sidekiq size limiter limit: -1') - described_class.new(TestSizeLimiterWorker, job_payload, size_limit: -1) + validator = described_class.new(TestSizeLimiterWorker, job_payload, size_limit: -1) + + expect(validator.size_limit).to be(0) end end @@ -85,9 +112,9 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do it 'defaults to 0' do expect(::Sidekiq.logger).not_to receive(:warn) - validator = described_class.new(TestSizeLimiterWorker, job_payload) + validator = described_class.new(TestSizeLimiterWorker, job_payload, size_limit: nil) - expect(validator.size_limit).to be(0) + expect(validator.size_limit).to be(described_class::DEFAULT_SIZE_LIMIT) end end @@ -258,6 +285,22 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do end end + context 'when job size is bigger than compression threshold and size limit is 0' do + let(:size_limit) { 0 } + let(:args) { { a: 'a' * 300 } } + let(:job) { job_payload(args) } + + it 'does not raise an exception and compresses the arguments' do + expect(::Gitlab::SidekiqMiddleware::SizeLimiter::Compressor).to receive(:compress).with( + job, Sidekiq.dump_json(args) + ).and_return('a' * 40) + + expect do + validate.call(TestSizeLimiterWorker, job) + end.not_to raise_error + end + end + context 'when the job was already compressed' do let(:job) do job_payload({ a: 'a' * 10 }) @@ -275,7 +318,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do let(:args) { { a: 'a' * 3000 } } let(:job) { job_payload(args) } - it 'does not raise an exception' do + it 'raises an exception' do expect(::Gitlab::SidekiqMiddleware::SizeLimiter::Compressor).to receive(:compress).with( job, Sidekiq.dump_json(args) ).and_return('a' * 60) @@ -284,24 +327,46 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do validate.call(TestSizeLimiterWorker, job) end.to raise_error(Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError) end + + it 'does not raise an exception when the worker allows big payloads' do + worker_class.big_payload! + + expect(::Gitlab::SidekiqMiddleware::SizeLimiter::Compressor).to receive(:compress).with( + job, Sidekiq.dump_json(args) + ).and_return('a' * 60) + + expect do + validate.call(TestSizeLimiterWorker, job) + end.not_to raise_error + end end end end - describe '#validate!' do - context 'when calling SizeLimiter.validate!' do - let(:validate) { ->(worker_clas, job) { described_class.validate!(worker_class, job) } } + describe '.validate!' do + let(:validate) { ->(worker_class, job) { described_class.validate!(worker_class, job) } } + it_behaves_like 'validate limit job payload size' do before do - stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_MODE', mode) - stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_LIMIT_BYTES', size_limit) - stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_COMPRESSION_THRESHOLD_BYTES', compression_threshold) + stub_application_setting( + sidekiq_job_limiter_mode: mode, + sidekiq_job_limiter_compression_threshold_bytes: compression_threshold, + sidekiq_job_limiter_limit_bytes: size_limit + ) end + end - it_behaves_like 'validate limit job payload size' + it "skips background migrations" do + expect(described_class).not_to receive(:new) + + described_class::EXEMPT_WORKER_NAMES.each do |class_name| + validate.call(class_name.constantize, job_payload) + end end + end - context 'when creating an instance with the related ENV variables' do + describe '#validate!' do + context 'when creating an instance with the related configuration variables' do let(:validate) do ->(worker_clas, job) do described_class.new(worker_class, job).validate! @@ -309,9 +374,11 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do end before do - stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_MODE', mode) - stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_LIMIT_BYTES', size_limit) - stub_env('GITLAB_SIDEKIQ_SIZE_LIMITER_COMPRESSION_THRESHOLD_BYTES', compression_threshold) + stub_application_setting( + sidekiq_job_limiter_mode: mode, + sidekiq_job_limiter_compression_threshold_bytes: compression_threshold, + sidekiq_job_limiter_limit_bytes: size_limit + ) end it_behaves_like 'validate limit job payload size' |