From a5b68f41550e69e0d0dbd69db2007da99b585dce Mon Sep 17 00:00:00 2001 From: Kharkunov Eugene Date: Mon, 17 Nov 2025 10:43:26 +0300 Subject: [PATCH] Fix NotSupported exception tests --- .../defold/extender/client/ExtenderClient.java | 17 +++++++++++++++-- .../com/defold/extender/ExtenderController.java | 15 +++++++++++++-- .../java/com/defold/extender/ExtenderUtil.java | 2 +- .../extender/PlatformNotSupportedException.java | 2 +- .../extender/VersionNotSupportedException.java | 2 +- .../com/defold/extender/IntegrationTest.java | 16 ++++++++++++++-- 6 files changed, 45 insertions(+), 9 deletions(-) diff --git a/client/src/main/java/com/defold/extender/client/ExtenderClient.java b/client/src/main/java/com/defold/extender/client/ExtenderClient.java index a3840812..587aaf45 100644 --- a/client/src/main/java/com/defold/extender/client/ExtenderClient.java +++ b/client/src/main/java/com/defold/extender/client/ExtenderClient.java @@ -288,7 +288,17 @@ private void build_async(String platform, String sdkVersion, HttpEntity entity, os.close(); throw new ExtenderClientException(String.format("Failed to build source: jobId - %s, traceId - %s", jobId, traceId == null ? "null" : traceId)); } - } else { + } else if (statusCode == HttpStatus.SC_NOT_IMPLEMENTED) { + String traceId = response.getFirstHeader(TRACE_ID_HEADER_NAME).getValue(); + HttpEntity responseBody = response.getEntity(); + String body = responseBody != null ? EntityUtils.toString(responseBody) : "(unknown)"; + String error = String.format("%s (trace id - %s)", body, traceId == null ? "null" : traceId); + log(error); + OutputStream os = new FileOutputStream(log); + os.write(error.getBytes()); + os.close(); + throw new ExtenderClientException(error); + } else{ String result = String.format("Async build request failed with status code %d %s", statusCode, statusLine.getReasonPhrase()); log(result); OutputStream os = new FileOutputStream(log); @@ -297,7 +307,10 @@ private void build_async(String platform, String sdkVersion, HttpEntity entity, os.close(); throw new ExtenderClientException("Failed to build source."); } - } catch (Exception e) { + } catch (ExtenderClientException exc) { + throw exc; + } + catch (Exception e) { throw new ExtenderClientException("Failed to communicate with Extender service.", e); } } diff --git a/server/src/main/java/com/defold/extender/ExtenderController.java b/server/src/main/java/com/defold/extender/ExtenderController.java index 40c0c889..04c841c3 100644 --- a/server/src/main/java/com/defold/extender/ExtenderController.java +++ b/server/src/main/java/com/defold/extender/ExtenderController.java @@ -138,6 +138,14 @@ public ResponseEntity handleExtenderException(ExtenderException ex) { return new ResponseEntity<>(ex.getOutput(), headers, HttpStatus.UNPROCESSABLE_ENTITY); } + @ExceptionHandler({PlatformNotSupportedException.class, VersionNotSupportedException.class}) + public ResponseEntity handleUsupportedExceptions(Exception exc) { + LOGGER.error(Markers.SERVER_ERROR, exc.getMessage(), exc); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.TEXT_PLAIN); + return new ResponseEntity<>(exc.getMessage(), headers, HttpStatus.NOT_IMPLEMENTED); + } + @ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception ex) { LOGGER.error(Markers.SERVER_ERROR, HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(), ex); @@ -216,9 +224,12 @@ public void buildEngineAsync(HttpServletRequest _request, buildEnvDescription = ExtenderUtil.getSdksForPlatform(platform, mappings); } catch(ExtenderException exc) { if (instanceType.equals(InstanceType.FRONTEND_ONLY)) { - LOGGER.error("Unsupported engine version {}", sdkVersion); + LOGGER.error("Unsupported engine version '{}'", sdkVersion); throw new VersionNotSupportedException(sdkVersion); } + } catch (NullPointerException exc) { + LOGGER.error("Unsupported build platform '{}'", platform); + throw new PlatformNotSupportedException(platform); } // Build engine locally or on remote builder if (remoteBuilderEnabled && buildEnvDescription != null && isRemotePlatform(buildEnvDescription[0], buildEnvDescription[1])) { @@ -229,7 +240,7 @@ public void buildEngineAsync(HttpServletRequest _request, asyncBuilder.asyncBuildEngine(metricsWriter, platform, sdkVersion, jobDirectory, uploadDirectory, buildDirectory); } else { // no remote builder was found and current instance can't build - LOGGER.error("Unsupported build platform {}", platform); + LOGGER.error("Unsupported build platform '{}'", platform); throw new PlatformNotSupportedException(platform); } } diff --git a/server/src/main/java/com/defold/extender/ExtenderUtil.java b/server/src/main/java/com/defold/extender/ExtenderUtil.java index 7d7ea5f9..2a059d36 100644 --- a/server/src/main/java/com/defold/extender/ExtenderUtil.java +++ b/server/src/main/java/com/defold/extender/ExtenderUtil.java @@ -872,7 +872,7 @@ public static String readContentFromResource(Resource inputSource) throws IOExce // return a list of two string: platform name like "emsdk" and platform version like "3155" @SuppressWarnings("unchecked") - public static String[] getSdksForPlatform(String platform, JSONObject mappings) { + public static String[] getSdksForPlatform(String platform, JSONObject mappings) throws NullPointerException { return ((List) mappings.get(platform)).toArray(new String[2]); } diff --git a/server/src/main/java/com/defold/extender/PlatformNotSupportedException.java b/server/src/main/java/com/defold/extender/PlatformNotSupportedException.java index 5cc65088..b962c676 100644 --- a/server/src/main/java/com/defold/extender/PlatformNotSupportedException.java +++ b/server/src/main/java/com/defold/extender/PlatformNotSupportedException.java @@ -1,7 +1,7 @@ package com.defold.extender; public class PlatformNotSupportedException extends ExtenderException { - private static String ERROR_MESSAGE = "Platform %s is not supported on the current server. Please, check build server address. If error will persist - create task here https://github.com/defold/extender/issues"; + private static String ERROR_MESSAGE = "Platform '%s' is not supported on the current server. Please, check build server address. If error will persist - create task here https://github.com/defold/extender/issues"; public PlatformNotSupportedException(String platform) { super(String.format(ERROR_MESSAGE, platform)); diff --git a/server/src/main/java/com/defold/extender/VersionNotSupportedException.java b/server/src/main/java/com/defold/extender/VersionNotSupportedException.java index 446b16ba..72ab0f4f 100644 --- a/server/src/main/java/com/defold/extender/VersionNotSupportedException.java +++ b/server/src/main/java/com/defold/extender/VersionNotSupportedException.java @@ -1,7 +1,7 @@ package com.defold.extender; public class VersionNotSupportedException extends ExtenderException { - private static String ERROR_MESSAGE = "Engine version %s is not supported on the current server. Please, use latest stable version. https://github.com/defold/defold/releases/latest"; + private static String ERROR_MESSAGE = "Engine version '%s' is not supported on the current server. Please, use latest stable version. https://github.com/defold/defold/releases/latest"; public VersionNotSupportedException(String version) { super(String.format(ERROR_MESSAGE, version)); diff --git a/server/src/test/java/com/defold/extender/IntegrationTest.java b/server/src/test/java/com/defold/extender/IntegrationTest.java index 0d934431..fb78463b 100644 --- a/server/src/test/java/com/defold/extender/IntegrationTest.java +++ b/server/src/test/java/com/defold/extender/IntegrationTest.java @@ -17,7 +17,6 @@ import org.springframework.boot.logging.LogLevel; import org.springframework.boot.logging.LoggingSystem; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -589,6 +588,19 @@ public void testUnsupportedVersion() throws IOException, ExtenderClientException ); ExtenderClientException exc = assertThrows(ExtenderClientException.class, () -> doBuild(sourceFiles, configuration)); - assertTrue(exc.getMessage().contains("Unsupported engine version")); + assertTrue(exc.getMessage().contains("Engine version 'non-exist' is not supported on the current server")); + } + + @Test + public void testUnsupportedPlatform() throws IOException, ExtenderClientException { + TestConfiguration configuration = new TestConfiguration(new DefoldVersion("1aafd0a262ff40214ed7f51302d92fa587c607ef", new Version(1, 10, 4), new String[]{ "x86_64-platform" }) , "x86_64-platform"); + List sourceFiles = Lists.newArrayList( + new FileExtenderResource("test-data/AndroidManifest.xml", "AndroidManifest.xml"), + new FileExtenderResource("test-data/ext2/ext.manifest"), + new FileExtenderResource("test-data/ext2/src/test_ext.cpp") + ); + + ExtenderClientException exc = assertThrows(ExtenderClientException.class, () -> doBuild(sourceFiles, configuration)); + assertTrue(exc.getMessage().contains("Platform 'x86_64-platform' is not supported on the current server")); } }