]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11966 Add security hotspot to Github Checks
authorBenoît Gianinetti <benoit.gianinetti@sonarsource.com>
Wed, 24 Apr 2019 14:43:17 +0000 (16:43 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 6 May 2019 09:01:14 +0000 (11:01 +0200)
server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IntegrateIssuesVisitor.java
server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRulesLoader.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultActiveRulesLoaderTest.java

index 2c51dff13efcdb10c6a6c911977c77691539cdf7..f6c6d5f4127cac48d0f546f41f193ddeb64c6857 100644 (file)
  */
 package org.sonar.ce.task.projectanalysis.issue;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Stream;
-import org.sonar.api.rules.RuleType;
-import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
 import org.sonar.ce.task.projectanalysis.component.Component;
 import org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit;
 import org.sonar.ce.task.projectanalysis.component.MergeAndTargetBranchComponentUuids;
 import org.sonar.ce.task.projectanalysis.component.TypeAwareVisitorAdapter;
 import org.sonar.ce.task.projectanalysis.util.cache.DiskCache;
 import org.sonar.core.issue.DefaultIssue;
+import org.sonar.core.util.stream.MoreCollectors;
 
 import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;
 
@@ -41,17 +39,14 @@ public class IntegrateIssuesVisitor extends TypeAwareVisitorAdapter {
   private final IssueVisitors issueVisitors;
   private final IssueTrackingDelegator issueTracking;
   private final SiblingsIssueMerger issueStatusCopier;
-  private final AnalysisMetadataHolder analysisMetadataHolder;
   private final MergeAndTargetBranchComponentUuids mergeAndTargetBranchComponentUuids;
 
-  public IntegrateIssuesVisitor(IssueCache issueCache, IssueLifecycle issueLifecycle, IssueVisitors issueVisitors,
-    AnalysisMetadataHolder analysisMetadataHolder, IssueTrackingDelegator issueTracking, SiblingsIssueMerger issueStatusCopier,
-    MergeAndTargetBranchComponentUuids mergeAndTargetBranchComponentUuids) {
+  public IntegrateIssuesVisitor(IssueCache issueCache, IssueLifecycle issueLifecycle, IssueVisitors issueVisitors, IssueTrackingDelegator issueTracking,
+    SiblingsIssueMerger issueStatusCopier, MergeAndTargetBranchComponentUuids mergeAndTargetBranchComponentUuids) {
     super(CrawlerDepthLimit.FILE, POST_ORDER);
     this.issueCache = issueCache;
     this.issueLifecycle = issueLifecycle;
     this.issueVisitors = issueVisitors;
-    this.analysisMetadataHolder = analysisMetadataHolder;
     this.issueTracking = issueTracking;
     this.issueStatusCopier = issueStatusCopier;
     this.mergeAndTargetBranchComponentUuids = mergeAndTargetBranchComponentUuids;
@@ -73,22 +68,17 @@ public class IntegrateIssuesVisitor extends TypeAwareVisitorAdapter {
   }
 
   private void fillNewOpenIssues(Component component, Stream<DefaultIssue> newIssues, DiskCache<DefaultIssue>.DiskAppender cacheAppender) {
-    List<DefaultIssue> list = new ArrayList<>();
+    List<DefaultIssue> newIssuesList = newIssues
+      .peek(issueLifecycle::initNewOpenIssue)
+      .collect(MoreCollectors.toList());
 
-    newIssues.forEach(issue -> {
-      issueLifecycle.initNewOpenIssue(issue);
-      if (analysisMetadataHolder.isLongLivingBranch() || issue.type() != RuleType.SECURITY_HOTSPOT) {
-        list.add(issue);
-      }
-    });
-
-    if (list.isEmpty()) {
+    if (newIssuesList.isEmpty()) {
       return;
     }
 
-    issueStatusCopier.tryMerge(component, list);
+    issueStatusCopier.tryMerge(component, newIssuesList);
 
-    for (DefaultIssue issue : list) {
+    for (DefaultIssue issue : newIssuesList) {
       process(component, issue, cacheAppender);
     }
   }
@@ -107,9 +97,7 @@ public class IntegrateIssuesVisitor extends TypeAwareVisitorAdapter {
       DefaultIssue raw = entry.getKey();
       DefaultIssue base = entry.getValue();
       issueLifecycle.mergeExistingOpenIssue(raw, base);
-      if (analysisMetadataHolder.isLongLivingBranch() || raw.type() != RuleType.SECURITY_HOTSPOT) {
-        process(component, raw, cacheAppender);
-      }
+      process(component, raw, cacheAppender);
     }
   }
 
index 90853ca12bcc5efc02c02b5c8f3f77543e6101ec..4c4ba86943e99ec340c77642499bd192974e293d 100644 (file)
@@ -155,7 +155,7 @@ public class IntegrateIssuesVisitorTest {
     treeRootHolder.setRoot(PROJECT);
     issueCache = new IssueCache(temp.newFile(), System2.INSTANCE);
     when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(true);
-    underTest = new IntegrateIssuesVisitor(issueCache, issueLifecycle, issueVisitors, analysisMetadataHolder, trackingDelegator, issueStatusCopier, mergeAndTargetBranchComponentUuids);
+    underTest = new IntegrateIssuesVisitor(issueCache, issueLifecycle, issueVisitors, trackingDelegator, issueStatusCopier, mergeAndTargetBranchComponentUuids);
   }
 
   @Test
index dd5be5b771c989d3a7ffdf1a111c722fe93e4de1..3f6cb897aafe9a39b18e98742a7a2a4a852d1205 100644 (file)
@@ -21,17 +21,13 @@ package org.sonar.scanner.rule;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 import org.apache.commons.io.IOUtils;
 import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
 import org.sonar.scanner.bootstrap.ScannerWsClient;
-import org.sonar.scanner.scan.branch.BranchConfiguration;
 import org.sonar.scanner.util.ScannerUtils;
 import org.sonarqube.ws.Rules;
 import org.sonarqube.ws.Rules.Active;
@@ -46,23 +42,11 @@ import static org.sonar.api.utils.DateUtils.parseDateTime;
 
 public class DefaultActiveRulesLoader implements ActiveRulesLoader {
   private static final String RULES_SEARCH_URL = "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives,createdAt,updatedAt&activation=true";
-  private static final String RULES_SEARCH_NO_HOTSPOT_URL;
-
-  static {
-    // need to use static initializer because of https://bugs.openjdk.java.net/browse/JDK-8077605
-    RULES_SEARCH_NO_HOTSPOT_URL = RULES_SEARCH_URL + "&types="
-      + Arrays.stream(RuleType.values())
-      .filter(t -> t != RuleType.SECURITY_HOTSPOT)
-      .map(Enum::name)
-      .collect(Collectors.joining(","));
-  }
 
   private final ScannerWsClient wsClient;
-  private final BranchConfiguration branchConfiguration;
 
-  public DefaultActiveRulesLoader(ScannerWsClient wsClient, BranchConfiguration branchConfiguration) {
+  public DefaultActiveRulesLoader(ScannerWsClient wsClient) {
     this.wsClient = wsClient;
-    this.branchConfiguration = branchConfiguration;
   }
 
   @Override
@@ -90,14 +74,10 @@ public class DefaultActiveRulesLoader implements ActiveRulesLoader {
 
   private String getUrl(String qualityProfileKey, int page, int pageSize) {
     StringBuilder builder = new StringBuilder(1024);
-    if (branchConfiguration.isShortOrPullRequest()) {
-      builder.append(RULES_SEARCH_NO_HOTSPOT_URL);
-    } else {
-      builder.append(RULES_SEARCH_URL);
-    }
+    builder.append(RULES_SEARCH_URL);
     builder.append("&qprofile=").append(ScannerUtils.encodeForUrl(qualityProfileKey));
-    builder.append("&p=").append(page);
     builder.append("&ps=").append(pageSize);
+    builder.append("&p=").append(page);
     return builder.toString();
   }
 
index 1d35d6a8b78870e50a21e95bd70510160e4b36e5..ad46a6851ed305dc83d33c893b5d9b6a7b068eb9 100644 (file)
@@ -21,7 +21,6 @@ package org.sonar.scanner.rule;
 
 import com.google.common.collect.ImmutableSortedMap;
 import java.io.ByteArrayInputStream;
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collection;
 import java.util.stream.IntStream;
@@ -56,22 +55,21 @@ public class DefaultActiveRulesLoaderTest {
 
   private DefaultActiveRulesLoader loader;
   private ScannerWsClient wsClient;
-  private BranchConfiguration branchConfig;
 
   @Before
   public void setUp() {
     wsClient = mock(ScannerWsClient.class);
-    branchConfig = mock(BranchConfiguration.class);
+    BranchConfiguration branchConfig = mock(BranchConfiguration.class);
     when(branchConfig.isShortOrPullRequest()).thenReturn(false);
-    loader = new DefaultActiveRulesLoader(wsClient, branchConfig);
+    loader = new DefaultActiveRulesLoader(wsClient);
   }
 
   @Test
-  public void feed_real_response_encode_qp() throws IOException {
+  public void feed_real_response_encode_qp() {
     int total = PAGE_SIZE_1 + PAGE_SIZE_2;
 
-    WsTestUtil.mockStream(wsClient, urlOfPage(1, false), responseOfSize(PAGE_SIZE_1, total));
-    WsTestUtil.mockStream(wsClient, urlOfPage(2, false), responseOfSize(PAGE_SIZE_2, total));
+    WsTestUtil.mockStream(wsClient, urlOfPage(1), responseOfSize(PAGE_SIZE_1, total));
+    WsTestUtil.mockStream(wsClient, urlOfPage(2), responseOfSize(PAGE_SIZE_2, total));
 
     Collection<LoadedActiveRule> activeRules = loader.load("c+-test_c+-values-17445");
     assertThat(activeRules).hasSize(total);
@@ -85,42 +83,15 @@ public class DefaultActiveRulesLoaderTest {
       .extracting(LoadedActiveRule::getSeverity)
       .containsExactly(SEVERITY_VALUE);
 
-    WsTestUtil.verifyCall(wsClient, urlOfPage(1, false));
-    WsTestUtil.verifyCall(wsClient, urlOfPage(2, false));
+    WsTestUtil.verifyCall(wsClient, urlOfPage(1));
+    WsTestUtil.verifyCall(wsClient, urlOfPage(2));
 
     verifyNoMoreInteractions(wsClient);
   }
 
-  @Test
-  public void no_hotspots_on_pr_or_short_branches() throws IOException {
-    when(branchConfig.isShortOrPullRequest()).thenReturn(true);
-    int total = PAGE_SIZE_1 + PAGE_SIZE_2;
-
-    WsTestUtil.mockStream(wsClient, urlOfPage(1, true), responseOfSize(PAGE_SIZE_1, total));
-    WsTestUtil.mockStream(wsClient, urlOfPage(2, true), responseOfSize(PAGE_SIZE_2, total));
-
-    Collection<LoadedActiveRule> activeRules = loader.load("c+-test_c+-values-17445");
-    assertThat(activeRules).hasSize(total);
-    assertThat(activeRules)
-      .filteredOn(r -> r.getRuleKey().equals(EXAMPLE_KEY))
-      .extracting(LoadedActiveRule::getParams)
-      .extracting(p -> p.get(FORMAT_KEY))
-      .containsExactly(FORMAT_VALUE);
-    assertThat(activeRules)
-      .filteredOn(r -> r.getRuleKey().equals(EXAMPLE_KEY))
-      .extracting(LoadedActiveRule::getSeverity)
-      .containsExactly(SEVERITY_VALUE);
-
-    WsTestUtil.verifyCall(wsClient, urlOfPage(1, true));
-    WsTestUtil.verifyCall(wsClient, urlOfPage(2, true));
-
-    verifyNoMoreInteractions(wsClient);
-  }
-
-  private String urlOfPage(int page, boolean noHotspots) {
+  private String urlOfPage(int page) {
     return "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives,createdAt,updatedAt&activation=true"
-      + (noHotspots ? "&types=CODE_SMELL,BUG,VULNERABILITY" : "") + "&qprofile=c%2B-test_c%2B-values-17445&p=" + page
-      + "&ps=500";
+      + ("") + "&qprofile=c%2B-test_c%2B-values-17445&ps=500&p=" + page + "";
   }
 
   /**