diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-12-20 14:22:11 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-12-20 14:22:11 +0000 |
commit | 0c872e02b2c822e3397515ec324051ff540f0cd5 (patch) | |
tree | ce2fb6ce7030e4dad0f4118d21ab6453e5938cdd /spec/lib/gitlab/gitaly_client | |
parent | f7e05a6853b12f02911494c4b3fe53d9540d74fc (diff) | |
download | gitlab-ce-0c872e02b2c822e3397515ec324051ff540f0cd5.tar.gz |
Add latest changes from gitlab-org/gitlab@15-7-stable-eev15.7.0-rc42
Diffstat (limited to 'spec/lib/gitlab/gitaly_client')
3 files changed, 90 insertions, 127 deletions
diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb index 604feeea325..82d5d0f292b 100644 --- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb @@ -898,7 +898,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do end shared_examples '#user_commit_files failure' do - it 'raises a PreReceiveError' do + it 'raises an IndexError' do expect_any_instance_of(Gitaly::OperationService::Stub) .to receive(:user_commit_files).with(kind_of(Enumerator), kind_of(Hash)) .and_raise(structured_error) @@ -912,7 +912,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do context 'with missing file' do let(:status_code) { GRPC::Core::StatusCodes::NOT_FOUND } - let(:expected_message) { "File not found: README.md" } + let(:expected_message) { "A file with this name doesn't exist" } let(:expected_error) do Gitaly::UserCommitFilesError.new( index_update: Gitaly::IndexError.new( @@ -926,7 +926,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do context 'with existing directory' do let(:status_code) { GRPC::Core::StatusCodes::ALREADY_EXISTS } - let(:expected_message) { "Directory already exists: dir1" } + let(:expected_message) { "A directory with this name already exists" } let(:expected_error) do Gitaly::UserCommitFilesError.new( index_update: Gitaly::IndexError.new( @@ -940,7 +940,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do context 'with existing file' do let(:status_code) { GRPC::Core::StatusCodes::ALREADY_EXISTS } - let(:expected_message) { "File already exists: README.md" } + let(:expected_message) { "A file with this name already exists" } let(:expected_error) do Gitaly::UserCommitFilesError.new( index_update: Gitaly::IndexError.new( @@ -954,7 +954,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do context 'with invalid path' do let(:status_code) { GRPC::Core::StatusCodes::INVALID_ARGUMENT } - let(:expected_message) { "Invalid path: invalid://file/name" } + let(:expected_message) { "invalid path: 'invalid://file/name'" } let(:expected_error) do Gitaly::UserCommitFilesError.new( index_update: Gitaly::IndexError.new( @@ -968,7 +968,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do context 'with directory traversal' do let(:status_code) { GRPC::Core::StatusCodes::INVALID_ARGUMENT } - let(:expected_message) { "Directory traversal in path escapes repository: ../../../../etc/shadow" } + let(:expected_message) { "Path cannot include directory traversal" } let(:expected_error) do Gitaly::UserCommitFilesError.new( index_update: Gitaly::IndexError.new( @@ -982,7 +982,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do context 'with empty path' do let(:status_code) { GRPC::Core::StatusCodes::INVALID_ARGUMENT } - let(:expected_message) { "Received empty path" } + let(:expected_message) { "You must provide a file path" } let(:expected_error) do Gitaly::UserCommitFilesError.new( index_update: Gitaly::IndexError.new( @@ -1009,16 +1009,33 @@ RSpec.describe Gitlab::GitalyClient::OperationService do end context 'with an exception without the detailed error' do - let(:permission_error) do - GRPC::PermissionDenied.new - end - - it 'raises PermissionDenied' do + before do expect_any_instance_of(Gitaly::OperationService::Stub) .to receive(:user_commit_files).with(kind_of(Enumerator), kind_of(Hash)) - .and_raise(permission_error) + .and_raise(raised_error) + end - expect { subject }.to raise_error(GRPC::PermissionDenied) + context 'with an index error from libgit2' do + let(:raised_error) do + GRPC::Internal.new('invalid path: .git/foo') + end + + it 'raises IndexError' do + expect { subject }.to raise_error do |error| + expect(error).to be_a(Gitlab::Git::Index::IndexError) + expect(error.message).to eq('invalid path: .git/foo') + end + end + end + + context 'with a generic error' do + let(:raised_error) do + GRPC::PermissionDenied.new + end + + it 'raises PermissionDenied' do + expect { subject }.to raise_error(GRPC::PermissionDenied) + end end end end diff --git a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb index bd96e9baf1d..ae2e343377d 100644 --- a/spec/lib/gitlab/gitaly_client/ref_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/ref_service_spec.rb @@ -71,28 +71,6 @@ RSpec.describe Gitlab::GitalyClient::RefService do end end - describe '#branch_names' do - it 'sends a find_all_branch_names message' do - expect_any_instance_of(Gitaly::RefService::Stub) - .to receive(:find_all_branch_names) - .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash)) - .and_return([]) - - client.branch_names - end - end - - describe '#tag_names' do - it 'sends a find_all_tag_names message' do - expect_any_instance_of(Gitaly::RefService::Stub) - .to receive(:find_all_tag_names) - .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash)) - .and_return([]) - - client.tag_names - end - end - describe '#find_branch' do it 'sends a find_branch message' do expect_any_instance_of(Gitaly::RefService::Stub) @@ -102,6 +80,16 @@ RSpec.describe Gitlab::GitalyClient::RefService do client.find_branch('name') end + + context 'when Gitaly returns a ambiguios reference error' do + it 'raises an UnknownRef error' do + expect_any_instance_of(Gitaly::RefService::Stub) + .to receive(:find_branch) + .and_raise(GRPC::BadStatus.new(2, 'reference is ambiguous')) + + expect { client.find_branch('name') }.to raise_error(Gitlab::Git::AmbiguousRef, 'branch is ambiguous: name') + end + end end describe '#find_tag' do diff --git a/spec/lib/gitlab/gitaly_client/with_feature_flag_actors_spec.rb b/spec/lib/gitlab/gitaly_client/with_feature_flag_actors_spec.rb index 41dce5d76dd..61945cc06b8 100644 --- a/spec/lib/gitlab/gitaly_client/with_feature_flag_actors_spec.rb +++ b/spec/lib/gitlab/gitaly_client/with_feature_flag_actors_spec.rb @@ -157,70 +157,47 @@ RSpec.describe Gitlab::GitalyClient::WithFeatureFlagActors do let(:call_arg_2) { double } let(:call_arg_3) { double } let(:call_result) { double } + let(:repository_actor) { instance_double(::Repository) } + let(:user_actor) { instance_double(::User) } + let(:project_actor) { instance_double(Project) } + let(:group_actor) { instance_double(Group) } before do + allow(service).to receive(:user_actor).and_return(user_actor) + allow(service).to receive(:repository_actor).and_return(repository_actor) + allow(service).to receive(:project_actor).and_return(project_actor) + allow(service).to receive(:group_actor).and_return(group_actor) + allow(Gitlab::GitalyClient).to receive(:with_feature_flag_actors).and_call_original allow(Gitlab::GitalyClient).to receive(:call).and_return(call_result) end - context 'when actors_aware_gitaly_calls flag is enabled' do - let(:repository_actor) { instance_double(::Repository) } - let(:user_actor) { instance_double(::User) } - let(:project_actor) { instance_double(Project) } - let(:group_actor) { instance_double(Group) } - - before do - stub_feature_flags(actors_aware_gitaly_calls: true) - - allow(service).to receive(:user_actor).and_return(user_actor) - allow(service).to receive(:repository_actor).and_return(repository_actor) - allow(service).to receive(:project_actor).and_return(project_actor) - allow(service).to receive(:group_actor).and_return(group_actor) - allow(Gitlab::GitalyClient).to receive(:with_feature_flag_actors).and_call_original - end - - it 'triggers client call with feature flag actors' do - result = service.gitaly_client_call(call_arg_1, call_arg_2, karg: call_arg_3) - - expect(Gitlab::GitalyClient).to have_received(:call).with(call_arg_1, call_arg_2, karg: call_arg_3) - expect(Gitlab::GitalyClient).to have_received(:with_feature_flag_actors).with( - repository: repository_actor, - user: user_actor, - project: project_actor, - group: group_actor - ) - expect(result).to be(call_result) - end - - context 'when call without repository_actor' do - before do - allow(service).to receive(:repository_actor).and_return(nil) - allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original - end - - it 'calls error tracking track_and_raise_for_dev_exception' do - expect do - service.gitaly_client_call(call_arg_1, call_arg_2, karg: call_arg_3) - end.to raise_error /gitaly_client_call called without setting repository_actor/ - - expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_for_dev_exception).with( - be_a(Feature::InvalidFeatureFlagError) - ) - end - end + it 'triggers client call with feature flag actors' do + result = service.gitaly_client_call(call_arg_1, call_arg_2, karg: call_arg_3) + + expect(Gitlab::GitalyClient).to have_received(:call).with(call_arg_1, call_arg_2, karg: call_arg_3) + expect(Gitlab::GitalyClient).to have_received(:with_feature_flag_actors).with( + repository: repository_actor, + user: user_actor, + project: project_actor, + group: group_actor + ) + expect(result).to be(call_result) end - context 'when actors_aware_gitaly_calls not enabled' do + context 'when call without repository_actor' do before do - stub_feature_flags(actors_aware_gitaly_calls: false) + allow(service).to receive(:repository_actor).and_return(nil) + allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original end - it 'triggers client call without feature flag actors' do - expect(Gitlab::GitalyClient).not_to receive(:with_feature_flag_actors) + it 'calls error tracking track_and_raise_for_dev_exception' do + expect do + service.gitaly_client_call(call_arg_1, call_arg_2, karg: call_arg_3) + end.to raise_error /gitaly_client_call called without setting repository_actor/ - result = service.gitaly_client_call(call_arg_1, call_arg_2, karg: call_arg_3) - - expect(Gitlab::GitalyClient).to have_received(:call).with(call_arg_1, call_arg_2, karg: call_arg_3) - expect(result).to be(call_result) + expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_for_dev_exception).with( + be_a(Feature::InvalidFeatureFlagError) + ) end end @@ -228,47 +205,28 @@ RSpec.describe Gitlab::GitalyClient::WithFeatureFlagActors do let_it_be(:project) { create(:project) } let(:repository_actor) { project.repository } - context 'when actors_aware_gitaly_calls flag is enabled' do - let(:user_actor) { instance_double(::User) } - let(:project_actor) { instance_double(Project) } - let(:group_actor) { instance_double(Group) } - - before do - stub_feature_flags(actors_aware_gitaly_calls: true) - - allow(Feature::Gitaly).to receive(:user_actor).and_return(user_actor) - allow(Feature::Gitaly).to receive(:project_actor).with(project).and_return(project_actor) - allow(Feature::Gitaly).to receive(:group_actor).with(project).and_return(group_actor) - end - - it 'returns a hash with collected feature flag actors' do - result = service.gitaly_feature_flag_actors(repository_actor) - expect(result).to eql( - repository: repository_actor, - user: user_actor, - project: project_actor, - group: group_actor - ) - - expect(Feature::Gitaly).to have_received(:user_actor).with(no_args) - expect(Feature::Gitaly).to have_received(:project_actor).with(project) - expect(Feature::Gitaly).to have_received(:group_actor).with(project) - end - end + let(:user_actor) { instance_double(::User) } + let(:project_actor) { instance_double(Project) } + let(:group_actor) { instance_double(Group) } - context 'when actors_aware_gitaly_calls not enabled' do - before do - stub_feature_flags(actors_aware_gitaly_calls: false) - end + before do + allow(Feature::Gitaly).to receive(:user_actor).and_return(user_actor) + allow(Feature::Gitaly).to receive(:project_actor).with(project).and_return(project_actor) + allow(Feature::Gitaly).to receive(:group_actor).with(project).and_return(group_actor) + end - it 'returns an empty hash' do - expect(Feature::Gitaly).not_to receive(:user_actor) - expect(Feature::Gitaly).not_to receive(:project_actor) - expect(Feature::Gitaly).not_to receive(:group_actor) + it 'returns a hash with collected feature flag actors' do + result = service.gitaly_feature_flag_actors(repository_actor) + expect(result).to eql( + repository: repository_actor, + user: user_actor, + project: project_actor, + group: group_actor + ) - result = service.gitaly_feature_flag_actors(repository_actor) - expect(result).to eql({}) - end + expect(Feature::Gitaly).to have_received(:user_actor).with(no_args) + expect(Feature::Gitaly).to have_received(:project_actor).with(project) + expect(Feature::Gitaly).to have_received(:group_actor).with(project) end end end |