aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2015-08-21 10:45:28 +0200
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2015-08-24 14:00:32 +0200
commit89a832c978f58e7ce3783bd42a7c0604f2cb90ef (patch)
tree2e69970c1aebe1c2517544fa00cf8516e0234033 /server
parent03ab11c531008e064bc0cb42f3abba1cd23c036e (diff)
downloadsonarqube-89a832c978f58e7ce3783bd42a7c0604f2cb90ef.tar.gz
sonarqube-89a832c978f58e7ce3783bd42a7c0604f2cb90ef.zip
rename SumCounter to IntSumCounter and add LongSumCounter
add support for each kind of counter in SumFormula
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumFormula.java64
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/IntSumCounter.java (renamed from server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumCounter.java)10
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/LongSumCounter.java68
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/SumCounter.java32
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java19
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java8
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java26
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java21
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java16
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/formula/IntSumFormulaTest.java (renamed from server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaTest.java)35
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/formula/LongSumFormulaTest.java117
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/IntSumCounterTest.java (renamed from server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumCounterTest.java)11
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/LongSumCounterTest.java86
15 files changed, 436 insertions, 84 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumFormula.java b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumFormula.java
index e2fc1a0e8fc..19b1a30d8d5 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumFormula.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumFormula.java
@@ -22,34 +22,74 @@ package org.sonar.server.computation.formula;
import com.google.common.base.Optional;
import org.sonar.server.computation.component.CrawlerDepthLimit;
+import org.sonar.server.computation.formula.counter.IntSumCounter;
+import org.sonar.server.computation.formula.counter.LongSumCounter;
+import org.sonar.server.computation.formula.counter.SumCounter;
import org.sonar.server.computation.measure.Measure;
import static java.util.Objects.requireNonNull;
-public class SumFormula implements Formula<SumCounter> {
- private final String metricKey;
+public abstract class SumFormula<T extends SumCounter<U, T>, U extends Number> implements Formula<T> {
+ protected final String metricKey;
public SumFormula(String metricKey) {
this.metricKey = requireNonNull(metricKey, "Metric key cannot be null");
}
- @Override
- public SumCounter createNewCounter() {
- return new SumCounter(metricKey);
+ public static IntSumFormula createIntSumFormula(String metricKey) {
+ return new IntSumFormula(metricKey);
}
- @Override
- public Optional<Measure> createMeasure(SumCounter counter, CreateMeasureContext context) {
- Optional<Integer> valueOptional = counter.getValue();
- if (valueOptional.isPresent() && CrawlerDepthLimit.LEAVES.isDeeperThan(context.getComponent().getType())) {
- return Optional.of(Measure.newMeasureBuilder().create(valueOptional.get()));
+ public static class IntSumFormula extends SumFormula<IntSumCounter, Integer> {
+ private IntSumFormula(String metricKey) {
+ super(metricKey);
+ }
+
+ @Override
+ public IntSumCounter createNewCounter() {
+ return new IntSumCounter(metricKey);
+ }
+
+ @Override
+ public Optional<Measure> createMeasure(IntSumCounter counter, CreateMeasureContext context) {
+ Optional<Integer> valueOptional = counter.getValue();
+ if (shouldCreateMeasure(context, valueOptional)) {
+ return Optional.of(Measure.newMeasureBuilder().create(valueOptional.get()));
+ }
+ return Optional.absent();
+ }
+ }
+
+ public static LongSumFormula createLongSumFormula(String metricKey) {
+ return new LongSumFormula(metricKey);
+ }
+
+ public static class LongSumFormula extends SumFormula<LongSumCounter, Long> {
+ private LongSumFormula(String metricKey) {
+ super(metricKey);
}
- return Optional.absent();
+
+ @Override
+ public LongSumCounter createNewCounter() {
+ return new LongSumCounter(metricKey);
+ }
+
+ @Override
+ public Optional<Measure> createMeasure(LongSumCounter counter, CreateMeasureContext context) {
+ Optional<Long> valueOptional = counter.getValue();
+ if (shouldCreateMeasure(context, valueOptional)) {
+ return Optional.of(Measure.newMeasureBuilder().create(valueOptional.get()));
+ }
+ return Optional.absent();
+ }
+ }
+
+ private static <T extends Number> boolean shouldCreateMeasure(CreateMeasureContext context, Optional<T> value) {
+ return value.isPresent() && CrawlerDepthLimit.LEAVES.isDeeperThan(context.getComponent().getType());
}
@Override
public String[] getOutputMetricKeys() {
return new String[] {metricKey};
}
-
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumCounter.java b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/IntSumCounter.java
index 69bf85cbeb4..c5dd1c5f8e2 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumCounter.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/IntSumCounter.java
@@ -18,27 +18,28 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-package org.sonar.server.computation.formula;
+package org.sonar.server.computation.formula.counter;
import com.google.common.base.Optional;
+import org.sonar.server.computation.formula.LeafAggregateContext;
import org.sonar.server.computation.measure.Measure;
/**
* Simple counter that do the sum of an integer measure
*/
-public class SumCounter implements Counter<SumCounter> {
+public class IntSumCounter implements SumCounter<Integer, IntSumCounter> {
private final String metricKey;
private int value = 0;
private boolean initialized = false;
- public SumCounter(String metricKey) {
+ public IntSumCounter(String metricKey) {
this.metricKey = metricKey;
}
@Override
- public void aggregate(SumCounter counter) {
+ public void aggregate(IntSumCounter counter) {
if (counter.getValue().isPresent()) {
addValue(counter.getValue().get());
}
@@ -57,6 +58,7 @@ public class SumCounter implements Counter<SumCounter> {
value += newValue;
}
+ @Override
public Optional<Integer> getValue() {
if (initialized) {
return Optional.of(value);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/LongSumCounter.java b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/LongSumCounter.java
new file mode 100644
index 00000000000..30af1009ef7
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/LongSumCounter.java
@@ -0,0 +1,68 @@
+/*
+ * 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.formula.counter;
+
+import com.google.common.base.Optional;
+import org.sonar.server.computation.formula.LeafAggregateContext;
+import org.sonar.server.computation.measure.Measure;
+
+/**
+ * Simple counter that do the sum of an integer measure
+ */
+public class LongSumCounter implements SumCounter<Long, LongSumCounter> {
+
+ private final String metricKey;
+
+ private long value = 0;
+ private boolean initialized = false;
+
+ public LongSumCounter(String metricKey) {
+ this.metricKey = metricKey;
+ }
+
+ @Override
+ public void aggregate(LongSumCounter counter) {
+ if (counter.getValue().isPresent()) {
+ addValue(counter.getValue().get());
+ }
+ }
+
+ @Override
+ public void aggregate(LeafAggregateContext context) {
+ Optional<Measure> measureOptional = context.getMeasure(metricKey);
+ if (measureOptional.isPresent()) {
+ addValue(measureOptional.get().getLongValue());
+ }
+ }
+
+ private void addValue(long newValue) {
+ initialized = true;
+ value += newValue;
+ }
+
+ @Override
+ public Optional<Long> getValue() {
+ if (initialized) {
+ return Optional.of(value);
+ }
+ return Optional.absent();
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/SumCounter.java b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/SumCounter.java
new file mode 100644
index 00000000000..45e709296ff
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/formula/counter/SumCounter.java
@@ -0,0 +1,32 @@
+/*
+ * 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.formula.counter;
+
+import com.google.common.base.Optional;
+import org.sonar.server.computation.formula.Counter;
+import org.sonar.server.computation.formula.LeafAggregateContext;
+
+public interface SumCounter<T extends Number, COUNTER extends SumCounter<T, COUNTER>> extends Counter<COUNTER> {
+ void aggregate(COUNTER counter);
+
+ void aggregate(LeafAggregateContext context);
+
+ Optional<T> getValue();
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java
index 5fac2ff75a0..3a41699c5ea 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CommentMeasuresStep.java
@@ -30,8 +30,8 @@ import org.sonar.server.computation.formula.CreateMeasureContext;
import org.sonar.server.computation.formula.Formula;
import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor;
import org.sonar.server.computation.formula.LeafAggregateContext;
-import org.sonar.server.computation.formula.SumCounter;
-import org.sonar.server.computation.formula.SumFormula;
+import org.sonar.server.computation.formula.counter.IntSumCounter;
+import org.sonar.server.computation.formula.counter.SumCounter;
import org.sonar.server.computation.measure.Measure;
import org.sonar.server.computation.measure.MeasureRepository;
import org.sonar.server.computation.metric.Metric;
@@ -44,6 +44,7 @@ import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY;
import static org.sonar.api.measures.CoreMetrics.PUBLIC_API_KEY;
import static org.sonar.api.measures.CoreMetrics.PUBLIC_DOCUMENTED_API_DENSITY_KEY;
import static org.sonar.api.measures.CoreMetrics.PUBLIC_UNDOCUMENTED_API_KEY;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
/**
* Computes comments measures on files and then aggregates them on higher components.
@@ -60,7 +61,7 @@ public class CommentMeasuresStep implements ComputationStep {
this.metricRepository = metricRepository;
this.measureRepository = measureRepository;
this.formulas = ImmutableList.<Formula>of(
- new SumFormula(COMMENTED_OUT_CODE_LINES_KEY),
+ createIntSumFormula(COMMENTED_OUT_CODE_LINES_KEY),
new DocumentationFormula(),
new CommentDensityFormula());
}
@@ -72,7 +73,7 @@ public class CommentMeasuresStep implements ComputationStep {
.visit(treeRootHolder.getRoot());
}
- private class CommentDensityFormula implements Formula<SumCounter> {
+ private class CommentDensityFormula implements Formula<IntSumCounter> {
private final Metric nclocMetric;
@@ -81,12 +82,12 @@ public class CommentMeasuresStep implements ComputationStep {
}
@Override
- public SumCounter createNewCounter() {
- return new SumCounter(COMMENT_LINES_KEY);
+ public IntSumCounter createNewCounter() {
+ return new IntSumCounter(COMMENT_LINES_KEY);
}
@Override
- public Optional<Measure> createMeasure(SumCounter counter, CreateMeasureContext context) {
+ public Optional<Measure> createMeasure(IntSumCounter counter, CreateMeasureContext context) {
return createCommentLinesMeasure(counter, context)
.or(createCommentLinesDensityMeasure(counter, context));
}
@@ -172,8 +173,8 @@ public class CommentMeasuresStep implements ComputationStep {
private final SumCounter publicUndocumentedApiCounter;
public DocumentationCounter() {
- this.publicApiCounter = new SumCounter(PUBLIC_API_KEY);
- this.publicUndocumentedApiCounter = new SumCounter(PUBLIC_UNDOCUMENTED_API_KEY);
+ this.publicApiCounter = new IntSumCounter(PUBLIC_API_KEY);
+ this.publicUndocumentedApiCounter = new IntSumCounter(PUBLIC_UNDOCUMENTED_API_KEY);
}
@Override
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java
index 83489ec77b6..d6474a99a2f 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComplexityMeasuresStep.java
@@ -27,7 +27,6 @@ import org.sonar.server.computation.formula.AverageFormula;
import org.sonar.server.computation.formula.DistributionFormula;
import org.sonar.server.computation.formula.Formula;
import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor;
-import org.sonar.server.computation.formula.SumFormula;
import org.sonar.server.computation.measure.MeasureRepository;
import org.sonar.server.computation.metric.MetricRepository;
@@ -43,6 +42,7 @@ import static org.sonar.api.measures.CoreMetrics.FILE_COMPLEXITY_KEY;
import static org.sonar.api.measures.CoreMetrics.FUNCTIONS_KEY;
import static org.sonar.api.measures.CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION_KEY;
import static org.sonar.api.measures.CoreMetrics.FUNCTION_COMPLEXITY_KEY;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
/**
* Computes complexity measures on files and then aggregates them on higher components.
@@ -50,9 +50,9 @@ import static org.sonar.api.measures.CoreMetrics.FUNCTION_COMPLEXITY_KEY;
public class ComplexityMeasuresStep implements ComputationStep {
private static final ImmutableList<Formula> FORMULAS = ImmutableList.<Formula>of(
- new SumFormula(COMPLEXITY_KEY),
- new SumFormula(COMPLEXITY_IN_CLASSES_KEY),
- new SumFormula(COMPLEXITY_IN_FUNCTIONS_KEY),
+ createIntSumFormula(COMPLEXITY_KEY),
+ createIntSumFormula(COMPLEXITY_IN_CLASSES_KEY),
+ createIntSumFormula(COMPLEXITY_IN_FUNCTIONS_KEY),
new DistributionFormula(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY),
new DistributionFormula(FILE_COMPLEXITY_DISTRIBUTION_KEY),
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java
index 8279c00ec06..9f5501d3442 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CoverageMeasuresStep.java
@@ -24,7 +24,6 @@ import org.sonar.server.computation.component.PathAwareCrawler;
import org.sonar.server.computation.component.TreeRootHolder;
import org.sonar.server.computation.formula.Formula;
import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor;
-import org.sonar.server.computation.formula.SumFormula;
import org.sonar.server.computation.formula.coverage.LinesAndConditionsWithUncoveredFormula;
import org.sonar.server.computation.formula.coverage.LinesAndConditionsWithUncoveredMetricKeys;
import org.sonar.server.computation.formula.coverage.SingleWithUncoveredFormula;
@@ -53,6 +52,7 @@ import static org.sonar.api.measures.CoreMetrics.OVERALL_UNCOVERED_CONDITIONS_KE
import static org.sonar.api.measures.CoreMetrics.OVERALL_UNCOVERED_LINES_KEY;
import static org.sonar.api.measures.CoreMetrics.UNCOVERED_CONDITIONS_KEY;
import static org.sonar.api.measures.CoreMetrics.UNCOVERED_LINES_KEY;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
/**
* Computes coverage measures on files and then aggregates them on higher components.
@@ -60,26 +60,26 @@ import static org.sonar.api.measures.CoreMetrics.UNCOVERED_LINES_KEY;
public class CoverageMeasuresStep implements ComputationStep {
private static final ImmutableList<Formula> COVERAGE_FORMULAS = ImmutableList.<Formula>of(
// unit test
- new SumFormula(LINES_TO_COVER_KEY),
- new SumFormula(UNCOVERED_LINES_KEY),
- new SumFormula(CONDITIONS_TO_COVER_KEY),
- new SumFormula(UNCOVERED_CONDITIONS_KEY),
+ createIntSumFormula(LINES_TO_COVER_KEY),
+ createIntSumFormula(UNCOVERED_LINES_KEY),
+ createIntSumFormula(CONDITIONS_TO_COVER_KEY),
+ createIntSumFormula(UNCOVERED_CONDITIONS_KEY),
new CodeCoverageFormula(),
new BranchCoverageFormula(),
new LineCoverageFormula(),
// integration test
- new SumFormula(IT_LINES_TO_COVER_KEY),
- new SumFormula(IT_UNCOVERED_LINES_KEY),
- new SumFormula(IT_CONDITIONS_TO_COVER_KEY),
- new SumFormula(IT_UNCOVERED_CONDITIONS_KEY),
+ createIntSumFormula(IT_LINES_TO_COVER_KEY),
+ createIntSumFormula(IT_UNCOVERED_LINES_KEY),
+ createIntSumFormula(IT_CONDITIONS_TO_COVER_KEY),
+ createIntSumFormula(IT_UNCOVERED_CONDITIONS_KEY),
new ItCoverageFormula(),
new ItBranchCoverageFormula(),
new ItLineCoverageFormula(),
// overall test
- new SumFormula(OVERALL_LINES_TO_COVER_KEY),
- new SumFormula(OVERALL_UNCOVERED_LINES_KEY),
- new SumFormula(OVERALL_CONDITIONS_TO_COVER_KEY),
- new SumFormula(OVERALL_UNCOVERED_CONDITIONS_KEY),
+ createIntSumFormula(OVERALL_LINES_TO_COVER_KEY),
+ createIntSumFormula(OVERALL_UNCOVERED_LINES_KEY),
+ createIntSumFormula(OVERALL_CONDITIONS_TO_COVER_KEY),
+ createIntSumFormula(OVERALL_UNCOVERED_CONDITIONS_KEY),
new OverallCodeCoverageFormula(),
new OverallBranchCoverageFormula(),
new OverallLineCoverageFormula());
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java
index f95579432cb..6c688cdcc93 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/DuplicationMeasuresStep.java
@@ -30,8 +30,8 @@ import org.sonar.server.computation.formula.Counter;
import org.sonar.server.computation.formula.CreateMeasureContext;
import org.sonar.server.computation.formula.Formula;
import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor;
+import org.sonar.server.computation.formula.counter.IntSumCounter;
import org.sonar.server.computation.formula.LeafAggregateContext;
-import org.sonar.server.computation.formula.SumCounter;
import org.sonar.server.computation.measure.Measure;
import org.sonar.server.computation.measure.MeasureRepository;
import org.sonar.server.computation.metric.Metric;
@@ -169,7 +169,7 @@ public class DuplicationMeasuresStep implements ComputationStep {
}
/**
- * This counter is almost the same as {@link SumCounter}, expect that it will aggregate a value of 0 when there's no measure on file level
+ * This counter is almost the same as {@link IntSumCounter}, expect that it will aggregate a value of 0 when there's no measure on file level
*/
private class SumDuplicationCounter implements Counter<SumDuplicationCounter> {
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java
index 66f13a875ff..ebdf6b09058 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/SizeMeasuresStep.java
@@ -21,6 +21,7 @@ package org.sonar.server.computation.step;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
+import java.util.List;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.component.CrawlerDepthLimit;
@@ -29,7 +30,6 @@ import org.sonar.server.computation.component.PathAwareVisitorAdapter;
import org.sonar.server.computation.component.TreeRootHolder;
import org.sonar.server.computation.formula.Formula;
import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor;
-import org.sonar.server.computation.formula.SumFormula;
import org.sonar.server.computation.measure.Measure;
import org.sonar.server.computation.measure.MeasureRepository;
import org.sonar.server.computation.metric.Metric;
@@ -44,6 +44,7 @@ import static org.sonar.api.measures.CoreMetrics.LINES_KEY;
import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY;
import static org.sonar.api.measures.CoreMetrics.STATEMENTS_KEY;
import static org.sonar.server.computation.component.ComponentVisitor.Order.POST_ORDER;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
import static org.sonar.server.computation.measure.Measure.newMeasureBuilder;
/**
@@ -51,15 +52,15 @@ import static org.sonar.server.computation.measure.Measure.newMeasureBuilder;
*/
public class SizeMeasuresStep implements ComputationStep {
private static final CounterStackElementFactory COUNTER_STACK_ELEMENT_FACTORY = new CounterStackElementFactory();
- private static final ImmutableList<Formula> AGGREGATED_SIZE_MEASURE_FORMULAS = ImmutableList.<Formula>of(
- new SumFormula(LINES_KEY),
- new SumFormula(GENERATED_LINES_KEY),
- new SumFormula(NCLOC_KEY),
- new SumFormula(GENERATED_NCLOC_KEY),
- new SumFormula(FUNCTIONS_KEY),
- new SumFormula(STATEMENTS_KEY),
- new SumFormula(CLASSES_KEY),
- new SumFormula(ACCESSORS_KEY));
+ private static final List<Formula> AGGREGATED_SIZE_MEASURE_FORMULAS = ImmutableList.<Formula>of(
+ createIntSumFormula(LINES_KEY),
+ createIntSumFormula(GENERATED_LINES_KEY),
+ createIntSumFormula(NCLOC_KEY),
+ createIntSumFormula(GENERATED_NCLOC_KEY),
+ createIntSumFormula(FUNCTIONS_KEY),
+ createIntSumFormula(STATEMENTS_KEY),
+ createIntSumFormula(CLASSES_KEY),
+ createIntSumFormula(ACCESSORS_KEY));
private final TreeRootHolder treeRootHolder;
private final MetricRepository metricRepository;
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java
index b76cfa2282c..97e110ff0df 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java
@@ -27,11 +27,10 @@ import org.sonar.server.computation.component.PathAwareCrawler;
import org.sonar.server.computation.component.TreeRootHolder;
import org.sonar.server.computation.formula.Counter;
import org.sonar.server.computation.formula.CreateMeasureContext;
-import org.sonar.server.computation.formula.LeafAggregateContext;
import org.sonar.server.computation.formula.Formula;
import org.sonar.server.computation.formula.FormulaExecutorComponentVisitor;
-import org.sonar.server.computation.formula.SumCounter;
-import org.sonar.server.computation.formula.SumFormula;
+import org.sonar.server.computation.formula.LeafAggregateContext;
+import org.sonar.server.computation.formula.counter.IntSumCounter;
import org.sonar.server.computation.measure.Measure;
import org.sonar.server.computation.measure.MeasureRepository;
import org.sonar.server.computation.metric.MetricRepository;
@@ -42,6 +41,7 @@ import static org.sonar.api.measures.CoreMetrics.TEST_ERRORS_KEY;
import static org.sonar.api.measures.CoreMetrics.TEST_EXECUTION_TIME_KEY;
import static org.sonar.api.measures.CoreMetrics.TEST_FAILURES_KEY;
import static org.sonar.api.measures.CoreMetrics.TEST_SUCCESS_DENSITY_KEY;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
/**
* Computes unit test measures on files and then aggregates them on higher components.
@@ -51,8 +51,8 @@ public class UnitTestMeasuresStep implements ComputationStep {
private static final String[] METRICS = new String[] {TESTS_KEY, TEST_ERRORS_KEY, TEST_FAILURES_KEY, TEST_SUCCESS_DENSITY_KEY};
private static final ImmutableList<Formula> FORMULAS = ImmutableList.<Formula>of(
- new SumFormula(TEST_EXECUTION_TIME_KEY),
- new SumFormula(SKIPPED_TESTS_KEY),
+ createIntSumFormula(TEST_EXECUTION_TIME_KEY),
+ createIntSumFormula(SKIPPED_TESTS_KEY),
new UnitTestsFormula());
private final TreeRootHolder treeRootHolder;
@@ -126,9 +126,9 @@ public class UnitTestMeasuresStep implements ComputationStep {
private static class UnitTestsCounter implements Counter<UnitTestsCounter> {
- private final SumCounter testsCounter = new SumCounter(TESTS_KEY);
- private final SumCounter testsErrorsCounter = new SumCounter(TEST_ERRORS_KEY);
- private final SumCounter testsFailuresCounter = new SumCounter(TEST_FAILURES_KEY);
+ private final IntSumCounter testsCounter = new IntSumCounter(TESTS_KEY);
+ private final IntSumCounter testsErrorsCounter = new IntSumCounter(TEST_ERRORS_KEY);
+ private final IntSumCounter testsFailuresCounter = new IntSumCounter(TEST_FAILURES_KEY);
@Override
public void aggregate(UnitTestsCounter counter) {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/IntSumFormulaTest.java
index 0f648992a00..c6343d78010 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/IntSumFormulaTest.java
@@ -27,6 +27,8 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.component.ReportComponent;
+import org.sonar.server.computation.formula.SumFormula.IntSumFormula;
+import org.sonar.server.computation.formula.counter.IntSumCounter;
import org.sonar.server.computation.measure.Measure;
import org.sonar.server.computation.metric.Metric;
import org.sonar.server.computation.period.PeriodsHolder;
@@ -35,23 +37,24 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.api.measures.CoreMetrics.LINES_KEY;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
-public class SumFormulaTest {
+public class IntSumFormulaTest {
- private static final SumFormula BASIC_SUM_FORMULA = new SumFormula(LINES_KEY);
+ private static final IntSumFormula INT_SUM_FORMULA = createIntSumFormula(LINES_KEY);
@Rule
public ExpectedException thrown = ExpectedException.none();
LeafAggregateContext leafAggregateContext = mock(LeafAggregateContext.class);
CreateMeasureContext projectCreateMeasureContext = new DumbCreateMeasureContext(
- ReportComponent.builder(Component.Type.PROJECT, 1).build(), mock(Metric.class), mock(PeriodsHolder.class));
+ ReportComponent.builder(Component.Type.PROJECT, 1).build(), mock(Metric.class), mock(PeriodsHolder.class));
CreateMeasureContext fileCreateMeasureContext = new DumbCreateMeasureContext(
- ReportComponent.builder(Component.Type.FILE, 2).build(), mock(Metric.class), mock(PeriodsHolder.class));
+ ReportComponent.builder(Component.Type.FILE, 2).build(), mock(Metric.class), mock(PeriodsHolder.class));
@Test
public void check_create_new_counter_class() {
- assertThat(BASIC_SUM_FORMULA.createNewCounter().getClass()).isEqualTo(SumCounter.class);
+ assertThat(INT_SUM_FORMULA.createNewCounter().getClass()).isEqualTo(IntSumCounter.class);
}
@Test
@@ -59,51 +62,51 @@ public class SumFormulaTest {
thrown.expect(NullPointerException.class);
thrown.expectMessage("Metric key cannot be null");
- new SumFormula(null);
+ createIntSumFormula(null);
}
@Test
public void check_output_metric_key_is_lines() {
- assertThat(BASIC_SUM_FORMULA.getOutputMetricKeys()).containsOnly(LINES_KEY);
+ assertThat(INT_SUM_FORMULA.getOutputMetricKeys()).containsOnly(LINES_KEY);
}
@Test
public void create_measure() {
- SumCounter counter = BASIC_SUM_FORMULA.createNewCounter();
+ IntSumCounter counter = INT_SUM_FORMULA.createNewCounter();
addMeasure(LINES_KEY, 10);
counter.aggregate(leafAggregateContext);
- assertThat(BASIC_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getIntValue()).isEqualTo(10);
+ assertThat(INT_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getIntValue()).isEqualTo(10);
}
@Test
public void create_measure_when_counter_is_aggregating_from_another_counter() {
- SumCounter anotherCounter = BASIC_SUM_FORMULA.createNewCounter();
+ IntSumCounter anotherCounter = INT_SUM_FORMULA.createNewCounter();
addMeasure(LINES_KEY, 10);
anotherCounter.aggregate(leafAggregateContext);
- SumCounter counter = BASIC_SUM_FORMULA.createNewCounter();
+ IntSumCounter counter = INT_SUM_FORMULA.createNewCounter();
counter.aggregate(anotherCounter);
- assertThat(BASIC_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getIntValue()).isEqualTo(10);
+ assertThat(INT_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getIntValue()).isEqualTo(10);
}
@Test
public void not_create_measure_on_file() {
- SumCounter counter = BASIC_SUM_FORMULA.createNewCounter();
+ IntSumCounter counter = INT_SUM_FORMULA.createNewCounter();
addMeasure(LINES_KEY, 10);
counter.aggregate(leafAggregateContext);
- Assertions.assertThat(BASIC_SUM_FORMULA.createMeasure(counter, fileCreateMeasureContext)).isAbsent();
+ Assertions.assertThat(INT_SUM_FORMULA.createMeasure(counter, fileCreateMeasureContext)).isAbsent();
}
@Test
public void do_not_create_measures_when_no_values() {
- SumCounter counter = BASIC_SUM_FORMULA.createNewCounter();
+ IntSumCounter counter = INT_SUM_FORMULA.createNewCounter();
when(leafAggregateContext.getMeasure(LINES_KEY)).thenReturn(Optional.<Measure>absent());
counter.aggregate(leafAggregateContext);
- Assertions.assertThat(BASIC_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext)).isAbsent();
+ Assertions.assertThat(INT_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext)).isAbsent();
}
private void addMeasure(String metricKey, int value) {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/LongSumFormulaTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/LongSumFormulaTest.java
new file mode 100644
index 00000000000..20d28b6ff9d
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/LongSumFormulaTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.formula;
+
+import com.google.common.base.Optional;
+import org.assertj.guava.api.Assertions;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.server.computation.component.Component;
+import org.sonar.server.computation.component.ReportComponent;
+import org.sonar.server.computation.formula.SumFormula.LongSumFormula;
+import org.sonar.server.computation.formula.counter.LongSumCounter;
+import org.sonar.server.computation.measure.Measure;
+import org.sonar.server.computation.metric.Metric;
+import org.sonar.server.computation.period.PeriodsHolder;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.sonar.api.measures.CoreMetrics.LINES_KEY;
+import static org.sonar.server.computation.formula.SumFormula.createLongSumFormula;
+
+public class LongSumFormulaTest {
+
+ private static final LongSumFormula LONG_SUM_FORMULA = createLongSumFormula(LINES_KEY);
+ private static final long MEASURE_VALUE = 10;
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ LeafAggregateContext leafAggregateContext = mock(LeafAggregateContext.class);
+ CreateMeasureContext projectCreateMeasureContext = new DumbCreateMeasureContext(
+ ReportComponent.builder(Component.Type.PROJECT, 1).build(), mock(Metric.class), mock(PeriodsHolder.class));
+ CreateMeasureContext fileCreateMeasureContext = new DumbCreateMeasureContext(
+ ReportComponent.builder(Component.Type.FILE, 2).build(), mock(Metric.class), mock(PeriodsHolder.class));
+
+ @Test
+ public void check_create_new_counter_class() {
+ assertThat(LONG_SUM_FORMULA.createNewCounter().getClass()).isEqualTo(LongSumCounter.class);
+ }
+
+ @Test
+ public void fail_with_NPE_when_creating_formula_with_null_metric() {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Metric key cannot be null");
+
+ createLongSumFormula(null);
+ }
+
+ @Test
+ public void check_output_metric_key_is_lines() {
+ assertThat(LONG_SUM_FORMULA.getOutputMetricKeys()).containsOnly(LINES_KEY);
+ }
+
+ @Test
+ public void create_measure() {
+ LongSumCounter counter = LONG_SUM_FORMULA.createNewCounter();
+ addMeasure(LINES_KEY, MEASURE_VALUE);
+ counter.aggregate(leafAggregateContext);
+
+ assertThat(LONG_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getLongValue()).isEqualTo(MEASURE_VALUE);
+ }
+
+ @Test
+ public void create_measure_when_counter_is_aggregating_from_another_counter() {
+ LongSumCounter anotherCounter = LONG_SUM_FORMULA.createNewCounter();
+ addMeasure(LINES_KEY, MEASURE_VALUE);
+ anotherCounter.aggregate(leafAggregateContext);
+
+ LongSumCounter counter = LONG_SUM_FORMULA.createNewCounter();
+ counter.aggregate(anotherCounter);
+
+ assertThat(LONG_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getLongValue()).isEqualTo(MEASURE_VALUE);
+ }
+
+ @Test
+ public void not_create_measure_on_file() {
+ LongSumCounter counter = LONG_SUM_FORMULA.createNewCounter();
+ addMeasure(LINES_KEY, MEASURE_VALUE);
+ counter.aggregate(leafAggregateContext);
+
+ Assertions.assertThat(LONG_SUM_FORMULA.createMeasure(counter, fileCreateMeasureContext)).isAbsent();
+ }
+
+ @Test
+ public void do_not_create_measures_when_no_values() {
+ LongSumCounter counter = LONG_SUM_FORMULA.createNewCounter();
+ when(leafAggregateContext.getMeasure(LINES_KEY)).thenReturn(Optional.<Measure>absent());
+ counter.aggregate(leafAggregateContext);
+
+ Assertions.assertThat(LONG_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext)).isAbsent();
+ }
+
+ private void addMeasure(String metricKey, long value) {
+ when(leafAggregateContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value)));
+ }
+
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java
index 084b9b3a7be..3fb05b3033c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaExecutionTest.java
@@ -39,6 +39,7 @@ import static org.sonar.server.computation.component.Component.Type.DIRECTORY;
import static org.sonar.server.computation.component.Component.Type.MODULE;
import static org.sonar.server.computation.component.Component.Type.PROJECT;
import static org.sonar.server.computation.component.ReportComponent.builder;
+import static org.sonar.server.computation.formula.SumFormula.createIntSumFormula;
import static org.sonar.server.computation.measure.Measure.newMeasureBuilder;
import static org.sonar.server.computation.measure.MeasureRepoEntry.entryOf;
import static org.sonar.server.computation.measure.MeasureRepoEntry.toEntries;
@@ -57,7 +58,7 @@ public class SumFormulaExecutionTest {
@Before
public void setUp() throws Exception {
underTest = FormulaExecutorComponentVisitor.newBuilder(metricRepository, measureRepository)
- .buildFor(Lists.<Formula>newArrayList(new SumFormula(LINES_KEY)));
+ .buildFor(Lists.<Formula>newArrayList(createIntSumFormula(LINES_KEY)));
}
@Test
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumCounterTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/IntSumCounterTest.java
index 8a11c3bb3f8..a2e22822c65 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumCounterTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/IntSumCounterTest.java
@@ -18,10 +18,11 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-package org.sonar.server.computation.formula;
+package org.sonar.server.computation.formula.counter;
import com.google.common.base.Optional;
import org.junit.Test;
+import org.sonar.server.computation.formula.LeafAggregateContext;
import org.sonar.server.computation.measure.Measure;
import static org.assertj.core.api.Assertions.assertThat;
@@ -30,13 +31,13 @@ import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-public class SumCounterTest {
+public class IntSumCounterTest {
private final static String METRIC_KEY = "metric";
LeafAggregateContext leafAggregateContext = mock(LeafAggregateContext.class);
- SumCounter sumCounter = new SumCounter(METRIC_KEY);
+ SumCounter sumCounter = new IntSumCounter(METRIC_KEY);
@Test
public void no_value_when_no_aggregation() {
@@ -64,7 +65,7 @@ public class SumCounterTest {
@Test
public void aggregate_from_counter() {
when(leafAggregateContext.getMeasure(METRIC_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(10)));
- SumCounter anotherCounter = new SumCounter(METRIC_KEY);
+ SumCounter anotherCounter = new IntSumCounter(METRIC_KEY);
anotherCounter.aggregate(leafAggregateContext);
sumCounter.aggregate(anotherCounter);
@@ -74,7 +75,7 @@ public class SumCounterTest {
@Test
public void no_value_when_aggregate_from_empty_aggregator() {
- SumCounter anotherCounter = new SumCounter(METRIC_KEY);
+ SumCounter anotherCounter = new IntSumCounter(METRIC_KEY);
sumCounter.aggregate(anotherCounter);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/LongSumCounterTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/LongSumCounterTest.java
new file mode 100644
index 00000000000..b79513a0972
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/formula/counter/LongSumCounterTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.formula.counter;
+
+import com.google.common.base.Optional;
+import org.junit.Test;
+import org.sonar.server.computation.formula.LeafAggregateContext;
+import org.sonar.server.computation.measure.Measure;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.guava.api.Assertions.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class LongSumCounterTest {
+
+ private static final String METRIC_KEY = "metric";
+ private static final long MEASURE_VALUE = 10L;
+
+ LeafAggregateContext leafAggregateContext = mock(LeafAggregateContext.class);
+
+ SumCounter sumCounter = new LongSumCounter(METRIC_KEY);
+
+ @Test
+ public void no_value_when_no_aggregation() {
+ assertThat(sumCounter.getValue()).isAbsent();
+ }
+
+ @Test
+ public void aggregate_from_context() {
+ when(leafAggregateContext.getMeasure(METRIC_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(MEASURE_VALUE)));
+
+ sumCounter.aggregate(leafAggregateContext);
+
+ assertThat(sumCounter.getValue().get()).isEqualTo(MEASURE_VALUE);
+ }
+
+ @Test
+ public void no_value_when_aggregate_from_context_but_no_measure() {
+ when(leafAggregateContext.getMeasure(anyString())).thenReturn(Optional.<Measure>absent());
+
+ sumCounter.aggregate(leafAggregateContext);
+
+ assertThat(sumCounter.getValue()).isAbsent();
+ }
+
+ @Test
+ public void aggregate_from_counter() {
+ when(leafAggregateContext.getMeasure(METRIC_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(MEASURE_VALUE)));
+ SumCounter anotherCounter = new LongSumCounter(METRIC_KEY);
+ anotherCounter.aggregate(leafAggregateContext);
+
+ sumCounter.aggregate(anotherCounter);
+
+ assertThat(sumCounter.getValue().get()).isEqualTo(MEASURE_VALUE);
+ }
+
+ @Test
+ public void no_value_when_aggregate_from_empty_aggregator() {
+ SumCounter anotherCounter = new LongSumCounter(METRIC_KEY);
+
+ sumCounter.aggregate(anotherCounter);
+
+ assertThat(sumCounter.getValue()).isAbsent();
+ }
+
+}