aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanos Gyerik <janos.gyerik@sonarsource.com>2017-10-04 14:00:37 +0200
committerGitHub <noreply@github.com>2017-10-04 14:00:37 +0200
commitcfbf9f6d521245460c515c77833823a8b56d0ef9 (patch)
tree1b25a532e3e6d33de4c3d3734eb6a6331ff188f2
parent7aae33867472515bcec1d5161e6fca8d31d6c0bd (diff)
downloadsonarqube-cfbf9f6d521245460c515c77833823a8b56d0ef9.tar.gz
sonarqube-cfbf9f6d521245460c515c77833823a8b56d0ef9.zip
SONAR-9685 Better handle when a plugin returns null from Metrics::getMetrics (#2622)
-rw-r--r--sonar-core/src/main/java/org/sonar/core/metric/ScannerMetrics.java2
-rw-r--r--sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java33
2 files changed, 25 insertions, 10 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/metric/ScannerMetrics.java b/sonar-core/src/main/java/org/sonar/core/metric/ScannerMetrics.java
index 3052cefcffb..e4b8ec69b57 100644
--- a/sonar-core/src/main/java/org/sonar/core/metric/ScannerMetrics.java
+++ b/sonar-core/src/main/java/org/sonar/core/metric/ScannerMetrics.java
@@ -22,6 +22,7 @@ package org.sonar.core.metric;
import com.google.common.collect.ImmutableSet;
import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
import java.util.stream.Stream;
@@ -137,6 +138,7 @@ public class ScannerMetrics {
private static Stream<Metric> getPluginMetrics(Metrics[] metricsRepositories) {
return Arrays.stream(metricsRepositories)
.map(Metrics::getMetrics)
+ .filter(Objects::nonNull)
.flatMap(List::stream);
}
}
diff --git a/sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java b/sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java
index d3822923fd4..7865984aea5 100644
--- a/sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java
@@ -19,38 +19,51 @@
*/
package org.sonar.core.metric;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.sonar.api.measures.Metric;
import org.sonar.api.measures.Metrics;
-import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
public class ScannerMetricsTest {
- static final ScannerMetrics SENSOR_METRICS_WITHOUT_METRIC_PLUGIN = new ScannerMetrics(new Metrics[] {});
- static final ScannerMetrics SENSOR_METRICS_WITH_PLUGIN = new ScannerMetrics(new Metrics[] {new FakeMetrics()});
+ // metrics that are always added, regardless of plugins
+ private static final List<Metric> SENSOR_METRICS_WITHOUT_METRIC_PLUGIN = metrics();
@Test
public void check_number_of_allowed_core_metrics() throws Exception {
- assertThat(SENSOR_METRICS_WITHOUT_METRIC_PLUGIN.getMetrics()).hasSize(34);
+ assertThat(SENSOR_METRICS_WITHOUT_METRIC_PLUGIN).hasSize(34);
}
@Test
public void check_metrics_from_plugin() throws Exception {
- List<Metric> metrics = newArrayList(SENSOR_METRICS_WITH_PLUGIN.getMetrics());
- Iterables.removeAll(metrics, SENSOR_METRICS_WITHOUT_METRIC_PLUGIN.getMetrics());
+ List<Metric> metrics = metrics(new FakeMetrics());
+ metrics.removeAll(SENSOR_METRICS_WITHOUT_METRIC_PLUGIN);
assertThat(metrics).hasSize(2);
}
- private static class FakeMetrics implements Metrics {
+ @Test
+ public void should_not_crash_on_null_metrics_from_faulty_plugins() {
+ Metrics faultyMetrics = () -> null;
+ Metrics okMetrics = new FakeMetrics();
+
+ List<Metric> metrics = metrics(okMetrics, faultyMetrics);
+ metrics.removeAll(SENSOR_METRICS_WITHOUT_METRIC_PLUGIN);
+
+ assertThat(metrics).isEqualTo(okMetrics.getMetrics());
+ }
+
+ private static List<Metric> metrics(Metrics... metrics) {
+ return new ArrayList<>(new ScannerMetrics(metrics).getMetrics());
+ }
+ private static class FakeMetrics implements Metrics {
@Override
public List<Metric> getMetrics() {
- return ImmutableList.<Metric>of(
+ return Arrays.asList(
new Metric.Builder("key1", "name1", Metric.ValueType.INT).create(),
new Metric.Builder("key2", "name2", Metric.ValueType.FLOAT).create());
}