From bc01f5a6bf5456c9c5f34cd328869fd50a3f9c03 Mon Sep 17 00:00:00 2001 From: =?utf8?q?L=C3=A9o=20Geoffroy?= Date: Fri, 15 Mar 2024 13:44:00 +0100 Subject: [PATCH] SONAR-21778 Fix computation of measures when project has not been analyzed yet --- .../formula/ImpactSumFormula.java | 92 ----------- .../formula/counter/IntSumCounter.java | 3 +- .../formula/counter/LongSumCounter.java | 3 +- .../formula/counter/SumCounter.java | 4 +- .../formula/ImpactSumFormulaTest.java | 147 ------------------ 5 files changed, 7 insertions(+), 242 deletions(-) delete mode 100644 server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormula.java delete mode 100644 server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormulaTest.java diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormula.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormula.java deleted file mode 100644 index 5c31d780f4b..00000000000 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormula.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2024 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.ce.task.projectanalysis.formula; - -import java.util.Optional; -import org.sonar.ce.task.projectanalysis.measure.Measure; -import org.sonar.server.measure.ImpactMeasureBuilder; - -import static java.util.Objects.requireNonNull; - -public class ImpactSumFormula implements Formula { - - private final String metricKey; - - - private ImpactSumFormula(String metricKey) { - this.metricKey = requireNonNull(metricKey, "Metric key cannot be null"); - } - - @Override - public ImpactSumFormula.ImpactCounter createNewCounter() { - return new ImpactSumFormula.ImpactCounter(); - } - - public static ImpactSumFormula createImpactSumFormula(String metricKey) { - return new ImpactSumFormula(metricKey); - } - - @Override - public Optional createMeasure(ImpactCounter counter, CreateMeasureContext context) { - return counter.getValue().map(v -> Measure.newMeasureBuilder().create(v)); - } - - @Override - public String[] getOutputMetricKeys() { - return new String[]{metricKey}; - } - - class ImpactCounter implements Counter { - - private boolean initialized = false; - private boolean hasEmptyValue = false; - private final ImpactMeasureBuilder measureImpactBuilder = ImpactMeasureBuilder.createEmpty(); - - @Override - public void aggregate(ImpactSumFormula.ImpactCounter counter) { - Optional value = counter.getValue(); - if (value.isPresent()) { - initialized = true; - measureImpactBuilder.add(ImpactMeasureBuilder.fromString(value.get())); - } else { - hasEmptyValue = true; - } - } - - @Override - public void initialize(CounterInitializationContext context) { - Optional measureOptional = context.getMeasure(metricKey); - String data = measureOptional.map(Measure::getData).orElse(null); - if (data != null) { - initialized = true; - measureImpactBuilder.add(ImpactMeasureBuilder.fromString(data)); - } else { - hasEmptyValue = true; - } - } - - public Optional getValue() { - if (initialized && !hasEmptyValue) { - return Optional.ofNullable(measureImpactBuilder.buildAsString()); - } - return Optional.empty(); - } - } -} diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/IntSumCounter.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/IntSumCounter.java index e552b052b85..a004a52d15f 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/IntSumCounter.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/IntSumCounter.java @@ -65,7 +65,8 @@ public class IntSumCounter implements SumCounter { } } - private void addValue(int newValue) { + @Override + public void addValue(Integer newValue) { initialized = true; value += newValue; } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/LongSumCounter.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/LongSumCounter.java index ae1e53d7247..9e1d70203a0 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/LongSumCounter.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/LongSumCounter.java @@ -65,7 +65,8 @@ public class LongSumCounter implements SumCounter { } } - private void addValue(long newValue) { + @Override + public void addValue(Long newValue) { initialized = true; value += newValue; } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/SumCounter.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/SumCounter.java index ab7b34ad2ff..408d9d19dd6 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/SumCounter.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/formula/counter/SumCounter.java @@ -22,7 +22,9 @@ package org.sonar.ce.task.projectanalysis.formula.counter; import java.util.Optional; import org.sonar.ce.task.projectanalysis.formula.Counter; -public interface SumCounter> extends Counter { +public interface SumCounter> extends Counter { Optional getValue(); + + void addValue(T value); } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormulaTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormulaTest.java deleted file mode 100644 index b0eadc31a14..00000000000 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/formula/ImpactSumFormulaTest.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2024 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.ce.task.projectanalysis.formula; - -import com.google.gson.Gson; -import java.util.LinkedHashMap; -import java.util.Optional; -import javax.annotation.Nullable; -import org.junit.Test; -import org.sonar.api.issue.impact.Severity; -import org.sonar.ce.task.projectanalysis.measure.Measure; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class ImpactSumFormulaTest { - - public static final ImpactSumFormula IMPACT_SUM_FORMULA = ImpactSumFormula.createImpactSumFormula("metricKey"); - private final Gson gson = new Gson(); - - private final CounterInitializationContext counterInitializationContext = mock(CounterInitializationContext.class); - - private final CreateMeasureContext createMeasureContext = mock(CreateMeasureContext.class); - - @Test - public void getOutputMetricKeys_shouldReturnCorrectMetrics() { - assertThat(IMPACT_SUM_FORMULA.getOutputMetricKeys()).containsExactly("metricKey"); - } - - @Test - public void createMeasure_whenCounterReturnsValue_shouldReturnExpectedMeasure() { - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - String value = newImpactJson(4, 2, 1, 1); - addMeasure("metricKey", value); - counter.initialize(counterInitializationContext); - - assertThat(IMPACT_SUM_FORMULA.createMeasure(counter, createMeasureContext)).get().extracting(Measure::getData) - .isEqualTo(value); - } - - @Test - public void createMeasure_whenCounterReturnsNoValue_shouldReturnNoMeasure() { - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - assertThat(IMPACT_SUM_FORMULA.createMeasure(counter, createMeasureContext)).isEmpty(); - } - - @Test - public void createNewCounter_shouldReturnExpectedCounter() { - assertThat(IMPACT_SUM_FORMULA.createNewCounter()).isNotNull() - .isInstanceOf(ImpactSumFormula.ImpactCounter.class); - } - - @Test - public void getValue_whenInitialized_shouldReturnExpectedValue() { - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - String value = newImpactJson(4, 2, 1, 1); - addMeasure("metricKey", value); - counter.initialize(counterInitializationContext); - assertThat(counter.getValue()).get().isEqualTo(value); - } - - @Test - public void getValue_whenAggregatingExistingValue_shouldReturnAggregationResult() { - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - String value = newImpactJson(4, 2, 1, 1); - addMeasure("metricKey", value); - counter.initialize(counterInitializationContext); - - ImpactSumFormula.ImpactCounter counter2 = IMPACT_SUM_FORMULA.createNewCounter(); - String value2 = newImpactJson(3, 1, 1, 1); - addMeasure("metricKey", value2); - counter2.initialize(counterInitializationContext); - - counter.aggregate(counter2); - assertThat(counter.getValue()).get().isEqualTo(newImpactJson(7, 3, 2, 2)); - } - - @Test - public void getValue_whenAggregatingUninitializedValue_shouldReturnEmptyValue() { - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - String value = newImpactJson(4, 2, 1, 1); - addMeasure("metricKey", value); - counter.initialize(counterInitializationContext); - - ImpactSumFormula.ImpactCounter counter2 = IMPACT_SUM_FORMULA.createNewCounter(); - - counter.aggregate(counter2); - assertThat(counter.getValue()).isEmpty(); - } - - @Test - public void getValue_whenAggregatingEmptyValue_shouldReturnEmptyValue() { - - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - String value = newImpactJson(4, 2, 1, 1); - addMeasure("metricKey", value); - counter.initialize(counterInitializationContext); - - ImpactSumFormula.ImpactCounter counter2 = IMPACT_SUM_FORMULA.createNewCounter(); - addMeasure("metricKey", null); - counter2.initialize(counterInitializationContext); - - counter.aggregate(counter2); - - assertThat(counter.getValue()).isEmpty(); - } - - @Test - public void getValue_whenNotInitialized_shouldReturnEmpty() { - ImpactSumFormula.ImpactCounter counter = IMPACT_SUM_FORMULA.createNewCounter(); - assertThat(counter.getValue()).isEmpty(); - } - - - public String newImpactJson(Integer total, Integer high, Integer medium, Integer low) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put(Severity.LOW.name(), low); - map.put(Severity.MEDIUM.name(), medium); - map.put(Severity.HIGH.name(), high); - map.put("total", total); - return gson.toJson(map); - } - - private void addMeasure(String metricKey, @Nullable String value) { - when(counterInitializationContext.getMeasure(metricKey)).thenReturn(Optional.ofNullable(value).map(v -> Measure.newMeasureBuilder().create(v))); - } - - -} -- 2.39.5