127 lines
2.4 KiB
Ruby
127 lines
2.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'fast_spec_helper'
|
||
|
require 'rspec-parameterized'
|
||
|
require 'active_support/testing/time_helpers'
|
||
|
|
||
|
RSpec.describe Gitlab::Ci::Runner::Backoff do
|
||
|
include ActiveSupport::Testing::TimeHelpers
|
||
|
|
||
|
describe '#duration' do
|
||
|
it 'returns backoff duration from start' do
|
||
|
freeze_time do
|
||
|
described_class.new(5.minutes.ago).then do |backoff|
|
||
|
expect(backoff.duration).to eq 5.minutes
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns an integer value' do
|
||
|
freeze_time do
|
||
|
described_class.new(5.seconds.ago).then do |backoff|
|
||
|
expect(backoff.duration).to be 5
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'returns the smallest number greater than or equal to duration' do
|
||
|
freeze_time do
|
||
|
described_class.new(0.5.seconds.ago).then do |backoff|
|
||
|
expect(backoff.duration).to be 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#slot' do
|
||
|
using RSpec::Parameterized::TableSyntax
|
||
|
|
||
|
where(:started, :slot) do
|
||
|
0 | 0
|
||
|
0.1 | 0
|
||
|
0.9 | 0
|
||
|
1 | 0
|
||
|
1.1 | 0
|
||
|
1.9 | 0
|
||
|
2 | 0
|
||
|
2.9 | 0
|
||
|
3 | 0
|
||
|
4 | 1
|
||
|
5 | 1
|
||
|
6 | 1
|
||
|
7 | 1
|
||
|
8 | 2
|
||
|
9 | 2
|
||
|
9.9 | 2
|
||
|
10 | 2
|
||
|
15 | 2
|
||
|
16 | 3
|
||
|
31 | 3
|
||
|
32 | 4
|
||
|
63 | 4
|
||
|
64 | 5
|
||
|
127 | 5
|
||
|
128 | 6
|
||
|
250 | 6
|
||
|
310 | 7
|
||
|
520 | 8
|
||
|
999 | 8
|
||
|
end
|
||
|
|
||
|
with_them do
|
||
|
it 'falls into an appropaite backoff slot' do
|
||
|
freeze_time do
|
||
|
backoff = described_class.new(started.seconds.ago)
|
||
|
expect(backoff.slot).to eq slot
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#to_seconds' do
|
||
|
using RSpec::Parameterized::TableSyntax
|
||
|
|
||
|
where(:started, :backoff) do
|
||
|
0 | 1
|
||
|
0.1 | 1
|
||
|
0.9 | 1
|
||
|
1 | 1
|
||
|
1.1 | 1
|
||
|
1.9 | 1
|
||
|
2 | 1
|
||
|
3 | 1
|
||
|
4 | 2
|
||
|
5 | 2
|
||
|
6 | 2
|
||
|
6.5 | 2
|
||
|
7 | 2
|
||
|
8 | 4
|
||
|
9 | 4
|
||
|
9.9 | 4
|
||
|
10 | 4
|
||
|
15 | 4
|
||
|
16 | 8
|
||
|
31 | 8
|
||
|
32 | 16
|
||
|
63 | 16
|
||
|
64 | 32
|
||
|
127 | 32
|
||
|
128 | 64
|
||
|
250 | 64
|
||
|
310 | 64
|
||
|
520 | 64
|
||
|
999 | 64
|
||
|
end
|
||
|
|
||
|
with_them do
|
||
|
it 'calculates backoff based on an appropriate slot' do
|
||
|
freeze_time do
|
||
|
described_class.new(started.seconds.ago).then do |delay|
|
||
|
expect(delay.to_seconds).to eq backoff
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|