From afca052cb6b99bf77d3da52ad9b5306c1949ced2 Mon Sep 17 00:00:00 2001 From: Martin Entlicher Date: Tue, 17 Oct 2023 18:00:07 +0200 Subject: [PATCH] Repaired DAP tests on Windows and updated weekly jobs. (GR-49254) --- tools/ci/ci.jsonnet | 21 +++++------ .../truffle/tools/dap/test/DAPTester.java | 36 +++++++++++++++++-- .../tools/dap/test/RelativeSourceDAPTest.java | 8 +++-- .../tools/dap/test/SimpleLanguageDAPTest.java | 14 ++------ .../dap/server/LoadedSourcesHandler.java | 5 +-- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/tools/ci/ci.jsonnet b/tools/ci/ci.jsonnet index 15a94b77e505..acdfb668078a 100644 --- a/tools/ci/ci.jsonnet +++ b/tools/ci/ci.jsonnet @@ -7,7 +7,7 @@ setup+: [ ["cd", "./tools"], ], - timelimit: "30:00", + timelimit: "45:00", }, local common_guard = { @@ -30,8 +30,8 @@ } }, - local tools_gate_lite = tools_common + { - name: 'gate-tools-lite-oraclejdk' + self.jdk_version + '-' + self.os + '-' + self.arch, + local tools_weekly = tools_common + { + name: 'weekly-tools-oraclejdk' + self.jdk_version + '-' + self.os + '-' + self.arch, run: [ ["mx", "build"], ["mx", "unittest", "--verbose"], @@ -81,17 +81,18 @@ }, builds: [ - common.linux_amd64 + common.oraclejdk20 + tools_gate, + common.linux_amd64 + common.oraclejdk21 + tools_gate, common.linux_amd64 + common.oraclejdk17 + tools_gate, - common.linux_amd64 + common.oraclejdk20 + tools_javadoc, + common.linux_amd64 + common.oraclejdk21 + tools_javadoc, common.linux_amd64 + common.oraclejdk17 + tools_coverage_weekly, - common.linux_aarch64 + common.labsjdk17 + tools_gate_lite, + common.linux_aarch64 + common.labsjdk21 + tools_weekly, + common.linux_aarch64 + common.labsjdk17 + tools_weekly, - common.windows_amd64 + common.oraclejdk20 + tools_gate_lite + devkits["windows-jdk20"], - common.windows_amd64 + common.oraclejdk17 + tools_gate_lite + devkits["windows-jdk17"], + common.windows_amd64 + common.oraclejdk21 + tools_weekly + devkits["windows-jdk21"], + common.windows_amd64 + common.oraclejdk17 + tools_weekly + devkits["windows-jdk17"], - common.darwin_amd64 + common.oraclejdk20 + tools_gate_lite, - common.darwin_amd64 + common.oraclejdk17 + tools_gate_lite, + common.darwin_amd64 + common.oraclejdk21 + tools_weekly, + common.darwin_amd64 + common.oraclejdk17 + tools_weekly, ], } diff --git a/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/DAPTester.java b/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/DAPTester.java index 4f4f10f74de6..18ba19a55397 100644 --- a/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/DAPTester.java +++ b/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/DAPTester.java @@ -24,6 +24,7 @@ */ package com.oracle.truffle.tools.dap.test; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -47,6 +48,7 @@ import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; import org.graalvm.shadowed.org.json.JSONArray; +import org.graalvm.shadowed.org.json.JSONException; import org.graalvm.shadowed.org.json.JSONObject; import org.junit.Assert; @@ -103,6 +105,7 @@ public void finish() throws IOException { throw new AssertionError("Last eval(...) has not finished yet", ex); } catch (ExecutionException ex) { // Guest language execution failed + throw new AssertionError(ex); } } if (handler.getInputStream().available() > 0) { @@ -112,7 +115,16 @@ public void finish() throws IOException { public Future eval(Source source) { lastValue = CompletableFuture.supplyAsync(() -> { - return context.eval(source); + try { + return context.eval(source); + } catch (Throwable t) { + // Async exceptions are not visible till we check the future. + // We might never check the future + // if we're blocked by waiting for an expected output, + // which does not come due to the exception. + t.printStackTrace(System.err); + throw t; + } }, executor); return lastValue; } @@ -171,7 +183,15 @@ private static byte[] readMessageBytes(InputStream in) throws IOException { } public boolean compareReceivedMessages(String... messages) throws Exception { - List expectedObjects = Arrays.stream(messages).map(message -> new JSONObject(message)).collect(Collectors.toList()); + List expectedObjects = Arrays.stream(messages).map(message -> { + JSONObject json; + try { + json = new JSONObject(message); + } catch (JSONException jex) { + throw new RuntimeException(message, jex); + } + return json; + }).collect(Collectors.toList()); int size = expectedObjects.size(); while (size > 0) { final String receivedMessage = getMessage(); @@ -235,6 +255,18 @@ private static boolean compare(JSONObject expectedObject, JSONObject receivedObj return true; } + public static String getFilePath(File file) { + String path; + try { + path = file.getCanonicalPath(); + } catch (IOException ex) { + path = file.getAbsolutePath(); + } + // We need to escape backlash for correct JSON: + path = path.replace("\\", "\\\\"); + return path; + } + private static final class ProxyOutputStream extends OutputStream { OutputStream delegate; diff --git a/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/RelativeSourceDAPTest.java b/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/RelativeSourceDAPTest.java index 7ce2d007fa31..530092504055 100644 --- a/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/RelativeSourceDAPTest.java +++ b/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/RelativeSourceDAPTest.java @@ -44,6 +44,8 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; +import static com.oracle.truffle.tools.dap.test.DAPTester.getFilePath; + /** * Test of SourcePath option. */ @@ -131,7 +133,7 @@ public void testSourcePath() throws Exception { tester.compareReceivedMessages("{\"event\":\"thread\",\"body\":{\"threadId\":1,\"reason\":\"started\"},\"type\":\"event\",\"seq\":" + (seq++) + "}"); } // Suspend at the beginning of the script: - String sourceJson = (i == 0) ? "{\"name\":\"" + new File(resolvedURI[i].getPath()).getName() + "\",\"path\":\"" + resolvedURI[i].getPath() + "\"}" + String sourceJson = (i == 0) ? "{\"name\":\"" + new File(resolvedURI[i].getPath()).getName() + "\",\"path\":\"" + getFilePath(new File(resolvedURI[i])) + "\"}" : "{\"sourceReference\":" + (i + 1) + ",\"path\":\"" + resolvedURI[i].getSchemeSpecificPart() + "\",\"name\":\"test" + (i + 1) + ".file\"}"; tester.compareReceivedMessages( "{\"event\":\"loadedSource\",\"body\":{\"reason\":\"new\",\"source\":" + sourceJson + "},\"type\":\"event\",\"seq\":" + (seq++) + "}"); @@ -175,7 +177,7 @@ public void testNonExistingSourcePath() throws Exception { tester.sendMessage("{\"command\":\"configurationDone\",\"type\":\"request\",\"seq\":5}"); tester.compareReceivedMessages("{\"success\":true,\"type\":\"response\",\"request_seq\":5,\"command\":\"configurationDone\",\"seq\":5}"); - String resolvedPath = new File("relative/path").toPath().toAbsolutePath().toString(); + String resolvedPath = getFilePath(new File("relative/path")); tester.eval(source); String sourceJson = "{\"sourceReference\":1,\"path\":\"" + resolvedPath + "\",\"name\":\"path\"}"; @@ -219,7 +221,7 @@ private static void testBreakpoints(int sectionLine, int sectionColumn, int bpLi TestDebugNoContentLanguage language = new TestDebugNoContentLanguage(relativePath, true, true); ProxyLanguage.setDelegate(language); Source source = Source.create(ProxyLanguage.ID, sourceContent); - String sourceJson = "{\"name\":\"" + filePath.getFileName() + "\",\"path\":\"" + filePath + "\"}"; + String sourceJson = "{\"name\":\"" + filePath.getFileName() + "\",\"path\":\"" + getFilePath(filePath.toFile()) + "\"}"; DAPTester tester = DAPTester.start(false, null, Collections.singletonList(sourcePathURI)); tester.sendMessage( diff --git a/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/SimpleLanguageDAPTest.java b/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/SimpleLanguageDAPTest.java index 479bcd5214c8..5efa853bf190 100644 --- a/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/SimpleLanguageDAPTest.java +++ b/tools/src/com.oracle.truffle.tools.dap.test/src/com/oracle/truffle/tools/dap/test/SimpleLanguageDAPTest.java @@ -36,6 +36,8 @@ import org.junit.Ignore; import org.junit.Test; +import static com.oracle.truffle.tools.dap.test.DAPTester.getFilePath; + @Ignore("GR-43473") public final class SimpleLanguageDAPTest { @@ -1196,18 +1198,6 @@ private static File createTemporaryFile(String content) throws IOException { return file; } - private static String getFilePath(File file) { - String path; - try { - path = file.getCanonicalPath(); - } catch (IOException ex) { - path = file.getAbsolutePath(); - } - // We need to escape backlash for correct JSON: - path = path.replace("\\", "\\\\"); - return path; - } - private static String replaceNewLines(String nl) { return nl.replace("\n", "\\n").replace("\r", "\\r"); } diff --git a/tools/src/com.oracle.truffle.tools.dap/src/com/oracle/truffle/tools/dap/server/LoadedSourcesHandler.java b/tools/src/com.oracle.truffle.tools.dap/src/com/oracle/truffle/tools/dap/server/LoadedSourcesHandler.java index 0214feea716e..1ad2e853f645 100644 --- a/tools/src/com.oracle.truffle.tools.dap/src/com/oracle/truffle/tools/dap/server/LoadedSourcesHandler.java +++ b/tools/src/com.oracle.truffle.tools.dap/src/com/oracle/truffle/tools/dap/server/LoadedSourcesHandler.java @@ -34,6 +34,7 @@ import com.oracle.truffle.tools.dap.types.LoadedSourceEvent; import java.net.URI; +import java.nio.file.InvalidPathException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -204,7 +205,7 @@ private Pair getPath(Source source, TruffleContext truffleConte tFile = context.getEnv().getTruffleFile(truffleContext, path); } } - } catch (UnsupportedOperationException ex) { + } catch (UnsupportedOperationException | InvalidPathException ex) { // Unsupported URI/path } if (tFile != null) { @@ -217,7 +218,7 @@ private Pair getPath(Source source, TruffleContext truffleConte } else if (path != null) { try { srcRef = !context.getEnv().getTruffleFile(truffleContext, path).isReadable(); - } catch (SecurityException ex) { + } catch (SecurityException | InvalidPathException ex) { // Can not verify readability srcRef = true; }