From 23ad2b41560083a270ab5e2d025eaa5060585b29 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 10 Nov 2020 15:24:38 +0100 Subject: [PATCH] Rationalize Testcontainers image versions This commit rationalizes the Docker image names used in integration tests. Closes gh-24107 --- ...asswordAuthenticationIntegrationTests.java | 5 + ...baseAutoConfigurationIntegrationTests.java | 5 +- ...DataAutoConfigurationIntegrationTests.java | 5 +- ...rchRepositoriesAutoConfigurationTests.java | 6 +- ...rchRepositoriesAutoConfigurationTests.java | 6 +- ...earchRestClientAutoConfigurationTests.java | 6 +- ...rsionOverridingElasticsearchContainer.java | 42 -------- ...earchRestClientAutoConfigurationTests.java | 6 +- .../SessionAutoConfigurationMongoTests.java | 5 +- .../mongo/DataMongoTestIntegrationTests.java | 5 +- ...DataMongoTestReactiveIntegrationTests.java | 5 +- ...TestWithIncludeFilterIntegrationTests.java | 5 +- ...actionalDataMongoTestIntegrationTests.java | 5 +- .../neo4j/DataNeo4jTestIntegrationTests.java | 5 +- ...taNeo4jTestPropertiesIntegrationTests.java | 5 +- ...TestWithIncludeFilterIntegrationTests.java | 5 +- .../spring-boot-test-support/build.gradle | 1 + .../testcontainers/DockerImageNames.java | 102 ++++++++++++++++++ .../testcontainers/RedisContainer.java | 2 +- .../build.gradle | 1 + .../data/r2dbc/CityRepositoryTests.java | 4 +- .../build.gradle | 1 + .../data/r2dbc/CityRepositoryTests.java | 4 +- 23 files changed, 163 insertions(+), 73 deletions(-) delete mode 100644 spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests.java index af67db07560..3862196ac10 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests.java @@ -37,6 +37,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.util.StreamUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -83,6 +84,10 @@ class CassandraAutoConfigurationWithPasswordAuthenticationIntegrationTests { static final class PasswordAuthenticatorCassandraContainer extends CassandraContainer { + PasswordAuthenticatorCassandraContainer() { + super(DockerImageNames.cassandra().toString()); + } + @Override protected void containerIsCreated(String containerId) { String config = this.copyFileFromContainer("/etc/cassandra/cassandra.yaml", diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationIntegrationTests.java index 9129f85e275..68c420bc315 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationIntegrationTests.java @@ -31,6 +31,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import static org.assertj.core.api.Assertions.assertThat; @@ -46,8 +47,8 @@ class CouchbaseAutoConfigurationIntegrationTests { private static final String BUCKET_NAME = "cbbucket"; @Container - static final CouchbaseContainer couchbase = new CouchbaseContainer().withCredentials("spring", "password") - .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)) + static final CouchbaseContainer couchbase = new CouchbaseContainer(DockerImageNames.couchbase().toString()) + .withCredentials("spring", "password").withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)) .withBucket(new BucketDefinition(BUCKET_NAME).withPrimaryIndex(false)); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java index 31c9ba7e983..fe2b795bcf4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java @@ -31,6 +31,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration; import org.springframework.boot.autoconfigure.data.cassandra.city.City; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.SchemaAction; @@ -48,8 +49,8 @@ import static org.assertj.core.api.Assertions.assertThat; class CassandraDataAutoConfigurationIntegrationTests { @Container - static final CassandraContainer cassandra = new CassandraContainer<>().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(10)); + static final CassandraContainer cassandra = new CassandraContainer<>(DockerImageNames.cassandra().toString()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration( diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java index 92ec91bc674..47145dacd9b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java @@ -31,6 +31,7 @@ import org.springframework.boot.autoconfigure.data.elasticsearch.city.CityReposi import org.springframework.boot.autoconfigure.data.empty.EmptyDataPackage; import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; @@ -48,8 +49,9 @@ import static org.assertj.core.api.Assertions.assertThat; class ElasticsearchRepositoriesAutoConfigurationTests { @Container - static final ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer() - .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)); + static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer( + DockerImageNames.elasticsearch().toString()).withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java index 411803cbf96..2e9b60f7de4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.autoconfigure.data.elasticsearch.city.City; import org.springframework.boot.autoconfigure.data.elasticsearch.city.ReactiveCityRepository; import org.springframework.boot.autoconfigure.data.empty.EmptyDataPackage; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate; import org.springframework.data.elasticsearch.repository.config.EnableReactiveElasticsearchRepositories; @@ -47,8 +48,9 @@ import static org.assertj.core.api.Assertions.assertThat; public class ReactiveElasticsearchRepositoriesAutoConfigurationTests { @Container - static ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(10)); + static ElasticsearchContainer elasticsearch = new ElasticsearchContainer( + DockerImageNames.elasticsearch().toString()).withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(ReactiveElasticsearchRestClientAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRestClientAutoConfigurationTests.java index 73426ea3136..ac7315ff772 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRestClientAutoConfigurationTests.java @@ -30,6 +30,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; @@ -47,8 +48,9 @@ import static org.mockito.Mockito.mock; public class ReactiveElasticsearchRestClientAutoConfigurationTests { @Container - static ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(10)); + static ElasticsearchContainer elasticsearch = new ElasticsearchContainer( + DockerImageNames.elasticsearch().toString()).withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(ReactiveElasticsearchRestClientAutoConfiguration.class)); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java deleted file mode 100644 index d64e77cf26c..00000000000 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012-2020 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.boot.autoconfigure.data.elasticsearch; - -import org.elasticsearch.Version; -import org.testcontainers.elasticsearch.ElasticsearchContainer; - -/** - * Extension of {@link ElasticsearchContainer} to override default version. - * - * @author Scott Frederick - */ -public class VersionOverridingElasticsearchContainer extends ElasticsearchContainer { - - /** - * Elasticsearch Docker base URL - */ - private static final String ELASTICSEARCH_IMAGE = "docker.elastic.co/elasticsearch/elasticsearch"; - - /** - * Elasticsearch version - */ - protected static final String ELASTICSEARCH_VERSION = Version.CURRENT.toString(); - - public VersionOverridingElasticsearchContainer() { - super(ELASTICSEARCH_IMAGE + ":" + ELASTICSEARCH_VERSION); - } - -} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java index 09648bf9bc5..309037d10fb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java @@ -42,6 +42,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -59,8 +60,9 @@ import static org.mockito.Mockito.mock; class ElasticsearchRestClientAutoConfigurationTests { @Container - static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(10)); + static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer( + DockerImageNames.elasticsearch().toString()).withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(10)); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class)); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java index 919a83cae2d..53173d3c09d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.session.data.mongo.MongoIndexedSessionRepository; import org.springframework.session.data.redis.RedisIndexedSessionRepository; import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository; @@ -46,8 +47,8 @@ import static org.assertj.core.api.Assertions.assertThat; class SessionAutoConfigurationMongoTests extends AbstractSessionAutoConfigurationTests { @Container - static final MongoDBContainer mongoDB = new MongoDBContainer().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(5)); + static final MongoDBContainer mongoDB = new MongoDBContainer(DockerImageNames.mongo().toString()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(5)); private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() .withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java index 3e2af399898..c621d2e0e7a 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java @@ -25,6 +25,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.ApplicationContext; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.context.DynamicPropertyRegistry; @@ -43,8 +44,8 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; class DataMongoTestIntegrationTests { @Container - static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(5)); + static final MongoDBContainer mongoDB = new MongoDBContainer(DockerImageNames.mongo().toString()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(5)); @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java index e2b948c86f2..d2526ee8efd 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java @@ -24,6 +24,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; @@ -40,8 +41,8 @@ import static org.assertj.core.api.Assertions.assertThat; class DataMongoTestReactiveIntegrationTests { @Container - static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(5)); + static final MongoDBContainer mongoDB = new MongoDBContainer(DockerImageNames.mongo().toString()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(5)); @Autowired private ReactiveMongoTemplate mongoTemplate; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java index bf3826564f0..07fca15c195 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java @@ -24,6 +24,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Service; import org.springframework.test.context.DynamicPropertyRegistry; @@ -41,8 +42,8 @@ import static org.assertj.core.api.Assertions.assertThat; class DataMongoTestWithIncludeFilterIntegrationTests { @Container - static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(5)); + static final MongoDBContainer mongoDB = new MongoDBContainer(DockerImageNames.mongo().toString()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(5)); @Autowired private ExampleService service; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java index bb57a8a9dc2..cb705c71c12 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java @@ -26,6 +26,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.Bean; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.MongoTransactionManager; @@ -47,8 +48,8 @@ import static org.assertj.core.api.Assertions.assertThat; class TransactionalDataMongoTestIntegrationTests { @Container - static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(5)); + static final MongoDBContainer mongoDB = new MongoDBContainer(DockerImageNames.mongo().toString()) + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(5)); @Autowired private ExampleRepository exampleRepository; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java index 90f06dc0402..5d450fddd9a 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java @@ -26,6 +26,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.ApplicationContext; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; @@ -45,8 +46,8 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; class DataNeo4jTestIntegrationTests { @Container - static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication() - .withStartupTimeout(Duration.ofMinutes(10)); + static final Neo4jContainer neo4j = new Neo4jContainer<>(DockerImageNames.neo4j().toString()) + .withoutAuthentication().withStartupTimeout(Duration.ofMinutes(10)); @Autowired private Session session; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java index cd9c80a3b8e..61567a3513d 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java @@ -24,6 +24,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.core.env.Environment; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; @@ -41,8 +42,8 @@ import static org.assertj.core.api.Assertions.assertThat; class DataNeo4jTestPropertiesIntegrationTests { @Container - static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication() - .withStartupTimeout(Duration.ofMinutes(10)); + static final Neo4jContainer neo4j = new Neo4jContainer<>(DockerImageNames.neo4j().toString()) + .withoutAuthentication().withStartupTimeout(Duration.ofMinutes(10)); @Autowired private Environment environment; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java index 7533e60b525..e7aa66bdaa8 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java @@ -24,6 +24,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Service; import org.springframework.test.context.DynamicPropertyRegistry; @@ -42,8 +43,8 @@ import static org.assertj.core.api.Assertions.assertThat; class DataNeo4jTestWithIncludeFilterIntegrationTests { @Container - static final Neo4jContainer neo4j = new Neo4jContainer<>().withoutAuthentication() - .withStartupTimeout(Duration.ofMinutes(10)); + static final Neo4jContainer neo4j = new Neo4jContainer<>(DockerImageNames.neo4j().toString()) + .withoutAuthentication().withStartupTimeout(Duration.ofMinutes(10)); @Autowired private ExampleService service; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle index 7985225b9bc..9a1093a81ff 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle @@ -11,6 +11,7 @@ dependencies { compileOnly("com.datastax.oss:java-driver-core") compileOnly("javax.servlet:javax.servlet-api") compileOnly("junit:junit") + compileOnly("org.elasticsearch:elasticsearch") compileOnly("org.junit.jupiter:junit-jupiter") compileOnly("org.junit.platform:junit-platform-engine") compileOnly("org.mockito:mockito-core") diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java new file mode 100644 index 00000000000..3acdaf6afc2 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/DockerImageNames.java @@ -0,0 +1,102 @@ +/* + * Copyright 2012-2020 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.boot.testsupport.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +/** + * Create {@link DockerImageName} instances for services used in integration tests. + * + * @author Stephane Nicoll + * @since 2.3.6 + */ +public final class DockerImageNames { + + private static final String CASSANDRA_VERSION = "3.11.2"; + + private static final String COUCHBASE_VERSION = "6.5.1"; + + private static final String MONGO_VERSION = "4.0.10"; + + private static final String NEO4J_VERSION = "3.5.0"; + + private static final String POSTGRESQL_VERSION = "9.6.12"; + + private static final String REDIS_VERSION = "4.0.6"; + + private DockerImageNames() { + } + + /** + * Return a {@link DockerImageName} suitable for running Cassandra. + * @return a docker image name for running cassandra + */ + public static DockerImageName cassandra() { + return new DockerImageName("cassandra", CASSANDRA_VERSION); + } + + /** + * Return a {@link DockerImageName} suitable for running Cassandra. + * @return a docker image name for running cassandra + */ + public static DockerImageName couchbase() { + return new DockerImageName("couchbase/server", COUCHBASE_VERSION); + } + + /** + * Return a {@link DockerImageName} suitable for running Elasticsearch according to + * the version available on the classpath. + * @return a docker image name for running elasticsearch + */ + public static DockerImageName elasticsearch() { + String version = org.elasticsearch.Version.CURRENT.toString(); + return new DockerImageName("docker.elastic.co/elasticsearch/elasticsearch", version); + } + + /** + * Return a {@link DockerImageName} suitable for running Mongo. + * @return a docker image name for running mongo + */ + public static DockerImageName mongo() { + return new DockerImageName("mongo", MONGO_VERSION); + } + + /** + * Return a {@link DockerImageName} suitable for running Neo4j. + * @return a docker image name for running neo4j + */ + public static DockerImageName neo4j() { + return new DockerImageName("neo4j", NEO4J_VERSION); + } + + /** + * Return a {@link DockerImageName} suitable for running PostgreSQL. + * @return a docker image name for running postgresql + */ + public static DockerImageName postgresql() { + return new DockerImageName("postgres", POSTGRESQL_VERSION); + } + + /** + * Return a {@link DockerImageName} suitable for running Redis. + * @return a docker image name for running redis + */ + public static DockerImageName redis() { + return new DockerImageName("redis", REDIS_VERSION); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/RedisContainer.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/RedisContainer.java index 24cb1d84c15..c354d548359 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/RedisContainer.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/testcontainers/RedisContainer.java @@ -28,7 +28,7 @@ import org.testcontainers.containers.GenericContainer; public class RedisContainer extends GenericContainer { public RedisContainer() { - super("redis:4.0.6"); + super(DockerImageNames.redis().toString()); addExposedPorts(6379); } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/build.gradle index 67f7746d97f..020bb3e9d9c 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/build.gradle +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/build.gradle @@ -17,6 +17,7 @@ dependencies { runtimeOnly("org.springframework:spring-jdbc") testImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-test")) + testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) testImplementation("io.projectreactor:reactor-test") testImplementation("org.testcontainers:junit-jupiter") testImplementation("org.testcontainers:postgresql") diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java index 91be5af5d76..ea8ef50c6f2 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-flyway/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java @@ -24,6 +24,7 @@ import reactor.test.StepVerifier; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.r2dbc.DataR2dbcTest; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; @@ -37,7 +38,8 @@ import static org.assertj.core.api.Assertions.assertThat; class CityRepositoryTests { @Container - static PostgreSQLContainer postgresql = new PostgreSQLContainer<>().withDatabaseName("test_flyway"); + static PostgreSQLContainer postgresql = new PostgreSQLContainer<>(DockerImageNames.postgresql().toString()) + .withDatabaseName("test_flyway"); @DynamicPropertySource static void postgresqlProperties(DynamicPropertyRegistry registry) { diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/build.gradle index ac107b3e457..b5decbc7adb 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/build.gradle +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/build.gradle @@ -17,6 +17,7 @@ dependencies { runtimeOnly("org.springframework:spring-jdbc") testImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-test")) + testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) testImplementation("io.projectreactor:reactor-test") testImplementation("org.testcontainers:junit-jupiter") testImplementation("org.testcontainers:postgresql") diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java index f54abf92d6a..8e9525df7a9 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-r2dbc-liquibase/src/test/java/smoketest/data/r2dbc/CityRepositoryTests.java @@ -24,6 +24,7 @@ import reactor.test.StepVerifier; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.r2dbc.DataR2dbcTest; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; @@ -37,7 +38,8 @@ import static org.assertj.core.api.Assertions.assertThat; class CityRepositoryTests { @Container - static PostgreSQLContainer postgresql = new PostgreSQLContainer<>().withDatabaseName("test_liquibase"); + static PostgreSQLContainer postgresql = new PostgreSQLContainer<>(DockerImageNames.postgresql().toString()) + .withDatabaseName("test_liquibase"); @DynamicPropertySource static void postgresqlProperties(DynamicPropertyRegistry registry) {