From f5967b4b8d20a0ce19bdefc8cd135e2bbf7e9b07 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 19 Oct 2017 10:23:43 -0700 Subject: [PATCH] Replace BootJava test harness constructors with builder api. And fix failing tests in the process --- .../java/handlers/RunningAppProvider.java | 19 +++-- .../java/utils/SpringLiveHoverWatchdog.java | 1 - .../test/AutowiredHoverProviderTest.java | 2 +- .../test/ComponentHoverProviderTest.java | 5 +- .../beans/test/SpringIndexerBeansTest.java | 2 +- .../test/RequestMappingLiveHoverTest.java | 8 +- .../RequestMappingSymbolProviderTest.java | 2 +- .../java/scope/test/ScopeCompletionTest.java | 3 +- .../java/utils/test/SpringIndexerTest.java | 2 +- .../java/value/test/ValueCompletionTest.java | 19 +++-- .../harness/BootLanguageServerHarness.java | 79 ++++++++++++++----- 11 files changed, 94 insertions(+), 48 deletions(-) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/RunningAppProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/RunningAppProvider.java index edf37b7c2..8378aa2ab 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/RunningAppProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/RunningAppProvider.java @@ -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 getAllRunningSpringApps() throws Exception { - return SpringBootApp.getAllRunningSpringApps().values(); - } + public static final RunningAppProvider DEFAULT = new RunningAppProvider() { + @Override public Collection getAllRunningSpringApps() throws Exception { + return SpringBootApp.getAllRunningSpringApps().values(); + } + }; + public static final RunningAppProvider NULL = new RunningAppProvider() { + @Override public Collection getAllRunningSpringApps() throws Exception { + return ImmutableList.of(); + } + }; + + Collection getAllRunningSpringApps() throws Exception; } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java index b5ac870b7..c3226ae41 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java @@ -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))); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java index 9bc808287..bd03a1c08 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java @@ -66,7 +66,7 @@ public class AutowiredHoverProviderTest { @Before public void setup() throws Exception { - harness = new BootLanguageServerHarness(); + harness = BootLanguageServerHarness.builder().build(); projectFinder = harness.getProjectFinder(); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java index d299f90b4..27193707b 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java @@ -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 diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java index 62641f09c..f0427dae4 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java @@ -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())); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java index ed4ddcd28..8ff121603 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java @@ -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> 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); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java index 178b721b4..9e4cf511d 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java @@ -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(); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java index 3c46d0d50..d1d4326e2 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java @@ -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); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java index fef850aba..b26cfeb56 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java @@ -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 diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java index a3d925a65..bb38a6d40 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java @@ -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); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java index b2b6a839d..31618134f 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java @@ -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 { 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. + *

+ * 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 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 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";