From c19e6ff4081c25fce35e91de0219021ffaa05f3f Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Thu, 3 Sep 2015 11:35:37 +0200 Subject: [PATCH] Fix metrics of type MILLISEC Underlying type must be long instead of int --- .../computation/source/LastCommitVisitor.java | 9 +- .../step/CustomMeasuresCopyStep.java | 2 +- .../step/UnitTestMeasuresStep.java | 3 +- .../sonar/server/source/SourceService.java | 2 +- .../computation/issue/IssueAssignerTest.java | 143 ------------------ .../step/ReportUnitTestMeasuresStepTest.java | 15 +- .../step/ViewsUnitTestMeasuresStepTest.java | 20 ++- .../sonar/batch/report/MeasuresPublisher.java | 8 +- .../batch/sensor/DefaultSensorStorage.java | 8 +- .../org/sonar/api/measures/CoreMetrics.java | 2 +- .../java/org/sonar/api/measures/Metric.java | 2 +- 11 files changed, 49 insertions(+), 165 deletions(-) delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/source/LastCommitVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/source/LastCommitVisitor.java index 63a137871c5..a3b9d9a85e2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/source/LastCommitVisitor.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/source/LastCommitVisitor.java @@ -106,11 +106,10 @@ public class LastCommitVisitor extends PathAwareVisitorAdapter path) { - if (!path.isRoot()) { - Optional rawMeasure = measureRepository.getRawMeasure(projectView, lastCommitDateMetric); - if (rawMeasure.isPresent()) { - path.parent().addDate(rawMeasure.get().getLongValue()); - } + Optional rawMeasure = measureRepository.getRawMeasure(projectView, lastCommitDateMetric); + if (rawMeasure.isPresent()) { + // path.parent() should never fail as a project view must never be a root component + path.parent().addDate(rawMeasure.get().getLongValue()); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java index 9f43912a786..db17f758238 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java @@ -86,8 +86,8 @@ public class CustomMeasuresCopyStep implements ComputationStep { switch (metric.getType()) { case INT: case RATING: - case MILLISEC: return Measure.newMeasureBuilder().create((int) dto.getValue()); + case MILLISEC: case WORK_DUR: return Measure.newMeasureBuilder().create((long) dto.getValue()); case FLOAT: 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 8846c8fcde6..f49d6429782 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 @@ -43,6 +43,7 @@ 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; +import static org.sonar.server.computation.formula.SumFormula.createLongSumFormula; /** * Computes unit test measures on files and then aggregates them on higher components. @@ -52,7 +53,7 @@ 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 FORMULAS = ImmutableList.of( - createIntSumFormula(TEST_EXECUTION_TIME_KEY), + createLongSumFormula(TEST_EXECUTION_TIME_KEY), createIntSumFormula(SKIPPED_TESTS_KEY), new UnitTestsFormula()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java b/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java index c0d141cd870..3dd1b32ef18 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java @@ -115,7 +115,7 @@ public class SourceService { } - private class IsGreaterOrEqualThanLine implements Predicate { + private static class IsGreaterOrEqualThanLine implements Predicate { private final int from; IsGreaterOrEqualThanLine(int from) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java deleted file mode 100644 index 585d6ac9890..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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. - */ -///* -// * 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.issue; -// -//import java.util.Date; -//import org.junit.Before; -//import org.junit.ClassRule; -//import org.junit.Rule; -//import org.junit.Test; -//import org.sonar.api.config.Settings; -//import org.sonar.batch.protocol.output.BatchReport; -//import org.sonar.server.computation.batch.BatchReportReaderRule; -//import org.sonar.server.computation.component.Component; -//import org.sonar.server.computation.component.ReportComponent; -//import org.sonar.server.es.EsTester; -//import org.sonar.server.source.SourceService2; -//import org.sonar.server.source.index.SourceLineDoc; -//import org.sonar.server.source.index.SourceLineIndex; -//import org.sonar.server.source.index.SourceLineIndexDefinition; -// -//import static org.mockito.Mockito.mock; -// -//public class IssueAssignerTest { -// -// @ClassRule -// public static EsTester esTester = new EsTester().addDefinitions(new SourceLineIndexDefinition(new Settings())); -// -// @Rule -// public BatchReportReaderRule reportReader = new BatchReportReaderRule(); -// ScmAccountToUser scmAccountToUser = mock(ScmAccountToUser.class); -// DefaultAssignee defaultAssignee = mock(DefaultAssignee.class); -// Component file = ReportComponent.builder(Component.Type.FILE, 1).build(); -// -// IssueAssigner underTest; -// -// @Before -// public void setUp() { -// esTester.truncateIndices(); -// underTest = new IssueAssigner(new SourceService2(esTester.client()), reportReader, scmAccountToUser, defaultAssignee); -// } -// -// @Test -// public void line_author_from_report() { -// reportReader.putChangesets(BatchReport.Changesets.newBuilder() -// .setComponentRef(123_456_789) -// .addChangeset(newChangeset("charb", "123-456-789", 123_456_789L)) -// .addChangeset(newChangeset("wolinski", "987-654-321", 987_654_321L)) -// .addChangesetIndexByLine(0) -// .addChangesetIndexByLine(0) -// .addChangesetIndexByLine(1) -// .build()); -// -// underTest.beforeComponent(file); -// // underTest.onIssue(file, issue); -// // sut.init("ANY_UUID", 123_456_789, reportReader); -// // -// // assertThat(sut.lineAuthor(1)).isEqualTo("charb"); -// // assertThat(sut.lineAuthor(2)).isEqualTo("charb"); -// // assertThat(sut.lineAuthor(3)).isEqualTo("wolinski"); -// // // compute last author -// // assertThat(sut.lineAuthor(4)).isEqualTo("wolinski"); -// // assertThat(sut.lineAuthor(null)).isEqualTo("wolinski"); -// } -// -// // @Test -// // public void line_author_from_index() throws Exception { -// // esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE, -// // newSourceLine("cabu", "123-456-789", 123_456_789, 1), -// // newSourceLine("cabu", "123-456-789", 123_456_789, 2), -// // newSourceLine("cabu", "123-123-789", 123_456_789, 3), -// // newSourceLine("wolinski", "987-654-321", 987_654_321, 4), -// // newSourceLine("cabu", "123-456-789", 123_456_789, 5) -// // ); -// // -// // sut.init("DEFAULT_UUID", 123, reportReader); -// // -// // assertThat(sut.lineAuthor(1)).isEqualTo("cabu"); -// // assertThat(sut.lineAuthor(2)).isEqualTo("cabu"); -// // assertThat(sut.lineAuthor(3)).isEqualTo("cabu"); -// // assertThat(sut.lineAuthor(4)).isEqualTo("wolinski"); -// // assertThat(sut.lineAuthor(5)).isEqualTo("cabu"); -// // assertThat(sut.lineAuthor(6)).isEqualTo("wolinski"); -// // } -// // -// // @Test(expected = IllegalStateException.class) -// // public void fail_when_component_ref_is_not_filled() { -// // sut.init("ANY_UUID", null, reportReader); -// // sut.lineAuthor(0); -// // } -// -// private BatchReport.Changesets.Changeset.Builder newChangeset(String author, String revision, long date) { -// return BatchReport.Changesets.Changeset.newBuilder() -// .setAuthor(author) -// .setRevision(revision) -// .setDate(date); -// } -// -// private SourceLineDoc newSourceLine(String author, String revision, long date, int lineNumber) { -// return new SourceLineDoc() -// .setScmAuthor(author) -// .setScmRevision(revision) -// .setScmDate(new Date(date)) -// .setLine(lineNumber) -// .setProjectUuid("PROJECT_UUID") -// .setFileUuid("DEFAULT_UUID"); -// } -//} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ReportUnitTestMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ReportUnitTestMeasuresStepTest.java index 02f7f589675..9da9e10ec1e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ReportUnitTestMeasuresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ReportUnitTestMeasuresStepTest.java @@ -109,7 +109,7 @@ public class ReportUnitTestMeasuresStepTest { @Test public void aggregate_tests_execution_time() { - checkMeasuresAggregation(TEST_EXECUTION_TIME_KEY, 100, 400, 500); + checkMeasuresAggregation(TEST_EXECUTION_TIME_KEY, 100L, 400L, 500L); } @Test @@ -272,4 +272,17 @@ public class ReportUnitTestMeasuresStepTest { assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).containsOnly(entryOf(metricKey, newMeasureBuilder().create(expectedValue))); } + private void checkMeasuresAggregation(String metricKey, long file1Value, long file2Value, long expectedValue) { + measureRepository.addRawMeasure(FILE_1_REF, metricKey, newMeasureBuilder().create(file1Value)); + measureRepository.addRawMeasure(FILE_2_REF, metricKey, newMeasureBuilder().create(file2Value)); + + underTest.execute(); + + assertThat(measureRepository.getAddedRawMeasure(FILE_1_REF, metricKey)).isAbsent(); + assertThat(measureRepository.getAddedRawMeasure(FILE_2_REF, metricKey)).isAbsent(); + assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).containsOnly(entryOf(metricKey, newMeasureBuilder().create(expectedValue))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(SUB_MODULE_REF))).containsOnly(entryOf(metricKey, newMeasureBuilder().create(expectedValue))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(MODULE_REF))).containsOnly(entryOf(metricKey, newMeasureBuilder().create(expectedValue))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).containsOnly(entryOf(metricKey, newMeasureBuilder().create(expectedValue))); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ViewsUnitTestMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ViewsUnitTestMeasuresStepTest.java index 020016b501f..0035d6a9ece 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ViewsUnitTestMeasuresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ViewsUnitTestMeasuresStepTest.java @@ -102,7 +102,7 @@ public class ViewsUnitTestMeasuresStepTest { @Test public void aggregate_tests_execution_time() { - checkMeasuresAggregation(TEST_EXECUTION_TIME_KEY, 100, 400, 500); + checkMeasuresAggregation(TEST_EXECUTION_TIME_KEY, 100L, 400L, 500L); } @Test @@ -257,6 +257,19 @@ public class ViewsUnitTestMeasuresStepTest { assertAddedRawMeasureValue(ROOT_REF, metricKey, expectedValue); } + private void checkMeasuresAggregation(String metricKey, long file1Value, long file2Value, long expectedValue) { + measureRepository.addRawMeasure(PROJECT_VIEW_1_REF, metricKey, newMeasureBuilder().create(file1Value)); + measureRepository.addRawMeasure(PROJECT_VIEW_2_REF, metricKey, newMeasureBuilder().create(file2Value)); + + underTest.execute(); + + assertNoAddedRawMeasureOnProjectViews(); + assertAddedRawMeasureValue(SUB_SUBVIEW_1_REF, metricKey, expectedValue); + assertNoAddedRawMeasure(SUB_SUBVIEW_2_REF, TEST_SUCCESS_DENSITY_KEY); + assertAddedRawMeasureValue(SUBVIEW_REF, metricKey, expectedValue); + assertAddedRawMeasureValue(ROOT_REF, metricKey, expectedValue); + } + private void addedRawMeasure(int componentRef, String metricKey, int value) { measureRepository.addRawMeasure(componentRef, metricKey, newMeasureBuilder().create(value)); } @@ -266,6 +279,11 @@ public class ViewsUnitTestMeasuresStepTest { .isEqualTo(entryOf(metricKey, newMeasureBuilder().create(value))); } + private void assertAddedRawMeasureValue(int componentRef, String metricKey, long value) { + assertThat(entryOf(metricKey, measureRepository.getAddedRawMeasure(componentRef, metricKey).get())) + .isEqualTo(entryOf(metricKey, newMeasureBuilder().create(value))); + } + private void assertNoAddedRawMeasure(int componentRef, String metricKey) { assertThat(measureRepository.getAddedRawMeasure(componentRef, metricKey)).isAbsent(); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java b/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java index 0f601de4fd4..fecc5383dad 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java +++ b/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java @@ -86,13 +86,13 @@ public class MeasuresPublisher implements ReportPublisherStep { builder.setBooleanValue((Boolean) value); break; case DOUBLE: - builder.setDoubleValue((Double) value); + builder.setDoubleValue(((Number) value).doubleValue()); break; case INT: - builder.setIntValue((Integer) value); + builder.setIntValue(((Number) value).intValue()); break; case LONG: - builder.setLongValue((Long) value); + builder.setLongValue(((Number) value).longValue()); break; case STRING: builder.setStringValue((String) value); @@ -105,7 +105,6 @@ public class MeasuresPublisher implements ReportPublisherStep { private MeasureValueType getMeasureValueType(ValueType type) { switch (type) { case INT: - case MILLISEC: case RATING: return MeasureValueType.INT; case FLOAT: @@ -119,6 +118,7 @@ public class MeasuresPublisher implements ReportPublisherStep { case DISTRIB: return MeasureValueType.STRING; case WORK_DUR: + case MILLISEC: return MeasureValueType.LONG; default: throw new IllegalStateException("Unknown value type: " + type); diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java index 8cef84ace5b..0c6a9d67fa2 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java @@ -160,12 +160,11 @@ public class DefaultSensorStorage implements SensorStorage { break; case INT: case MILLISEC: - measureToSave.setValue(Double.valueOf((Integer) measure.value())); - break; + case WORK_DUR: case FLOAT: case PERCENT: case RATING: - measureToSave.setValue((Double) measure.value()); + measureToSave.setValue(((Number) measure.value()).doubleValue()); break; case STRING: case LEVEL: @@ -173,9 +172,6 @@ public class DefaultSensorStorage implements SensorStorage { case DISTRIB: measureToSave.setData((String) measure.value()); break; - case WORK_DUR: - measureToSave.setValue(Double.valueOf((Long) measure.value())); - break; default: throw new UnsupportedOperationException("Unsupported type :" + m.getType()); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/measures/CoreMetrics.java b/sonar-plugin-api/src/main/java/org/sonar/api/measures/CoreMetrics.java index 93d954fa621..797c48bf78c 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/measures/CoreMetrics.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/measures/CoreMetrics.java @@ -413,7 +413,7 @@ public final class CoreMetrics { .create(); public static final String TEST_EXECUTION_TIME_KEY = "test_execution_time"; - public static final Metric TEST_EXECUTION_TIME = new Metric.Builder(TEST_EXECUTION_TIME_KEY, "Unit tests duration", Metric.ValueType.MILLISEC) + public static final Metric TEST_EXECUTION_TIME = new Metric.Builder(TEST_EXECUTION_TIME_KEY, "Unit tests duration", Metric.ValueType.MILLISEC) .setDescription("Execution duration of unit tests") .setDirection(Metric.DIRECTION_WORST) .setQualitative(false) diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java b/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java index 01b1fddc8f1..cd4304e5349 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java @@ -58,7 +58,7 @@ public class Metric implements Serializable, org.sonar.a PERCENT(Double.class), BOOL(Boolean.class), STRING(String.class), - MILLISEC(Integer.class), + MILLISEC(Long.class), DATA(String.class), LEVEL(Metric.Level.class), DISTRIB(String.class), -- 2.39.5