diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2015-08-21 10:45:28 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2015-08-24 14:00:32 +0200 |
commit | 89a832c978f58e7ce3783bd42a7c0604f2cb90ef (patch) | |
tree | 2e69970c1aebe1c2517544fa00cf8516e0234033 /server | |
parent | 03ab11c531008e064bc0cb42f3abba1cd23c036e (diff) | |
download | sonarqube-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')
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(); + } + +} |