Olga Maciaszek-Sharma
2 years ago
4 changed files with 149 additions and 3 deletions
@ -0,0 +1,140 @@
@@ -0,0 +1,140 @@
|
||||
/* |
||||
* Copyright 2012-2022 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.cloud.loadbalancer.aot; |
||||
|
||||
import java.net.URL; |
||||
|
||||
import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory; |
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
import org.junit.jupiter.api.AfterEach; |
||||
import org.junit.jupiter.api.BeforeEach; |
||||
import org.junit.jupiter.api.Test; |
||||
import org.junit.jupiter.api.extension.ExtendWith; |
||||
|
||||
import org.springframework.aot.AotDetector; |
||||
import org.springframework.aot.test.generator.compile.CompileWithTargetClassAccess; |
||||
import org.springframework.aot.test.generator.compile.TestCompiler; |
||||
import org.springframework.boot.autoconfigure.AutoConfigurations; |
||||
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration; |
||||
import org.springframework.boot.context.annotation.UserConfigurations; |
||||
import org.springframework.boot.test.context.runner.WebApplicationContextRunner; |
||||
import org.springframework.boot.test.system.CapturedOutput; |
||||
import org.springframework.boot.test.system.OutputCaptureExtension; |
||||
import org.springframework.boot.test.util.TestPropertyValues; |
||||
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext; |
||||
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; |
||||
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; |
||||
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; |
||||
import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration; |
||||
import org.springframework.context.ApplicationContextInitializer; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.context.aot.ApplicationContextAotGenerator; |
||||
import org.springframework.context.support.GenericApplicationContext; |
||||
import org.springframework.javapoet.ClassName; |
||||
import org.springframework.test.aot.generate.TestGenerationContext; |
||||
import org.springframework.test.util.ReflectionTestUtils; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link LoadBalancerChildContextInitializer}. |
||||
* |
||||
* @author Olga Maciaszek-Sharma |
||||
*/ |
||||
@ExtendWith(OutputCaptureExtension.class) |
||||
public class LoadBalancerChildContextInitializerTests { |
||||
|
||||
private static final Log LOG = LogFactory.getLog(LoadBalancerChildContextInitializerTests.class); |
||||
|
||||
@BeforeEach |
||||
@AfterEach |
||||
void reset() { |
||||
ReflectionTestUtils.setField(TomcatURLStreamHandlerFactory.class, "instance", null); |
||||
ReflectionTestUtils.setField(URL.class, "factory", null); |
||||
} |
||||
|
||||
@Test |
||||
@CompileWithTargetClassAccess |
||||
@SuppressWarnings("unchecked") |
||||
void shouldStartLBChildContextsFromAotContributions(CapturedOutput output) { |
||||
WebApplicationContextRunner contextRunner = new WebApplicationContextRunner( |
||||
AnnotationConfigServletWebApplicationContext::new) |
||||
.withConfiguration(AutoConfigurations.of(ServletWebServerFactoryAutoConfiguration.class, |
||||
LoadBalancerAutoConfiguration.class)) |
||||
.withConfiguration(UserConfigurations.of(TestLoadBalancerConfiguration.class)); |
||||
contextRunner.withPropertyValues("spring.cloud.loadbalancer.eager-load.clients[0]=test1").prepare(context -> { |
||||
TestGenerationContext generationContext = new TestGenerationContext(TestTarget.class); |
||||
ClassName className = new ApplicationContextAotGenerator().processAheadOfTime( |
||||
(GenericApplicationContext) context.getSourceApplicationContext(), generationContext); |
||||
generationContext.writeGeneratedContent(); |
||||
TestCompiler compiler = TestCompiler.forSystem(); |
||||
compiler.withFiles(generationContext.getGeneratedFiles()).compile(compiled -> { |
||||
ServletWebServerApplicationContext freshApplicationContext = new ServletWebServerApplicationContext(); |
||||
ApplicationContextInitializer<GenericApplicationContext> initializer = compiled |
||||
.getInstance(ApplicationContextInitializer.class, className.toString()); |
||||
initializer.initialize(freshApplicationContext); |
||||
assertThat(output).contains("Refreshing LoadBalancerClientFactory-test1", |
||||
"Refreshing LoadBalancerClientFactory-test-2", "Refreshing LoadBalancerClientFactory-test_3"); |
||||
assertThat(output).doesNotContain("Instantiating bean from Test 2 custom config", |
||||
"Instantiating bean from default custom config"); |
||||
TestPropertyValues.of(AotDetector.AOT_ENABLED + "=true") |
||||
.applyToSystemProperties(freshApplicationContext::refresh); |
||||
assertThat(output).contains("Instantiating bean from Test 2 custom config", |
||||
"Instantiating bean from default custom config"); |
||||
}); |
||||
}); |
||||
|
||||
} |
||||
|
||||
static class TestTarget { |
||||
|
||||
} |
||||
|
||||
@Configuration(proxyBeanMethods = false) |
||||
@LoadBalancerClients(value = { @LoadBalancerClient(value = "test-2", configuration = Test2Configuration.class), |
||||
@LoadBalancerClient("test_3") }, defaultConfiguration = DefaultConfiguration.class) |
||||
public static class TestLoadBalancerConfiguration { |
||||
|
||||
} |
||||
|
||||
public static class Test2Configuration { |
||||
|
||||
@Bean |
||||
TestBean testBean() { |
||||
LOG.debug("Instantiating bean from Test 2 custom config"); |
||||
return new TestBean(); |
||||
} |
||||
|
||||
} |
||||
|
||||
public static class DefaultConfiguration { |
||||
|
||||
@Bean |
||||
TestBean defaultTestBean() { |
||||
LOG.debug("Instantiating bean from default custom config"); |
||||
return new TestBean(); |
||||
} |
||||
|
||||
} |
||||
|
||||
public static class TestBean { |
||||
|
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue