86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'spec_helper'
 | 
						|
 | 
						|
RSpec.describe Gitlab::Ci::Trace::RemoteChecksum do
 | 
						|
  let_it_be(:job) { create(:ci_build, :success) }
 | 
						|
 | 
						|
  let(:file_store) { JobArtifactUploader::Store::LOCAL }
 | 
						|
  let(:trace_artifact) { create(:ci_job_artifact, :trace, job: job, file_store: file_store) }
 | 
						|
  let(:checksum) { Digest::MD5.hexdigest(trace_artifact.file.read) }
 | 
						|
  let(:base64checksum) { Digest::MD5.base64digest(trace_artifact.file.read) }
 | 
						|
  let(:fetcher) { described_class.new(trace_artifact) }
 | 
						|
 | 
						|
  describe '#md5_checksum' do
 | 
						|
    subject { fetcher.md5_checksum }
 | 
						|
 | 
						|
    context 'when the file is stored locally' do
 | 
						|
      it { is_expected.to be_nil }
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when object store is enabled' do
 | 
						|
      before do
 | 
						|
        stub_artifacts_object_storage
 | 
						|
      end
 | 
						|
 | 
						|
      context 'with local files' do
 | 
						|
        it { is_expected.to be_nil }
 | 
						|
      end
 | 
						|
 | 
						|
      context 'with remote files' do
 | 
						|
        let(:file_store) { JobArtifactUploader::Store::REMOTE }
 | 
						|
 | 
						|
        context 'when the feature flag is disabled' do
 | 
						|
          before do
 | 
						|
            stub_feature_flags(ci_archived_build_trace_checksum: false)
 | 
						|
          end
 | 
						|
 | 
						|
          it { is_expected.to be_nil }
 | 
						|
        end
 | 
						|
 | 
						|
        context 'with AWS as provider' do
 | 
						|
          it { is_expected.to eq(checksum) }
 | 
						|
        end
 | 
						|
 | 
						|
        context 'with Google as provider' do
 | 
						|
          before do
 | 
						|
            spy_file = spy(:file)
 | 
						|
            expect(fetcher).to receive(:provider_google?) { true }
 | 
						|
            expect(fetcher).not_to receive(:provider_aws?) { false }
 | 
						|
            allow(spy_file).to receive(:attributes).and_return(metadata)
 | 
						|
 | 
						|
            allow_next_found_instance_of(Ci::JobArtifact) do |trace_artifact|
 | 
						|
              allow(trace_artifact.file).to receive(:file) { spy_file }
 | 
						|
            end
 | 
						|
          end
 | 
						|
 | 
						|
          context 'when the response does not include :content_md5' do
 | 
						|
            let(:metadata) {{}}
 | 
						|
 | 
						|
            it 'raises an exception' do
 | 
						|
              expect { subject }.to raise_error KeyError, /content_md5/
 | 
						|
            end
 | 
						|
          end
 | 
						|
 | 
						|
          context 'when the response include :content_md5' do
 | 
						|
            let(:metadata) {{ content_md5: base64checksum }}
 | 
						|
 | 
						|
            it { is_expected.to eq(checksum) }
 | 
						|
          end
 | 
						|
        end
 | 
						|
 | 
						|
        context 'with unsupported providers' do
 | 
						|
          let(:file_store) { JobArtifactUploader::Store::REMOTE }
 | 
						|
 | 
						|
          before do
 | 
						|
            expect(fetcher).to receive(:provider_aws?) { false }
 | 
						|
            expect(fetcher).to receive(:provider_google?) { false }
 | 
						|
          end
 | 
						|
 | 
						|
          it { is_expected.to be_nil }
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |