diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2011-06-21 15:12:11 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2011-06-21 15:13:48 +0200 |
commit | 02fdeba8d5cea42b17f0e24bc1d0bdebd9c0d29b (patch) | |
tree | 56b6d7bb26a1b842577c75968269ad3ae9e976ef /plugins/sonar-core-plugin | |
parent | 09b9a9586fe2a3a82d79ea2e7c5f1cbe742c8ac5 (diff) | |
download | sonarqube-02fdeba8d5cea42b17f0e24bc1d0bdebd9c0d29b.tar.gz sonarqube-02fdeba8d5cea42b17f0e24bc1d0bdebd9c0d29b.zip |
SONAR-2505 support measure variations
Diffstat (limited to 'plugins/sonar-core-plugin')
13 files changed, 207 insertions, 47 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java index c14be8d3310..f3b72b9e0c1 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java @@ -217,6 +217,7 @@ public class CorePlugin extends SonarPlugin { extensions.add(ReferenceAnalysis.class); // time machine + extensions.add(TimeMachineConfiguration.class); extensions.add(TendencyDecorator.class); extensions.add(VariationDecorator.class); extensions.add(ViolationTrackingDecorator.class); diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewCoverageFileAnalyzer.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewCoverageFileAnalyzer.java index d44ffd056e1..666d89082b5 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewCoverageFileAnalyzer.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewCoverageFileAnalyzer.java @@ -32,7 +32,6 @@ import org.sonar.api.resources.Resource; import org.sonar.api.resources.Scopes; import org.sonar.api.utils.KeyValueFormat; import org.sonar.batch.components.PastSnapshot; -import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.core.NotDryRun; import java.util.Arrays; diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java index 86a150e28cd..4e00eb4c99f 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java @@ -31,7 +31,6 @@ import org.sonar.api.rules.Rule; import org.sonar.api.rules.RulePriority; import org.sonar.api.rules.Violation; import org.sonar.batch.components.PastSnapshot; -import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.core.NotDryRun; import java.util.*; diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java index ade65afb788..5a52622f9ec 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java @@ -31,7 +31,6 @@ import org.sonar.api.measures.MetricFinder; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; import org.sonar.api.resources.Scopes; -import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.core.NotDryRun; import java.util.List; diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java new file mode 100644 index 00000000000..0ef49a93ea6 --- /dev/null +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java @@ -0,0 +1,112 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.core.timemachine; + +import com.google.common.collect.Lists; +import org.apache.commons.configuration.Configuration; +import org.apache.commons.lang.StringUtils; +import org.slf4j.LoggerFactory; +import org.sonar.api.BatchExtension; +import org.sonar.api.CoreProperties; +import org.sonar.api.database.DatabaseSession; +import org.sonar.api.database.model.Snapshot; +import org.sonar.api.resources.Project; +import org.sonar.api.resources.Qualifiers; +import org.sonar.api.utils.Logs; +import org.sonar.batch.components.PastSnapshot; +import org.sonar.batch.components.PastSnapshotFinder; + +import javax.persistence.Query; +import java.util.Collections; +import java.util.List; + +public class TimeMachineConfiguration implements BatchExtension { + + private static final int NUMBER_OF_VARIATION_SNAPSHOTS = 5; + + private Project project; + private final Configuration configuration; + private List<PastSnapshot> projectPastSnapshots; + private DatabaseSession session; + + public TimeMachineConfiguration(DatabaseSession session, Project project, Configuration configuration, PastSnapshotFinder pastSnapshotFinder) { + this.session = session; + this.project = project; + this.configuration = configuration; + initPastSnapshots(pastSnapshotFinder); + } + + private void initPastSnapshots(PastSnapshotFinder pastSnapshotFinder) { + Snapshot projectSnapshot = buildProjectSnapshot(); + + projectPastSnapshots = Lists.newLinkedList(); + if (projectSnapshot != null) { + for (int index = 1; index <= NUMBER_OF_VARIATION_SNAPSHOTS; index++) { + PastSnapshot pastSnapshot = pastSnapshotFinder.find(projectSnapshot, configuration, index); + if (pastSnapshot != null) { + log(pastSnapshot); + projectPastSnapshots.add(pastSnapshot); + } + } + } + } + + private Snapshot buildProjectSnapshot() { + Query query = session.createNativeQuery("select p.id from projects p where p.kee=:resourceKey and p.qualifier<>:lib and p.enabled=:enabled"); + query.setParameter("resourceKey", project.getKey()); + query.setParameter("lib", Qualifiers.LIBRARY); + query.setParameter("enabled", Boolean.TRUE); + + Snapshot snapshot = null; + Number projectId = session.getSingleResult(query, null); + if (projectId != null) { + snapshot = new Snapshot(); + snapshot.setResourceId(projectId.intValue()); + snapshot.setCreatedAt(project.getAnalysisDate()); + } + return snapshot; + } + + private void log(PastSnapshot pastSnapshot) { + String qualifier = pastSnapshot.getQualifier(); + // hack to avoid too many logs when the views plugin is installed + if (StringUtils.equals(Qualifiers.VIEW, qualifier) || StringUtils.equals(Qualifiers.SUBVIEW, qualifier)) { + LoggerFactory.getLogger(getClass()).debug(pastSnapshot.toString()); + } else { + Logs.INFO.info(pastSnapshot.toString()); + } + } + + public boolean skipTendencies() { + return configuration.getBoolean(CoreProperties.SKIP_TENDENCIES_PROPERTY, CoreProperties.SKIP_TENDENCIES_DEFAULT_VALUE); + } + + public int getTendencyPeriodInDays() { + return configuration.getInt(CoreProperties.CORE_TENDENCY_DEPTH_PROPERTY, CoreProperties.CORE_TENDENCY_DEPTH_DEFAULT_VALUE); + } + + public List<PastSnapshot> getProjectPastSnapshots() { + return projectPastSnapshots; + } + + public boolean isFileVariationEnabled() { + return configuration.getBoolean("sonar.enableFileVariation", Boolean.FALSE); + } +} diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersister.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersister.java index 889a9010d78..6021e9ef78c 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersister.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersister.java @@ -27,7 +27,6 @@ import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; import org.sonar.api.resources.ResourceUtils; import org.sonar.batch.components.PastSnapshot; -import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.core.NotDryRun; import java.util.List; diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/VariationDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/VariationDecorator.java index 1fe3ec56cc1..5299904a13b 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/VariationDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/VariationDecorator.java @@ -22,36 +22,38 @@ package org.sonar.plugins.core.timemachine; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; +import org.sonar.api.CoreProperties; import org.sonar.api.batch.*; import org.sonar.api.measures.*; import org.sonar.api.resources.Project; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.Resource; import org.sonar.api.resources.Scopes; import org.sonar.batch.components.PastMeasuresLoader; import org.sonar.batch.components.PastSnapshot; -import org.sonar.batch.components.TimeMachineConfiguration; -import org.sonar.core.NotDryRun; import java.util.Collection; import java.util.List; import java.util.Map; -@NotDryRun @DependedUpon(DecoratorBarriers.END_OF_TIME_MACHINE) public class VariationDecorator implements Decorator { private List<PastSnapshot> projectPastSnapshots; private MetricFinder metricFinder; private PastMeasuresLoader pastMeasuresLoader; + private final boolean enabledFileVariation; public VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, TimeMachineConfiguration configuration) { - this(pastMeasuresLoader, metricFinder, configuration.getProjectPastSnapshots()); + this(pastMeasuresLoader, metricFinder, configuration.getProjectPastSnapshots(), configuration.isFileVariationEnabled()); } - public VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, List<PastSnapshot> projectPastSnapshots) { + + VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, List<PastSnapshot> projectPastSnapshots, boolean enabledFileVariation) { this.pastMeasuresLoader = pastMeasuresLoader; this.projectPastSnapshots = projectPastSnapshots; this.metricFinder = metricFinder; + this.enabledFileVariation = enabledFileVariation; } public boolean shouldExecuteOnProject(Project project) { @@ -64,19 +66,23 @@ public class VariationDecorator implements Decorator { } public void decorate(Resource resource, DecoratorContext context) { - if (shouldCalculateVariations(resource)) { - for (PastSnapshot projectPastSnapshot : projectPastSnapshots) { - calculateVariation(resource, context, projectPastSnapshot); + for (PastSnapshot projectPastSnapshot : projectPastSnapshots) { + if (shouldComputeVariation(projectPastSnapshot.getMode(), resource)) { + computeVariation(resource, context, projectPastSnapshot); } } } - static boolean shouldCalculateVariations(Resource resource) { + boolean shouldComputeVariation(String variationMode, Resource resource) { + if (Scopes.FILE.equals(resource.getScope()) && !Qualifiers.UNIT_TEST_FILE.equals(resource.getQualifier())) { + return enabledFileVariation && StringUtils.equals(variationMode, CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS); + } + // measures on files are currently purged, so past measures are not available on files return StringUtils.equals(Scopes.PROJECT, resource.getScope()) || StringUtils.equals(Scopes.DIRECTORY, resource.getScope()); } - private void calculateVariation(Resource resource, DecoratorContext context, PastSnapshot pastSnapshot) { + private void computeVariation(Resource resource, DecoratorContext context, PastSnapshot pastSnapshot) { List<Object[]> pastMeasures = pastMeasuresLoader.getPastMeasures(resource, pastSnapshot); compareWithPastMeasures(context, pastSnapshot.getIndex(), pastMeasures); } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java index 22a239811b3..b027004067b 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java @@ -38,7 +38,6 @@ import org.sonar.api.rules.Rule; import org.sonar.api.rules.RulePriority; import org.sonar.api.rules.Violation; import org.sonar.batch.components.PastSnapshot; -import org.sonar.batch.components.TimeMachineConfiguration; import java.util.Arrays; import java.util.Date; diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java index 9fd3336ab0c..5999463ec21 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java @@ -29,7 +29,6 @@ import org.sonar.api.measures.Measure; import org.sonar.api.measures.MetricFinder; import org.sonar.api.resources.JavaPackage; import org.sonar.api.resources.Project; -import org.sonar.batch.components.TimeMachineConfiguration; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -61,7 +60,9 @@ public class TendencyDecoratorTest { } private TimeMachineConfiguration newConf() { - return new TimeMachineConfiguration(new PropertiesConfiguration()); + TimeMachineConfiguration configuration = mock(TimeMachineConfiguration.class); + when(configuration.getTendencyPeriodInDays()).thenReturn(30); + return configuration; } @Test diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersisterTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersisterTest.java index afc51cf8969..21dcfefffec 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersisterTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationPersisterTest.java @@ -23,7 +23,6 @@ import org.junit.Test; import org.sonar.api.database.model.Snapshot; import org.sonar.api.utils.DateUtils; import org.sonar.batch.components.PastSnapshot; -import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.jpa.test.AbstractDbUnitTestCase; import java.text.ParseException; diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java index f1444bd6acc..dda4f1a77b8 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java @@ -20,20 +20,19 @@ package org.sonar.plugins.core.timemachine; import org.apache.commons.configuration.PropertiesConfiguration; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; import org.junit.Test; import org.sonar.api.CoreProperties; import org.sonar.api.database.model.Snapshot; -import org.sonar.api.utils.DateUtils; -import org.sonar.batch.components.PastSnapshot; +import org.sonar.api.resources.Project; import org.sonar.batch.components.PastSnapshotFinder; -import org.sonar.batch.components.TimeMachineConfiguration; import org.sonar.jpa.test.AbstractDbUnitTestCase; -import java.text.ParseException; -import java.util.Date; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; public class TimeMachineConfigurationTest extends AbstractDbUnitTestCase { @@ -42,32 +41,41 @@ public class TimeMachineConfigurationTest extends AbstractDbUnitTestCase { public void shouldSkipTendencies() { PropertiesConfiguration conf = new PropertiesConfiguration(); conf.setProperty(CoreProperties.SKIP_TENDENCIES_PROPERTY, true); - assertThat(new TimeMachineConfiguration(conf).skipTendencies(), is(true)); + assertThat(new TimeMachineConfiguration(getSession(), new Project("my:project"), conf, mock(PastSnapshotFinder.class)).skipTendencies(), is(true)); } @Test public void shouldNotSkipTendenciesByDefault() { PropertiesConfiguration conf = new PropertiesConfiguration(); - assertThat(new TimeMachineConfiguration(conf).skipTendencies(), is(false)); + assertThat(new TimeMachineConfiguration(getSession(), new Project("my:project"), conf, mock(PastSnapshotFinder.class)).skipTendencies(), is(false)); } @Test - public void shouldInitPastSnapshots() throws ParseException { + public void shouldInitPastSnapshots() { + setupData("shared"); PropertiesConfiguration conf = new PropertiesConfiguration(); PastSnapshotFinder pastSnapshotFinder = mock(PastSnapshotFinder.class); - when(pastSnapshotFinder.find(null, conf, 1)).thenReturn(new PastSnapshot("days", new Date(), newSnapshot("2010-10-15"))); - when(pastSnapshotFinder.find(null, conf, 3)).thenReturn(new PastSnapshot("days", new Date(), newSnapshot("2010-10-13"))); - TimeMachineConfiguration timeMachineConfiguration = new TimeMachineConfiguration(conf, pastSnapshotFinder, null); + new TimeMachineConfiguration(getSession(), new Project("my:project"), conf, pastSnapshotFinder); - verify(pastSnapshotFinder).find(null, conf, 1); - verify(pastSnapshotFinder).find(null, conf, 2); - verify(pastSnapshotFinder).find(null, conf, 3); + verify(pastSnapshotFinder).find(argThat(new BaseMatcher<Snapshot>() { + public boolean matches(Object o) { + return ((Snapshot) o).getResourceId() == 2 /* see database in shared.xml */; + } - assertThat(timeMachineConfiguration.getProjectPastSnapshots().size(), is(2)); + public void describeTo(Description description) { + } + }), eq(conf), eq(1)); } - private Snapshot newSnapshot(String date) throws ParseException { - return new Snapshot().setCreatedAt(DateUtils.parseDate(date)); + @Test + public void shouldNotInitPastSnapshotsIfFirstAnalysis() { + setupData("shared"); + PropertiesConfiguration conf = new PropertiesConfiguration(); + PastSnapshotFinder pastSnapshotFinder = mock(PastSnapshotFinder.class); + + new TimeMachineConfiguration(getSession(), new Project("new:project"), conf, pastSnapshotFinder); + + verifyZeroInteractions(pastSnapshotFinder); } } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java index ad4fd12459e..27c2fff471b 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java @@ -21,9 +21,9 @@ package org.sonar.plugins.core.timemachine; import org.junit.Test; import org.mockito.Matchers; +import org.sonar.api.CoreProperties; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.database.model.MeasureModel; -import org.sonar.api.database.model.Snapshot; import org.sonar.api.measures.Measure; import org.sonar.api.measures.MeasuresFilter; import org.sonar.api.measures.Metric; @@ -50,14 +50,41 @@ public class VariationDecoratorTest extends AbstractDbUnitTestCase { public static final Metric COVERAGE = new Metric("coverage").setId(COVERAGE_ID); @Test - public void shouldNotCalculateVariationsOnFiles() { - assertThat(VariationDecorator.shouldCalculateVariations(new Project("foo")), is(true)); - assertThat(VariationDecorator.shouldCalculateVariations(new JavaPackage("org.foo")), is(true)); - assertThat(VariationDecorator.shouldCalculateVariations(new Directory("org/foo")), is(true)); - - assertThat(VariationDecorator.shouldCalculateVariations(new JavaFile("org.foo.Bar")), is(false)); - assertThat(VariationDecorator.shouldCalculateVariations(new JavaFile("org.foo.Bar", true)), is(false)); - assertThat(VariationDecorator.shouldCalculateVariations(new File("org/foo/Bar.php")), is(false)); + public void shouldComputeVariations() { + TimeMachineConfiguration conf = mock(TimeMachineConfiguration.class); + when(conf.isFileVariationEnabled()).thenReturn(false); + VariationDecorator decorator = new VariationDecorator(mock(PastMeasuresLoader.class), mock(MetricFinder.class), conf); + + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, new Project("foo")), is(true)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_DATE, new Project("foo")), is(true)); + } + + @Test + public void shouldNotComputeFileVariations() { + TimeMachineConfiguration conf = mock(TimeMachineConfiguration.class); + when(conf.isFileVariationEnabled()).thenReturn(false); + VariationDecorator decorator = new VariationDecorator(mock(PastMeasuresLoader.class), mock(MetricFinder.class), conf); + + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, new JavaFile("org.foo.Bar")), is(false)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_DATE, new JavaFile("org.foo.Bar")), is(false)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, new File("org/foo/Bar.php")), is(false)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_DATE, new File("org/foo/Bar.php")), is(false)); + } + + @Test + public void shouldComputeFileVariationsIfExplictlyEnabled() { + TimeMachineConfiguration conf = mock(TimeMachineConfiguration.class); + when(conf.isFileVariationEnabled()).thenReturn(true); + VariationDecorator decorator = new VariationDecorator(mock(PastMeasuresLoader.class), mock(MetricFinder.class), conf); + + // only for variation with reference analysis + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, new JavaFile("org.foo.Bar")), is(true)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_DATE, new JavaFile("org.foo.Bar")), is(false)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, new File("org/foo/Bar.php")), is(true)); + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_DATE, new File("org/foo/Bar.php")), is(false)); + + // no side-effect on other resources + assertThat(decorator.shouldComputeVariation(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, new Project("foo")), is(true)); } @Test @@ -83,8 +110,7 @@ public class VariationDecoratorTest extends AbstractDbUnitTestCase { Measure currentCoverage = newMeasure(COVERAGE, 80.0); when(context.getMeasures(Matchers.<MeasuresFilter>anyObject())).thenReturn(Arrays.asList(currentNcloc, currentCoverage)); - VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, mock(MetricFinder.class), - Arrays.asList(pastSnapshot1, pastSnapshot3)); + VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, mock(MetricFinder.class), Arrays.asList(pastSnapshot1, pastSnapshot3), false); decorator.decorate(javaPackage, context); // context updated for each variation : 2 times for ncloc and 1 time for coverage diff --git a/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest/shared.xml b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest/shared.xml new file mode 100644 index 00000000000..5e53bd405e7 --- /dev/null +++ b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest/shared.xml @@ -0,0 +1,12 @@ +<dataset> + + <projects long_name="[null]" id="1" scope="PRJ" kee="my:project" qualifier="LIB" name="my project as lib" + root_id="[null]" description="[null]" enabled="true" profile_id="[null]" language="java" copy_resource_id="[null]"/> + + <projects long_name="[null]" id="2" scope="PRJ" kee="my:project" qualifier="TRK" name="my project" + root_id="[null]" description="[null]" enabled="true" profile_id="[null]" language="java" copy_resource_id="[null]"/> + + <projects long_name="[null]" id="3" scope="DIR" kee="my:project:path/to/dir" qualifier="TRK" name="my dir" + root_id="2" description="[null]" enabled="true" profile_id="[null]" language="java" copy_resource_id="[null]"/> + +</dataset> |