]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9685 Better handle when a plugin returns null from Metrics::getMetrics (#2622)
authorJanos Gyerik <janos.gyerik@sonarsource.com>
Wed, 4 Oct 2017 12:00:37 +0000 (14:00 +0200)
committerGitHub <noreply@github.com>
Wed, 4 Oct 2017 12:00:37 +0000 (14:00 +0200)
sonar-core/src/main/java/org/sonar/core/metric/ScannerMetrics.java
sonar-core/src/test/java/org/sonar/core/metric/ScannerMetricsTest.java

index 3052cefcffb1233a0fa4f3d4a5214d3d5117384f..e4b8ec69b57bf48f18c17d47ea2e91097a227ff2 100644 (file)
@@ -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);
   }
 }
index d3822923fd42b5aa278c5e4c12c935a20796827e..7865984aea5422e21983a94cf166868805d3e79a 100644 (file)
  */
 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());
     }