From 4e4fd97cc866af44d8aea415be2a0dd1f4eb32d1 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Tue, 14 Sep 2021 13:35:18 -0500 Subject: [PATCH] SONAR-15208 Scanner should distinguish between network and server errors when uploading report --- .../sonar/scanner/report/ReportPublisher.java | 11 ++++-- .../scanner/report/ReportPublisherTest.java | 34 +++++++++++++------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java index f5a6e50b33e..f628cdc351c 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java @@ -202,11 +202,16 @@ public class ReportPublisher implements Startable { WsResponse response; try { post.setWriteTimeOutInMs(DEFAULT_WRITE_TIMEOUT); - response = wsClient.call(post).failIfNotSuccessful(); - } catch (HttpException e) { - throw MessageException.of(String.format("Failed to upload report - %s", DefaultScannerWsClient.createErrorMessage(e))); + response = wsClient.call(post); + } catch (Exception e) { + throw new IllegalStateException("Failed to upload report: " + e.getMessage(), e); } + try { + response.failIfNotSuccessful(); + } catch (HttpException e) { + throw MessageException.of(String.format("Server failed to process report. Please check server logs: %s", DefaultScannerWsClient.createErrorMessage(e))); + } try (InputStream protobuf = response.contentStream()) { return Ce.SubmitResponse.parser().parseFrom(protobuf).getTaskId(); } catch (Exception e) { diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java index f28488eb69a..5833168be7e 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java @@ -71,16 +71,16 @@ public class ReportPublisherTest { @Rule public ExpectedException exception = ExpectedException.none(); - GlobalAnalysisMode mode = mock(GlobalAnalysisMode.class); - ScanProperties properties = mock(ScanProperties.class); - DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class, Mockito.RETURNS_DEEP_STUBS); - Server server = mock(Server.class); - InputModuleHierarchy moduleHierarchy = mock(InputModuleHierarchy.class); - DefaultInputModule root; - AnalysisContextReportPublisher contextPublisher = mock(AnalysisContextReportPublisher.class); - BranchConfiguration branchConfiguration = mock(BranchConfiguration.class); - CeTaskReportDataHolder reportMetadataHolder = mock(CeTaskReportDataHolder.class); - ReportPublisher underTest = new ReportPublisher(properties, wsClient, server, contextPublisher, moduleHierarchy, mode, reportTempFolder, + private GlobalAnalysisMode mode = mock(GlobalAnalysisMode.class); + private ScanProperties properties = mock(ScanProperties.class); + private DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class, Mockito.RETURNS_DEEP_STUBS); + private Server server = mock(Server.class); + private InputModuleHierarchy moduleHierarchy = mock(InputModuleHierarchy.class); + private DefaultInputModule root; + private AnalysisContextReportPublisher contextPublisher = mock(AnalysisContextReportPublisher.class); + private BranchConfiguration branchConfiguration = mock(BranchConfiguration.class); + private CeTaskReportDataHolder reportMetadataHolder = mock(CeTaskReportDataHolder.class); + private ReportPublisher underTest = new ReportPublisher(properties, wsClient, server, contextPublisher, moduleHierarchy, mode, reportTempFolder, new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder); @Before @@ -120,6 +120,18 @@ public class ReportPublisherTest { "ceTaskUrl=https://localhost/api/ce/task?id=TASK-123\n"); } + @Test + public void upload_error_message() { + HttpException ex = new HttpException("url", 404, "{\"errors\":[{\"msg\":\"Organization with key 'MyOrg' does not exist\"}]}"); + WsResponse response = mock(WsResponse.class); + when(response.failIfNotSuccessful()).thenThrow(ex); + when(wsClient.call(any(WsRequest.class))).thenThrow(new IllegalStateException("timeout")); + + exception.expect(IllegalStateException.class); + exception.expectMessage("Failed to upload report: timeout"); + underTest.upload(reportTempFolder.newFile()); + } + @Test public void parse_upload_error_message() { HttpException ex = new HttpException("url", 404, "{\"errors\":[{\"msg\":\"Organization with key 'MyOrg' does not exist\"}]}"); @@ -128,7 +140,7 @@ public class ReportPublisherTest { when(wsClient.call(any(WsRequest.class))).thenReturn(response); exception.expect(MessageException.class); - exception.expectMessage("Failed to upload report - Organization with key 'MyOrg' does not exist"); + exception.expectMessage("Server failed to process report. Please check server logs: Organization with key 'MyOrg' does not exist"); underTest.upload(reportTempFolder.newFile()); } -- 2.39.5