Replace BootJava test harness constructors with builder api.

And fix failing tests in the process
This commit is contained in:
Kris De Volder
2017-10-19 10:23:43 -07:00
parent b41fb3af41
commit f5967b4b8d
11 changed files with 94 additions and 48 deletions

View File

@@ -14,12 +14,21 @@ import java.util.Collection;
import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
public class RunningAppProvider {
import com.google.common.collect.ImmutableList;
public static final RunningAppProvider DEFAULT = new RunningAppProvider();
public interface RunningAppProvider {
public Collection<SpringBootApp> getAllRunningSpringApps() throws Exception {
return SpringBootApp.getAllRunningSpringApps().values();
}
public static final RunningAppProvider DEFAULT = new RunningAppProvider() {
@Override public Collection<SpringBootApp> getAllRunningSpringApps() throws Exception {
return SpringBootApp.getAllRunningSpringApps().values();
}
};
public static final RunningAppProvider NULL = new RunningAppProvider() {
@Override public Collection<SpringBootApp> getAllRunningSpringApps() throws Exception {
return ImmutableList.of();
}
};
Collection<SpringBootApp> getAllRunningSpringApps() throws Exception;
}

View File

@@ -103,7 +103,6 @@ public class SpringLiveHoverWatchdog {
}
private void publishLiveHints(String docURI, Range[] ranges) {
System.out.println(" PUBLISH LIVE HOVER HINTS !!! " + ranges.length);
server.getClient().highlight(new HighlightParams(new TextDocumentIdentifier(docURI), Arrays.asList(ranges)));
}

View File

@@ -66,7 +66,7 @@ public class AutowiredHoverProviderTest {
@Before
public void setup() throws Exception {
harness = new BootLanguageServerHarness();
harness = BootLanguageServerHarness.builder().build();
projectFinder = harness.getProjectFinder();
}

View File

@@ -50,7 +50,6 @@ import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness;
import org.springframework.ide.vscode.project.harness.ProjectsHarness;
import org.springframework.ide.vscode.project.harness.PropertyIndexHarness;
/**
* @author Martin Lippert
@@ -62,8 +61,8 @@ public class ComponentHoverProviderTest {
@Before
public void setup() throws Exception {
harness = new BootLanguageServerHarness();
projectFinder = (d) -> harness.getProjectFinder().find(d);
harness = BootLanguageServerHarness.builder().build();
projectFinder = harness.getProjectFinder();
}
@Test

View File

@@ -51,7 +51,7 @@ public class SpringIndexerBeansTest {
symbolProviders.put(Constants.SPRING_BEAN, new BeansSymbolProvider());
symbolProviders.put(Constants.SPRING_COMPONENT, new ComponentSymbolProvider());
harness = new BootLanguageServerHarness();
harness = BootLanguageServerHarness.builder().build();
projectFinder = harness.getProjectFinder();
harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()));
}

View File

@@ -17,14 +17,12 @@ import java.io.File;
import org.junit.Before;
import org.junit.Test;
import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.languageserver.testharness.Editor;
import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness;
import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness;
import org.springframework.ide.vscode.project.harness.MockRunningAppProvider;
import org.springframework.ide.vscode.project.harness.ProjectsHarness;
import org.springframework.ide.vscode.project.harness.PropertyIndexHarness;
public class RequestMappingLiveHoverTest {
@@ -35,7 +33,9 @@ public class RequestMappingLiveHoverTest {
public void setup() throws Exception {
mockAppProvider = new MockRunningAppProvider();
harness = BootLanguageServerHarness.createMocked(mockAppProvider.provider);
harness = BootLanguageServerHarness.builder()
.runningAppProvider(mockAppProvider.provider)
.build();
}
@Test
@@ -58,7 +58,7 @@ public class RequestMappingLiveHoverTest {
// mock app to return realistic results if possible
.getRequestMappings(
"{\"/webjars/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**\":{\"bean\":\"resourceHandlerMapping\"},\"/**/favicon.ico\":{\"bean\":\"faviconHandlerMapping\"},\"{[/hello-world],methods=[GET]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public example.Greeting example.HelloWorldController.sayHello(java.lang.String)\"},\"{[/goodbye]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.goodbye()\"},\"{[/hello]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public java.lang.String example.RestApi.hello()\"},\"{[/error]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\"},\"{[/error],produces=[text/html]}\":{\"bean\":\"requestMappingHandlerMapping\",\"method\":\"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\"}}")
. build();
.build();
harness.intialize(directory);

View File

@@ -44,7 +44,7 @@ public class RequestMappingSymbolProviderTest {
symbolProviders = new HashMap<>();
symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider());
harness = new BootLanguageServerHarness();
harness = BootLanguageServerHarness.builder().build();
projectFinder = harness.getProjectFinder();
}

View File

@@ -21,7 +21,6 @@ import org.eclipse.lsp4j.CompletionItem;
import org.junit.Before;
import org.junit.Test;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.languageserver.testharness.Editor;
import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness;
@@ -38,7 +37,7 @@ public class ScopeCompletionTest {
@Before
public void setup() throws Exception {
IJavaProject testProject = ProjectsHarness.INSTANCE.mavenProject("test-annotations");
harness = BootLanguageServerHarness.createMocked();
harness = BootLanguageServerHarness.builder().mockDefaults().build();
harness.useProject(testProject);
harness.intialize(null);
}

View File

@@ -59,7 +59,7 @@ public class SpringIndexerTest {
public void setup() throws Exception {
symbolProviders = new HashMap<>();
symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider());
harness = new BootLanguageServerHarness();
harness = BootLanguageServerHarness.builder().build();
}
@Test

View File

@@ -45,17 +45,16 @@ public class ValueCompletionTest {
@Before
public void setup() throws Exception {
//Somewhat strange test setup, test provides a specific test project.
// The context finder finds this test project,
// But it is not used in the indexProvider.
//This is a bit odd... but we preserved the strangeness how it was.
testProject = ProjectsHarness.INSTANCE.mavenProject("test-annotations");
indexHarness = new PropertyIndexHarness();
//Somewhat strange test setup, with a project context finder that finds the test project,
// but doesn't use it in the indexProvider.
BootJavaLanguageServerParams params = new BootJavaLanguageServerParams(
d -> getTestProject(),
ProjectObserver.NULL,
indexHarness.getIndexProvider(),
RunningAppProvider.DEFAULT
);
harness = new BootLanguageServerHarness(params);
harness = BootLanguageServerHarness.builder()
.mockDefaults()
.projectFinder(d -> getTestProject())
.build();
indexHarness = harness.getPropertyIndexHarness();
harness.intialize(null);
}

View File

@@ -10,49 +10,90 @@
*******************************************************************************/
package org.springframework.ide.vscode.project.harness;
import java.util.concurrent.Callable;
import org.junit.Assert;
import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer;
import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerParams;
import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider;
import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.util.LSFactory;
import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness;
public class BootLanguageServerHarness extends LanguageServerHarness<BootJavaLanguageServer> {
private PropertyIndexHarness indexHarness;
private JavaProjectFinder projectFinder = (doc) -> getServer().getProjectFinder().find(doc);
private final JavaProjectFinder projectFinder = (doc) -> getServer().getProjectFinder().find(doc);
/**
* Creates a harness with a 'realistic' language server. I.e. no fake or mocked components.
* Creates a builder and initializes it so that it sets up a test harness with
* the 'real stuff'. I.e project finder and other injected components are like
* they would be in 'production' environment.
* <p>
* Builder methods can still be called to replace some of the components with
* mocks selectively.
*/
public BootLanguageServerHarness() throws Exception {
super(() -> new BootJavaLanguageServer(BootJavaLanguageServerParams.createDefault()));
public static Builder builder() {
return new Builder();
}
public static class Builder {
LSFactory<BootJavaLanguageServerParams> defaultsFactory = BootJavaLanguageServerParams.createDefault();
private JavaProjectFinder projectFinder = null;
private ProjectObserver projectObserver = null;
private SpringPropertyIndexProvider indexProvider = null;
private RunningAppProvider runningAppProvider = null;
private PropertyIndexHarness indexHarness = null;
public BootLanguageServerHarness build() throws Exception {
BootLanguageServerHarness harness = new BootLanguageServerHarness(this);
return harness;
}
public Builder mockDefaults() {
indexHarness = new PropertyIndexHarness();
projectFinder = indexHarness.getProjectFinder();
indexProvider = indexHarness.getIndexProvider();
projectObserver = ProjectObserver.NULL;
runningAppProvider = RunningAppProvider.NULL;
return this;
}
public Builder runningAppProvider(RunningAppProvider provider) {
this.runningAppProvider = provider;
return this;
}
public Builder projectFinder(JavaProjectFinder projectFinder) {
this.projectFinder = projectFinder;
return this;
}
}
/**
* Creates a harness with custom (potentially mocked) params.
* This constructor is private. Use the builder api instead.
*/
public BootLanguageServerHarness(BootJavaLanguageServerParams params) throws Exception {
private BootLanguageServerHarness(Builder builder) throws Exception {
super(() -> {
return new BootJavaLanguageServer((server) -> params);
LSFactory<BootJavaLanguageServerParams> params = (server) -> {
BootJavaLanguageServerParams defaults = BootJavaLanguageServerParams.createDefault().create(server);
return new BootJavaLanguageServerParams(
builder.projectFinder==null?defaults.projectFinder:builder.projectFinder,
builder.projectObserver==null?defaults.projectObserver:builder.projectObserver,
builder.indexProvider==null?defaults.indexProvider:builder.indexProvider,
builder.runningAppProvider==null?defaults.runningAppProvider:builder.runningAppProvider
);
};
return new BootJavaLanguageServer(params);
});
this.projectFinder = params.projectFinder;
this.indexHarness = builder.indexHarness;
}
public static BootLanguageServerHarness createMocked() throws Exception {
return createMocked(RunningAppProvider.DEFAULT);
}
public static BootLanguageServerHarness createMocked(RunningAppProvider provider) throws Exception {
PropertyIndexHarness indexHarness = new PropertyIndexHarness();
BootLanguageServerHarness harness = new BootLanguageServerHarness(new BootJavaLanguageServerParams(indexHarness.getProjectFinder(), ProjectObserver.NULL, indexHarness.getIndexProvider(), provider));
harness.indexHarness = indexHarness;
return harness;
}
@Override
protected String getFileExtension() {
return ".java";