aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorTravis Collins <travistx@gmail.com>2025-02-24 08:41:41 -0700
committerLukasz Jarocki <lukasz.jarocki@sonarsource.com>2025-02-28 09:57:47 +0100
commit7dcab6516c16c34d6ce2b7432500deb2602d8ed5 (patch)
tree89fa54f27ad8207334d0e9752aab14d3db7dcd58 /server
parent0f85d075011ddce696ab508980d5c75315814109 (diff)
downloadsonarqube-7dcab6516c16c34d6ce2b7432500deb2602d8ed5.tar.gz
sonarqube-7dcab6516c16c34d6ce2b7432500deb2602d8ed5.zip
SCA-57 Simplify ScaStep IOC
Diffstat (limited to 'server')
-rw-r--r--server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolder.java56
-rw-r--r--server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaHolderImpl.java56
-rw-r--r--server/sonar-ce-common/src/test/java/org/sonar/ce/common/sca/ScaHolderImplTest.java90
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java19
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/DefaultPersistScaStepImpl.java (renamed from server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/PersistScaStepProvider.java)22
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/DefaultScaStepImpl.java (renamed from server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/package-info.java)17
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistScaStep.java37
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/ScaStep.java36
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulatorTest.java45
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/DefaultPersistScaStepImplTest.java (renamed from server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ScaStepTest.java)31
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/DefaultScaStepTest.java (renamed from server/sonar-ce-common/src/main/java/org/sonar/ce/common/sca/ScaStepProvider.java)27
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistScaStepTest.java65
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);
- }
-
-}