From 6c5b0efcc68f20f91a0205921d5f061eec5521f1 Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Mon, 28 Apr 2025 15:50:00 +0200 Subject: [PATCH 1/3] Add additional logging to unregister/register --- .../lsp/parametric/ParametricTextDocumentService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java index a165d0cf3..652d44d4a 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java @@ -611,7 +611,7 @@ public CompletableFuture> foldingRange(FoldingRangeRequestPar @Override public void registerLanguage(LanguageParameter lang) { - logger.info("registerLanguage({})", lang.getName()); + logger.info("registerLanguage({})/begin", lang.getName()); for (var extension: lang.getExtensions()) { this.registeredExtensions.put(extension, lang.getName()); @@ -647,6 +647,8 @@ public void registerLanguage(LanguageParameter lang) { if (client != null) { fact.setClient(client); } + + logger.info("registerLanguage({})/end", lang.getName()); } private static String buildContributionKey(LanguageParameter lang) { @@ -655,6 +657,7 @@ private static String buildContributionKey(LanguageParameter lang) { @Override public void unregisterLanguage(LanguageParameter lang) { + logger.info("unregisterLanguage({})/begin", lang.getName()); boolean removeAll = lang.getMainModule() == null || lang.getMainModule().isEmpty(); if (!removeAll) { if (!contributions.get(lang.getName()).removeContributor(buildContributionKey(lang))) { @@ -676,6 +679,7 @@ public void unregisterLanguage(LanguageParameter lang) { facts.remove(lang.getName()); contributions.remove(lang.getName()); } + logger.info("unregisterLanguage({})/end", lang.getName()); } @Override From 99ff0e742610bf714c26374aaae16cb261132001 Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Mon, 28 Apr 2025 15:57:08 +0200 Subject: [PATCH 2/3] Add failing test --- .../demo/lang/pico/OldStyleLanguageServer.rsc | 5 +- .../dsl-unregister-register-race.test.ts | 86 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 rascal-vscode-extension/src/test/vscode-suite/dsl-unregister-register-race.test.ts diff --git a/rascal-lsp/src/main/rascal/demo/lang/pico/OldStyleLanguageServer.rsc b/rascal-lsp/src/main/rascal/demo/lang/pico/OldStyleLanguageServer.rsc index d7adc8492..3b1cd1250 100644 --- a/rascal-lsp/src/main/rascal/demo/lang/pico/OldStyleLanguageServer.rsc +++ b/rascal-lsp/src/main/rascal/demo/lang/pico/OldStyleLanguageServer.rsc @@ -172,7 +172,10 @@ Register the Pico language and the contributions that supply the IDE with featur * You can run each contribution on an example in the terminal to test it first. Any feedback (errors and exceptions) is faster and more clearly printed in the terminal. } -void main() { +void main(bool unregister = false) { + if (unregister) { + unregisterLanguage("Pico", {"pico", "pico-new"}); + } registerLanguage( language( pathConfig(), diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl-unregister-register-race.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl-unregister-register-race.test.ts new file mode 100644 index 000000000..256c9f0b3 --- /dev/null +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl-unregister-register-race.test.ts @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2025, NWO-I CWI and Swat.engineering + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +import { VSBrowser, WebDriver, Workbench } from 'vscode-extension-tester'; +import { Delays, IDEOperations, RascalREPL, TestWorkspace, ignoreFails, printRascalOutputOnFailure } from './utils'; + +describe('DSL unregister/register race', function () { + let browser: VSBrowser; + let driver: WebDriver; + let bench: Workbench; + let ide : IDEOperations; + + this.timeout(Delays.extremelySlow * 2); + + printRascalOutputOnFailure('Language Parametric Rascal'); + + async function loadPico() { + const repl = new RascalREPL(bench, driver); + await repl.start(); + await repl.execute("import demo::lang::pico::OldStyleLanguageServer;"); + const replExecuteMain = repl.execute("main(unregister=true);"); // we don't wait yet, because we might miss pico loading window + const ide = new IDEOperations(browser); + const isPicoLoading = ide.statusContains("Pico"); + await driver.wait(isPicoLoading, Delays.slow, "Pico DSL should start loading"); + // now wait for the Pico loader to disappear + await driver.wait(async () => !(await isPicoLoading()), Delays.extremelySlow, "Pico DSL should be finished starting", 100); + await replExecuteMain; + await repl.terminate(); + } + + before(async () => { + browser = VSBrowser.instance; + driver = browser.driver; + bench = new Workbench(); + await ignoreFails(browser.waitForWorkbench()); + ide = new IDEOperations(browser); + await ide.load(); + }); + + beforeEach(async function () { + await loadPico(); + }); + + afterEach(async function () { + if (this.currentTest && this.currentTest.state === 'failed') { + throw Error('Race successfully triggered'); + } + await ide.cleanup(); + }); + + after(async function() { + }); + + for (let i = 0; i < 100; i++) { + it.only("Try trigger race", async function () { + const editor = await ide.openModule(TestWorkspace.picoFile); + await ide.hasSyntaxHighlighting(editor); + await ide.hasInlayHint(editor); + }); + } +}); + From 366b7fda5c89693018d660fe730511315984eeac Mon Sep 17 00:00:00 2001 From: Pieter Olivier Date: Thu, 13 Mar 2025 14:19:20 +0100 Subject: [PATCH 3/3] Now taking vscode version number in runUItests from package.json --- runUItests.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runUItests.sh b/runUItests.sh index 7e05214f0..616f56af8 100755 --- a/runUItests.sh +++ b/runUItests.sh @@ -20,8 +20,9 @@ rm -rf $UITESTS || true npm run compile-tests # test what was compiled - +VSCODE_VERSION=`grep '"vscode":' package.json | awk -F\^ '{ print $2 }' | awk -F\" '{ print $1 }'` +echo "Running tests with VSCode version $VSCODE_VERSION" exec npx extest setup-and-run out/test/vscode-suite/*.test.js \ - --code_version 1.82.3 \ + --code_version ${VSCODE_VERSION} \ --storage $UITESTS \ --extensions_dir $UITESTS/extensions_dir \ No newline at end of file