Merge branch '6.0.x'
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.test.context.aot;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
/**
|
||||
@@ -27,7 +26,7 @@ import org.springframework.lang.Nullable;
|
||||
* and run-time. At build time, test components can {@linkplain #setAttribute contribute}
|
||||
* attributes during the AOT processing phase. At run time, test components can
|
||||
* {@linkplain #getString(String) retrieve} attributes that were contributed at
|
||||
* build time. If {@link AotDetector#useGeneratedArtifacts()} returns {@code true},
|
||||
* build time. If {@link TestAotDetector#useGeneratedArtifacts()} returns {@code true},
|
||||
* run-time mode applies.
|
||||
*
|
||||
* <p>For example, if a test component computes something at build time that
|
||||
@@ -44,7 +43,7 @@ import org.springframework.lang.Nullable;
|
||||
* — can choose to contribute an attribute at any point in time. Note that
|
||||
* contributing an attribute during standard JVM test execution will not have any
|
||||
* adverse side effect since AOT attributes will be ignored in that scenario. In
|
||||
* any case, you should use {@link AotDetector#useGeneratedArtifacts()} to determine
|
||||
* any case, you should use {@link TestAotDetector#useGeneratedArtifacts()} to determine
|
||||
* if invocations of {@link #setAttribute(String, String)} and
|
||||
* {@link #removeAttribute(String)} are permitted.
|
||||
*
|
||||
@@ -71,12 +70,12 @@ public interface AotTestAttributes {
|
||||
* @param name the unique attribute name
|
||||
* @param value the associated attribute value
|
||||
* @throws UnsupportedOperationException if invoked during
|
||||
* {@linkplain AotDetector#useGeneratedArtifacts() AOT run-time execution}
|
||||
* {@linkplain TestAotDetector#useGeneratedArtifacts() AOT run-time execution}
|
||||
* @throws IllegalArgumentException if the provided value is {@code null} or
|
||||
* if an attempt is made to override an existing attribute
|
||||
* @see #setAttribute(String, boolean)
|
||||
* @see #removeAttribute(String)
|
||||
* @see AotDetector#useGeneratedArtifacts()
|
||||
* @see TestAotDetector#useGeneratedArtifacts()
|
||||
*/
|
||||
void setAttribute(String name, String value);
|
||||
|
||||
@@ -88,13 +87,13 @@ public interface AotTestAttributes {
|
||||
* @param name the unique attribute name
|
||||
* @param value the associated attribute value
|
||||
* @throws UnsupportedOperationException if invoked during
|
||||
* {@linkplain AotDetector#useGeneratedArtifacts() AOT run-time execution}
|
||||
* {@linkplain TestAotDetector#useGeneratedArtifacts() AOT run-time execution}
|
||||
* @throws IllegalArgumentException if an attempt is made to override an
|
||||
* existing attribute
|
||||
* @see #setAttribute(String, String)
|
||||
* @see #removeAttribute(String)
|
||||
* @see Boolean#toString(boolean)
|
||||
* @see AotDetector#useGeneratedArtifacts()
|
||||
* @see TestAotDetector#useGeneratedArtifacts()
|
||||
*/
|
||||
default void setAttribute(String name, boolean value) {
|
||||
setAttribute(name, Boolean.toString(value));
|
||||
@@ -104,8 +103,8 @@ public interface AotTestAttributes {
|
||||
* Remove the attribute stored under the provided name.
|
||||
* @param name the unique attribute name
|
||||
* @throws UnsupportedOperationException if invoked during
|
||||
* {@linkplain AotDetector#useGeneratedArtifacts() AOT run-time execution}
|
||||
* @see AotDetector#useGeneratedArtifacts()
|
||||
* {@linkplain TestAotDetector#useGeneratedArtifacts() AOT run-time execution}
|
||||
* @see TestAotDetector#useGeneratedArtifacts()
|
||||
* @see #setAttribute(String, String)
|
||||
*/
|
||||
void removeAttribute(String name);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -19,7 +19,6 @@ package org.springframework.test.context.aot;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
/**
|
||||
@@ -40,7 +39,7 @@ final class AotTestAttributesFactory {
|
||||
/**
|
||||
* Get the underlying attributes map.
|
||||
* <p>If the map is not already loaded, this method loads the map from the
|
||||
* generated class when running in {@linkplain AotDetector#useGeneratedArtifacts()
|
||||
* generated class when running in {@linkplain TestAotDetector#useGeneratedArtifacts()
|
||||
* AOT execution mode} and otherwise creates a new map for storing attributes
|
||||
* during the AOT processing phase.
|
||||
*/
|
||||
@@ -50,7 +49,7 @@ final class AotTestAttributesFactory {
|
||||
synchronized (AotTestAttributesFactory.class) {
|
||||
attrs = attributes;
|
||||
if (attrs == null) {
|
||||
attrs = (AotDetector.useGeneratedArtifacts() ? loadAttributesMap() : new ConcurrentHashMap<>());
|
||||
attrs = (TestAotDetector.useGeneratedArtifacts() ? loadAttributesMap() : new ConcurrentHashMap<>());
|
||||
attributes = attrs;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -19,7 +19,6 @@ package org.springframework.test.context.aot;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.context.ApplicationContextInitializer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.lang.Nullable;
|
||||
@@ -30,7 +29,7 @@ import org.springframework.lang.Nullable;
|
||||
*
|
||||
* <p>Intended solely for internal use within the framework.
|
||||
*
|
||||
* <p>If we are not running in {@linkplain AotDetector#useGeneratedArtifacts()
|
||||
* <p>If we are not running in {@linkplain TestAotDetector#useGeneratedArtifacts()
|
||||
* AOT mode} or if a test class is not {@linkplain #isSupportedTestClass(Class)
|
||||
* supported} in AOT mode, {@link #getContextInitializer(Class)} and
|
||||
* {@link #getContextInitializerClass(Class)} will return {@code null}.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -19,7 +19,6 @@ package org.springframework.test.context.aot;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.context.ApplicationContextInitializer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.lang.Nullable;
|
||||
@@ -45,7 +44,7 @@ final class AotTestContextInitializersFactory {
|
||||
/**
|
||||
* Get the underlying map.
|
||||
* <p>If the map is not already loaded, this method loads the map from the
|
||||
* generated class when running in {@linkplain AotDetector#useGeneratedArtifacts()
|
||||
* generated class when running in {@linkplain TestAotDetector#useGeneratedArtifacts()
|
||||
* AOT execution mode} and otherwise creates an immutable, empty map.
|
||||
*/
|
||||
static Map<String, Supplier<ApplicationContextInitializer<ConfigurableApplicationContext>>> getContextInitializers() {
|
||||
@@ -54,7 +53,7 @@ final class AotTestContextInitializersFactory {
|
||||
synchronized (AotTestContextInitializersFactory.class) {
|
||||
initializers = contextInitializers;
|
||||
if (initializers == null) {
|
||||
initializers = (AotDetector.useGeneratedArtifacts() ? loadContextInitializersMap() : Map.of());
|
||||
initializers = (TestAotDetector.useGeneratedArtifacts() ? loadContextInitializersMap() : Map.of());
|
||||
contextInitializers = initializers;
|
||||
}
|
||||
}
|
||||
@@ -68,7 +67,7 @@ final class AotTestContextInitializersFactory {
|
||||
synchronized (AotTestContextInitializersFactory.class) {
|
||||
initializerClasses = contextInitializerClasses;
|
||||
if (initializerClasses == null) {
|
||||
initializerClasses = (AotDetector.useGeneratedArtifacts() ? loadContextInitializerClassesMap() : Map.of());
|
||||
initializerClasses = (TestAotDetector.useGeneratedArtifacts() ? loadContextInitializerClassesMap() : Map.of());
|
||||
contextInitializerClasses = initializerClasses;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -18,7 +18,6 @@ package org.springframework.test.context.aot;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
@@ -61,7 +60,7 @@ class DefaultAotTestAttributes implements AotTestAttributes {
|
||||
|
||||
|
||||
private static void assertNotInAotRuntime() {
|
||||
if (AotDetector.useGeneratedArtifacts()) {
|
||||
if (TestAotDetector.useGeneratedArtifacts()) {
|
||||
throw new UnsupportedOperationException(
|
||||
"AOT attributes cannot be modified during AOT run-time execution");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2002-2023 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.test.context.aot;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.core.SpringProperties;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* TestContext framework specific utility for determining if AOT-processed
|
||||
* optimizations must be used rather than the regular runtime.
|
||||
*
|
||||
* <p>Strictly for internal use within the framework.
|
||||
*
|
||||
* @author Sam Brannen
|
||||
* @since 6.0.9
|
||||
*/
|
||||
public abstract class TestAotDetector {
|
||||
|
||||
/**
|
||||
* Determine whether AOT optimizations must be considered at runtime.
|
||||
* <p>This can be triggered using the {@value AotDetector#AOT_ENABLED}
|
||||
* Spring property or via GraalVM's {@code "org.graalvm.nativeimage.imagecode"}
|
||||
* JVM system property (if set to any non-empty value other than {@code agent}).
|
||||
* @return {@code true} if AOT optimizations must be considered
|
||||
* @see <a href="https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java">GraalVM's ImageInfo.java</a>
|
||||
* @see AotDetector#useGeneratedArtifacts()
|
||||
*/
|
||||
public static boolean useGeneratedArtifacts() {
|
||||
return (SpringProperties.getFlag(AotDetector.AOT_ENABLED) || inNativeImage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if we are currently running within a GraalVM native image from
|
||||
* the perspective of the TestContext framework.
|
||||
* @return {@code true} if the {@code org.graalvm.nativeimage.imagecode} JVM
|
||||
* system property has been set to any value other than {@code agent}.
|
||||
*/
|
||||
private static boolean inNativeImage() {
|
||||
String imageCode = System.getProperty("org.graalvm.nativeimage.imagecode");
|
||||
return (StringUtils.hasText(imageCode) && !"agent".equalsIgnoreCase(imageCode.trim()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -26,7 +26,6 @@ import java.util.stream.Stream;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.aot.generate.ClassNameGenerator;
|
||||
import org.springframework.aot.generate.DefaultGenerationContext;
|
||||
import org.springframework.aot.generate.GeneratedClasses;
|
||||
@@ -123,7 +122,7 @@ public class TestContextAotGenerator {
|
||||
* @throws TestContextAotException if an error occurs during AOT processing
|
||||
*/
|
||||
public void processAheadOfTime(Stream<Class<?>> testClasses) throws TestContextAotException {
|
||||
Assert.state(!AotDetector.useGeneratedArtifacts(), "Cannot perform AOT processing during AOT run-time execution");
|
||||
Assert.state(!TestAotDetector.useGeneratedArtifacts(), "Cannot perform AOT processing during AOT run-time execution");
|
||||
try {
|
||||
resetAotFactories();
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 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.
|
||||
@@ -21,7 +21,6 @@ import java.util.List;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.aot.AotDetector;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextInitializer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
@@ -36,6 +35,7 @@ import org.springframework.test.context.MergedContextConfiguration;
|
||||
import org.springframework.test.context.SmartContextLoader;
|
||||
import org.springframework.test.context.aot.AotContextLoader;
|
||||
import org.springframework.test.context.aot.AotTestContextInitializers;
|
||||
import org.springframework.test.context.aot.TestAotDetector;
|
||||
import org.springframework.test.context.aot.TestContextAotException;
|
||||
import org.springframework.test.context.util.TestContextSpringFactoriesUtils;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -248,7 +248,7 @@ public class DefaultCacheAwareContextLoaderDelegate implements CacheAwareContext
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private MergedContextConfiguration replaceIfNecessary(MergedContextConfiguration mergedConfig) {
|
||||
if (AotDetector.useGeneratedArtifacts()) {
|
||||
if (TestAotDetector.useGeneratedArtifacts()) {
|
||||
Class<?> testClass = mergedConfig.getTestClass();
|
||||
Class<? extends ApplicationContextInitializer<?>> contextInitializerClass =
|
||||
this.aotTestContextInitializers.getContextInitializerClass(testClass);
|
||||
|
||||
Reference in New Issue
Block a user