diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-20 15:19:03 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-20 15:19:03 +0000 |
commit | 14bd84b61276ef29b97d23642d698de769bacfd2 (patch) | |
tree | f9eba90140c1bd874211dea17750a0d422c04080 /spec/services/packages | |
parent | 891c388697b2db0d8ee0c8358a9bdbf6dc56d581 (diff) | |
download | gitlab-ce-14bd84b61276ef29b97d23642d698de769bacfd2.tar.gz |
Add latest changes from gitlab-org/gitlab@15-10-stable-eev15.10.0-rc42
Diffstat (limited to 'spec/services/packages')
56 files changed, 212 insertions, 92 deletions
diff --git a/spec/services/packages/cleanup/execute_policy_service_spec.rb b/spec/services/packages/cleanup/execute_policy_service_spec.rb index 93335c4a821..a083dc0d4ea 100644 --- a/spec/services/packages/cleanup/execute_policy_service_spec.rb +++ b/spec/services/packages/cleanup/execute_policy_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Cleanup::ExecutePolicyService do +RSpec.describe Packages::Cleanup::ExecutePolicyService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be_with_reload(:policy) { create(:packages_cleanup_policy, project: project) } diff --git a/spec/services/packages/cleanup/update_policy_service_spec.rb b/spec/services/packages/cleanup/update_policy_service_spec.rb index a11fbb766f5..8068c351e5f 100644 --- a/spec/services/packages/cleanup/update_policy_service_spec.rb +++ b/spec/services/packages/cleanup/update_policy_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Cleanup::UpdatePolicyService do +RSpec.describe Packages::Cleanup::UpdatePolicyService, feature_category: :package_registry do using RSpec::Parameterized::TableSyntax let_it_be_with_reload(:project) { create(:project) } diff --git a/spec/services/packages/composer/composer_json_service_spec.rb b/spec/services/packages/composer/composer_json_service_spec.rb index d2187688c4c..15acd79c49e 100644 --- a/spec/services/packages/composer/composer_json_service_spec.rb +++ b/spec/services/packages/composer/composer_json_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Composer::ComposerJsonService do +RSpec.describe Packages::Composer::ComposerJsonService, feature_category: :package_registry do describe '#execute' do let(:branch) { project.repository.find_branch('master') } let(:target) { branch.target } diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb index 26429a7b5d9..78d5d76fe4f 100644 --- a/spec/services/packages/composer/create_package_service_spec.rb +++ b/spec/services/packages/composer/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Composer::CreatePackageService do +RSpec.describe Packages::Composer::CreatePackageService, feature_category: :package_registry do include PackagesManagerApiSpecHelpers let_it_be(:package_name) { 'composer-package-name' } diff --git a/spec/services/packages/composer/version_parser_service_spec.rb b/spec/services/packages/composer/version_parser_service_spec.rb index 69253ff934e..ac50f2e2e55 100644 --- a/spec/services/packages/composer/version_parser_service_spec.rb +++ b/spec/services/packages/composer/version_parser_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Composer::VersionParserService do +RSpec.describe Packages::Composer::VersionParserService, feature_category: :package_registry do let_it_be(:params) { {} } describe '#execute' do diff --git a/spec/services/packages/conan/create_package_file_service_spec.rb b/spec/services/packages/conan/create_package_file_service_spec.rb index e655b8d1f9e..6859e52560a 100644 --- a/spec/services/packages/conan/create_package_file_service_spec.rb +++ b/spec/services/packages/conan/create_package_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Conan::CreatePackageFileService do +RSpec.describe Packages::Conan::CreatePackageFileService, feature_category: :package_registry do include WorkhorseHelpers let_it_be(:package) { create(:conan_package) } diff --git a/spec/services/packages/conan/create_package_service_spec.rb b/spec/services/packages/conan/create_package_service_spec.rb index 6f644f5ef95..db06463b7fa 100644 --- a/spec/services/packages/conan/create_package_service_spec.rb +++ b/spec/services/packages/conan/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Conan::CreatePackageService do +RSpec.describe Packages::Conan::CreatePackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/create_dependency_service_spec.rb b/spec/services/packages/create_dependency_service_spec.rb index f95e21cd045..06a7a13bdd9 100644 --- a/spec/services/packages/create_dependency_service_spec.rb +++ b/spec/services/packages/create_dependency_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::CreateDependencyService do +RSpec.describe Packages::CreateDependencyService, feature_category: :package_registry do describe '#execute' do let_it_be(:namespace) { create(:namespace) } let_it_be(:version) { '1.0.1' } diff --git a/spec/services/packages/create_event_service_spec.rb b/spec/services/packages/create_event_service_spec.rb index 58fa68b11fe..44ad3f29c58 100644 --- a/spec/services/packages/create_event_service_spec.rb +++ b/spec/services/packages/create_event_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::CreateEventService do +RSpec.describe Packages::CreateEventService, feature_category: :package_registry do let(:scope) { 'generic' } let(:event_name) { 'push_package' } diff --git a/spec/services/packages/create_package_file_service_spec.rb b/spec/services/packages/create_package_file_service_spec.rb index 2ff00ea8568..5b4ea3e1530 100644 --- a/spec/services/packages/create_package_file_service_spec.rb +++ b/spec/services/packages/create_package_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::CreatePackageFileService do +RSpec.describe Packages::CreatePackageFileService, feature_category: :package_registry do let_it_be(:package) { create(:maven_package) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/create_temporary_package_service_spec.rb b/spec/services/packages/create_temporary_package_service_spec.rb index 4b8d37401d8..be8b5afc1e0 100644 --- a/spec/services/packages/create_temporary_package_service_spec.rb +++ b/spec/services/packages/create_temporary_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::CreateTemporaryPackageService do +RSpec.describe Packages::CreateTemporaryPackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:params) { {} } diff --git a/spec/services/packages/debian/create_package_file_service_spec.rb b/spec/services/packages/debian/create_package_file_service_spec.rb index 43928669eb1..b527bf8c1de 100644 --- a/spec/services/packages/debian/create_package_file_service_spec.rb +++ b/spec/services/packages/debian/create_package_file_service_spec.rb @@ -57,7 +57,7 @@ RSpec.describe Packages::Debian::CreatePackageFileService, feature_category: :pa expect(package_file).to be_valid expect(package_file.file.read).to start_with('Format: 1.8') - expect(package_file.size).to eq(2143) + expect(package_file.size).to eq(2422) expect(package_file.file_name).to eq(file_name) expect(package_file.file_sha1).to eq('54321') expect(package_file.file_sha256).to eq('543212345') diff --git a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb index 4d6acac219b..a22c1fc7acc 100644 --- a/spec/services/packages/debian/extract_changes_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_changes_metadata_service_spec.rb @@ -19,7 +19,7 @@ RSpec.describe Packages::Debian::ExtractChangesMetadataService, feature_category expect(subject[:file_type]).to eq(:changes) expect(subject[:architecture]).to be_nil expect(subject[:fields]).to include(expected_fields) - expect(subject[:files].count).to eq(6) + expect(subject[:files].count).to eq(7) end end diff --git a/spec/services/packages/debian/extract_metadata_service_spec.rb b/spec/services/packages/debian/extract_metadata_service_spec.rb index 412f285152b..1983c49c6b7 100644 --- a/spec/services/packages/debian/extract_metadata_service_spec.rb +++ b/spec/services/packages/debian/extract_metadata_service_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require 'spec_helper' RSpec.describe Packages::Debian::ExtractMetadataService, feature_category: :package_registry do @@ -6,12 +7,13 @@ RSpec.describe Packages::Debian::ExtractMetadataService, feature_category: :pack subject { service.execute } - RSpec.shared_context 'Debian ExtractMetadata Service' do |trait| + RSpec.shared_context 'with Debian package file' do |trait| let(:package_file) { create(:debian_package_file, trait) } end RSpec.shared_examples 'Test Debian ExtractMetadata Service' do |expected_file_type, expected_architecture, expected_fields| - it "returns file_type #{expected_file_type.inspect}, architecture #{expected_architecture.inspect} and fields #{expected_fields.nil? ? '' : 'including '}#{expected_fields.inspect}", :aggregate_failures do + it "returns file_type #{expected_file_type.inspect}, architecture #{expected_architecture.inspect} and fields #{expected_fields.nil? ? '' : 'including '}#{expected_fields.inspect}", + :aggregate_failures do expect(subject[:file_type]).to eq(expected_file_type) expect(subject[:architecture]).to eq(expected_architecture) @@ -25,29 +27,79 @@ RSpec.describe Packages::Debian::ExtractMetadataService, feature_category: :pack using RSpec::Parameterized::TableSyntax - where(:case_name, :trait, :expected_file_type, :expected_architecture, :expected_fields) do - 'with invalid' | :invalid | :unknown | nil | nil - 'with source' | :source | :source | nil | nil - 'with dsc' | :dsc | :dsc | nil | { 'Binary' => 'sample-dev, libsample0, sample-udeb' } - 'with deb' | :deb | :deb | 'amd64' | { 'Multi-Arch' => 'same' } - 'with udeb' | :udeb | :udeb | 'amd64' | { 'Package' => 'sample-udeb' } - 'with buildinfo' | :buildinfo | :buildinfo | nil | { 'Architecture' => 'amd64 source', 'Build-Architecture' => 'amd64' } - 'with changes' | :changes | :changes | nil | { 'Architecture' => 'source amd64', 'Binary' => 'libsample0 sample-dev sample-udeb' } + context 'with valid file types' do + where(:case_name, :trait, :expected_file_type, :expected_architecture, :expected_fields) do + 'with source' | :source | :source | nil | nil + 'with dsc' | :dsc | :dsc | nil | { 'Binary' => 'sample-dev, libsample0, sample-udeb, sample-ddeb' } + 'with deb' | :deb | :deb | 'amd64' | { 'Multi-Arch' => 'same' } + 'with udeb' | :udeb | :udeb | 'amd64' | { 'Package' => 'sample-udeb' } + 'with ddeb' | :ddeb | :ddeb | 'amd64' | { 'Package' => 'sample-ddeb' } + 'with buildinfo' | :buildinfo | :buildinfo | nil | { 'Architecture' => 'amd64 source', + 'Build-Architecture' => 'amd64' } + 'with changes' | :changes | :changes | nil | { 'Architecture' => 'source amd64', + 'Binary' => 'libsample0 sample-dev sample-udeb' } + end + + with_them do + include_context 'with Debian package file', params[:trait] do + it_behaves_like 'Test Debian ExtractMetadata Service', + params[:expected_file_type], + params[:expected_architecture], + params[:expected_fields] + end + end end - with_them do - include_context 'Debian ExtractMetadata Service', params[:trait] do - it_behaves_like 'Test Debian ExtractMetadata Service', - params[:expected_file_type], - params[:expected_architecture], - params[:expected_fields] + context 'with valid source extensions' do + where(:ext) do + %i[gz bz2 lzma xz] + end + + with_them do + let(:package_file) do + create(:debian_package_file, :source, file_name: "myfile.tar.#{ext}", + file_fixture: 'spec/fixtures/packages/debian/sample_1.2.3~alpha2.tar.xz') + end + + it_behaves_like 'Test Debian ExtractMetadata Service', :source + end + end + + context 'with invalid source extensions' do + where(:ext) do + %i[gzip bzip2] + end + + with_them do + let(:package_file) do + create(:debian_package_file, :source, file_name: "myfile.tar.#{ext}", + file_fixture: 'spec/fixtures/packages/debian/sample_1.2.3~alpha2.tar.xz') + end + + it 'raises an error' do + expect do + subject + end.to raise_error(described_class::ExtractionError, + "unsupported file extension for file #{package_file.file_name}") + end + end + end + + context 'with invalid file name' do + let(:package_file) { create(:debian_package_file, :invalid) } + + it 'raises an error' do + expect do + subject + end.to raise_error(described_class::ExtractionError, + "unsupported file extension for file #{package_file.file_name}") end end context 'with invalid package file' do let(:package_file) { create(:conan_package_file) } - it 'raise error' do + it 'raises an error' do expect { subject }.to raise_error(described_class::ExtractionError, 'invalid package file') end end diff --git a/spec/services/packages/debian/generate_distribution_service_spec.rb b/spec/services/packages/debian/generate_distribution_service_spec.rb index 6d179c791a3..27206b847e4 100644 --- a/spec/services/packages/debian/generate_distribution_service_spec.rb +++ b/spec/services/packages/debian/generate_distribution_service_spec.rb @@ -3,20 +3,32 @@ require 'spec_helper' RSpec.describe Packages::Debian::GenerateDistributionService, feature_category: :package_registry do - describe '#execute' do - subject { described_class.new(distribution).execute } + include_context 'with published Debian package' - let(:subject2) { described_class.new(distribution).execute } - let(:subject3) { described_class.new(distribution).execute } + let(:service) { described_class.new(distribution) } - include_context 'with published Debian package' + [:project, :group].each do |container_type| + context "for #{container_type}" do + include_context 'with Debian distribution', container_type - [:project, :group].each do |container_type| - context "for #{container_type}" do - include_context 'with Debian distribution', container_type + describe '#execute' do + subject { service.execute } + + let(:subject2) { described_class.new(distribution).execute } + let(:subject3) { described_class.new(distribution).execute } it_behaves_like 'Generate Debian Distribution and component files' end + + describe '#lease_key' do + subject { service.send(:lease_key) } + + let(:prefix) { "packages:debian:generate_distribution_service:" } + + it 'returns an unique key' do + is_expected.to eq "#{prefix}#{container_type}_distribution:#{distribution.id}" + end + end end end end diff --git a/spec/services/packages/debian/parse_debian822_service_spec.rb b/spec/services/packages/debian/parse_debian822_service_spec.rb index 35b7ead9209..624d4d95e5a 100644 --- a/spec/services/packages/debian/parse_debian822_service_spec.rb +++ b/spec/services/packages/debian/parse_debian822_service_spec.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require 'spec_helper' RSpec.describe Packages::Debian::ParseDebian822Service, feature_category: :package_registry do @@ -76,14 +77,19 @@ RSpec.describe Packages::Debian::ParseDebian822Service, feature_category: :packa 'Multi-Arch' => 'same', 'Depends' => '${shlibs:Depends}, ${misc:Depends}', 'Description' => "Some mostly empty lib\nUsed in GitLab tests.\n\nTesting another paragraph." - }, + }, 'Package: sample-udeb' => { - 'Package' => 'sample-udeb', - 'Package-Type' => 'udeb', - 'Architecture' => 'any', - 'Depends' => 'installed-base', - 'Description' => 'Some mostly empty udeb' - } + 'Package' => 'sample-udeb', + 'Package-Type' => 'udeb', + 'Architecture' => 'any', + 'Depends' => 'installed-base', + 'Description' => 'Some mostly empty udeb' + }, + 'Package: sample-ddeb' => { + 'Package' => 'sample-ddeb', + 'Architecture' => 'any', + 'Description' => 'Some fake Ubuntu ddeb' + } } expect(subject.execute.to_s).to eq(expected.to_s) diff --git a/spec/services/packages/debian/process_changes_service_spec.rb b/spec/services/packages/debian/process_changes_service_spec.rb index e3ed744377e..d2c05b678ea 100644 --- a/spec/services/packages/debian/process_changes_service_spec.rb +++ b/spec/services/packages/debian/process_changes_service_spec.rb @@ -18,7 +18,7 @@ RSpec.describe Packages::Debian::ProcessChangesService, feature_category: :packa expect { subject.execute } .to change { Packages::Package.count }.from(1).to(2) .and not_change { Packages::PackageFile.count } - .and change { incoming.package_files.count }.from(7).to(0) + .and change { incoming.package_files.count }.from(8).to(0) .and change { package_file.debian_file_metadatum&.reload&.file_type }.from('unknown').to('changes') created_package = Packages::Package.last diff --git a/spec/services/packages/debian/process_package_file_service_spec.rb b/spec/services/packages/debian/process_package_file_service_spec.rb index caf29cfc4fa..2684b69785a 100644 --- a/spec/services/packages/debian/process_package_file_service_spec.rb +++ b/spec/services/packages/debian/process_package_file_service_spec.rb @@ -35,6 +35,7 @@ RSpec.describe Packages::Debian::ProcessPackageFileService, feature_category: :p where(:case_name, :expected_file_type, :file_name, :component_name) do 'with a deb' | 'deb' | 'libsample0_1.2.3~alpha2_amd64.deb' | 'main' 'with an udeb' | 'udeb' | 'sample-udeb_1.2.3~alpha2_amd64.udeb' | 'contrib' + 'with an ddeb' | 'ddeb' | 'sample-ddeb_1.2.3~alpha2_amd64.ddeb' | 'main' end with_them do @@ -67,9 +68,9 @@ RSpec.describe Packages::Debian::ProcessPackageFileService, feature_category: :p .to receive(:perform_async).with(:project, distribution.id) expect { subject.execute } .to change(Packages::Package, :count).from(2).to(1) - .and change(Packages::PackageFile, :count).from(14).to(8) + .and change(Packages::PackageFile, :count).from(16).to(9) .and not_change(Packages::Debian::Publication, :count) - .and change(package.package_files, :count).from(7).to(0) + .and change(package.package_files, :count).from(8).to(0) .and change(package_file, :package).from(package).to(matching_package) .and not_change(matching_package, :name) .and not_change(matching_package, :version) diff --git a/spec/services/packages/generic/create_package_file_service_spec.rb b/spec/services/packages/generic/create_package_file_service_spec.rb index 9d6784b7721..08c4cbdbe11 100644 --- a/spec/services/packages/generic/create_package_file_service_spec.rb +++ b/spec/services/packages/generic/create_package_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Generic::CreatePackageFileService do +RSpec.describe Packages::Generic::CreatePackageFileService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:pipeline) { create(:ci_pipeline, user: user) } diff --git a/spec/services/packages/generic/find_or_create_package_service_spec.rb b/spec/services/packages/generic/find_or_create_package_service_spec.rb index 10ec917bc99..07054fe3651 100644 --- a/spec/services/packages/generic/find_or_create_package_service_spec.rb +++ b/spec/services/packages/generic/find_or_create_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Generic::FindOrCreatePackageService do +RSpec.describe Packages::Generic::FindOrCreatePackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:ci_build) { create(:ci_build, :running, user: user) } diff --git a/spec/services/packages/go/create_package_service_spec.rb b/spec/services/packages/go/create_package_service_spec.rb index 4ca1119fbaa..f552af81077 100644 --- a/spec/services/packages/go/create_package_service_spec.rb +++ b/spec/services/packages/go/create_package_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Go::CreatePackageService do +RSpec.describe Packages::Go::CreatePackageService, feature_category: :package_registry do let_it_be(:project) { create :project_empty_repo, path: 'my-go-lib' } let_it_be(:mod) { create :go_module, project: project } diff --git a/spec/services/packages/go/sync_packages_service_spec.rb b/spec/services/packages/go/sync_packages_service_spec.rb index 565b0f252ce..2881b6fdac9 100644 --- a/spec/services/packages/go/sync_packages_service_spec.rb +++ b/spec/services/packages/go/sync_packages_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Go::SyncPackagesService do +RSpec.describe Packages::Go::SyncPackagesService, feature_category: :package_registry do include_context 'basic Go module' let(:params) { { info: true, mod: true, zip: true } } diff --git a/spec/services/packages/helm/extract_file_metadata_service_spec.rb b/spec/services/packages/helm/extract_file_metadata_service_spec.rb index f4c61c12344..861d326d12a 100644 --- a/spec/services/packages/helm/extract_file_metadata_service_spec.rb +++ b/spec/services/packages/helm/extract_file_metadata_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Helm::ExtractFileMetadataService do +RSpec.describe Packages::Helm::ExtractFileMetadataService, feature_category: :package_registry do let_it_be(:package_file) { create(:helm_package_file) } let(:service) { described_class.new(package_file) } diff --git a/spec/services/packages/helm/process_file_service_spec.rb b/spec/services/packages/helm/process_file_service_spec.rb index 1be0153a4a5..a1f53e8756c 100644 --- a/spec/services/packages/helm/process_file_service_spec.rb +++ b/spec/services/packages/helm/process_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Helm::ProcessFileService do +RSpec.describe Packages::Helm::ProcessFileService, feature_category: :package_registry do let(:package) { create(:helm_package, without_package_files: true, status: 'processing') } let!(:package_file) { create(:helm_package_file, without_loaded_metadatum: true, package: package) } let(:channel) { 'stable' } diff --git a/spec/services/packages/mark_package_files_for_destruction_service_spec.rb b/spec/services/packages/mark_package_files_for_destruction_service_spec.rb index 66534338003..a00a0b79854 100644 --- a/spec/services/packages/mark_package_files_for_destruction_service_spec.rb +++ b/spec/services/packages/mark_package_files_for_destruction_service_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failures do +RSpec.describe Packages::MarkPackageFilesForDestructionService, :aggregate_failures, + feature_category: :package_registry do let(:service) { described_class.new(package_files) } describe '#execute', :aggregate_failures do diff --git a/spec/services/packages/mark_package_for_destruction_service_spec.rb b/spec/services/packages/mark_package_for_destruction_service_spec.rb index 125ec53ad61..d65e62b84a6 100644 --- a/spec/services/packages/mark_package_for_destruction_service_spec.rb +++ b/spec/services/packages/mark_package_for_destruction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::MarkPackageForDestructionService do +RSpec.describe Packages::MarkPackageForDestructionService, feature_category: :package_registry do let_it_be(:user) { create(:user) } let_it_be_with_reload(:package) { create(:npm_package) } @@ -36,6 +36,12 @@ RSpec.describe Packages::MarkPackageForDestructionService do end it 'returns an error ServiceResponse' do + expect(Gitlab::ErrorTracking).to receive(:track_exception).with( + instance_of(StandardError), + project_id: package.project_id, + package_id: package.id + ) + response = service.execute expect(package).not_to receive(:sync_maven_metadata) diff --git a/spec/services/packages/mark_packages_for_destruction_service_spec.rb b/spec/services/packages/mark_packages_for_destruction_service_spec.rb index 5c043b89de8..22278f9927d 100644 --- a/spec/services/packages/mark_packages_for_destruction_service_spec.rb +++ b/spec/services/packages/mark_packages_for_destruction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::MarkPackagesForDestructionService, :sidekiq_inline do +RSpec.describe Packages::MarkPackagesForDestructionService, :sidekiq_inline, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be_with_reload(:packages) { create_list(:npm_package, 3, project: project) } @@ -76,6 +76,11 @@ RSpec.describe Packages::MarkPackagesForDestructionService, :sidekiq_inline do it 'returns an error ServiceResponse' do expect(::Packages::Maven::Metadata::SyncService).not_to receive(:new) + expect(Gitlab::ErrorTracking).to receive(:track_exception).with( + instance_of(StandardError), + package_ids: package_ids + ) + expect { subject }.to not_change { ::Packages::Package.pending_destruction.count } .and not_change { ::Packages::PackageFile.pending_destruction.count } diff --git a/spec/services/packages/maven/create_package_service_spec.rb b/spec/services/packages/maven/create_package_service_spec.rb index 11bf00c1399..2c528c3591e 100644 --- a/spec/services/packages/maven/create_package_service_spec.rb +++ b/spec/services/packages/maven/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Maven::CreatePackageService do +RSpec.describe Packages::Maven::CreatePackageService, feature_category: :package_registry do let(:project) { create(:project) } let(:user) { create(:user) } let(:app_name) { 'my-app' } diff --git a/spec/services/packages/maven/find_or_create_package_service_spec.rb b/spec/services/packages/maven/find_or_create_package_service_spec.rb index cca074e2fa6..8b84d2541eb 100644 --- a/spec/services/packages/maven/find_or_create_package_service_spec.rb +++ b/spec/services/packages/maven/find_or_create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Maven::FindOrCreatePackageService do +RSpec.describe Packages::Maven::FindOrCreatePackageService, feature_category: :package_registry do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } @@ -44,6 +44,15 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do end end + shared_examples 'returning an error' do |with_message: ''| + it { expect { subject }.not_to change { project.package_files.count } } + + it 'returns an error', :aggregate_failures do + expect(subject.payload).to be_empty + expect(subject.errors).to include(with_message) + end + end + context 'path with version' do # Note that "path with version" and "file type maven metadata xml" only exists for snapshot versions # In other words, we will never have an metadata xml upload on a path with version for a non snapshot version @@ -128,11 +137,19 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do let!(:existing_package) { create(:maven_package, name: path, version: version, project: project) } - it { expect { subject }.not_to change { project.package_files.count } } + let(:existing_file_name) { file_name } + let(:jar_file) { existing_package.package_files.with_file_name_like('%.jar').first } - it 'returns an error', :aggregate_failures do - expect(subject.payload).to be_empty - expect(subject.errors).to include('Duplicate package is not allowed') + before do + jar_file.update_column(:file_name, existing_file_name) + end + + it_behaves_like 'returning an error', with_message: 'Duplicate package is not allowed' + + context 'for a SNAPSHOT version' do + let(:version) { '1.0.0-SNAPSHOT' } + + it_behaves_like 'returning an error', with_message: 'Duplicate package is not allowed' end context 'when uploading to the versionless package which contains metadata about all versions' do @@ -144,8 +161,7 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do context 'when uploading different non-duplicate files to the same package' do before do - package_file = existing_package.package_files.find_by(file_name: 'my-app-1.0-20180724.124855-1.jar') - package_file.destroy! + jar_file.destroy! end it_behaves_like 'reuse existing package' @@ -166,6 +182,27 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do it_behaves_like 'reuse existing package' end + + context 'when uploading a similar package file name with a classifier' do + let(:existing_file_name) { 'test.jar' } + let(:file_name) { 'test-javadoc.jar' } + + it_behaves_like 'reuse existing package' + + context 'for a SNAPSHOT version' do + let(:version) { '1.0.0-SNAPSHOT' } + let(:existing_file_name) { 'test-1.0-20230303.163304-1.jar' } + let(:file_name) { 'test-1.0-20230303.163304-1-javadoc.jar' } + + it_behaves_like 'reuse existing package' + end + end + end + + context 'with a very large file name' do + let(:params) { super().merge(file_name: 'a' * (described_class::MAX_FILE_NAME_LENGTH + 1)) } + + it_behaves_like 'returning an error', with_message: 'File name is too long' end end end diff --git a/spec/services/packages/maven/metadata/append_package_file_service_spec.rb b/spec/services/packages/maven/metadata/append_package_file_service_spec.rb index f3a90d31158..f65029f7b64 100644 --- a/spec/services/packages/maven/metadata/append_package_file_service_spec.rb +++ b/spec/services/packages/maven/metadata/append_package_file_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::AppendPackageFileService do +RSpec.describe ::Packages::Maven::Metadata::AppendPackageFileService, feature_category: :package_registry do let_it_be(:package) { create(:maven_package, version: nil) } let(:service) { described_class.new(package: package, metadata_content: content) } diff --git a/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb index 6fc1087940d..d0ef037b2d9 100644 --- a/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb +++ b/spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::CreatePluginsXmlService do +RSpec.describe ::Packages::Maven::Metadata::CreatePluginsXmlService, feature_category: :package_registry do let_it_be(:group_id) { 'my/test' } let_it_be(:package) { create(:maven_package, name: group_id, version: nil) } diff --git a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb index 70c2bbad87a..6ae84b5df4e 100644 --- a/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb +++ b/spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::CreateVersionsXmlService do +RSpec.describe ::Packages::Maven::Metadata::CreateVersionsXmlService, feature_category: :package_registry do let_it_be(:package) { create(:maven_package, version: nil) } let(:versions_in_database) { %w[1.3 2.0-SNAPSHOT 1.6 1.4 1.5-SNAPSHOT] } diff --git a/spec/services/packages/maven/metadata/sync_service_spec.rb b/spec/services/packages/maven/metadata/sync_service_spec.rb index 9a704d749b3..eaed54d959b 100644 --- a/spec/services/packages/maven/metadata/sync_service_spec.rb +++ b/spec/services/packages/maven/metadata/sync_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Packages::Maven::Metadata::SyncService do +RSpec.describe ::Packages::Maven::Metadata::SyncService, feature_category: :package_registry do using RSpec::Parameterized::TableSyntax let_it_be(:project) { create(:project) } diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb index ef8cdf2e8ab..70c79dae437 100644 --- a/spec/services/packages/npm/create_package_service_spec.rb +++ b/spec/services/packages/npm/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Npm::CreatePackageService do +RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_registry do let(:namespace) { create(:namespace) } let(:project) { create(:project, namespace: namespace) } let(:user) { create(:user) } diff --git a/spec/services/packages/npm/create_tag_service_spec.rb b/spec/services/packages/npm/create_tag_service_spec.rb index a4b07bf97cc..682effc9f4f 100644 --- a/spec/services/packages/npm/create_tag_service_spec.rb +++ b/spec/services/packages/npm/create_tag_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Npm::CreateTagService do +RSpec.describe Packages::Npm::CreateTagService, feature_category: :package_registry do let(:package) { create(:npm_package) } let(:tag_name) { 'test-tag' } diff --git a/spec/services/packages/nuget/create_dependency_service_spec.rb b/spec/services/packages/nuget/create_dependency_service_spec.rb index 268c8837e25..10daec8b871 100644 --- a/spec/services/packages/nuget/create_dependency_service_spec.rb +++ b/spec/services/packages/nuget/create_dependency_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Nuget::CreateDependencyService do +RSpec.describe Packages::Nuget::CreateDependencyService, feature_category: :package_registry do let_it_be(:package, reload: true) { create(:nuget_package) } describe '#execute' do diff --git a/spec/services/packages/nuget/metadata_extraction_service_spec.rb b/spec/services/packages/nuget/metadata_extraction_service_spec.rb index 12bab30b4a7..9177a5379d9 100644 --- a/spec/services/packages/nuget/metadata_extraction_service_spec.rb +++ b/spec/services/packages/nuget/metadata_extraction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::MetadataExtractionService do +RSpec.describe Packages::Nuget::MetadataExtractionService, feature_category: :package_registry do let_it_be(:package_file) { create(:nuget_package).package_files.first } let(:service) { described_class.new(package_file.id) } diff --git a/spec/services/packages/nuget/search_service_spec.rb b/spec/services/packages/nuget/search_service_spec.rb index 66c91487a8f..b5f32c9b727 100644 --- a/spec/services/packages/nuget/search_service_spec.rb +++ b/spec/services/packages/nuget/search_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::SearchService do +RSpec.describe Packages::Nuget::SearchService, feature_category: :package_registry do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } let_it_be(:subgroup) { create(:group, parent: group) } diff --git a/spec/services/packages/nuget/sync_metadatum_service_spec.rb b/spec/services/packages/nuget/sync_metadatum_service_spec.rb index 32093c48b76..ae07f312fcc 100644 --- a/spec/services/packages/nuget/sync_metadatum_service_spec.rb +++ b/spec/services/packages/nuget/sync_metadatum_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::SyncMetadatumService do +RSpec.describe Packages::Nuget::SyncMetadatumService, feature_category: :package_registry do let_it_be(:package, reload: true) { create(:nuget_package) } let_it_be(:metadata) do { diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb index 6a4dbeb10dc..3a13f2ff902 100644 --- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb +++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state do +RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state, feature_category: :package_registry do include ExclusiveLeaseHelpers let!(:package) { create(:nuget_package, :processing, :with_symbol_package) } diff --git a/spec/services/packages/pypi/create_package_service_spec.rb b/spec/services/packages/pypi/create_package_service_spec.rb index 6794ab4d9d6..0d278e32e89 100644 --- a/spec/services/packages/pypi/create_package_service_spec.rb +++ b/spec/services/packages/pypi/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures do +RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures, feature_category: :package_registry do include PackagesManagerApiSpecHelpers let_it_be(:project) { create(:project) } diff --git a/spec/services/packages/remove_tag_service_spec.rb b/spec/services/packages/remove_tag_service_spec.rb index 084635824e5..4ad478d487a 100644 --- a/spec/services/packages/remove_tag_service_spec.rb +++ b/spec/services/packages/remove_tag_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::RemoveTagService do +RSpec.describe Packages::RemoveTagService, feature_category: :package_registry do let!(:package_tag) { create(:packages_tag) } describe '#execute' do diff --git a/spec/services/packages/rpm/parse_package_service_spec.rb b/spec/services/packages/rpm/parse_package_service_spec.rb index f330587bfa0..80907d8f43f 100644 --- a/spec/services/packages/rpm/parse_package_service_spec.rb +++ b/spec/services/packages/rpm/parse_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::ParsePackageService do +RSpec.describe Packages::Rpm::ParsePackageService, feature_category: :package_registry do let(:package_file) { File.open('spec/fixtures/packages/rpm/hello-0.0.1-1.fc29.x86_64.rpm') } describe 'dynamic private methods' do diff --git a/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb index d93d6ab9fcb..e0d9e192d97 100644 --- a/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildFilelistXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildFilelistXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb index 201f9e67ce9..e81a436e006 100644 --- a/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildOtherXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildOtherXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb index 9bbfa5c9863..1e534782841 100644 --- a/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildPrimaryXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildPrimaryXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb index cf28301fa2c..99fcf0fabbf 100644 --- a/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::BuildRepomdXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::BuildRepomdXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(data).execute } diff --git a/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb b/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb index e351392ba1c..68a3ac7d82f 100644 --- a/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb +++ b/spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rpm::RepositoryMetadata::UpdateXmlService do +RSpec.describe Packages::Rpm::RepositoryMetadata::UpdateXmlService, feature_category: :package_registry do describe '#execute' do subject { described_class.new(filename: filename, xml: xml, data: data).execute } diff --git a/spec/services/packages/rubygems/create_dependencies_service_spec.rb b/spec/services/packages/rubygems/create_dependencies_service_spec.rb index b6e12b1cc61..d689bae96ff 100644 --- a/spec/services/packages/rubygems/create_dependencies_service_spec.rb +++ b/spec/services/packages/rubygems/create_dependencies_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rubygems::CreateDependenciesService do +RSpec.describe Packages::Rubygems::CreateDependenciesService, feature_category: :package_registry do include RubygemsHelpers let_it_be(:package) { create(:rubygems_package) } diff --git a/spec/services/packages/rubygems/create_gemspec_service_spec.rb b/spec/services/packages/rubygems/create_gemspec_service_spec.rb index 839fb4d955a..17890100b93 100644 --- a/spec/services/packages/rubygems/create_gemspec_service_spec.rb +++ b/spec/services/packages/rubygems/create_gemspec_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rubygems::CreateGemspecService do +RSpec.describe Packages::Rubygems::CreateGemspecService, feature_category: :package_registry do include RubygemsHelpers let_it_be(:package_file) { create(:package_file, :gem) } diff --git a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb index bb84e0cd361..9a72c51e99c 100644 --- a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb +++ b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Rubygems::DependencyResolverService do +RSpec.describe Packages::Rubygems::DependencyResolverService, feature_category: :package_registry do let_it_be(:project) { create(:project, :private) } let_it_be(:package) { create(:package, project: project) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/rubygems/metadata_extraction_service_spec.rb b/spec/services/packages/rubygems/metadata_extraction_service_spec.rb index bbd5b6f3d59..87d63eff311 100644 --- a/spec/services/packages/rubygems/metadata_extraction_service_spec.rb +++ b/spec/services/packages/rubygems/metadata_extraction_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' require 'rubygems/package' -RSpec.describe Packages::Rubygems::MetadataExtractionService do +RSpec.describe Packages::Rubygems::MetadataExtractionService, feature_category: :package_registry do include RubygemsHelpers let_it_be(:package) { create(:rubygems_package) } diff --git a/spec/services/packages/rubygems/process_gem_service_spec.rb b/spec/services/packages/rubygems/process_gem_service_spec.rb index caff338ef53..a1b4eae9655 100644 --- a/spec/services/packages/rubygems/process_gem_service_spec.rb +++ b/spec/services/packages/rubygems/process_gem_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Packages::Rubygems::ProcessGemService do +RSpec.describe Packages::Rubygems::ProcessGemService, feature_category: :package_registry do include ExclusiveLeaseHelpers include RubygemsHelpers diff --git a/spec/services/packages/terraform_module/create_package_service_spec.rb b/spec/services/packages/terraform_module/create_package_service_spec.rb index f73b5682835..3355dfcf5ec 100644 --- a/spec/services/packages/terraform_module/create_package_service_spec.rb +++ b/spec/services/packages/terraform_module/create_package_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::TerraformModule::CreatePackageService do +RSpec.describe Packages::TerraformModule::CreatePackageService, feature_category: :package_registry do let_it_be(:namespace) { create(:namespace) } let_it_be(:project) { create(:project, namespace: namespace) } let_it_be(:user) { create(:user) } diff --git a/spec/services/packages/update_package_file_service_spec.rb b/spec/services/packages/update_package_file_service_spec.rb index d988049c43a..5d081059105 100644 --- a/spec/services/packages/update_package_file_service_spec.rb +++ b/spec/services/packages/update_package_file_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::UpdatePackageFileService do +RSpec.describe Packages::UpdatePackageFileService, feature_category: :package_registry do let_it_be(:another_package) { create(:package) } let_it_be(:old_file_name) { 'old_file_name.txt' } let_it_be(:new_file_name) { 'new_file_name.txt' } diff --git a/spec/services/packages/update_tags_service_spec.rb b/spec/services/packages/update_tags_service_spec.rb index c4256699c94..d8f572fff32 100644 --- a/spec/services/packages/update_tags_service_spec.rb +++ b/spec/services/packages/update_tags_service_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::UpdateTagsService do +RSpec.describe Packages::UpdateTagsService, feature_category: :package_registry do let_it_be(:package, reload: true) { create(:nuget_package) } let(:tags) { %w(test-tag tag1 tag2 tag3) } |