GH-1530: requires complete index for validation and added more complicated test cases as a start for further testing
This commit is contained in:
@@ -81,8 +81,12 @@ public class NotRegisteredBeansReconciler implements JdtAstReconciler {
|
||||
|
||||
ITypeBinding type = node.resolveBinding();
|
||||
if (type != null && ReconcileUtils.implementsAnyType(AOT_BEANS, type)) {
|
||||
String beanClassName = type.getQualifiedName();
|
||||
|
||||
if (!context.isIndexComplete()) {
|
||||
throw new RequiredCompleteIndexException();
|
||||
}
|
||||
|
||||
String beanClassName = type.getQualifiedName();
|
||||
Bean[] registeredBeans = springIndex.getBeansWithType(project.getElementName(), beanClassName);
|
||||
|
||||
if (registeredBeans == null || registeredBeans.length == 0) {
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2025 Broadcom
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* https://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* Broadcom - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.springframework.ide.vscode.boot.java.reconcilers.test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.eclipse.lsp4j.Diagnostic;
|
||||
import org.eclipse.lsp4j.PublishDiagnosticsParams;
|
||||
import org.eclipse.lsp4j.TextDocumentIdentifier;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.ide.vscode.boot.app.BootJavaConfig;
|
||||
import org.springframework.ide.vscode.boot.app.SpringSymbolIndex;
|
||||
import org.springframework.ide.vscode.boot.bootiful.BootLanguageServerTest;
|
||||
import org.springframework.ide.vscode.boot.bootiful.SymbolProviderTestConf;
|
||||
import org.springframework.ide.vscode.boot.java.SpringAotJavaProblemType;
|
||||
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
|
||||
import org.springframework.ide.vscode.commons.languageserver.util.Settings;
|
||||
import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness;
|
||||
import org.springframework.ide.vscode.project.harness.ProjectsHarness;
|
||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
|
||||
/**
|
||||
* @author Martin Lippert
|
||||
*/
|
||||
@ExtendWith(SpringExtension.class)
|
||||
@BootLanguageServerTest
|
||||
@Import(SymbolProviderTestConf.class)
|
||||
public class NotRegisteredBeansAdvancedReconcilingTest {
|
||||
|
||||
@Autowired private BootLanguageServerHarness harness;
|
||||
@Autowired private JavaProjectFinder projectFinder;
|
||||
@Autowired private SpringSymbolIndex indexer;
|
||||
@Autowired private BootJavaConfig config;
|
||||
|
||||
private File directory;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() throws Exception {
|
||||
harness.intialize(null);
|
||||
|
||||
JsonElement json = new Gson().fromJson("""
|
||||
{
|
||||
"boot-java": {
|
||||
"validation": {
|
||||
"java": {
|
||||
"boot2": "AUTO",
|
||||
"boot3": "AUTO",
|
||||
"spring-aot": "ON",
|
||||
"version-validation": "ON"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
""", JsonElement.class);
|
||||
config.handleConfigurationChange(new Settings(json));
|
||||
|
||||
directory = new File(ProjectsHarness.class.getResource("/test-projects/test-spring-validations/").toURI());
|
||||
|
||||
String projectDir = directory.toURI().toString();
|
||||
|
||||
// trigger project creation
|
||||
projectFinder.find(new TextDocumentIdentifier(projectDir)).get();
|
||||
|
||||
CompletableFuture<Void> initProject = indexer.waitOperation();
|
||||
initProject.get(5, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testBasicValidationOfAotProcessorNotRegistered() throws Exception {
|
||||
String docUri = directory.toPath().resolve("src/main/java/org/test/aot/NotRegisteredBeanRegistrationAotProcessor.java").toUri().toString();
|
||||
|
||||
PublishDiagnosticsParams diagnosticsResult = harness.getDiagnostics(docUri);
|
||||
List<Diagnostic> diagnostics = diagnosticsResult.getDiagnostics();
|
||||
|
||||
assertEquals(1, diagnostics.size());
|
||||
assertEquals(SpringAotJavaProblemType.JAVA_BEAN_NOT_REGISTERED_IN_AOT.getCode(), diagnostics.get(0).getCode().getLeft());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testBasicValidationOfAotProcessorRegisteredAsComponent() throws Exception {
|
||||
String docUri = directory.toPath().resolve("src/main/java/org/test/aot/RegisteredAsComponentBeanRegistrationAotProcessor.java").toUri().toString();
|
||||
|
||||
PublishDiagnosticsParams diagnosticsResult = harness.getDiagnostics(docUri);
|
||||
List<Diagnostic> diagnostics = diagnosticsResult.getDiagnostics();
|
||||
|
||||
assertEquals(0, diagnostics.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testBasicValidationOfAotProcessorRegisteredViaConfig() throws Exception {
|
||||
String docUri = directory.toPath().resolve("src/main/java/org/test/aot/RegistetedViaConfigBeanRegistrationAotProcessor.java").toUri().toString();
|
||||
|
||||
PublishDiagnosticsParams diagnosticsResult = harness.getDiagnostics(docUri);
|
||||
List<Diagnostic> diagnostics = diagnosticsResult.getDiagnostics();
|
||||
|
||||
assertEquals(0, diagnostics.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled // this case needs work - (1) factories not taken into account at all, (2) requires complete index doesn't take other indexers into account yet
|
||||
void testBasicValidationOfAotProcessorRegisteredViaFactoriesFile() throws Exception {
|
||||
String docUri = directory.toPath().resolve("src/main/java/org/test/aot/RegisteredViaFactoriesBeanRegistrationAotProcessor.java").toUri().toString();
|
||||
|
||||
PublishDiagnosticsParams diagnosticsResult = harness.getDiagnostics(docUri);
|
||||
List<Diagnostic> diagnostics = diagnosticsResult.getDiagnostics();
|
||||
|
||||
assertEquals(0, diagnostics.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidationDisappearsWhenComponentAnnotationIsAdded() throws Exception {
|
||||
// TODO
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidationAppearsWhenComponentAnnotationIsRemoved() throws Exception {
|
||||
// TODO
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidationDisappearsWhenBeanMethodIsAddedToConfig() throws Exception {
|
||||
// TODO
|
||||
}
|
||||
|
||||
@Test
|
||||
void testValidationAppearsWhenBeanMethodIsRemovedFromConfig() throws Exception {
|
||||
// TODO
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.1.2</version>
|
||||
<version>3.4.4</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.test.aot;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class Config {
|
||||
|
||||
@Bean
|
||||
RegistetedViaConfigBeanRegistrationAotProcessor registeredViaConfigAotProcessor() {
|
||||
return new RegistetedViaConfigBeanRegistrationAotProcessor();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.test.aot;
|
||||
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotContribution;
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor;
|
||||
import org.springframework.beans.factory.support.RegisteredBean;
|
||||
|
||||
public class NotRegisteredBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
|
||||
|
||||
@Override
|
||||
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.test.aot;
|
||||
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotContribution;
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor;
|
||||
import org.springframework.beans.factory.support.RegisteredBean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class RegisteredAsComponentBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
|
||||
|
||||
@Override
|
||||
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.test.aot;
|
||||
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotContribution;
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor;
|
||||
import org.springframework.beans.factory.support.RegisteredBean;
|
||||
|
||||
public class RegisteredViaFactoriesBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
|
||||
|
||||
@Override
|
||||
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.test.aot;
|
||||
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotContribution;
|
||||
import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor;
|
||||
import org.springframework.beans.factory.support.RegisteredBean;
|
||||
|
||||
public class RegistetedViaConfigBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
|
||||
|
||||
@Override
|
||||
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user