From b87b2a49ebe2cc2cb286d56e3bd0cfe8f215b85e Mon Sep 17 00:00:00 2001 From: azerr Date: Tue, 3 Feb 2026 15:11:06 +0100 Subject: [PATCH] Stabilize two test that seem to often fail on the CI Signed-off-by: azerr --- .../model/ContentModelManager.java | 4 ++++ .../uriresolver/XMLCacheResolverExtension.java | 4 ++++ .../lemminx/services/XMLLanguageService.java | 15 +++++++++++++++ .../uriresolver/CacheResourcesManager.java | 13 +++++++++++++ ...idationExternalResourcesBasedOnDTDTest.java | 14 ++++++++++---- ...idationExternalResourcesBasedOnXSDTest.java | 18 ++++++++++++------ 6 files changed, 58 insertions(+), 10 deletions(-) diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java index d7b171066..8a783516c 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/model/ContentModelManager.java @@ -546,4 +546,8 @@ public void forceDownloadExternalResource(String url) { cacheResolverExtension.forceDownloadExternalResource(url); } + public void waitForDownload(String resourceUri) { + cacheResolverExtension.waitForDownload(resourceUri); + } + } \ No newline at end of file diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/uriresolver/XMLCacheResolverExtension.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/uriresolver/XMLCacheResolverExtension.java index 035aac933..9caf8da16 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/uriresolver/XMLCacheResolverExtension.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/extensions/contentmodel/uriresolver/XMLCacheResolverExtension.java @@ -172,4 +172,8 @@ public void evictCache() throws IOException { public void forceDownloadExternalResource(String url) { cacheResourcesManager.forceDownloadExternalResource(url); } + + public void waitForDownload(String resourceUri) { + cacheResourcesManager.waitForDownload(resourceUri); + } } diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLLanguageService.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLLanguageService.java index 923b8d141..b4575e1c1 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLLanguageService.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLLanguageService.java @@ -96,6 +96,8 @@ public void checkCanceled() { private final XMLLinkedEditing linkedEditing; private final XMLDocumentColor documentColor; + private boolean retriggerValidationWhenDownloadError; + public XMLLanguageService() { this.formatter = new XMLFormatter(this); this.highlighting = new XMLHighlighting(this); @@ -115,6 +117,7 @@ public XMLLanguageService() { this.rename = new XMLRename(this); this.selectionRanges = new XMLSelectionRanges(); this.linkedEditing = new XMLLinkedEditing(this); + setRetriggerValidationWhenDownloadError(true); } @Override @@ -208,8 +211,15 @@ public CompletableFuture publishDiagnostics(DOMDocument xmlDocument, // If there are some XSD, DTD which are downloading, wait for all download and // re-trigger the validation. + if (retriggerValidationWhenDownloadError) { List> futures = diagnostics.getFutures(); if (!futures.isEmpty()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } CompletableFuture allFutures = CompletableFuture .allOf(futures.toArray(new CompletableFuture[futures.size()])); allFutures.thenAccept(Void -> { @@ -219,6 +229,7 @@ public CompletableFuture publishDiagnostics(DOMDocument xmlDocument, return null; }); } + } return null; } @@ -334,5 +345,9 @@ public LinkedEditingRanges findLinkedEditingRanges(DOMDocument xmlDocument, Posi CancelChecker cancelChecker) { return linkedEditing.findLinkedEditingRanges(xmlDocument, position, cancelChecker); } + + public void setRetriggerValidationWhenDownloadError(boolean retriggerValidationWhenDownloadError) { + this.retriggerValidationWhenDownloadError = retriggerValidationWhenDownloadError; + } } diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/uriresolver/CacheResourcesManager.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/uriresolver/CacheResourcesManager.java index e12ed507f..331ed92bc 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/uriresolver/CacheResourcesManager.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/uriresolver/CacheResourcesManager.java @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -492,4 +493,16 @@ public void forceDownloadExternalResource(String url) { private boolean isForceDownloadExternalResource(String url) { return forceDownloadExternalResources.getIfPresent(url) != null; } + + public void waitForDownload(String resourceUri) { + CompletableFuture downloadedFile = resourcesLoading.get(resourceUri); + if (downloadedFile != null) { + try { + downloadedFile.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + } + } + } } diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnDTDTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnDTDTest.java index 16a67032c..67216a8a2 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnDTDTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnDTDTest.java @@ -78,12 +78,14 @@ public void docTypeDownloadProblem() throws Exception { validation.setResolveExternalEntities(true); XMLLanguageService ls = new XMLLanguageService(); + ls.setRetriggerValidationWhenDownloadError(false); String xml = "\r\n" + // "\r\n" + // ""; - String dtdCachePath = CacheResourcesManager.getResourceCachePath("http://localhost:8080/sample.dtd").toString(); + String resourceUri = "http://localhost:8080/sample.dtd"; + String dtdCachePath = CacheResourcesManager.getResourceCachePath(resourceUri).toString(); String fileURI = "test.xml"; // Downloading... XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, @@ -96,7 +98,8 @@ public void docTypeDownloadProblem() throws Exception { new Diagnostic(r(1, 1, 1, 13), "Element type \"root-element\" must be declared.", DiagnosticSeverity.Error, "xml", DTDErrorCode.MSG_ELEMENT_NOT_DECLARED.getCode()))); - TimeUnit.SECONDS.sleep(5); // HACK: to make the timing work on slow machines + ContentModelManager contentModelManager = ls.getComponent(ContentModelManager.class); + contentModelManager.waitForDownload(resourceUri); // Downloaded error XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, @@ -154,6 +157,7 @@ public void entityRefDownloadProblem() throws Exception { validation.setResolveExternalEntities(true); XMLLanguageService ls = new XMLLanguageService(); + ls.setRetriggerValidationWhenDownloadError(false); String xml = "\r\n" + // @@ -164,7 +168,8 @@ public void entityRefDownloadProblem() throws Exception { " &abcd;\r\n" + // ""; - String dtdCachePath = CacheResourcesManager.getResourceCachePath("http://localhost:8080/sample.dtd").toString(); + String resourceUri = "http://localhost:8080/sample.dtd"; + String dtdCachePath = CacheResourcesManager.getResourceCachePath(resourceUri).toString(); String fileURI = "test.xml"; // Downloading... XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, @@ -177,7 +182,8 @@ public void entityRefDownloadProblem() throws Exception { new Diagnostic(r(6, 1, 6, 7), "The entity \"abcd\" was referenced, but not declared.", DiagnosticSeverity.Error, "xml", DTDErrorCode.EntityNotDeclared.getCode()))); - TimeUnit.SECONDS.sleep(5); // HACK: to make the timing work on slow machines + ContentModelManager contentModelManager = ls.getComponent(ContentModelManager.class); + contentModelManager.waitForDownload(resourceUri); // Downloaded error XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnXSDTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnXSDTest.java index fd3a59d55..1e667f145 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnXSDTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/extensions/contentmodel/XMLValidationExternalResourcesBasedOnXSDTest.java @@ -81,14 +81,16 @@ public void noNamespaceSchemaLocationDownloadProblem() throws Exception { validation.setResolveExternalEntities(true); XMLLanguageService ls = new XMLLanguageService(); - + ls.setRetriggerValidationWhenDownloadError(false); + String xml = "\r\n" + // " \r\n" + // ""; - String xsdCachePath = CacheResourcesManager.getResourceCachePath("http://localhost:8080/sample.xsd").toString(); + String resourceUri = "http://localhost:8080/sample.xsd"; + String xsdCachePath = CacheResourcesManager.getResourceCachePath(resourceUri).toString(); String fileURI = "test.xml"; // Downloading... XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, pd(fileURI, @@ -99,7 +101,8 @@ public void noNamespaceSchemaLocationDownloadProblem() throws Exception { new Diagnostic(r(0, 1, 0, 13), "cvc-elt.1.a: Cannot find the declaration of element 'root-element'.", DiagnosticSeverity.Error, "xml", XMLSchemaErrorCode.cvc_elt_1_a.getCode()))); - TimeUnit.SECONDS.sleep(5); // HACK: to make the timing work on slow machines + ContentModelManager contentModelManager = ls.getComponent(ContentModelManager.class); + contentModelManager.waitForDownload(resourceUri); // Downloaded error XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, pd(fileURI, @@ -154,7 +157,8 @@ public void schemaLocationDownloadProblem() throws Exception { validation.setResolveExternalEntities(true); XMLLanguageService ls = new XMLLanguageService(); - + ls.setRetriggerValidationWhenDownloadError(false); + String xml = ""; - String xsdCachePath = CacheResourcesManager.getResourceCachePath("http://localhost:8080/sample.xsd").toString(); + String resourceUri = "http://localhost:8080/sample.xsd"; + String xsdCachePath = CacheResourcesManager.getResourceCachePath(resourceUri).toString(); String fileURI = "test.xml"; // Downloading... XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, pd(fileURI, @@ -173,7 +178,8 @@ public void schemaLocationDownloadProblem() throws Exception { new Diagnostic(r(0, 1, 0, 13), "cvc-elt.1.a: Cannot find the declaration of element 'root-element'.", DiagnosticSeverity.Error, "xml", XMLSchemaErrorCode.cvc_elt_1_a.getCode()))); - TimeUnit.SECONDS.sleep(5); // HACK: to make the timing work on slow machines + ContentModelManager contentModelManager = ls.getComponent(ContentModelManager.class); + contentModelManager.waitForDownload(resourceUri); // Downloaded error XMLAssert.testPublishDiagnosticsFor(xml, fileURI, validation, ls, pd(fileURI,