From d051146eb4451f999143733532176b7b7039acba Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 13 Jan 2022 11:23:32 +0000 Subject: [PATCH] Use Testcontainers instead on Embedded Mongo We've seen some problems, particularly on CI, where Embedded Mongo hangs while trying to start the Mongo process. To limit the problem, this commit replaces the use of Embedded Mongo with Testcontainers where we can, leaving Embedded Mongo in use only where we're specifically testing our Embedded Mongo support. Closes gh-28843 --- ...iveSessionAutoConfigurationMongoTests.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java index fe221ebebd2c..0b8549675da0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/ReactiveSessionAutoConfigurationMongoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * 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. @@ -16,18 +16,23 @@ package org.springframework.boot.autoconfigure.session; +import java.time.Duration; + import org.junit.jupiter.api.Test; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; -import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; +import org.springframework.boot.testsupport.testcontainers.DockerImageNames; import org.springframework.session.data.mongo.ReactiveMongoSessionRepository; import org.springframework.session.data.redis.ReactiveRedisSessionRepository; @@ -38,16 +43,22 @@ * * @author Andy Wilkinson */ +@Testcontainers class ReactiveSessionAutoConfigurationMongoTests extends AbstractSessionAutoConfigurationTests { + @Container + static final MongoDBContainer mongoDb = new MongoDBContainer(DockerImageNames.mongo()).withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(5)); + private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner() .withConfiguration(AutoConfigurations.of(SessionAutoConfiguration.class)); @Test void defaultConfig() { - this.contextRunner.withPropertyValues("spring.session.store-type=mongodb") - .withConfiguration(AutoConfigurations.of(EmbeddedMongoAutoConfiguration.class, - MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, + this.contextRunner + .withPropertyValues("spring.session.store-type=mongodb", + "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + .withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class)) .run(validateSpringSessionUsesMongo("sessions")); } @@ -55,17 +66,18 @@ void defaultConfig() { @Test void defaultConfigWithUniqueStoreImplementation() { this.contextRunner.withClassLoader(new FilteredClassLoader(ReactiveRedisSessionRepository.class)) - .withConfiguration(AutoConfigurations.of(EmbeddedMongoAutoConfiguration.class, - MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, + .withPropertyValues("spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + .withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class)) .run(validateSpringSessionUsesMongo("sessions")); } @Test void defaultConfigWithCustomTimeout() { - this.contextRunner.withPropertyValues("spring.session.store-type=mongodb", "spring.session.timeout=1m") - .withConfiguration(AutoConfigurations.of(EmbeddedMongoAutoConfiguration.class, - MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, + this.contextRunner + .withPropertyValues("spring.session.store-type=mongodb", "spring.session.timeout=1m", + "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + .withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class)) .run((context) -> { ReactiveMongoSessionRepository repository = validateSessionRepository(context, @@ -77,10 +89,10 @@ void defaultConfigWithCustomTimeout() { @Test void mongoSessionStoreWithCustomizations() { this.contextRunner - .withConfiguration(AutoConfigurations.of(EmbeddedMongoAutoConfiguration.class, - MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, + .withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class)) - .withPropertyValues("spring.session.store-type=mongodb", "spring.session.mongodb.collection-name=foo") + .withPropertyValues("spring.session.store-type=mongodb", "spring.session.mongodb.collection-name=foo", + "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) .run(validateSpringSessionUsesMongo("foo")); }