diff options
author | Janos Gyerik <janos.gyerik@sonarsource.com> | 2017-10-04 14:00:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-04 14:00:37 +0200 |
commit | cfbf9f6d521245460c515c77833823a8b56d0ef9 (patch) | |
tree | 1b25a532e3e6d33de4c3d3734eb6a6331ff188f2 | |
parent | 7aae33867472515bcec1d5161e6fca8d31d6c0bd (diff) | |
download | sonarqube-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.java | 2 | ||||
-rw-r--r-- | sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java | 33 |
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()); } |