diff options
author | Travis Collins <travistx@gmail.com> | 2025-02-24 08:41:41 -0700 |
---|---|---|
committer | Lukasz Jarocki <lukasz.jarocki@sonarsource.com> | 2025-02-28 09:57:47 +0100 |
commit | 7dcab6516c16c34d6ce2b7432500deb2602d8ed5 (patch) | |
tree | 89fa54f27ad8207334d0e9752aab14d3db7dcd58 /server | |
parent | 0f85d075011ddce696ab508980d5c75315814109 (diff) | |
download | sonarqube-7dcab6516c16c34d6ce2b7432500deb2602d8ed5.tar.gz sonarqube-7dcab6516c16c34d6ce2b7432500deb2602d8ed5.zip |
SCA-57 Simplify ScaStep IOC
Diffstat (limited to 'server')
12 files changed, 105 insertions, 396 deletions
diff --git a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolder.java b/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolder.java deleted file mode 100644 index c327b3b3197..00000000000 --- a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolder.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2025 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.ce.common.sca; - -import java.util.Collection; -import java.util.List; -import org.sonar.db.sca.ScaDependencyDto; -import org.sonar.db.sca.ScaReleaseDto; - -public interface ScaHolder { - /** - * Get the dependencies of this ScaHolder. This is an error - * to call if dependencyAnalysisPresent() returns false. - * - * @return the dependencies found by the analysis - */ - List<ScaDependencyDto> getDependencies(); - - void setDependencies(Collection<ScaDependencyDto> dependencies); - - /** - * Get the releases of this ScaHolder. This is an error - * to call if dependencyAnalysisPresent() returns false. - * - * @return the releases found by the analysis - */ - List<ScaReleaseDto> getReleases(); - - void setReleases(Collection<ScaReleaseDto> releases); - - /** - * Returns true if we were able to analyze dependencies. - * If we were not able, then the other getters can't return - * sensible results. - * - * @return true if we have dependencies - */ - boolean dependencyAnalysisPresent(); -} diff --git a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolderImpl.java b/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolderImpl.java deleted file mode 100644 index e25a7d6c724..00000000000 --- a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolderImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2025 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.ce.common.sca; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import org.sonar.db.sca.ScaDependencyDto; -import org.sonar.db.sca.ScaReleaseDto; - -public class ScaHolderImpl implements ScaHolder { - private List<ScaDependencyDto> dependencies = null; - private List<ScaReleaseDto> releases = null; - - @Override - public List<ScaDependencyDto> getDependencies() { - return Optional.ofNullable(this.dependencies).orElseThrow(() -> new IllegalStateException("SCA dependency analysis was not performed")); - } - - @Override - public void setDependencies(Collection<ScaDependencyDto> dependencies) { - this.dependencies = List.copyOf(dependencies); - } - - @Override - public List<ScaReleaseDto> getReleases() { - return Optional.ofNullable(this.releases).orElseThrow(() -> new IllegalStateException("SCA dependency analysis was not performed")); - } - - @Override - public void setReleases(Collection<ScaReleaseDto> releases) { - this.releases = List.copyOf(releases); - } - - @Override - public boolean dependencyAnalysisPresent() { - return this.dependencies != null && this.releases != null; - } -} diff --git a/server/sonar-ce-common/src/test/java/org/sonar/ce/common/sca/ScaHolderImplTest.java b/server/sonar-ce-common/src/test/java/org/sonar/ce/common/sca/ScaHolderImplTest.java deleted file mode 100644 index 83b4228d62b..00000000000 --- a/server/sonar-ce-common/src/test/java/org/sonar/ce/common/sca/ScaHolderImplTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2025 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.ce.common.sca; - -import java.util.Collection; -import java.util.List; -import org.junit.jupiter.api.Test; -import org.sonar.db.sca.PackageManager; -import org.sonar.db.sca.ScaDependencyDto; -import org.sonar.db.sca.ScaReleaseDto; - -import static org.assertj.core.api.Assertions.assertThat; - -class ScaHolderImplTest { - private static ScaDependencyDto newScaDependencyDto() { - return new ScaDependencyDto("scaDependencyUuid", - "scaReleaseUuid", - true, - "compile", - "some/path", - "another/path", - List.of(List.of("pkg:npm/foo@1.0.0")), - 1L, - 2L); - } - - private static ScaReleaseDto newScaReleaseDto() { - return new ScaReleaseDto("scaReleaseUuid", - "componentUuid", - "packageUrl", - PackageManager.MAVEN, - "foo:bar", - "1.0.0", - "MIT", - true, - 1L, - 2L); - } - - @Test - void test_setAndGetDependencies() { - ScaHolderImpl scaHolderImpl = new ScaHolderImpl(); - var dep = newScaDependencyDto(); - Collection<ScaDependencyDto> dependencies = List.of(dep); - scaHolderImpl.setDependencies(dependencies); - List<ScaDependencyDto> result = scaHolderImpl.getDependencies(); - assertThat(result).containsExactly(dep); - } - - @Test - void test_setAndGetReleases() { - ScaHolderImpl scaHolderImpl = new ScaHolderImpl(); - var release = newScaReleaseDto(); - Collection<ScaReleaseDto> releases = List.of(release); - scaHolderImpl.setReleases(releases); - List<ScaReleaseDto> result = scaHolderImpl.getReleases(); - assertThat(result).containsExactly(release); - } - - @Test - void test_dependencyAnalysisPresent() { - ScaHolderImpl scaHolderImpl = new ScaHolderImpl(); - assertThat(scaHolderImpl.dependencyAnalysisPresent()).isFalse(); - var dep = newScaDependencyDto(); - var release = newScaReleaseDto(); - Collection<ScaDependencyDto> dependencies = List.of(dep); - Collection<ScaReleaseDto> releases = List.of(release); - scaHolderImpl.setDependencies(dependencies); - assertThat(scaHolderImpl.dependencyAnalysisPresent()).isFalse(); - scaHolderImpl.setReleases(releases); - assertThat(scaHolderImpl.dependencyAnalysisPresent()).isTrue(); - } -} diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java index 50fa4561bc2..07297b340cb 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java @@ -22,16 +22,12 @@ package org.sonar.ce.task.projectanalysis.container; import java.util.Arrays; import java.util.List; import javax.annotation.Nullable; - -import org.sonar.ce.common.sca.ScaHolderImpl; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.container.TaskContainer; import org.sonar.ce.task.log.CeTaskMessagesImpl; import org.sonar.ce.task.projectanalysis.analysis.AnalysisFromSonarQube94Visitor; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderImpl; import org.sonar.ce.task.projectanalysis.api.posttask.PostProjectAnalysisTasksExecutor; -import org.sonar.ce.task.projectanalysis.scanner.ScannerReportDirectoryHolderImpl; -import org.sonar.ce.task.projectanalysis.scanner.ScannerReportReaderImpl; import org.sonar.ce.task.projectanalysis.component.BranchComponentUuidsDelegate; import org.sonar.ce.task.projectanalysis.component.BranchLoader; import org.sonar.ce.task.projectanalysis.component.BranchPersisterImpl; @@ -132,6 +128,8 @@ import org.sonar.ce.task.projectanalysis.qualityprofile.ActiveRulesHolderImpl; import org.sonar.ce.task.projectanalysis.qualityprofile.PrioritizedRulesHolderImpl; import org.sonar.ce.task.projectanalysis.qualityprofile.QProfileStatusRepositoryImpl; import org.sonar.ce.task.projectanalysis.qualityprofile.QualityProfileRuleChangeResolver; +import org.sonar.ce.task.projectanalysis.scanner.ScannerReportDirectoryHolderImpl; +import org.sonar.ce.task.projectanalysis.scanner.ScannerReportReaderImpl; import org.sonar.ce.task.projectanalysis.scm.ScmInfoDbLoader; import org.sonar.ce.task.projectanalysis.scm.ScmInfoRepositoryImpl; import org.sonar.ce.task.projectanalysis.source.DbLineHashVersion; @@ -147,6 +145,8 @@ import org.sonar.ce.task.projectanalysis.source.SourceLinesDiffImpl; import org.sonar.ce.task.projectanalysis.source.SourceLinesHashCache; import org.sonar.ce.task.projectanalysis.source.SourceLinesHashRepositoryImpl; import org.sonar.ce.task.projectanalysis.source.SourceLinesRepositoryImpl; +import org.sonar.ce.task.projectanalysis.step.DefaultPersistScaStepImpl; +import org.sonar.ce.task.projectanalysis.step.DefaultScaStepImpl; import org.sonar.ce.task.projectanalysis.step.ReportComputationSteps; import org.sonar.ce.task.projectanalysis.step.SmallChangesetQualityGateSpecialCase; import org.sonar.ce.task.projectanalysis.webhook.WebhookPostTask; @@ -181,7 +181,13 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop for (ReportAnalysisComponentProvider componentProvider : componentProviders) { container.add(componentProvider.getComponents()); } - container.add(steps.orderedStepClasses()); + + // Exclude interfaces because they can't be instantiated directly. + // The concrete class for interfaces must be added to the container separately. + container.add(steps.orderedStepClasses() + .stream() + .filter(stepClass -> !stepClass.isInterface()) + .toList()); } /** @@ -225,7 +231,8 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop NewCodeReferenceBranchComponentUuids.class, BranchComponentUuidsDelegate.class, SiblingComponentsWithOpenIssues.class, - ScaHolderImpl.class, + DefaultScaStepImpl.class, + DefaultPersistScaStepImpl.class, // repositories PreviousSourceHashRepositoryImpl.class, diff --git a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/PersistScaStepProvider.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/DefaultPersistScaStepImpl.java index 07c83fffb47..566b47010bb 100644 --- a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/PersistScaStepProvider.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/DefaultPersistScaStepImpl.java @@ -17,16 +17,18 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.ce.common.sca; +package org.sonar.ce.task.projectanalysis.step; -import org.sonar.api.ce.ComputeEngineSide; -import org.sonar.ce.task.step.ComputationStep; +// This will be overridden if another PersistScaStep implementation exists with Priority. +public class DefaultPersistScaStepImpl implements PersistScaStep { -/** - * When an implementation of this interface is available in the ioc container, the Compute Engine will use the value returned by - * {@link #get} as an extra step for software composition analysis. - */ -@ComputeEngineSide -public interface PersistScaStepProvider { - ComputationStep get(ScaHolder scaHolder, String branchUuid); + @Override + public String getDescription() { + return "Persist software composition analysis unavailable"; + } + + @Override + public void execute(Context context) { + // do nothing + } } diff --git a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/package-info.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/DefaultScaStepImpl.java index 70c1c463dab..ca92da743b3 100644 --- a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/package-info.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/DefaultScaStepImpl.java @@ -17,7 +17,18 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -@ParametersAreNonnullByDefault -package org.sonar.ce.common.sca; +package org.sonar.ce.task.projectanalysis.step; -import javax.annotation.ParametersAreNonnullByDefault; +// This will be overridden if another ScaStep implementation exists with Priority. +public class DefaultScaStepImpl implements ScaStep { + + @Override + public String getDescription() { + return "Software composition analysis unavailable"; + } + + @Override + public void execute(Context context) { + // do nothing + } +} diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistScaStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistScaStep.java index 8725b88cfa9..0f0c49df0a2 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistScaStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistScaStep.java @@ -19,42 +19,7 @@ */ package org.sonar.ce.task.projectanalysis.step; -import javax.annotation.Nullable; -import org.sonar.ce.common.sca.PersistScaStepProvider; -import org.sonar.ce.common.sca.ScaHolder; -import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; import org.sonar.ce.task.step.ComputationStep; -import org.springframework.beans.factory.annotation.Autowired; -public class PersistScaStep implements ComputationStep { - - private final ComputationStep wrapped; - - @Autowired(required = false) - public PersistScaStep(ScaHolder scaHolder, TreeRootHolder treeRootHolder) { - this(scaHolder, treeRootHolder, null); - } - - @Autowired(required = false) - public PersistScaStep(ScaHolder scaHolder, TreeRootHolder treeRootHolder, - @Nullable PersistScaStepProvider provider) { - if (provider != null) { - var branchUuid = treeRootHolder.getRoot().getUuid(); - this.wrapped = provider.get(scaHolder, branchUuid); - } else { - this.wrapped = null; - } - } - - @Override - public String getDescription() { - return wrapped != null ? wrapped.getDescription() : "Software composition analysis unavailable"; - } - - @Override - public void execute(Context context) { - if (wrapped != null) { - wrapped.execute(context); - } - } +public interface PersistScaStep extends ComputationStep { } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/ScaStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/ScaStep.java index c349bfa8410..7724346805f 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/ScaStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/ScaStep.java @@ -19,41 +19,7 @@ */ package org.sonar.ce.task.projectanalysis.step; -import javax.annotation.Nullable; -import org.sonar.ce.common.sca.ScaHolder; -import org.sonar.ce.common.sca.ScaStepProvider; -import org.sonar.ce.common.scanner.ScannerReportReader; -import org.sonar.ce.task.log.CeTaskMessages; import org.sonar.ce.task.step.ComputationStep; -import org.springframework.beans.factory.annotation.Autowired; -public class ScaStep implements ComputationStep { - - private final ComputationStep wrapped; - - @Autowired(required = false) - public ScaStep(ScannerReportReader reportReader, CeTaskMessages ceTaskMessages) { - this(reportReader, ceTaskMessages, null, null); - } - - @Autowired(required = false) - public ScaStep(ScannerReportReader reportReader, CeTaskMessages ceTaskMessages, @Nullable ScaStepProvider provider, @Nullable ScaHolder scaHolder) { - if (provider != null && scaHolder != null) { - this.wrapped = provider.get(reportReader, ceTaskMessages, scaHolder); - } else { - this.wrapped = null; - } - } - - @Override - public String getDescription() { - return wrapped != null ? wrapped.getDescription() : "Software composition analysis unavailable"; - } - - @Override - public void execute(Context context) { - if (wrapped != null) { - wrapped.execute(context); - } - } +public interface ScaStep extends ComputationStep { } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java index af035f909cc..6955e475da9 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java @@ -21,6 +21,7 @@ package org.sonar.ce.task.projectanalysis.container; import com.google.common.collect.ImmutableList; import java.lang.reflect.Modifier; +import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -28,12 +29,14 @@ import org.junit.Test; import org.reflections.Reflections; import org.sonar.ce.task.CeTask; import org.sonar.ce.task.projectanalysis.step.PersistComponentsStep; +import org.sonar.ce.task.projectanalysis.step.ReportComputationSteps; import org.sonar.ce.task.projectanalysis.task.ListTaskContainer; import org.sonar.ce.task.step.ComputationStep; import static com.google.common.collect.Sets.difference; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.when; public class ProjectAnalysisTaskContainerPopulatorTest { @@ -106,8 +109,48 @@ public class ProjectAnalysisTaskContainerPopulatorTest { assertThat(container.getAddedComponents()).contains(object, clazz); } - private static final class MyClass { + @Test + public void populateContainer_includesReportComputationStepClasses() { + Class<MyClass> clazz = MyClass.class; + ListTaskContainer container = new ListTaskContainer(); + + try (var ignored = mockConstruction(ReportComputationSteps.class, + (mock, context) -> { + when(mock.orderedStepClasses()).thenReturn(List.of(clazz)); + })) { + underTest.populateContainer(container); + assertThat(container.getAddedComponents()).contains(clazz); + } + } + + @Test + public void populateContainer_doesNotIncludeReportComputationStepInterfaces() { + Class<MyInterface> iface = MyInterface.class; + ListTaskContainer container = new ListTaskContainer(); + + try (var ignored = mockConstruction(ReportComputationSteps.class, + (mock, context) -> { + when(mock.orderedStepClasses()).thenReturn(List.of(iface)); + })) { + underTest.populateContainer(container); + + assertThat(container.getAddedComponents()).doesNotContain(iface); + } + } + + private interface MyInterface extends ComputationStep { + } + private static final class MyClass implements ComputationStep { + @Override + public void execute(Context context) { + // do nothing + } + + @Override + public String getDescription() { + return ""; + } } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ScaStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/DefaultPersistScaStepImplTest.java index 0bf793c7c3b..d5fa971f5c3 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ScaStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/DefaultPersistScaStepImplTest.java @@ -20,43 +20,20 @@ package org.sonar.ce.task.projectanalysis.step; import org.junit.jupiter.api.Test; -import org.sonar.ce.common.sca.ScaHolder; -import org.sonar.ce.common.sca.ScaStepProvider; -import org.sonar.ce.common.scanner.ScannerReportReader; -import org.sonar.ce.task.log.CeTaskMessages; import org.sonar.ce.task.step.ComputationStep; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNoException; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -class ScaStepTest { +class DefaultPersistScaStepImplTest { @Test - void shouldSkipScaStepIfNotAvailable() { - var underTest = new ScaStep(mock(ScannerReportReader.class), mock(CeTaskMessages.class), null, null); + void shouldNoOpWithoutError() { + var underTest = new DefaultPersistScaStepImpl(); - assertThat(underTest.getDescription()).isEqualTo("Software composition analysis unavailable"); + assertThat(underTest.getDescription()).isEqualTo("Persist software composition analysis unavailable"); assertThatNoException().isThrownBy(() -> underTest.execute(mock(ComputationStep.Context.class))); } - - @Test - void shouldWrapScaStepIfAvailable() { - var wrappedStep = mock(ComputationStep.class); - when(wrappedStep.getDescription()).thenReturn("wrapped step"); - - ScaStepProvider scaStepProvider = (reportReader, ceTaskMessages, scaHolder) -> wrappedStep; - var underTest = new ScaStep(mock(ScannerReportReader.class), mock(CeTaskMessages.class), scaStepProvider, mock(ScaHolder.class)); - - assertThat(underTest.getDescription()).isEqualTo("wrapped step"); - - var context = mock(ComputationStep.Context.class); - underTest.execute(context); - - verify(wrappedStep).execute(context); - } - } diff --git a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaStepProvider.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/DefaultScaStepTest.java index 7ebfab3aaf7..de46fd6b99c 100644 --- a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaStepProvider.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/DefaultScaStepTest.java @@ -17,18 +17,23 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.ce.common.sca; +package org.sonar.ce.task.projectanalysis.step; -import org.sonar.api.ce.ComputeEngineSide; -import org.sonar.ce.common.scanner.ScannerReportReader; -import org.sonar.ce.task.log.CeTaskMessages; +import org.junit.jupiter.api.Test; import org.sonar.ce.task.step.ComputationStep; -/** - * When an implementation of this interface is available in the ioc container, the Compute Engine will use the value returned by - * {@link #get(ScannerReportReader, CeTaskMessages, ScaHolder)} as an extra step for software composition analysis. - */ -@ComputeEngineSide -public interface ScaStepProvider { - ComputationStep get(ScannerReportReader reportReader, CeTaskMessages ceTaskMessages, ScaHolder scaHolder); +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.mockito.Mockito.mock; + +class DefaultScaStepTest { + + @Test + void shouldNoOpWithoutError() { + var underTest = new DefaultScaStepImpl(); + + assertThat(underTest.getDescription()).isEqualTo("Software composition analysis unavailable"); + + assertThatNoException().isThrownBy(() -> underTest.execute(mock(ComputationStep.Context.class))); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistScaStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistScaStepTest.java deleted file mode 100644 index e88d0c63c98..00000000000 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistScaStepTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2025 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.ce.task.projectanalysis.step; - -import org.junit.jupiter.api.Test; -import org.sonar.ce.common.sca.ScaHolder; -import org.sonar.ce.task.projectanalysis.component.Component; -import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; -import org.sonar.ce.task.step.ComputationStep; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatNoException; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class PersistScaStepTest { - - @Test - void shouldSkipScaStepIfNotAvailable() { - var underTest = new PersistScaStep(mock(ScaHolder.class), mock(TreeRootHolder.class), null); - - assertThat(underTest.getDescription()).isEqualTo("Software composition analysis unavailable"); - - assertThatNoException().isThrownBy(() -> underTest.execute(mock(ComputationStep.Context.class))); - } - - @Test - void shouldWrapScaStepIfAvailable() { - var wrappedStep = mock(ComputationStep.class); - when(wrappedStep.getDescription()).thenReturn("wrapped step"); - - var treeRootHolder = mock(TreeRootHolder.class); - var rootComponent = mock(Component.class); - when(treeRootHolder.getRoot()).thenReturn(rootComponent); - when(rootComponent.getUuid()).thenReturn("mocked-branch-uuid"); - var underTest = new PersistScaStep(mock(ScaHolder.class), treeRootHolder, - (scaHolder, branchUuid) -> wrappedStep); - - assertThat(underTest.getDescription()).isEqualTo("wrapped step"); - - var context = mock(ComputationStep.Context.class); - underTest.execute(context); - - verify(wrappedStep).execute(context); - } - -} |