From: Janos Gyerik Date: Wed, 4 Oct 2017 12:00:37 +0000 (+0200) Subject: SONAR-9685 Better handle when a plugin returns null from Metrics::getMetrics (#2622) X-Git-Tag: 6.6-RC1~41 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=cfbf9f6d521245460c515c77833823a8b56d0ef9;p=sonarqube.git SONAR-9685 Better handle when a plugin returns null from Metrics::getMetrics (#2622) --- 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 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 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 metrics = newArrayList(SENSOR_METRICS_WITH_PLUGIN.getMetrics()); - Iterables.removeAll(metrics, SENSOR_METRICS_WITHOUT_METRIC_PLUGIN.getMetrics()); + List 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 metrics = metrics(okMetrics, faultyMetrics); + metrics.removeAll(SENSOR_METRICS_WITHOUT_METRIC_PLUGIN); + + assertThat(metrics).isEqualTo(okMetrics.getMetrics()); + } + + private static List metrics(Metrics... metrics) { + return new ArrayList<>(new ScannerMetrics(metrics).getMetrics()); + } + private static class FakeMetrics implements Metrics { @Override public List getMetrics() { - return ImmutableList.of( + return Arrays.asList( new Metric.Builder("key1", "name1", Metric.ValueType.INT).create(), new Metric.Builder("key2", "name2", Metric.ValueType.FLOAT).create()); }