Attempt to fix race condition boot ls tests

See: https://www.pivotaltracker.com/story/show/175339205
This commit is contained in:
Kris De Volder
2020-10-19 14:27:03 -07:00
parent e42e544f16
commit d92572bc52
3 changed files with 17 additions and 39 deletions

View File

@@ -11,9 +11,9 @@
package org.springframework.ide.vscode.languageserver.testharness;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness.HIGHLIGHTS_TIMEOUT;
import static org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness.getDocString;
import static org.springframework.ide.vscode.languageserver.testharness.TestAsserts.assertContains;
import static org.springframework.ide.vscode.languageserver.testharness.TestAsserts.assertDoesNotContain;
@@ -27,6 +27,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -137,6 +139,7 @@ public class Editor {
private int selectionStart;
private Set<String> ignoredTypes;
private LanguageId languageId;
private Future<HighlightParams> highlightsFuture;
public Editor(LanguageServerHarness harness, String contents, LanguageId languageId) throws Exception {
this(harness, contents, languageId, null);
@@ -150,6 +153,7 @@ public class Editor {
this.selectionStart = state.selectionStart;
this.selectionEnd = state.selectionEnd;
this.ignoredTypes = new HashSet<>();
this.highlightsFuture = harness.getHighlightsFuture(doc);
}
public Editor(LanguageServerHarness harness, TextDocumentInfo doc, String contents, LanguageId languageId) throws Exception {
this.harness = harness;
@@ -159,6 +163,7 @@ public class Editor {
this.selectionStart = state.selectionStart;
this.selectionEnd = state.selectionEnd;
this.ignoredTypes = new HashSet<>();
this.highlightsFuture = harness.getHighlightsFuture(doc);
}
/**
@@ -215,7 +220,7 @@ public class Editor {
public List<Range> assertHighlights(String... expectedHighlights) throws Exception {
HighlightParams highlights = harness.getHighlights(doc);
HighlightParams highlights = this.highlightsFuture.get(HIGHLIGHTS_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS);
List<Range> ranges = highlights != null ? highlights.getCodeLenses().stream().map(CodeLens::getRange).collect(Collectors.toList()) : ImmutableList.of();
Collections.sort(ranges, RANGE_COMPARATOR);
List<String> actualHighlights = ranges.stream()
@@ -225,11 +230,6 @@ public class Editor {
return ranges;
}
public void assertNoHighlights() throws Exception {
HighlightParams highlights = harness.getHighlights(false, doc);
assertNull(highlights);
}
/**
* Get the editor text, with cursor markers inserted (for easy textual comparison
* after applying a proposal)

View File

@@ -104,10 +104,13 @@ import org.eclipse.lsp4j.WorkspaceEditCapabilities;
import org.eclipse.lsp4j.WorkspaceSymbolParams;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.lsp4j.services.LanguageClientAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.util.LanguageServerTestListener;
import org.springframework.ide.vscode.commons.languageserver.util.Settings;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService;
import org.springframework.ide.vscode.commons.protocol.CursorMovement;
import org.springframework.ide.vscode.commons.protocol.HighlightParams;
import org.springframework.ide.vscode.commons.protocol.ProgressParams;
@@ -138,6 +141,8 @@ import reactor.core.publisher.Mono;
public class LanguageServerHarness {
//Warning this 'harness' is incomplete. Growing it as needed.
private static Logger log = LoggerFactory.getLogger(LanguageServerHarness.class);
private Random random = new Random();
@@ -161,7 +166,7 @@ public class LanguageServerHarness {
this.server = server;
}
public static final Duration HIGHLIGHTS_TIMEOUT = Duration.ofMillis(10_000L); //Why so long?
public static final Duration HIGHLIGHTS_TIMEOUT = Duration.ofMillis(5_000L);
// public static LanguageServerHarness<SimpleLanguageServer> create(String extensionId, LanguageServerInitializer initializer) throws Exception {
// Callable<SimpleLanguageServer> factory = () -> {
@@ -224,6 +229,7 @@ public class LanguageServerHarness {
}
private void receiveHighlights(HighlightParams highlights) {
log.info("highlights received: {}", highlights);
Collection<CompletableFuture<HighlightParams>>requestors = ImmutableList.of();
synchronized (this) {
String uri = highlights.getDoc().getUri();
@@ -515,40 +521,12 @@ public class LanguageServerHarness {
}
public synchronized Future<HighlightParams> getHighlightsFuture(TextDocumentInfo doc) {
log.info("highlights requested");
CompletableFuture<HighlightParams> future = new CompletableFuture<HighlightParams>();
highlights.put(doc.getUri(), future);
return future;
}
public HighlightParams getHighlights(TextDocumentInfo doc) throws Exception {
return getHighlights(true, doc);
}
/**
* Set expectServerHighlights to false if NO highlights are expected from the server (for example, test cases
* that test that no highlights are received from the server because there are no running apps).
* @param expectServerHighlights false if NOT expecting any highlights from the server
* @param doc
* @return highlights, if they are expected, or null if they are not expected.
* @throws Exception
*/
public HighlightParams getHighlights(boolean expectServerHighlights, TextDocumentInfo doc) throws Exception {
try {
return getHighlightsFuture(doc).get(HIGHLIGHTS_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
// highlight requestor will timeout if the server does not send any highlights. This
// is not always an error. For example, if there are no initial running apps, the server will
// NOT send highlights (see PT 156688501), so in this case we expect to time out as part of
// the expected behaviour
if (!expectServerHighlights) {
return null;
}
else {
throw e;
}
}
}
public static Condition<Diagnostic> isDiagnosticWithSeverity(DiagnosticSeverity severity) {
return new Condition<>(
(d) -> d.getSeverity()==severity,

View File

@@ -110,8 +110,8 @@ public class ActiveProfilesHoverTest {
"\n" +
"}"
);
editor.assertHighlights(/*NONE*/);
editor.assertHoverContains("@Profile", "Consider adding `spring-boot-actuator` as a dependency");
editor.assertNoHighlights();
}
@Test
@@ -162,7 +162,7 @@ public class ActiveProfilesHoverTest {
"\n" +
"}"
);
editor.assertHighlights(/*NONE*/);
editor.assertNoHover("@Profile");
editor.assertNoHighlights();
}
}