aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2015-11-18 14:49:06 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2015-11-19 14:16:44 +0100
commit240cf9f64ff0d7aa1e94f4fdeeb449f48141bcb0 (patch)
tree3d22200623705904da1a78ac936f72724e908a9b
parentcd03d464226228b66e76bee952484ddb05d29a05 (diff)
downloadsonarqube-240cf9f64ff0d7aa1e94f4fdeeb449f48141bcb0.tar.gz
sonarqube-240cf9f64ff0d7aa1e94f4fdeeb449f48141bcb0.zip
SONAR-7027 Add PersistDeveloperStep
-rw-r--r--server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/DevCockpitBridge.java6
-rw-r--r--server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/PersistDevelopersDelegate.java30
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactory.java7
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactoryImpl.java6
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java9
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDevelopersStep.java46
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java175
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/taskprocessor/report/ReportTaskProcessor.java23
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulatorTest.java70
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java8
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDevelopersStepTest.java41
11 files changed, 329 insertions, 92 deletions
diff --git a/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/DevCockpitBridge.java b/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/DevCockpitBridge.java
index 9b330693a2c..9c37b04aa03 100644
--- a/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/DevCockpitBridge.java
+++ b/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/DevCockpitBridge.java
@@ -19,6 +19,7 @@
*/
package org.sonar.server.devcockpit;
+import java.util.List;
import org.sonar.core.platform.ComponentContainer;
/**
@@ -41,4 +42,9 @@ public interface DevCockpitBridge {
*/
void stopDevCockpit();
+ /**
+ * Return the list of components to add to the state-full container of a Compute Engine report analysis task
+ */
+ List<Object> getCeComponents();
+
}
diff --git a/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/PersistDevelopersDelegate.java b/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/PersistDevelopersDelegate.java
new file mode 100644
index 00000000000..d0c2dee1113
--- /dev/null
+++ b/server/sonar-dev-cockpit-bridge/src/main/java/org/sonar/server/devcockpit/PersistDevelopersDelegate.java
@@ -0,0 +1,30 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.server.devcockpit;
+
+/**
+ * This interface is used to delegate the persistence of developers to the Developer Cockpit plugin
+ */
+public interface PersistDevelopersDelegate {
+
+ void execute();
+
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactory.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactory.java
index 4c3a9576393..9987781b606 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactory.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactory.java
@@ -19,13 +19,12 @@
*/
package org.sonar.server.computation.container;
+import javax.annotation.Nullable;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.server.computation.queue.CeTask;
+import org.sonar.server.devcockpit.DevCockpitBridge;
-/**
- * Compute
- */
public interface ContainerFactory {
- ComputeEngineContainer create(ComponentContainer parent, CeTask task);
+ ComputeEngineContainer create(ComponentContainer parent, CeTask task, @Nullable DevCockpitBridge devCockpitBridge);
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactoryImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactoryImpl.java
index e1dfd4f2ac8..6e2bd9da187 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactoryImpl.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ContainerFactoryImpl.java
@@ -19,12 +19,14 @@
*/
package org.sonar.server.computation.container;
+import javax.annotation.Nullable;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.server.computation.queue.CeTask;
+import org.sonar.server.devcockpit.DevCockpitBridge;
public class ContainerFactoryImpl implements ContainerFactory {
@Override
- public ComputeEngineContainer create(ComponentContainer parent, CeTask task) {
- return new ComputeEngineContainerImpl(parent, new ReportComputeEngineContainerPopulator(task));
+ public ComputeEngineContainer create(ComponentContainer parent, CeTask task, @Nullable DevCockpitBridge devCockpitBridge) {
+ return new ComputeEngineContainerImpl(parent, new ReportComputeEngineContainerPopulator(task, devCockpitBridge));
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java
index c5d2cd69ca9..80935af6620 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java
@@ -21,6 +21,7 @@ package org.sonar.server.computation.container;
import java.util.Arrays;
import java.util.List;
+import javax.annotation.Nullable;
import org.sonar.core.issue.tracking.Tracker;
import org.sonar.core.platform.ContainerPopulator;
import org.sonar.server.computation.analysis.AnalysisMetadataHolderImpl;
@@ -88,13 +89,16 @@ import org.sonar.server.computation.sqale.SqaleRatingSettings;
import org.sonar.server.computation.step.ComputationStepExecutor;
import org.sonar.server.computation.step.ComputationSteps;
import org.sonar.server.computation.step.ReportComputationSteps;
+import org.sonar.server.devcockpit.DevCockpitBridge;
import org.sonar.server.view.index.ViewIndex;
public final class ReportComputeEngineContainerPopulator implements ContainerPopulator<ComputeEngineContainer> {
private final CeTask task;
+ private final DevCockpitBridge devCockpitBridge;
- public ReportComputeEngineContainerPopulator(CeTask task) {
+ public ReportComputeEngineContainerPopulator(CeTask task, @Nullable DevCockpitBridge devCockpitBridge) {
this.task = task;
+ this.devCockpitBridge = devCockpitBridge;
}
@Override
@@ -103,6 +107,9 @@ public final class ReportComputeEngineContainerPopulator implements ContainerPop
container.add(task);
container.add(steps);
container.addSingletons(componentClasses());
+ if (devCockpitBridge != null) {
+ container.addSingletons(devCockpitBridge.getCeComponents());
+ }
container.addSingletons(steps.orderedStepClasses());
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDevelopersStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDevelopersStep.java
new file mode 100644
index 00000000000..54010f21956
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDevelopersStep.java
@@ -0,0 +1,46 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.server.computation.step;
+
+import org.sonar.server.devcockpit.PersistDevelopersDelegate;
+
+/**
+ * Persist developers, should only be execute when the Dev Cockpit plugin is installed.
+ */
+public class PersistDevelopersStep implements ComputationStep {
+
+ private final PersistDevelopersDelegate persistDevelopersDelegate;
+
+ public PersistDevelopersStep(PersistDevelopersDelegate persistDevelopersDelegate) {
+ this.persistDevelopersDelegate = persistDevelopersDelegate;
+ }
+
+ @Override
+ public String getDescription() {
+ return "Persist developers";
+ }
+
+ @Override
+ public void execute() {
+ persistDevelopersDelegate.execute();
+ }
+
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java
index c9494f65379..d6b8424b1f4 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ReportComputationSteps.java
@@ -20,99 +20,109 @@
package org.sonar.server.computation.step;
import com.google.common.base.Function;
+import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nonnull;
import org.sonar.server.computation.container.ComputeEngineContainer;
+import org.sonar.server.devcockpit.DevCockpitBridge;
+
+import static com.google.common.collect.FluentIterable.from;
/**
* Ordered list of steps classes and instances to be executed for batch processing
*/
public class ReportComputationSteps implements ComputationSteps {
+ private static final List<Class<? extends ComputationStep>> STEPS = Arrays.asList(
+ ExtractReportStep.class,
+ LogScannerContextStep.class,
+
+ // Builds Component tree
+ LoadReportAnalysisMetadataHolderStep.class,
+ BuildComponentTreeStep.class,
+ ValidateProjectStep.class,
+
+ LoadDebtModelStep.class,
+ LoadQualityProfilesStep.class,
+
+ // load project related stuffs
+ LoadQualityGateStep.class,
+ LoadPeriodsStep.class,
+
+ // load duplications related stuff
+ LoadDuplicationsFromReportStep.class,
+ LoadCrossProjectDuplicationsRepositoryStep.class,
+
+ // data computation
+ SizeMeasuresStep.class,
+ NewCoverageMeasuresStep.class,
+ CoverageMeasuresStep.class,
+ CommentMeasuresStep.class,
+ CustomMeasuresCopyStep.class,
+ DuplicationMeasuresStep.class,
+ DuplicationDataMeasuresStep.class,
+ LanguageDistributionMeasuresStep.class,
+ UnitTestMeasuresStep.class,
+ ComplexityMeasuresStep.class,
+
+ LoadMeasureComputersStep.class,
+ ExecuteVisitorsStep.class,
+
+ // Must be executed after computation of all measures
+ ComputeMeasureVariationsStep.class,
+
+ // Must be executed after computation of differential measures
+ QualityGateMeasuresStep.class,
+ ComputeQProfileMeasureStep.class,
+ // Must be executed after computation of quality profile measure
+ QualityProfileEventsStep.class,
+
+ // Must be executed after computation of quality gate measure
+ QualityGateEventsStep.class,
+
+ // Persist data
+ PersistComponentsStep.class,
+ PersistSnapshotsStep.class,
+ PersistDevelopersStep.class,
+ PersistMeasuresStep.class,
+ PersistIssuesStep.class,
+ PersistProjectLinksStep.class,
+ PersistEventsStep.class,
+ PersistFileSourcesStep.class,
+ PersistTestsStep.class,
+ PersistCrossProjectDuplicationIndexStep.class,
+
+ // Switch snapshot and purge
+ SwitchSnapshotStep.class,
+ IndexComponentsStep.class,
+ PurgeDatastoresStep.class,
+ ApplyPermissionsStep.class,
+
+ // ES indexing is done after all db changes
+ IndexIssuesStep.class,
+ IndexTestsStep.class,
+
+ // notifications are sent at the end, so that webapp displays up-to-date information
+ SendIssueNotificationsStep.class
+ );
+
+ private final ComputeEngineContainer computeEngineContainer;
+
+ public ReportComputationSteps(ComputeEngineContainer computeEngineContainer) {
+ this.computeEngineContainer = computeEngineContainer;
+ }
+
/**
* List of all {@link org.sonar.server.computation.step.ComputationStep},
* ordered by execution sequence.
*/
@Override
public List<Class<? extends ComputationStep>> orderedStepClasses() {
- return Arrays.asList(
- ExtractReportStep.class,
- LogScannerContextStep.class,
-
- // Builds Component tree
- LoadReportAnalysisMetadataHolderStep.class,
- BuildComponentTreeStep.class,
- ValidateProjectStep.class,
-
- LoadDebtModelStep.class,
- LoadQualityProfilesStep.class,
-
- // load project related stuffs
- LoadQualityGateStep.class,
- LoadPeriodsStep.class,
-
- // load duplications related stuff
- LoadDuplicationsFromReportStep.class,
- LoadCrossProjectDuplicationsRepositoryStep.class,
-
- // data computation
- SizeMeasuresStep.class,
- NewCoverageMeasuresStep.class,
- CoverageMeasuresStep.class,
- CommentMeasuresStep.class,
- CustomMeasuresCopyStep.class,
- DuplicationMeasuresStep.class,
- DuplicationDataMeasuresStep.class,
- LanguageDistributionMeasuresStep.class,
- UnitTestMeasuresStep.class,
- ComplexityMeasuresStep.class,
-
- LoadMeasureComputersStep.class,
- ExecuteVisitorsStep.class,
-
- // Must be executed after computation of all measures
- ComputeMeasureVariationsStep.class,
-
- // Must be executed after computation of differential measures
- QualityGateMeasuresStep.class,
- ComputeQProfileMeasureStep.class,
- // Must be executed after computation of quality profile measure
- QualityProfileEventsStep.class,
-
- // Must be executed after computation of quality gate measure
- QualityGateEventsStep.class,
-
- // Persist data
- PersistComponentsStep.class,
- PersistSnapshotsStep.class,
- PersistMeasuresStep.class,
- PersistIssuesStep.class,
- PersistProjectLinksStep.class,
- PersistEventsStep.class,
- PersistFileSourcesStep.class,
- PersistTestsStep.class,
- PersistCrossProjectDuplicationIndexStep.class,
-
- // Switch snapshot and purge
- SwitchSnapshotStep.class,
- IndexComponentsStep.class,
- PurgeDatastoresStep.class,
- ApplyPermissionsStep.class,
-
- // ES indexing is done after all db changes
- IndexIssuesStep.class,
- IndexTestsStep.class,
-
- // notifications are sent at the end, so that webapp displays up-to-date information
- SendIssueNotificationsStep.class);
- }
-
- private final ComputeEngineContainer computeEngineContainer;
-
- public ReportComputationSteps(ComputeEngineContainer computeEngineContainer) {
- this.computeEngineContainer = computeEngineContainer;
+ return from(STEPS)
+ .filter(new AllowPersistDevelopersStepIfDevCockpitPluginInstalled())
+ .toList();
}
@Override
@@ -129,4 +139,17 @@ public class ReportComputationSteps implements ComputationSteps {
});
}
+ private class AllowPersistDevelopersStepIfDevCockpitPluginInstalled implements Predicate<Class<? extends ComputationStep>> {
+
+ private final boolean devCockpitIsInstalled = computeEngineContainer.getComponentByType(DevCockpitBridge.class) != null;
+
+ @Override
+ public boolean apply(@Nonnull Class<? extends ComputationStep> input) {
+ if (devCockpitIsInstalled) {
+ return true;
+ }
+ return !input.equals(PersistDevelopersStep.class);
+ }
+ }
+
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/taskprocessor/report/ReportTaskProcessor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/taskprocessor/report/ReportTaskProcessor.java
index e0b1dcd60e0..8bb70587108 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/taskprocessor/report/ReportTaskProcessor.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/taskprocessor/report/ReportTaskProcessor.java
@@ -21,13 +21,15 @@ package org.sonar.server.computation.taskprocessor.report;
import java.util.Collections;
import java.util.Set;
+import javax.annotation.CheckForNull;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.db.ce.CeTaskTypes;
-import org.sonar.server.computation.taskprocessor.CeTaskProcessor;
-import org.sonar.server.computation.step.ComputationStepExecutor;
import org.sonar.server.computation.container.ComputeEngineContainer;
import org.sonar.server.computation.container.ContainerFactory;
import org.sonar.server.computation.queue.CeTask;
+import org.sonar.server.computation.step.ComputationStepExecutor;
+import org.sonar.server.computation.taskprocessor.CeTaskProcessor;
+import org.sonar.server.devcockpit.DevCockpitBridge;
public class ReportTaskProcessor implements CeTaskProcessor {
@@ -35,10 +37,25 @@ public class ReportTaskProcessor implements CeTaskProcessor {
private final ContainerFactory containerFactory;
private final ComponentContainer serverContainer;
+ @CheckForNull
+ private final DevCockpitBridge devCockpitBridge;
+
+ /**
+ * Used when Developer Cockpit plugin is installed
+ */
+ public ReportTaskProcessor(ContainerFactory containerFactory, ComponentContainer serverContainer, DevCockpitBridge devCockpitBridge) {
+ this.containerFactory = containerFactory;
+ this.serverContainer = serverContainer;
+ this.devCockpitBridge = devCockpitBridge;
+ }
+ /**
+ * Used when Developer Cockpit plugin is not installed
+ */
public ReportTaskProcessor(ContainerFactory containerFactory, ComponentContainer serverContainer) {
this.containerFactory = containerFactory;
this.serverContainer = serverContainer;
+ this.devCockpitBridge = null;
}
@Override
@@ -48,7 +65,7 @@ public class ReportTaskProcessor implements CeTaskProcessor {
@Override
public void process(CeTask task) {
- ComputeEngineContainer ceContainer = containerFactory.create(serverContainer, task);
+ ComputeEngineContainer ceContainer = containerFactory.create(serverContainer, task, devCockpitBridge);
try {
ceContainer.getComponentByType(ComputationStepExecutor.class).execute();
} finally {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulatorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulatorTest.java
index a1275b60492..8e33902bff6 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulatorTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulatorTest.java
@@ -30,19 +30,25 @@ import org.junit.Test;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.server.computation.queue.CeTask;
import org.sonar.server.computation.step.ComputationStep;
+import org.sonar.server.computation.step.PersistComponentsStep;
+import org.sonar.server.computation.step.PersistDevelopersStep;
+import org.sonar.server.devcockpit.DevCockpitBridge;
+import org.sonar.server.devcockpit.PersistDevelopersDelegate;
import static com.google.common.base.Predicates.notNull;
import static com.google.common.collect.FluentIterable.from;
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.when;
public class ReportComputeEngineContainerPopulatorTest {
private CeTask task = mock(CeTask.class);
- private ReportComputeEngineContainerPopulator underTest = new ReportComputeEngineContainerPopulator(task);
+ private ReportComputeEngineContainerPopulator underTest;
@Test
public void item_is_added_to_the_container() {
+ underTest = new ReportComputeEngineContainerPopulator(task, null);
AddedObjectsRecorderComputeEngineContainer container = new AddedObjectsRecorderComputeEngineContainer();
underTest.populateContainer(container);
@@ -51,6 +57,7 @@ public class ReportComputeEngineContainerPopulatorTest {
@Test
public void all_computation_steps_are_added_in_order_to_the_container() {
+ underTest = new ReportComputeEngineContainerPopulator(task, null);
AddedObjectsRecorderComputeEngineContainer container = new AddedObjectsRecorderComputeEngineContainer();
underTest.populateContainer(container);
@@ -70,7 +77,52 @@ public class ReportComputeEngineContainerPopulatorTest {
.transform(StepsExplorer.toCanonicalName())
.toSet();
- assertThat(difference(StepsExplorer.retrieveStepPackageStepsCanonicalNames(), computationStepClassNames)).isEmpty();
+ // PersistDevelopersStep is the only step that is not in the report container (it's only added when Dev Cockpit plugin is installed)
+ assertThat(difference(StepsExplorer.retrieveStepPackageStepsCanonicalNames(), computationStepClassNames)).containsOnly(PersistDevelopersStep.class.getCanonicalName());
+ }
+
+ @Test
+ public void at_least_one_core_step_is_added_to_the_container() {
+ underTest = new ReportComputeEngineContainerPopulator(task, null);
+ AddedObjectsRecorderComputeEngineContainer container = new AddedObjectsRecorderComputeEngineContainer();
+ underTest.populateContainer(container);
+
+ assertThat(container.added).contains(PersistComponentsStep.class);
+ }
+
+ @Test
+ public void PersistDevelopersStep_is_not_added_to_the_container_when_DevCockpitBridge_is_null() {
+ underTest = new ReportComputeEngineContainerPopulator(task, null);
+ AddedObjectsRecorderComputeEngineContainer container = new AddedObjectsRecorderComputeEngineContainer();
+ underTest.populateContainer(container);
+
+ assertThat(container.added).doesNotContain(PersistDevelopersStep.class);
+ }
+
+ @Test
+ public void PersistDevelopersStep_is_added_to_the_container_when_DevCockpitBridge_exist() {
+ DevCockpitBridge devCockpitBridge = mock(DevCockpitBridge.class);
+ when(devCockpitBridge.getCeComponents()).thenReturn(Arrays.<Object>asList(PersistDevelopersDelegateImpl.class));
+
+ underTest = new ReportComputeEngineContainerPopulator(task, devCockpitBridge);
+ AddedObjectsRecorderComputeEngineContainer container = new AddedObjectsRecorderComputeEngineContainer();
+ container.add(devCockpitBridge);
+ underTest.populateContainer(container);
+
+ assertThat(container.added).contains(PersistDevelopersStep.class);
+ }
+
+ @Test
+ public void components_from_DevCockpitBridge_are_added_to_the_container_when_DevCockpitBridge_exist() {
+ DevCockpitBridge devCockpitBridge = mock(DevCockpitBridge.class);
+ when(devCockpitBridge.getCeComponents()).thenReturn(Arrays.<Object>asList(PersistDevelopersDelegateImpl.class));
+
+ underTest = new ReportComputeEngineContainerPopulator(task, devCockpitBridge);
+ AddedObjectsRecorderComputeEngineContainer container = new AddedObjectsRecorderComputeEngineContainer();
+ container.add(devCockpitBridge);
+ underTest.populateContainer(container);
+
+ assertThat(container.added).contains(PersistDevelopersDelegateImpl.class);
}
private enum IsComputationStep implements Predicate<Class<?>> {
@@ -111,7 +163,19 @@ public class ReportComputeEngineContainerPopulatorTest {
@Override
public <T> T getComponentByType(Class<T> type) {
- throw new UnsupportedOperationException("getComponentByType is not implemented");
+ for (Object add : added) {
+ if (add.getClass().getSimpleName().contains(type.getSimpleName())) {
+ return (T) add;
+ }
+ }
+ return null;
+ }
+ }
+
+ private static class PersistDevelopersDelegateImpl implements PersistDevelopersDelegate {
+ @Override
+ public void execute() {
+ // nothing to do
}
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
index cb05ce578d2..8d0caf0561b 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
@@ -27,12 +27,13 @@ import java.util.Set;
import org.junit.Test;
import org.picocontainer.ComponentAdapter;
import org.sonar.core.platform.ComponentContainer;
-import org.sonar.server.computation.queue.CeTask;
import org.sonar.server.computation.container.ComputeEngineContainerImpl;
import org.sonar.server.computation.container.ReportComputeEngineContainerPopulator;
import org.sonar.server.computation.container.StepsExplorer;
+import org.sonar.server.computation.queue.CeTask;
import static com.google.common.collect.FluentIterable.from;
+import static com.google.common.collect.Sets.difference;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
@@ -51,7 +52,7 @@ public class ComputationStepsTest {
@Test
public void all_steps_from_package_step_are_present_in_container() {
- ComputeEngineContainerImpl ceContainer = new ComputeEngineContainerImpl(new ComponentContainer(), new ReportComputeEngineContainerPopulator(mock(CeTask.class)));
+ ComputeEngineContainerImpl ceContainer = new ComputeEngineContainerImpl(new ComponentContainer(), new ReportComputeEngineContainerPopulator(mock(CeTask.class), null));
Set<String> stepsCanonicalNames = StepsExplorer.retrieveStepPackageStepsCanonicalNames();
@@ -61,7 +62,8 @@ public class ComputationStepsTest {
.transform(StepsExplorer.toCanonicalName())
.toSet();
- assertThat(typesInContainer).isEqualTo(stepsCanonicalNames);
+ // PersistDevelopersStep is the only step that is not in the report container (it's only added when Dev Cockpit plugin is installed);
+ assertThat(difference(stepsCanonicalNames, typesInContainer)).containsOnly(PersistDevelopersStep.class.getCanonicalName());
}
private enum ComponentAdapterToImplementationClass implements Function<ComponentAdapter<?>, Class<?>> {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDevelopersStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDevelopersStepTest.java
new file mode 100644
index 00000000000..6fc524efed3
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDevelopersStepTest.java
@@ -0,0 +1,41 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.server.computation.step;
+
+import org.junit.Test;
+import org.sonar.server.devcockpit.PersistDevelopersDelegate;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class PersistDevelopersStepTest {
+
+ PersistDevelopersDelegate persistDevelopersDelegate = mock(PersistDevelopersDelegate.class);
+
+ PersistDevelopersStep underTest = new PersistDevelopersStep(persistDevelopersDelegate);
+
+ @Test
+ public void execute_calls_delegate_execute() throws Exception {
+ underTest.execute();
+
+ verify(persistDevelopersDelegate).execute();
+ }
+}