63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'spec_helper'
 | 
						|
 | 
						|
RSpec.describe Gitlab::Ci::Trace::Backoff do
 | 
						|
  using RSpec::Parameterized::TableSyntax
 | 
						|
 | 
						|
  subject(:backoff) { described_class.new(archival_attempts) }
 | 
						|
 | 
						|
  it 'keeps the MAX_ATTEMPTS limit in sync' do
 | 
						|
    expect(Ci::BuildTraceMetadata::MAX_ATTEMPTS).to eq(5)
 | 
						|
  end
 | 
						|
 | 
						|
  it 'keeps the Redis TTL limit in sync' do
 | 
						|
    expect(Ci::BuildTraceChunks::RedisBase::CHUNK_REDIS_TTL).to eq(7.days)
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#value' do
 | 
						|
    where(:archival_attempts, :result) do
 | 
						|
      1  | 9.6
 | 
						|
      2  | 19.2
 | 
						|
      3  | 28.8
 | 
						|
      4  | 38.4
 | 
						|
      5  | 48.0
 | 
						|
    end
 | 
						|
 | 
						|
    with_them do
 | 
						|
      subject { backoff.value }
 | 
						|
 | 
						|
      it { is_expected.to eq(result.hours) }
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#value_with_jitter' do
 | 
						|
    where(:archival_attempts, :min_value, :max_value) do
 | 
						|
      1 |  9.6 | 13.6
 | 
						|
      2 | 19.2 | 23.2
 | 
						|
      3 | 28.8 | 32.8
 | 
						|
      4 | 38.4 | 42.4
 | 
						|
      5 | 48.0 | 52.0
 | 
						|
    end
 | 
						|
 | 
						|
    with_them do
 | 
						|
      subject { backoff.value_with_jitter }
 | 
						|
 | 
						|
      it { is_expected.to be_in(min_value.hours..max_value.hours) }
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  it 'all retries are happening under the 7 days limit' do
 | 
						|
    backoff_total = 1.upto(Ci::BuildTraceMetadata::MAX_ATTEMPTS).sum do |attempt|
 | 
						|
      backoff = described_class.new(attempt)
 | 
						|
      expect(backoff).to receive(:rand)
 | 
						|
        .with(described_class::MAX_JITTER_VALUE)
 | 
						|
        .and_return(described_class::MAX_JITTER_VALUE)
 | 
						|
 | 
						|
      backoff.value_with_jitter
 | 
						|
    end
 | 
						|
 | 
						|
    expect(backoff_total).to be < Ci::BuildTraceChunks::RedisBase::CHUNK_REDIS_TTL
 | 
						|
  end
 | 
						|
end
 |