diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-11-18 14:49:06 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-11-19 14:16:44 +0100 |
commit | 240cf9f64ff0d7aa1e94f4fdeeb449f48141bcb0 (patch) | |
tree | 3d22200623705904da1a78ac936f72724e908a9b | |
parent | cd03d464226228b66e76bee952484ddb05d29a05 (diff) | |
download | sonarqube-240cf9f64ff0d7aa1e94f4fdeeb449f48141bcb0.tar.gz sonarqube-240cf9f64ff0d7aa1e94f4fdeeb449f48141bcb0.zip |
SONAR-7027 Add PersistDeveloperStep
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(); + } +} |