Skip to content

Commit 0d646d7

Browse files
committed
Polish "Support ServiceConnection beans in slice tests"
See gh-36037
1 parent 4dfb60c commit 0d646d7

File tree

47 files changed

+153
-518
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+153
-518
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfiguration.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2012-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -61,7 +61,9 @@
6161
/**
6262
* The auto-configuration classes that should be imported. When empty, the classes are
6363
* specified using a file in {@code META-INF/spring} where the file name is the
64-
* fully-qualified name of the annotated class, suffixed with '.imports'.
64+
* fully-qualified name of the annotated class, suffixed with {@code .imports}. An
65+
* entry in the file may be prefixed with {@code optional:} to indicate that the
66+
* imported class should be ignored if it is not on the classpath.
6567
* @return the classes to import
6668
*/
6769
@AliasFor("value")

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2012-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,13 +25,15 @@
2525
import java.util.LinkedHashSet;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.Objects;
2829
import java.util.Set;
2930

3031
import org.springframework.boot.context.annotation.DeterminableImports;
3132
import org.springframework.boot.context.annotation.ImportCandidates;
3233
import org.springframework.core.annotation.AnnotatedElementUtils;
3334
import org.springframework.core.annotation.AnnotationAttributes;
3435
import org.springframework.core.annotation.AnnotationUtils;
36+
import org.springframework.core.io.ClassPathResource;
3537
import org.springframework.core.type.AnnotationMetadata;
3638
import org.springframework.util.ClassUtils;
3739
import org.springframework.util.LinkedMultiValueMap;
@@ -49,6 +51,8 @@
4951
*/
5052
class ImportAutoConfigurationImportSelector extends AutoConfigurationImportSelector implements DeterminableImports {
5153

54+
private static final String OPTIONAL_PREFIX = "optional:";
55+
5256
private static final Set<String> ANNOTATION_NAMES;
5357

5458
static {
@@ -92,13 +96,27 @@ private Collection<String> getConfigurationsForAnnotation(Class<?> source, Annot
9296
if (classes.length > 0) {
9397
return Arrays.asList(classes);
9498
}
95-
return loadFactoryNames(source);
99+
Collection<String> factoryNames = loadFactoryNames(source);
100+
return factoryNames.stream().map((name) -> {
101+
if (name.startsWith(OPTIONAL_PREFIX)) {
102+
name = name.substring(OPTIONAL_PREFIX.length());
103+
if (!present(name)) {
104+
return null;
105+
}
106+
}
107+
return name;
108+
}).filter(Objects::nonNull).toList();
96109
}
97110

98111
protected Collection<String> loadFactoryNames(Class<?> source) {
99112
return ImportCandidates.load(source, getBeanClassLoader()).getCandidates();
100113
}
101114

115+
private boolean present(String className) {
116+
String resourcePath = ClassUtils.convertClassNameToResourcePath(className) + ".class";
117+
return new ClassPathResource(resourcePath).exists();
118+
}
119+
102120
@Override
103121
protected Set<String> getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes) {
104122
Set<String> exclusions = new LinkedHashSet<>();

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelectorTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,25 @@ void importsAreSelectedUsingClassesAttribute() throws Exception {
7474
assertThat(imports).containsExactly(FreeMarkerAutoConfiguration.class.getName());
7575
}
7676

77+
@Test
78+
void importsAreSelectedFromImportsFile() throws Exception {
79+
AnnotationMetadata annotationMetadata = getAnnotationMetadata(FromImportsFile.class);
80+
String[] imports = this.importSelector.selectImports(annotationMetadata);
81+
assertThat(imports).containsExactly(
82+
"org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration",
83+
"org.springframework.boot.autoconfigure.missing.MissingAutoConfiguration");
84+
}
85+
86+
@Test
87+
void importsSelectedFromImportsFileIgnoreMissingOptionalClasses() throws Exception {
88+
AnnotationMetadata annotationMetadata = getAnnotationMetadata(
89+
FromImportsFileIgnoresMissingOptionalClasses.class);
90+
String[] imports = this.importSelector.selectImports(annotationMetadata);
91+
assertThat(imports).containsExactly(
92+
"org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration",
93+
"org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration");
94+
}
95+
7796
@Test
7897
void propertyExclusionsAreApplied() throws IOException {
7998
this.environment.setProperty("spring.autoconfigure.exclude", FreeMarkerAutoConfiguration.class.getName());
@@ -312,6 +331,18 @@ Class<?>[] excludeAutoConfiguration() default {
312331

313332
}
314333

334+
@Retention(RetentionPolicy.RUNTIME)
335+
@ImportAutoConfiguration
336+
@interface FromImportsFile {
337+
338+
}
339+
340+
@Retention(RetentionPolicy.RUNTIME)
341+
@ImportAutoConfiguration
342+
@interface FromImportsFileIgnoresMissingOptionalClasses {
343+
344+
}
345+
315346
static class TestImportAutoConfigurationImportSelector extends ImportAutoConfigurationImportSelector {
316347

317348
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
2+
org.springframework.boot.autoconfigure.missing.MissingAutoConfiguration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
optional:org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
2+
optional:org.springframework.boot.autoconfigure.missing.MissingAutoConfiguration
3+
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.cassandra.AutoConfigureDataCassandra.imports

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoC
55
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration
66
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration
77
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
8+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.couchbase.AutoConfigureDataCouchbase.imports

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoC
66
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration
77
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration
88
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
9+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.elasticsearch.AutoConfigureDataElasticsearch.imports

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClient
88
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
99
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration
1010
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
11+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.jdbc.AutoConfigureDataJdbc.imports

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
77
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
88
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
99
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
10+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.mongo.AutoConfigureDataMongo.imports

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
77
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration
88
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
99
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
10+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.neo4j.AutoConfigureDataNeo4j.imports

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration
44
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration
55
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration
66
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration
7-
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
7+
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
8+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.r2dbc.AutoConfigureDataR2dbc.imports

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
66
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration
77
org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration
88
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
9-
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
9+
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
10+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.redis.AutoConfigureDataRedis.imports

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
33
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration
44
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
55
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
6+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureJdbc.imports

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConf
55
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
66
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
77
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
8-
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
8+
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
9+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# AutoConfigureTestDatabase auto-configuration imports
22
org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration
3-
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
3+
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
4+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.jooq.AutoConfigureJooq.imports

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConf
55
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration
66
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
77
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
8-
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
8+
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
9+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureDataJpa.imports

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
77
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
88
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
99
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
10-
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
10+
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
11+
optional:org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/AutoConfigurationImportedCondition.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ private AutoConfigurationImportedCondition(Class<?> autoConfigurationClass) {
4141
public boolean matches(ApplicationContext context) {
4242
ConditionEvaluationReport report = ConditionEvaluationReport
4343
.get((ConfigurableListableBeanFactory) context.getAutowireCapableBeanFactory());
44-
return report.getConditionAndOutcomesBySource().containsKey(this.autoConfigurationClass.getName());
44+
return report.getConditionAndOutcomesBySource().containsKey(this.autoConfigurationClass.getName())
45+
|| report.getUnconditionalClasses().contains(this.autoConfigurationClass.getName());
4546
}
4647

4748
/**

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/cassandra/DataCassandraTestIntegrationTests.java

+7
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@
2929
import org.springframework.boot.test.autoconfigure.data.redis.ExampleService;
3030
import org.springframework.boot.test.context.TestConfiguration;
3131
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
32+
import org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration;
3233
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
3334
import org.springframework.context.ApplicationContext;
3435
import org.springframework.context.annotation.Bean;
3536
import org.springframework.data.cassandra.core.CassandraTemplate;
3637

3738
import static org.assertj.core.api.Assertions.assertThat;
3839
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
40+
import static org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.importedAutoConfiguration;
3941

4042
/**
4143
* Integration test for {@link DataCassandraTest @DataCassandraTest}.
@@ -84,6 +86,11 @@ void testRepository() {
8486
this.exampleRepository.deleteAll();
8587
}
8688

89+
@Test
90+
void serviceConnectionAutoConfigurationWasImported() {
91+
assertThat(this.applicationContext).has(importedAutoConfiguration(ServiceConnectionAutoConfiguration.class));
92+
}
93+
8794
@TestConfiguration(proxyBeanMethods = false)
8895
static class KeyspaceTestConfiguration {
8996

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/cassandra/DataCassandraTestWithServiceConnectionBeanIntegrationTests.java

-90
This file was deleted.

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/couchbase/DataCouchbaseTestIntegrationTests.java

+7
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@
2727
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
30+
import org.springframework.boot.testcontainers.service.connection.ServiceConnectionAutoConfiguration;
3031
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
3132
import org.springframework.context.ApplicationContext;
3233
import org.springframework.data.couchbase.core.CouchbaseTemplate;
3334

3435
import static org.assertj.core.api.Assertions.assertThat;
3536
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
37+
import static org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.importedAutoConfiguration;
3638

3739
/**
3840
* Integration test for {@link DataCouchbaseTest @DataCouchbaseTest}.
@@ -81,4 +83,9 @@ void testRepository() {
8183
this.exampleRepository.deleteAll();
8284
}
8385

86+
@Test
87+
void serviceConnectionAutoConfigurationWasImported() {
88+
assertThat(this.applicationContext).has(importedAutoConfiguration(ServiceConnectionAutoConfiguration.class));
89+
}
90+
8491
}

0 commit comments

Comments
 (0)