aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/sonar-core-plugin
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/sonar-core-plugin')
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastMeasuresLoader.java4
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/VariationDecorator.java35
-rw-r--r--plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java59
3 files changed, 82 insertions, 16 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastMeasuresLoader.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastMeasuresLoader.java
index be7fcfe30b1..7fc073956fc 100644
--- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastMeasuresLoader.java
+++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastMeasuresLoader.java
@@ -56,6 +56,10 @@ public class PastMeasuresLoader implements BatchExtension {
return metricByIds.values();
}
+ public List<MeasureModel> getPastMeasures(Resource resource, PastSnapshot projectPastSnapshot) {
+ return getPastMeasures(resource, projectPastSnapshot.getProjectSnapshot());
+ }
+
public List<MeasureModel> getPastMeasures(Resource resource, Snapshot projectSnapshot) {
// assume that the resource has already been saved
return getPastMeasures(resource.getId(), projectSnapshot);
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 03b594c36bf..12635f88ff5 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
@@ -39,16 +39,16 @@ import java.util.Map;
@DependedUpon(DecoratorBarriers.END_OF_TIME_MACHINE)
public class VariationDecorator implements Decorator {
- private List<PastSnapshot> targets;
+ private List<PastSnapshot> projectPastSnapshots;
private PastMeasuresLoader pastMeasuresLoader;
public VariationDecorator(PastMeasuresLoader pastMeasuresLoader, TimeMachineConfiguration configuration) {
this(pastMeasuresLoader, configuration.getVariationSnapshots());
}
- VariationDecorator(PastMeasuresLoader pastMeasuresLoader, List<PastSnapshot> targets) {
+ VariationDecorator(PastMeasuresLoader pastMeasuresLoader, List<PastSnapshot> projectPastSnapshots) {
this.pastMeasuresLoader = pastMeasuresLoader;
- this.targets = targets;
+ this.projectPastSnapshots = projectPastSnapshots;
}
public boolean shouldExecuteOnProject(Project project) {
@@ -60,22 +60,22 @@ public class VariationDecorator implements Decorator {
return pastMeasuresLoader.getMetrics();
}
- static boolean shouldCalculateVariations(Resource resource) {
- // measures on files are currently purged, so past measures are not available on files
- return !ResourceUtils.isEntity(resource);
- }
-
public void decorate(Resource resource, DecoratorContext context) {
if (shouldCalculateVariations(resource)) {
- for (PastSnapshot target : targets) {
- calculateVariation(resource, context, target);
+ for (PastSnapshot projectPastSnapshot : projectPastSnapshots) {
+ calculateVariation(resource, context, projectPastSnapshot);
}
}
}
- private void calculateVariation(Resource resource, DecoratorContext context, PastSnapshot target) {
- List<MeasureModel> pastMeasures = pastMeasuresLoader.getPastMeasures(resource, target.getProjectSnapshot());
- compareWithPastMeasures(context, target.getIndex(), pastMeasures);
+ static boolean shouldCalculateVariations(Resource resource) {
+ // measures on files are currently purged, so past measures are not available on files
+ return !ResourceUtils.isEntity(resource);
+ }
+
+ private void calculateVariation(Resource resource, DecoratorContext context, PastSnapshot pastSnapshot) {
+ List<MeasureModel> pastMeasures = pastMeasuresLoader.getPastMeasures(resource, pastSnapshot);
+ compareWithPastMeasures(context, pastSnapshot.getIndex(), pastMeasures);
}
void compareWithPastMeasures(DecoratorContext context, int index, List<MeasureModel> pastMeasures) {
@@ -88,16 +88,19 @@ public class VariationDecorator implements Decorator {
for (Measure measure : context.getMeasures(MeasuresFilters.all())) {
// compare with past measure
MeasureModel pastMeasure = pastMeasuresByKey.get(new MeasureKey(measure));
- updateVariation(measure, pastMeasure, index);
- context.saveMeasure(measure);
+ if (updateVariation(measure, pastMeasure, index)) {
+ context.saveMeasure(measure);
+ }
}
}
- void updateVariation(Measure measure, MeasureModel pastMeasure, int index) {
+ boolean updateVariation(Measure measure, MeasureModel pastMeasure, int index) {
if (pastMeasure != null && pastMeasure.getValue() != null && measure.getValue() != null) {
double variation = (measure.getValue().doubleValue() - pastMeasure.getValue().doubleValue());
measure.setVariation(index, variation);
+ return true;
}
+ return false;
}
@Override
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 b4f93aa97db..a2d21bcb804 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
@@ -20,14 +20,28 @@
package org.sonar.plugins.core.timemachine;
import org.junit.Test;
+import org.mockito.Matchers;
+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;
import org.sonar.api.resources.*;
import org.sonar.jpa.test.AbstractDbUnitTestCase;
+import java.util.Arrays;
+
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.mockito.Mockito.*;
public class VariationDecoratorTest extends AbstractDbUnitTestCase {
+ public static final Metric NCLOC = new Metric("ncloc").setId(12);
+ public static final Metric COVERAGE = new Metric("coverage").setId(16);
+
@Test
public void shouldNotCalculateVariationsOnFiles() {
assertThat(VariationDecorator.shouldCalculateVariations(new Project("foo")), is(true));
@@ -39,4 +53,49 @@ public class VariationDecoratorTest extends AbstractDbUnitTestCase {
assertThat(VariationDecorator.shouldCalculateVariations(new File("org/foo/Bar.php")), is(false));
}
+ @Test
+ public void shouldCompareAndSaveVariation() {
+ Resource javaPackage = new JavaPackage("org.foo");
+
+ PastMeasuresLoader pastMeasuresLoader = mock(PastMeasuresLoader.class);
+ PastSnapshot pastSnapshot1 = new PastSnapshot(1, "days", new Snapshot());
+ PastSnapshot pastSnapshot3 = new PastSnapshot(3, "days", new Snapshot());
+
+ // first past analysis
+ when(pastMeasuresLoader.getPastMeasures(javaPackage, pastSnapshot1)).thenReturn(Arrays.asList(
+ newMeasureModel(NCLOC, 180.0),
+ newMeasureModel(COVERAGE, 75.0)));
+
+ // second past analysis
+ when(pastMeasuresLoader.getPastMeasures(javaPackage, pastSnapshot3)).thenReturn(Arrays.asList(
+ newMeasureModel(NCLOC, 240.0)));
+
+ // current analysis
+ DecoratorContext context = mock(DecoratorContext.class);
+ Measure currentNcloc = newMeasure(NCLOC, 200.0);
+ Measure currentCoverage = newMeasure(COVERAGE, 80.0);
+ when(context.getMeasures(Matchers.<MeasuresFilter>anyObject())).thenReturn(Arrays.asList(currentNcloc, currentCoverage));
+
+ VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, Arrays.asList(pastSnapshot1, pastSnapshot3));
+ decorator.decorate(javaPackage, context);
+
+ // context updated for each variation : 2 times for ncloc and 1 time for coverage
+ verify(context, times(3)).saveMeasure(Matchers.<Measure>anyObject());
+
+ assertThat(currentNcloc.getVariation1(), is(20.0));
+ assertThat(currentNcloc.getVariation2(), nullValue());
+ assertThat(currentNcloc.getVariation3(), is(-40.0));
+
+ assertThat(currentCoverage.getVariation1(), is(5.0));
+ assertThat(currentCoverage.getVariation2(), nullValue());
+ assertThat(currentCoverage.getVariation3(), nullValue());
+ }
+
+ private Measure newMeasure(Metric metric, double value) {
+ return new Measure(metric, value);
+ }
+
+ private MeasureModel newMeasureModel(Metric metric, double value) {
+ return new MeasureModel(metric.getId(), value);
+ }
}