aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2015-09-03 11:35:37 +0200
committerSimon Brandhof <simon.brandhof@sonarsource.com>2015-09-04 15:17:26 +0200
commitc19e6ff4081c25fce35e91de0219021ffaa05f3f (patch)
tree50e38090a82fd06203a75078e21c4558fce068a1
parent6f18dd7465bd8226c25d7f8e2f0d0acbf85956b9 (diff)
downloadsonarqube-c19e6ff4081c25fce35e91de0219021ffaa05f3f.tar.gz
sonarqube-c19e6ff4081c25fce35e91de0219021ffaa05f3f.zip
Fix metrics of type MILLISEC
Underlying type must be long instead of int
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/source/LastCommitVisitor.java9
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java2
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/UnitTestMeasuresStep.java3
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueAssignerTest.java143
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/ReportUnitTestMeasuresStepTest.java15
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/ViewsUnitTestMeasuresStepTest.java20
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java8
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java8
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/measures/CoreMetrics.java2
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java2
11 files changed, 49 insertions, 165 deletions
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<LastCommitVisitor
@Override
public void visitProjectView(Component projectView, Path<LastCommit> path) {
- if (!path.isRoot()) {
- Optional<Measure> rawMeasure = measureRepository.getRawMeasure(projectView, lastCommitDateMetric);
- if (rawMeasure.isPresent()) {
- path.parent().addDate(rawMeasure.get().getLongValue());
- }
+ Optional<Measure> 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<Formula> FORMULAS = ImmutableList.<Formula>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<DbFileSources.Line> {
+ private static class IsGreaterOrEqualThanLine implements Predicate<DbFileSources.Line> {
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<Integer> TEST_EXECUTION_TIME = new Metric.Builder(TEST_EXECUTION_TIME_KEY, "Unit tests duration", Metric.ValueType.MILLISEC)
+ public static final Metric<Long> 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<G extends Serializable> 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),