From fae596ebe9358c5f73731fb35aa9dd192adc2fe3 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:15:26 +0200 Subject: [PATCH 01/14] added basic support for reusable --- .../MSSQLServerContainerInitializer.java | 48 +++++++++++-------- .../MSSQLServerContainerReusableTest.java | 31 ++++++++++++ .../test/resources/application-reusable.yaml | 5 ++ .../testcontainers/InitializerBase.java | 17 +++++-- pom.xml | 2 +- 5 files changed, 78 insertions(+), 25 deletions(-) create mode 100644 infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java create mode 100644 infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java index 751beb4..478d0d9 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java @@ -15,6 +15,7 @@ import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Environment; +import org.testcontainers.utility.TestcontainersConfiguration; public class MSSQLServerContainerInitializer extends InitializerBase { @@ -24,41 +25,45 @@ public class MSSQLServerContainerInitializer extends InitializerBase urlPropertyNames = getUrlPropertyNames(environment); - Map urlPropertyNameToValue = getUrlPropertyNameToValue(environment, urlPropertyNames); + var environment = applicationContext.getEnvironment(); + var urlPropertyNames = getUrlPropertyNames(environment); + var urlPropertyNameToValue = getUrlPropertyNameToValue(environment, urlPropertyNames); - MSSQLServerContainerWrapper container = Optional.ofNullable( - environment.getProperty("testcontainers.mssql.docker.image")) - .map(MSSQLServerContainerWrapper::new) - .orElseGet(MSSQLServerContainerWrapper::new); + var container = handleReusable(environment, + Optional.ofNullable(environment.getProperty("testcontainers.mssql.docker.image")) + .map(MSSQLServerContainerWrapper::new) + .orElseGet(MSSQLServerContainerWrapper::new)); - Optional initScript = Optional.ofNullable( - environment.getProperty("testcontainers.mssql.init-script")).map(container::withInitScript); + var initScript = Optional.ofNullable(environment.getProperty("testcontainers.mssql.init-script")) + .map(container::withInitScript); resolveStaticPort(urlPropertyNameToValue.values(), GENERIC_URL_WITH_PORT_GROUP_PATTERN) - .ifPresent(staticPort -> bindPort(container, staticPort, MS_SQL_SERVER_PORT)); + .ifPresent(staticPort -> bindPort(container, staticPort, MS_SQL_SERVER_PORT)); start(container); - Map replacedNameToValue = replaceHostAndPort(urlPropertyNameToValue, container); - Map testPropertyValues = addMissingUsernameAndPassword(replacedNameToValue, container); - TestPropertyValues values = TestPropertyValues.of(testPropertyValues); + var replacedNameToValue = replaceHostAndPort(urlPropertyNameToValue, container); + var testPropertyValues = addMissingUsernameAndPassword(replacedNameToValue, container); + var values = TestPropertyValues.of(testPropertyValues); values.applyTo(applicationContext); if (initScript.isEmpty()) { - String url = replacedNameToValue.getOrDefault("spring.datasource.url", replacedNameToValue.get("spring.flyway.url")); + String url = replacedNameToValue.getOrDefault("spring.datasource.url", + replacedNameToValue.get("spring.flyway.url")); DatabaseCreator creator = new DatabaseCreator(url, container.getUsername(), container.getPassword()); creator.createDatabaseIfItDoesNotExist(); } + + applicationContext.getBeanFactory() + .registerSingleton(MSSQLServerContainerWrapper.class.getSimpleName(), container); } private List getUrlPropertyNames(Environment environment) { - String name = environment.getProperty("testcontainers.mssql.datasource.url.property.name"); + var name = environment.getProperty("testcontainers.mssql.datasource.url.property.name"); if (Objects.nonNull(name)) { return Collections.singletonList(name); } - String[] names = environment.getProperty("testcontainers.mssql.datasource.url.property.names", String[].class); + var names = environment.getProperty("testcontainers.mssql.datasource.url.property.names", String[].class); if (Objects.nonNull(names)) { return Arrays.asList(names); } @@ -84,15 +89,17 @@ private Map replaceHostAndPort(Map urlPropertyNa return urlPropertyNameToValue.entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getKey, - entry -> replaceHostAndPortPlaceholders(entry.getValue(), container, MS_SQL_SERVER_PORT))); + entry -> replaceHostAndPortPlaceholders(entry.getValue(), + container, + MS_SQL_SERVER_PORT))); } private Map addMissingUsernameAndPassword(Map urlPropertyNameToValue, MSSQLServerContainerWrapper container) { - String username = container.getUsername(); - String password = container.getPassword(); + var username = container.getUsername(); + var password = container.getPassword(); - Map testPropertyValues = new HashMap<>(urlPropertyNameToValue); + var testPropertyValues = new HashMap<>(urlPropertyNameToValue); for (Map.Entry entry : urlPropertyNameToValue.entrySet()) { String name = entry.getKey(); if (DEFAULT_PROPERTY_NAMES.contains(name)) { @@ -103,5 +110,4 @@ private Map addMissingUsernameAndPassword(Map ur } return testPropertyValues; } - } diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java new file mode 100644 index 0000000..ccef4c5 --- /dev/null +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java @@ -0,0 +1,31 @@ +package com.infobip.testcontainers.spring.mssql; + +import lombok.AllArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; + +import static org.assertj.core.api.BDDAssertions.then; + +@AllArgsConstructor +@ActiveProfiles("reusable") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class MSSQLServerContainerReusableTest { + + private final MSSQLServerContainerWrapper mSSQLServerContainerWrapper; + + @Test + void shouldCreateContainer() { + // given + var mssqlServerContainerWrapper = new MSSQLServerContainerWrapper(); + mssqlServerContainerWrapper.withReuse(true); + + // when + mssqlServerContainerWrapper.start(); + + // then + then(mssqlServerContainerWrapper.getMappedPort(1433)).isEqualTo(mSSQLServerContainerWrapper.getMappedPort(1433)); + } +} diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml new file mode 100644 index 0000000..a547dc5 --- /dev/null +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -0,0 +1,5 @@ +spring: + datasource: + url: jdbc:sqlserver://:;database=MicrosoftDriverTestDatabase;trustServerCertificate=true + +testcontainers.reuse.enable: true \ No newline at end of file diff --git a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java index ab8662b..84b0c80 100644 --- a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java +++ b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java @@ -1,8 +1,6 @@ package com.infobip.testcontainers; -import java.util.Collection; -import java.util.Collections; -import java.util.Optional; +import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -11,8 +9,11 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.event.ContextClosedEvent; +import org.springframework.core.env.Environment; import org.testcontainers.containers.Container; +import org.testcontainers.containers.GenericContainer; import org.testcontainers.lifecycle.Startable; +import org.testcontainers.utility.TestcontainersConfiguration; public abstract class InitializerBase implements ApplicationContextInitializer, ApplicationListener { @@ -61,4 +62,14 @@ protected void bindPort(Container container, Integer hostPort, Integer contai container.setPortBindings(Collections.singletonList(hostPort + ":" + containerPort)); } + protected > T handleReusable(Environment environment, T container) { + + if(Objects.equals(environment.getProperty("testcontainers.reuse.enable"), "true")) { + TestcontainersConfiguration.getInstance().updateUserConfig("testcontainers.reuse.enable", "true"); + return container.withReuse(true); + } + + return container; + } + } diff --git a/pom.xml b/pom.xml index b4fbb71..db3d549 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ - 3.1.0 + 3.1.2 1.18.3 From 26cfd0d5ddb9c92b0a80e70223d74753c8622d75 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:17:20 +0200 Subject: [PATCH 02/14] bumped minor --- infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml | 2 +- infobip-kafka-testcontainers-spring-boot-starter/pom.xml | 2 +- infobip-mssql-testcontainers-spring-boot-starter/pom.xml | 2 +- infobip-postgresql-testcontainers-spring-boot-starter/pom.xml | 2 +- infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml | 2 +- infobip-redis-testcontainers-spring-boot-starter/pom.xml | 2 +- infobip-testcontainers-common/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml b/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml index 18f8d1f..d6ddca9 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-clickhouse-testcontainers-spring-boot-starter diff --git a/infobip-kafka-testcontainers-spring-boot-starter/pom.xml b/infobip-kafka-testcontainers-spring-boot-starter/pom.xml index 5fe65b1..e770a81 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-kafka-testcontainers-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-kafka-testcontainers-spring-boot-starter diff --git a/infobip-mssql-testcontainers-spring-boot-starter/pom.xml b/infobip-mssql-testcontainers-spring-boot-starter/pom.xml index 41a8cd3..8cb12d9 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-mssql-testcontainers-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-mssql-testcontainers-spring-boot-starter diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml b/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml index bebba1b..fb024bc 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-postgresql-testcontainers-spring-boot-starter diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml b/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml index b2eabc6..5afc140 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-rabbitmq-testcontainers-spring-boot-starter diff --git a/infobip-redis-testcontainers-spring-boot-starter/pom.xml b/infobip-redis-testcontainers-spring-boot-starter/pom.xml index 78eaa2d..e94b32e 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-redis-testcontainers-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-redis-testcontainers-spring-boot-starter diff --git a/infobip-testcontainers-common/pom.xml b/infobip-testcontainers-common/pom.xml index 3049236..2bce484 100644 --- a/infobip-testcontainers-common/pom.xml +++ b/infobip-testcontainers-common/pom.xml @@ -4,7 +4,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT infobip-testcontainers-common diff --git a/pom.xml b/pom.xml index db3d549..5b9e9e5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.infobip infobip-testcontainers-spring-boot-starter - 4.1.1-SNAPSHOT + 4.2.0-SNAPSHOT pom Infobip TestContainers Spring Boot Starter From 00903db3babcc570148fcb532b4350a516a3de77 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:17:51 +0200 Subject: [PATCH 03/14] bumped gpg plugin --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5b9e9e5..5469595 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ 3.8.1 4.3.0 0.8.10 - 3.0.1 + 3.1.0 3.1.1 3.1.0 3.1.0 From 2e3e9108a246dd2f35de4cec522e0e07e734c0ba Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:18:18 +0200 Subject: [PATCH 04/14] bumped plugins --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5469595..635dd80 100644 --- a/pom.xml +++ b/pom.xml @@ -93,9 +93,9 @@ 4.3.0 0.8.10 3.1.0 - 3.1.1 - 3.1.0 - 3.1.0 + 3.3.0 + 3.1.2 + 3.1.2 UTF-8 From bd8df2f2b59b5e7419bd172115642e4f294051b4 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:36:13 +0200 Subject: [PATCH 05/14] added common infrastructure for reuse added clickhouse support --- .../ClickhouseContainerInitializer.java | 21 +++++++----- ...eContainerInitializerWithReusableTest.java | 34 +++++++++++++++++++ .../test/resources/application-reusable.yaml | 10 ++++++ .../MSSQLServerContainerInitializer.java | 3 +- ...ContainerInitializerWithReusableTest.java} | 16 +++++---- .../testcontainers/InitializerBase.java | 12 +++++-- 6 files changed, 76 insertions(+), 20 deletions(-) create mode 100644 infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java create mode 100644 infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml rename infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/{MSSQLServerContainerReusableTest.java => MSSQLServerContainerInitializerWithReusableTest.java} (53%) diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java index c3324d1..7a53dc7 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java @@ -13,18 +13,22 @@ public class ClickhouseContainerInitializer extends InitializerBase customPropertyPath = Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.custom-path")); + Optional customPropertyPath = Optional.ofNullable( + environment.getProperty("testcontainers.clickhouse.custom-path")); String jdbcUrlPropertyPath = customPropertyPath.orElse("spring.datasource") + ".jdbc-url"; String jdbcUrlValue = Objects.requireNonNull(environment.getProperty(jdbcUrlPropertyPath)); - ClickhouseContainerWrapper container = Optional.ofNullable( - environment.getProperty("testcontainers.clickhouse.docker.image.version")) - .map(ClickhouseContainerWrapper::new) - .orElseGet(ClickhouseContainerWrapper::new); + ClickhouseContainerWrapper container = (ClickhouseContainerWrapper) handleReusable(environment, + Optional.ofNullable( + environment.getProperty( + "testcontainers.clickhouse.docker.image.version")) + .map(ClickhouseContainerWrapper::new) + .orElseGet(ClickhouseContainerWrapper::new)); - Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.init-script")).ifPresent(container::withInitScript); + Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.init-script")) + .ifPresent(container::withInitScript); resolveStaticPort(jdbcUrlValue, GENERIC_URL_WITH_PORT_GROUP_PATTERN) - .ifPresent(staticPort -> bindPort(container, staticPort, ClickhouseContainerWrapper.HTTP_PORT)); + .ifPresent(staticPort -> bindPort(container, staticPort, ClickhouseContainerWrapper.HTTP_PORT)); start(container); @@ -32,6 +36,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { TestPropertyValues values = TestPropertyValues.of(String.format("%s=%s", jdbcUrlPropertyPath, url)); values.applyTo(applicationContext); - } + registerContainerAsBean(applicationContext); + } } diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java new file mode 100644 index 0000000..bfc6dc8 --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java @@ -0,0 +1,34 @@ +package com.infobip.testcontainers.spring.clickhouse; + +import lombok.AllArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; +import org.testcontainers.containers.ClickHouseContainer; + +import static org.assertj.core.api.BDDAssertions.then; + +@AllArgsConstructor +@ActiveProfiles("reusable") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class ClickhouseContainerInitializerWithReusableTest { + + private final ClickhouseContainerWrapper clickhouseContainerWrapper; + private final int port = ClickHouseContainer.NATIVE_PORT; + + @Test + void shouldReuseContainer() { + // given + var givenContainer = new ClickhouseContainerWrapper(); + givenContainer.withReuse(true); + + // when + givenContainer.start(); + + // then + then(givenContainer.getMappedPort(port)).isEqualTo(clickhouseContainerWrapper.getMappedPort(port)); + } + +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml new file mode 100644 index 0000000..b6dffb3 --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -0,0 +1,10 @@ +spring: + datasource: + clickhouse: + jdbc-url: jdbc:clickhouse://: + +testcontainers: + clickhouse: + custom-path: "spring.datasource.clickhouse" + +testcontainers.reuse.enable: true diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java index 478d0d9..cc64b92 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java @@ -53,8 +53,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { creator.createDatabaseIfItDoesNotExist(); } - applicationContext.getBeanFactory() - .registerSingleton(MSSQLServerContainerWrapper.class.getSimpleName(), container); + registerContainerAsBean(applicationContext); } private List getUrlPropertyNames(Environment environment) { diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java similarity index 53% rename from infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java rename to infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java index ccef4c5..e783743 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerReusableTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java @@ -5,6 +5,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestConstructor; +import org.testcontainers.containers.MSSQLServerContainer; import static org.assertj.core.api.BDDAssertions.then; @@ -12,20 +13,21 @@ @ActiveProfiles("reusable") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class MSSQLServerContainerReusableTest { +class MSSQLServerContainerInitializerWithReusableTest { - private final MSSQLServerContainerWrapper mSSQLServerContainerWrapper; + private final MSSQLServerContainerWrapper container; + private final int port = MSSQLServerContainer.MS_SQL_SERVER_PORT; @Test - void shouldCreateContainer() { + void shouldReuseContainer() { // given - var mssqlServerContainerWrapper = new MSSQLServerContainerWrapper(); - mssqlServerContainerWrapper.withReuse(true); + var givenContainer = new MSSQLServerContainerWrapper(); + givenContainer.withReuse(true); // when - mssqlServerContainerWrapper.start(); + givenContainer.start(); // then - then(mssqlServerContainerWrapper.getMappedPort(1433)).isEqualTo(mSSQLServerContainerWrapper.getMappedPort(1433)); + then(givenContainer.getMappedPort(port)).isEqualTo(container.getMappedPort(port)); } } diff --git a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java index 84b0c80..377b1e7 100644 --- a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java +++ b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java @@ -5,9 +5,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ApplicationListener; -import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.*; import org.springframework.context.event.ContextClosedEvent; import org.springframework.core.env.Environment; import org.testcontainers.containers.Container; @@ -72,4 +70,12 @@ protected > T handleReusable(Environment environme return container; } + protected void registerContainerAsBean(ConfigurableApplicationContext applicationContext) { + var c = container.get(); + var containerClassName = c.getClass().getSimpleName(); + var beanName = Character.toLowerCase(containerClassName.charAt(0)) + containerClassName.substring(1); + applicationContext.getBeanFactory() + .registerSingleton(beanName, c); + } + } From 3d8b3281a3883512bbe8bbc0c4fc857be35af706 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:53:20 +0200 Subject: [PATCH 06/14] added kafka reusable support --- .../ClickhouseContainerInitializer.java | 30 +++---- ...eContainerInitializerWithReusableTest.java | 4 +- .../kafka/KafkaContainerInitializer.java | 83 +++++++++++-------- ...aContainerInitializerWithReusableTest.java | 35 ++++++++ .../test/resources/application-reusable.yaml | 10 +++ .../MSSQLServerContainerInitializer.java | 11 ++- ...rContainerInitializerWithReusableTest.java | 4 +- .../testcontainers/InitializerBase.java | 4 +- 8 files changed, 118 insertions(+), 63 deletions(-) create mode 100644 infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java create mode 100644 infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java index 7a53dc7..38e5a32 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java @@ -1,28 +1,24 @@ package com.infobip.testcontainers.spring.clickhouse; -import java.util.Objects; -import java.util.Optional; - import com.infobip.testcontainers.InitializerBase; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.Environment; + +import java.util.Objects; +import java.util.Optional; public class ClickhouseContainerInitializer extends InitializerBase { @Override public void initialize(ConfigurableApplicationContext applicationContext) { - Environment environment = applicationContext.getEnvironment(); - Optional customPropertyPath = Optional.ofNullable( - environment.getProperty("testcontainers.clickhouse.custom-path")); - String jdbcUrlPropertyPath = customPropertyPath.orElse("spring.datasource") + ".jdbc-url"; - String jdbcUrlValue = Objects.requireNonNull(environment.getProperty(jdbcUrlPropertyPath)); - ClickhouseContainerWrapper container = (ClickhouseContainerWrapper) handleReusable(environment, - Optional.ofNullable( - environment.getProperty( - "testcontainers.clickhouse.docker.image.version")) - .map(ClickhouseContainerWrapper::new) - .orElseGet(ClickhouseContainerWrapper::new)); + var environment = applicationContext.getEnvironment(); + var customPropertyPath = Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.custom-path")); + var jdbcUrlPropertyPath = customPropertyPath.orElse("spring.datasource") + ".jdbc-url"; + var jdbcUrlValue = Objects.requireNonNull(environment.getProperty(jdbcUrlPropertyPath)); + var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.docker.image.version")) + .map(ClickhouseContainerWrapper::new) + .orElseGet(ClickhouseContainerWrapper::new); + var container = handleReusable(environment, wrapper); Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.init-script")) .ifPresent(container::withInitScript); @@ -32,9 +28,9 @@ public void initialize(ConfigurableApplicationContext applicationContext) { start(container); - String url = replaceHostAndPortPlaceholders(jdbcUrlValue, container, ClickhouseContainerWrapper.HTTP_PORT); + var url = replaceHostAndPortPlaceholders(jdbcUrlValue, container, ClickhouseContainerWrapper.HTTP_PORT); - TestPropertyValues values = TestPropertyValues.of(String.format("%s=%s", jdbcUrlPropertyPath, url)); + var values = TestPropertyValues.of(String.format("%s=%s", jdbcUrlPropertyPath, url)); values.applyTo(applicationContext); registerContainerAsBean(applicationContext); diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java index bfc6dc8..458c886 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java @@ -15,7 +15,7 @@ @SpringBootTest(classes = Main.class) class ClickhouseContainerInitializerWithReusableTest { - private final ClickhouseContainerWrapper clickhouseContainerWrapper; + private final ClickhouseContainerWrapper wrapper; private final int port = ClickHouseContainer.NATIVE_PORT; @Test @@ -28,7 +28,7 @@ void shouldReuseContainer() { givenContainer.start(); // then - then(givenContainer.getMappedPort(port)).isEqualTo(clickhouseContainerWrapper.getMappedPort(port)); + then(givenContainer.getMappedPort(port)).isEqualTo(wrapper.getMappedPort(port)); } } diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java index 615c5af..1e13eaf 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java @@ -1,23 +1,19 @@ package com.infobip.testcontainers.spring.kafka; -import static java.lang.Integer.parseInt; -import static java.lang.Short.parseShort; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import com.infobip.testcontainers.InitializerBase; import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.NewTopic; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.Environment; + +import java.util.*; +import java.util.concurrent.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.lang.Integer.parseInt; +import static java.lang.Short.parseShort; public class KafkaContainerInitializer extends InitializerBase { @@ -25,42 +21,61 @@ public class KafkaContainerInitializer extends InitializerBase bindPort(container, staticPort, KafkaContainerWrapper.KAFKA_PORT)); + .ifPresent(staticPort -> bindPort(container, staticPort, KafkaContainerWrapper.KAFKA_PORT)); start(container); - String url = replaceHostAndPortPlaceholders(bootstrapServers, container, KafkaContainerWrapper.KAFKA_PORT); + var url = replaceHostAndPortPlaceholders(bootstrapServers, container, KafkaContainerWrapper.KAFKA_PORT); Optional.ofNullable(environment.getProperty("testcontainers.kafka.topics", String[].class)) .ifPresent(topics -> createTestKafkaTopics(url, topics)); - TestPropertyValues values = TestPropertyValues.of( - "spring.kafka.bootstrap-servers=" + url); + var values = TestPropertyValues.of( + "spring.kafka.bootstrap-servers=" + url); values.applyTo(applicationContext); + + registerContainerAsBean(applicationContext); } private static void createTestKafkaTopics(String bootstrapServers, String[] topics) { - List newTopics = Stream.of(topics) - .map(topic -> topic.split(":")) - .map(topicParts -> new NewTopic(topicParts[0], parseInt(topicParts[1]), - parseShort(topicParts[2]))) - .collect(Collectors.toList()); - - try { - AdminClient.create(Collections.singletonMap("bootstrap.servers", bootstrapServers)) - .createTopics(newTopics) - .all() - .get(60, TimeUnit.SECONDS); + try (var client = AdminClient.create(Collections.singletonMap("bootstrap.servers", bootstrapServers))) { + deleteTopics(client, topics); + createTopics(client, topics); } catch (Exception e) { throw new RuntimeException(e); } } + private static void deleteTopics(AdminClient client, String[] topics) throws InterruptedException, + ExecutionException, TimeoutException { + var existingTopics = client.listTopics().names().get(60, TimeUnit.SECONDS); + var deleteTopics = Stream.of(topics) + .map(topic -> topic.split(":")) + .map(topicParts -> topicParts[0]) + .filter(existingTopics::contains) + .collect(Collectors.toList()); + client.deleteTopics(deleteTopics) + .all() + .get(60, TimeUnit.SECONDS); + } + + private static void createTopics(AdminClient client, String[] topics) throws InterruptedException, + ExecutionException, TimeoutException { + var newTopics = Stream.of(topics) + .map(topic -> topic.split(":")) + .map(topicParts -> new NewTopic(topicParts[0], parseInt(topicParts[1]), + parseShort(topicParts[2]))) + .collect(Collectors.toList()); + + client.createTopics(newTopics) + .all() + .get(60, TimeUnit.SECONDS); + } } diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java new file mode 100644 index 0000000..e2a460b --- /dev/null +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java @@ -0,0 +1,35 @@ +package com.infobip.testcontainers.spring.kafka; + +import lombok.AllArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; +import org.testcontainers.containers.KafkaContainer; + +import static org.assertj.core.api.BDDAssertions.then; +import static org.awaitility.Awaitility.await; + +@AllArgsConstructor +@ActiveProfiles("reusable") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class KafkaContainerInitializerWithReusableTest { + + private final KafkaContainerWrapper wrapper; + private final int port = KafkaContainer.KAFKA_PORT; + + @Test + void shouldReuseContainer() { + // given + var givenContainer = new KafkaContainerWrapper(); + givenContainer.withReuse(true); + + // when + givenContainer.start(); + + // then + then(givenContainer.getMappedPort(port)).isEqualTo(wrapper.getMappedPort(port)); + } + +} diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml new file mode 100644 index 0000000..640916e --- /dev/null +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -0,0 +1,10 @@ +spring: + kafka: + consumer: + groupId: test + autoOffsetReset: earliest + bootstrap-servers: : + +testcontainers.kafka.topics: test-topic:1:1 + +testcontainers.reuse.enable: true diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java index cc64b92..dcbcb6a 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java @@ -28,11 +28,10 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var environment = applicationContext.getEnvironment(); var urlPropertyNames = getUrlPropertyNames(environment); var urlPropertyNameToValue = getUrlPropertyNameToValue(environment, urlPropertyNames); - - var container = handleReusable(environment, - Optional.ofNullable(environment.getProperty("testcontainers.mssql.docker.image")) - .map(MSSQLServerContainerWrapper::new) - .orElseGet(MSSQLServerContainerWrapper::new)); + var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.mssql.docker.image")) + .map(MSSQLServerContainerWrapper::new) + .orElseGet(MSSQLServerContainerWrapper::new); + var container = handleReusable(environment, wrapper); var initScript = Optional.ofNullable(environment.getProperty("testcontainers.mssql.init-script")) .map(container::withInitScript); @@ -99,7 +98,7 @@ private Map addMissingUsernameAndPassword(Map ur var password = container.getPassword(); var testPropertyValues = new HashMap<>(urlPropertyNameToValue); - for (Map.Entry entry : urlPropertyNameToValue.entrySet()) { + for (var entry : urlPropertyNameToValue.entrySet()) { String name = entry.getKey(); if (DEFAULT_PROPERTY_NAMES.contains(name)) { String root = name.substring(0, name.indexOf(".url")); diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java index e783743..673ca6c 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java @@ -15,7 +15,7 @@ @SpringBootTest(classes = Main.class) class MSSQLServerContainerInitializerWithReusableTest { - private final MSSQLServerContainerWrapper container; + private final MSSQLServerContainerWrapper wrapper; private final int port = MSSQLServerContainer.MS_SQL_SERVER_PORT; @Test @@ -28,6 +28,6 @@ void shouldReuseContainer() { givenContainer.start(); // then - then(givenContainer.getMappedPort(port)).isEqualTo(container.getMappedPort(port)); + then(givenContainer.getMappedPort(port)).isEqualTo(wrapper.getMappedPort(port)); } } diff --git a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java index 377b1e7..1616d2c 100644 --- a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java +++ b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java @@ -60,11 +60,11 @@ protected void bindPort(Container container, Integer hostPort, Integer contai container.setPortBindings(Collections.singletonList(hostPort + ":" + containerPort)); } - protected > T handleReusable(Environment environment, T container) { + protected , T extends GenericContainer> T handleReusable(Environment environment, T container) { if(Objects.equals(environment.getProperty("testcontainers.reuse.enable"), "true")) { TestcontainersConfiguration.getInstance().updateUserConfig("testcontainers.reuse.enable", "true"); - return container.withReuse(true); + container.withReuse(true); } return container; From f769af902903a3e942b0cf3b2361a2aa442cef7f Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 13:58:47 +0200 Subject: [PATCH 07/14] added reusable postgresql support --- .../PostgreSQLContainerInitializer.java | 36 +++++++++-------- ...LContainerInitializerWithReusableTest.java | 39 +++++++++++++++++++ .../test/resources/application-reusable.yaml | 7 ++++ 3 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java create mode 100644 infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java index 472096c..2216d05 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java @@ -1,43 +1,45 @@ package com.infobip.testcontainers.spring.postgresql; -import java.util.Optional; - import com.infobip.testcontainers.InitializerBase; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; +import java.util.Optional; + public class PostgreSQLContainerInitializer extends InitializerBase { @Override public void initialize(ConfigurableApplicationContext applicationContext) { - Environment environment = applicationContext.getEnvironment(); - String dataSourceUrlPropertyName = Optional.ofNullable( - environment.getProperty("testcontainers.postgresql.datasource.url.property.name")) - .orElse("spring.datasource.url"); - String dataSourceUrl = environment.getProperty(dataSourceUrlPropertyName); + var environment = applicationContext.getEnvironment(); + var dataSourceUrlPropertyName = Optional.ofNullable( + environment.getProperty("testcontainers.postgresql.datasource.url.property.name")) + .orElse("spring.datasource.url"); + var dataSourceUrl = environment.getProperty(dataSourceUrlPropertyName); if (StringUtils.isEmpty(dataSourceUrl)) { throw new IllegalStateException("URL for test-container is null or empty."); } - String database = dataSourceUrl.substring(dataSourceUrl.lastIndexOf("/") + 1); - PostgreSQLContainerWrapper container = Optional.ofNullable(environment.getProperty("testcontainers.postgresql.docker.image")) - .map(imageName -> new PostgreSQLContainerWrapper(database, imageName)) - .orElseGet(() -> new PostgreSQLContainerWrapper(database)); + var database = dataSourceUrl.substring(dataSourceUrl.lastIndexOf("/") + 1); + var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.postgresql.docker.image")) + .map(imageName -> new PostgreSQLContainerWrapper(database, imageName)) + .orElseGet(() -> new PostgreSQLContainerWrapper(database)); + var container = handleReusable(environment, wrapper); - Optional.ofNullable(environment.getProperty("testcontainers.postgresql.init-script")).ifPresent(container::withInitScript); + Optional.ofNullable(environment.getProperty("testcontainers.postgresql.init-script")) + .ifPresent(container::withInitScript); resolveStaticPort(dataSourceUrl, GENERIC_URL_WITH_PORT_GROUP_PATTERN) - .ifPresent(staticPort -> bindPort(container, staticPort, PostgreSQLContainerWrapper.POSTGRESQL_PORT)); + .ifPresent(staticPort -> bindPort(container, staticPort, PostgreSQLContainerWrapper.POSTGRESQL_PORT)); start(container); - String url = replaceHostAndPortPlaceholders(dataSourceUrl, container, PostgreSQLContainerWrapper.POSTGRESQL_PORT); - TestPropertyValues values = TestPropertyValues.of(dataSourceUrlPropertyName + "=" + url); + var url = replaceHostAndPortPlaceholders(dataSourceUrl, container, PostgreSQLContainerWrapper.POSTGRESQL_PORT); + var values = TestPropertyValues.of(dataSourceUrlPropertyName + "=" + url); values.applyTo(applicationContext); - } + registerContainerAsBean(applicationContext); + } } diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java new file mode 100644 index 0000000..65f39bd --- /dev/null +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java @@ -0,0 +1,39 @@ +package com.infobip.testcontainers.spring.postgresql; + +import lombok.AllArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SimpleDriverDataSource; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; +import org.testcontainers.containers.PostgreSQLContainer; + +import java.sql.*; + +import static org.assertj.core.api.BDDAssertions.then; + +@AllArgsConstructor +@ActiveProfiles("reusable") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class PostgreSQLContainerInitializerWithReusableTest { + + private final PostgreSQLContainerWrapper wrapper; + private final int port = PostgreSQLContainer.POSTGRESQL_PORT; + + @Test + void shouldReuseContainer() { + // given + var givenContainer = new PostgreSQLContainerWrapper("TestDatabase"); + givenContainer.withReuse(true); + + // when + givenContainer.start(); + + // then + then(givenContainer.getMappedPort(port)).isEqualTo(wrapper.getMappedPort(port)); + } + +} \ No newline at end of file diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml new file mode 100644 index 0000000..f2eb7e5 --- /dev/null +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -0,0 +1,7 @@ +spring: + datasource: + url: jdbc:postgresql://:/TestDatabase + username: test + password: test + +testcontainers.reuse.enable: true \ No newline at end of file From b91c93e96e955ca70784f8fbc860fce7dfc812af Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 14:02:13 +0200 Subject: [PATCH 08/14] added rabbitmq reusable support --- .../rabbit/RabbitContainerInitializer.java | 25 ++++++------ ...tContainerInitializerWithReusableTest.java | 39 +++++++++++++++++++ .../test/resources/application-reusable.yml | 3 ++ 3 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java create mode 100644 infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java index d96840b..036dddf 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java @@ -13,29 +13,28 @@ public class RabbitContainerInitializer extends InitializerBase { @Override - public void initialize(ConfigurableApplicationContext configurableApplicationContext) { - Environment environment = configurableApplicationContext.getEnvironment(); - RabbitContainerWrapper container = Optional.ofNullable( - environment.getProperty("testcontainers.rabbit.docker.image")) - .map(RabbitContainerWrapper::new) - .orElseGet( - () -> new RabbitContainerWrapper("rabbitmq:3.8.9-alpine")); + public void initialize(ConfigurableApplicationContext applicationContext) { + var environment = applicationContext.getEnvironment(); + var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.rabbit.docker.image")) + .map(RabbitContainerWrapper::new) + .orElseGet(() -> new RabbitContainerWrapper("rabbitmq:3.8.9-alpine")); + var container = handleReusable(environment, wrapper); resolveStaticPort(environment) - .ifPresent(staticPort -> bindPort(container, staticPort, PORT)); + .ifPresent(staticPort -> bindPort(container, staticPort, PORT)); container.waitingFor(Wait.forListeningPort()); start(container); - TestPropertyValues values = TestPropertyValues.of( - String.format("spring.rabbitmq.addresses=%s:%d", container.getHost(), - container.getMappedPort(PORT))); - values.applyTo(configurableApplicationContext); + var values = TestPropertyValues.of( + String.format("spring.rabbitmq.addresses=%s:%d", container.getHost(), container.getMappedPort(PORT))); + values.applyTo(applicationContext); + + registerContainerAsBean(applicationContext); } private Optional resolveStaticPort(Environment environment) { return Optional.ofNullable(environment.getProperty("spring.rabbitmq.port")) .map(Integer::valueOf); } - } diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java new file mode 100644 index 0000000..42c6fac --- /dev/null +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java @@ -0,0 +1,39 @@ +package com.infobip.testcontainers.spring.rabbit; + +import lombok.AllArgsConstructor; +import org.assertj.core.api.BDDAssertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.boot.autoconfigure.amqp.RabbitProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; + +import static org.assertj.core.api.BDDAssertions.then; + +@AllArgsConstructor +@ActiveProfiles("reusable") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@TestConfiguration +@SpringBootTest(classes = Main.class) +class RabbitContainerInitializerWithReusableTest { + + private final RabbitContainerWrapper wrapper; + private final int port = RabbitContainerWrapper.PORT; + + @Test + void shouldReuseContainer() { + // given + var givenContainer = new RabbitContainerWrapper("rabbitmq:3.6.14-alpine"); + givenContainer.withReuse(true); + + // when + givenContainer.start(); + + // then + then(givenContainer.getMappedPort(port)).isEqualTo(wrapper.getMappedPort(port)); + } + +} diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml new file mode 100644 index 0000000..8ce30d9 --- /dev/null +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml @@ -0,0 +1,3 @@ +testcontainers.rabbit.docker.image: rabbitmq:3.6.14-alpine + +testcontainers.reuse.enable: true \ No newline at end of file From 8e6a6767eae280493d0cab81d82fb9b15938d079 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 14:04:53 +0200 Subject: [PATCH 09/14] added redis reusable support --- .../redis/RedisContainerInitializer.java | 21 ++++++------ ...sContainerInitializerWithReusableTest.java | 33 +++++++++++++++++++ .../test/resources/application-reusable.yaml | 6 ++++ 3 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java create mode 100644 infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java b/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java index dec24c2..1dc3480 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java +++ b/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java @@ -12,20 +12,21 @@ public class RedisContainerInitializer extends InitializerBase new RedisContainerWrapper("redis:6.2.6-alpine")); + var environment = applicationContext.getEnvironment(); + var redisUrl = Objects.requireNonNull(environment.getProperty("spring.data.redis.url")); + var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.redis.docker.image")) + .map(RedisContainerWrapper::new) + .orElseGet(() -> new RedisContainerWrapper("redis:6.2.6-alpine")); + var container = handleReusable(environment, wrapper); resolveStaticPort(redisUrl, GENERIC_URL_WITH_PORT_GROUP_PATTERN) - .ifPresent(staticPort -> bindPort(container, staticPort, RedisContainerWrapper.PORT)); + .ifPresent(staticPort -> bindPort(container, staticPort, RedisContainerWrapper.PORT)); start(container); - String url = replaceHostAndPortPlaceholders(redisUrl, container, RedisContainerWrapper.PORT); - TestPropertyValues values = TestPropertyValues.of("spring.data.redis.url=" + url); + var url = replaceHostAndPortPlaceholders(redisUrl, container, RedisContainerWrapper.PORT); + var values = TestPropertyValues.of("spring.data.redis.url=" + url); values.applyTo(applicationContext); - } + registerContainerAsBean(applicationContext); + } } diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java new file mode 100644 index 0000000..5bd5ba8 --- /dev/null +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java @@ -0,0 +1,33 @@ +package com.infobip.testcontainers.spring.redis; + +import lombok.AllArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; + +import static org.assertj.core.api.BDDAssertions.then; + +@AllArgsConstructor +@ActiveProfiles("reusable") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class RedisContainerInitializerWithReusableTest { + + private final RedisContainerWrapper wrapper; + private final int port = RedisContainerWrapper.PORT; + + @Test + void shouldReuseContainer() { + // given + var givenContainer = new RedisContainerWrapper(); + givenContainer.withReuse(true); + + // when + givenContainer.start(); + + // then + then(givenContainer.getMappedPort(port)).isEqualTo(wrapper.getMappedPort(port)); + } +} diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml new file mode 100644 index 0000000..69275e3 --- /dev/null +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -0,0 +1,6 @@ +spring: + data: + redis: + url: redis://: + +testcontainers.reuse.enable: true \ No newline at end of file From d5f4c79e8d6d97d81925a854429abfdb3a1de122 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 15:03:09 +0200 Subject: [PATCH 10/14] refactoring --- .../pom.xml | 8 +++++ .../ClickhouseContainerInitializer.java | 2 +- .../ClickhouseContainerInitializerTest.java | 5 ++- ...ontainerInitializerWithInitScriptTest.java | 7 ++-- ...eContainerInitializerWithReusableTest.java | 7 ++-- ...ontainerInitializerWithStaticPortTest.java | 17 ++++----- .../spring/clickhouse/Main.java | 13 ------- .../test/resources/application-reusable.yaml | 4 +-- .../pom.xml | 7 ++++ .../kafka/KafkaContainerInitializer.java | 2 +- .../kafka/KafkaContainerInitializerTest.java | 5 ++- ...aContainerInitializerWithReusableTest.java | 8 ++--- ...ontainerInitializerWithStaticPortTest.java | 23 +++++------- .../testcontainers/spring/kafka/Main.java | 12 ------- .../test/resources/application-reusable.yaml | 4 +-- .../pom.xml | 7 ++++ .../MSSQLServerContainerInitializer.java | 3 +- ...ontainerInitializerWithInitScriptTest.java | 5 ++- ...ontainerInitializerWithJtdsDriverTest.java | 7 ++-- ...nerInitializerWithMicrosoftDriverTest.java | 7 ++-- ...rContainerInitializerWithReusableTest.java | 7 ++-- ...ontainerInitializerWithStaticPortTest.java | 17 ++++----- .../test/resources/application-reusable.yaml | 4 +-- .../pom.xml | 8 +++++ .../PostgreSQLContainerInitializer.java | 2 +- .../spring/postgresql/Main.java | 13 ------- .../PostgreSQLContainerInitializerTest.java | 7 ++-- ...ontainerInitializerWithInitScriptTest.java | 5 ++- ...LContainerInitializerWithReusableTest.java | 12 ++----- ...ontainerInitializerWithStaticPortTest.java | 5 ++- .../test/resources/application-reusable.yaml | 4 +-- .../pom.xml | 8 +++++ .../rabbit/RabbitContainerInitializer.java | 2 +- .../testcontainers/spring/rabbit/Main.java | 34 ------------------ .../RabbitContainerInitializerTest.java | 13 +++---- ...tContainerInitializerWithReusableTest.java | 13 ++----- ...ontainerInitializerWithStaticPortTest.java | 13 +++---- .../test/resources/application-reusable.yml | 4 +-- .../pom.xml | 8 +++++ .../redis/RedisContainerInitializer.java | 3 +- .../testcontainers/spring/redis/Main.java | 12 ------- .../redis/RedisContainerInitializerTest.java | 5 ++- ...sContainerInitializerWithReusableTest.java | 8 ++--- ...ontainerInitializerWithStaticPortTest.java | 11 +++--- .../test/resources/application-reusable.yaml | 4 +-- .../testcontainers/InitializerBase.java | 28 +++++++-------- infobip-testcontainers-test-common/pom.xml | 29 +++++++++++++++ .../com/infobip/testcontainers}/Main.java | 2 +- .../testcontainers/ReusableTestBase.java | 36 +++++++++++++++++++ .../com/infobip/testcontainers/TestBase.java | 10 ++++++ pom.xml | 16 ++------- 51 files changed, 216 insertions(+), 280 deletions(-) delete mode 100644 infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java delete mode 100644 infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java delete mode 100644 infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/Main.java delete mode 100644 infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/Main.java delete mode 100644 infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/Main.java create mode 100644 infobip-testcontainers-test-common/pom.xml rename {infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql => infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers}/Main.java (85%) create mode 100644 infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java create mode 100644 infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/TestBase.java diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml b/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml index d6ddca9..7948690 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml @@ -42,5 +42,13 @@ org.springframework.boot spring-boot-starter-jdbc + + + + com.infobip + infobip-testcontainers-test-common + test + ${project.version} + diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java index 38e5a32..f9acecb 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java @@ -18,7 +18,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.docker.image.version")) .map(ClickhouseContainerWrapper::new) .orElseGet(ClickhouseContainerWrapper::new); - var container = handleReusable(environment, wrapper); + var container = handleReusable(wrapper); Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.init-script")) .ifPresent(container::withInitScript); diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java index 714f246..0fc1d29 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java @@ -4,6 +4,7 @@ import javax.sql.DataSource; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -13,9 +14,7 @@ @AllArgsConstructor @ActiveProfiles("test") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class ClickhouseContainerInitializerTest { +class ClickhouseContainerInitializerTest extends TestBase { private DataSource dataSource; diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithInitScriptTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithInitScriptTest.java index c052c4b..7b39153 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithInitScriptTest.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithInitScriptTest.java @@ -1,11 +1,10 @@ package com.infobip.testcontainers.spring.clickhouse; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import javax.sql.DataSource; @@ -13,9 +12,7 @@ @AllArgsConstructor @ActiveProfiles("init-script") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class ClickhouseContainerInitializerWithInitScriptTest { +class ClickhouseContainerInitializerWithInitScriptTest extends TestBase { private DataSource dataSource; diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java index 458c886..74d65c1 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithReusableTest.java @@ -1,19 +1,16 @@ package com.infobip.testcontainers.spring.clickhouse; +import com.infobip.testcontainers.ReusableTestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import org.testcontainers.containers.ClickHouseContainer; import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("reusable") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class ClickhouseContainerInitializerWithReusableTest { +class ClickhouseContainerInitializerWithReusableTest extends ReusableTestBase { private final ClickhouseContainerWrapper wrapper; private final int port = ClickHouseContainer.NATIVE_PORT; diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java index c3eb946..c527268 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java @@ -1,23 +1,20 @@ package com.infobip.testcontainers.spring.clickhouse; -import static com.infobip.testcontainers.spring.clickhouse.DataSourceConfig.CLICKHOUSE_URL_PROPERTY_NAME; -import static org.assertj.core.api.BDDAssertions.then; - -import javax.sql.DataSource; - +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; + +import javax.sql.DataSource; + +import static com.infobip.testcontainers.spring.clickhouse.DataSourceConfig.CLICKHOUSE_URL_PROPERTY_NAME; +import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("static-port") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class ClickhouseContainerInitializerWithStaticPortTest { +class ClickhouseContainerInitializerWithStaticPortTest extends TestBase { private Environment environment; private DataSource dataSource; diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java deleted file mode 100644 index faf8973..0000000 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.infobip.testcontainers.spring.clickhouse; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; - -@SpringBootApplication -public class Main { - - public static void main(String[] args) { - new SpringApplicationBuilder(Main.class).run(args); - } - -} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml index b6dffb3..853ecf1 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -5,6 +5,4 @@ spring: testcontainers: clickhouse: - custom-path: "spring.datasource.clickhouse" - -testcontainers.reuse.enable: true + custom-path: "spring.datasource.clickhouse" \ No newline at end of file diff --git a/infobip-kafka-testcontainers-spring-boot-starter/pom.xml b/infobip-kafka-testcontainers-spring-boot-starter/pom.xml index e770a81..58e0584 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-kafka-testcontainers-spring-boot-starter/pom.xml @@ -39,5 +39,12 @@ awaitility test + + + com.infobip + infobip-testcontainers-test-common + test + ${project.version} + diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java index 1e13eaf..5df2b6d 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java @@ -26,7 +26,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.kafka.docker.image.version")) .map(KafkaContainerWrapper::new) .orElseGet(KafkaContainerWrapper::new); - var container = handleReusable(environment, wrapper); + var container = handleReusable(wrapper); resolveStaticPort(bootstrapServers, KAFKA_SERVER_PATTERN) .ifPresent(staticPort -> bindPort(container, staticPort, KafkaContainerWrapper.KAFKA_PORT)); diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerTest.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerTest.java index 4ba09fb..f7f56c1 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerTest.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerTest.java @@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -19,9 +20,7 @@ @AllArgsConstructor @ActiveProfiles("test") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class KafkaContainerInitializerTest { +class KafkaContainerInitializerTest extends TestBase { private final KafkaTemplate kafkaTemplate; private final Listener listener; diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java index e2a460b..5f1e456 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithReusableTest.java @@ -1,20 +1,16 @@ package com.infobip.testcontainers.spring.kafka; +import com.infobip.testcontainers.ReusableTestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import org.testcontainers.containers.KafkaContainer; import static org.assertj.core.api.BDDAssertions.then; -import static org.awaitility.Awaitility.await; @AllArgsConstructor @ActiveProfiles("reusable") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class KafkaContainerInitializerWithReusableTest { +class KafkaContainerInitializerWithReusableTest extends ReusableTestBase { private final KafkaContainerWrapper wrapper; private final int port = KafkaContainer.KAFKA_PORT; diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java index 6b2a662..6f0e109 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java @@ -1,28 +1,23 @@ package com.infobip.testcontainers.spring.kafka; -import static com.infobip.testcontainers.spring.kafka.Listener.TOPIC; -import static org.assertj.core.api.BDDAssertions.then; -import static org.awaitility.Awaitility.await; - -import java.time.Duration; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.kafka.KafkaProperties; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.support.SendResult; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; + +import java.time.Duration; +import java.util.concurrent.*; + +import static com.infobip.testcontainers.spring.kafka.Listener.TOPIC; +import static org.assertj.core.api.BDDAssertions.then; +import static org.awaitility.Awaitility.await; @AllArgsConstructor @ActiveProfiles("static-port") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class KafkaContainerInitializerWithStaticPortTest { +class KafkaContainerInitializerWithStaticPortTest extends TestBase { private final KafkaTemplate kafkaTemplate; private final Listener listener; diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java deleted file mode 100644 index 259769c..0000000 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.infobip.testcontainers.spring.kafka; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; - -@SpringBootApplication -public class Main { - - public static void main(String[] args) { - new SpringApplicationBuilder(Main.class).run(args); - } -} diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml index 640916e..abce944 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -5,6 +5,4 @@ spring: autoOffsetReset: earliest bootstrap-servers: : -testcontainers.kafka.topics: test-topic:1:1 - -testcontainers.reuse.enable: true +testcontainers.kafka.topics: test-topic:1:1 \ No newline at end of file diff --git a/infobip-mssql-testcontainers-spring-boot-starter/pom.xml b/infobip-mssql-testcontainers-spring-boot-starter/pom.xml index 8cb12d9..e97032a 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-mssql-testcontainers-spring-boot-starter/pom.xml @@ -39,5 +39,12 @@ jtds test + + + com.infobip + infobip-testcontainers-test-common + test + ${project.version} + diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java index dcbcb6a..dd46c86 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializer.java @@ -15,7 +15,6 @@ import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Environment; -import org.testcontainers.utility.TestcontainersConfiguration; public class MSSQLServerContainerInitializer extends InitializerBase { @@ -31,7 +30,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.mssql.docker.image")) .map(MSSQLServerContainerWrapper::new) .orElseGet(MSSQLServerContainerWrapper::new); - var container = handleReusable(environment, wrapper); + var container = handleReusable(wrapper); var initScript = Optional.ofNullable(environment.getProperty("testcontainers.mssql.init-script")) .map(container::withInitScript); diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithInitScriptTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithInitScriptTest.java index e3023c3..16a1def 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithInitScriptTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithInitScriptTest.java @@ -1,5 +1,6 @@ package com.infobip.testcontainers.spring.mssql; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; @@ -17,9 +18,7 @@ @AllArgsConstructor @ActiveProfiles("init-script") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class MSSQLServerContainerInitializerWithInitScriptTest { +class MSSQLServerContainerInitializerWithInitScriptTest extends TestBase { private final DataSourceProperties properties; diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java index 3a0a541..f60c7b5 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java @@ -1,13 +1,12 @@ package com.infobip.testcontainers.spring.mssql; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import java.sql.*; @@ -15,9 +14,7 @@ @AllArgsConstructor @ActiveProfiles("jtds") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class MSSQLServerContainerInitializerWithJtdsDriverTest { +class MSSQLServerContainerInitializerWithJtdsDriverTest extends TestBase { private final DataSourceProperties properties; diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java index c6e5425..9a33e34 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java @@ -1,14 +1,13 @@ package com.infobip.testcontainers.spring.mssql; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import java.sql.*; @@ -16,9 +15,7 @@ @AllArgsConstructor @ActiveProfiles("microsoft-driver") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class MSSQLServerContainerInitializerWithMicrosoftDriverTest { +class MSSQLServerContainerInitializerWithMicrosoftDriverTest extends TestBase { private final Environment environment; private final DataSourceProperties properties; diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java index 673ca6c..be3d243 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithReusableTest.java @@ -1,19 +1,16 @@ package com.infobip.testcontainers.spring.mssql; +import com.infobip.testcontainers.ReusableTestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import org.testcontainers.containers.MSSQLServerContainer; import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("reusable") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class MSSQLServerContainerInitializerWithReusableTest { +class MSSQLServerContainerInitializerWithReusableTest extends ReusableTestBase { private final MSSQLServerContainerWrapper wrapper; private final int port = MSSQLServerContainer.MS_SQL_SERVER_PORT; diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java index a50b75c..c8e4fef 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java @@ -1,26 +1,21 @@ package com.infobip.testcontainers.spring.mssql; -import static org.assertj.core.api.BDDAssertions.then; - -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; - +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; + +import java.sql.*; + +import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("static-port") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class MSSQLServerContainerInitializerWithStaticPortTest { +class MSSQLServerContainerInitializerWithStaticPortTest extends TestBase { private final Environment environment; private final DataSourceProperties properties; diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml index a547dc5..8fd5521 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -1,5 +1,3 @@ spring: datasource: - url: jdbc:sqlserver://:;database=MicrosoftDriverTestDatabase;trustServerCertificate=true - -testcontainers.reuse.enable: true \ No newline at end of file + url: jdbc:sqlserver://:;database=MicrosoftDriverTestDatabase;trustServerCertificate=true \ No newline at end of file diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml b/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml index fb024bc..bf5597a 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-postgresql-testcontainers-spring-boot-starter/pom.xml @@ -32,5 +32,13 @@ postgresql ${testcontainers.version} + + + + com.infobip + infobip-testcontainers-test-common + test + ${project.version} + diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java index 2216d05..2124294 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializer.java @@ -25,7 +25,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.postgresql.docker.image")) .map(imageName -> new PostgreSQLContainerWrapper(database, imageName)) .orElseGet(() -> new PostgreSQLContainerWrapper(database)); - var container = handleReusable(environment, wrapper); + var container = handleReusable(wrapper); Optional.ofNullable(environment.getProperty("testcontainers.postgresql.init-script")) .ifPresent(container::withInitScript); diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/Main.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/Main.java deleted file mode 100644 index 131bd99..0000000 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/Main.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.infobip.testcontainers.spring.postgresql; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; - -@SpringBootApplication -public class Main { - - public static void main(String[] args) { - new SpringApplicationBuilder(Main.class).run(args); - } - -} \ No newline at end of file diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerTest.java index 00bc69b..d112940 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerTest.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerTest.java @@ -1,13 +1,12 @@ package com.infobip.testcontainers.spring.postgresql; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import java.sql.*; @@ -15,9 +14,7 @@ @AllArgsConstructor @ActiveProfiles("test") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class PostgreSQLContainerInitializerTest { +class PostgreSQLContainerInitializerTest extends TestBase { private final DataSourceProperties properties; diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithInitScriptTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithInitScriptTest.java index eaa431e..6739791 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithInitScriptTest.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithInitScriptTest.java @@ -1,5 +1,6 @@ package com.infobip.testcontainers.spring.postgresql; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; @@ -17,9 +18,7 @@ @AllArgsConstructor @ActiveProfiles("init-script") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class PostgreSQLContainerInitializerWithInitScriptTest { +class PostgreSQLContainerInitializerWithInitScriptTest extends TestBase { private final DataSourceProperties properties; diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java index 65f39bd..f49f498 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithReusableTest.java @@ -1,24 +1,16 @@ package com.infobip.testcontainers.spring.postgresql; +import com.infobip.testcontainers.ReusableTestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import org.testcontainers.containers.PostgreSQLContainer; -import java.sql.*; - import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("reusable") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class PostgreSQLContainerInitializerWithReusableTest { +class PostgreSQLContainerInitializerWithReusableTest extends ReusableTestBase { private final PostgreSQLContainerWrapper wrapper; private final int port = PostgreSQLContainer.POSTGRESQL_PORT; diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java index 985790f..b67a364 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java @@ -6,6 +6,7 @@ import java.sql.DriverManager; import java.sql.SQLException; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; @@ -17,9 +18,7 @@ @AllArgsConstructor @ActiveProfiles("static-port") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class PostgreSQLContainerInitializerWithStaticPortTest { +class PostgreSQLContainerInitializerWithStaticPortTest extends TestBase { private final DataSourceProperties properties; diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml index f2eb7e5..69a2534 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -2,6 +2,4 @@ spring: datasource: url: jdbc:postgresql://:/TestDatabase username: test - password: test - -testcontainers.reuse.enable: true \ No newline at end of file + password: test \ No newline at end of file diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml b/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml index 5afc140..ca7928b 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/pom.xml @@ -21,5 +21,13 @@ org.springframework.boot spring-boot-starter-amqp + + + + com.infobip + infobip-testcontainers-test-common + test + ${project.version} + diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java index 036dddf..354bf10 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java @@ -18,7 +18,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.rabbit.docker.image")) .map(RabbitContainerWrapper::new) .orElseGet(() -> new RabbitContainerWrapper("rabbitmq:3.8.9-alpine")); - var container = handleReusable(environment, wrapper); + var container = handleReusable(wrapper); resolveStaticPort(environment) .ifPresent(staticPort -> bindPort(container, staticPort, PORT)); diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/Main.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/Main.java deleted file mode 100644 index 9284ec9..0000000 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/Main.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.infobip.testcontainers.spring.rabbit; - -import static org.springframework.amqp.core.BindingBuilder.bind; - -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.Queue; -import org.springframework.amqp.core.QueueBuilder; -import org.springframework.amqp.core.TopicExchange; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.Bean; - -@SpringBootApplication -public class Main { - - @Bean - public Queue testQueue() { - return QueueBuilder.durable("test.queue").build(); - } - - @Bean - public TopicExchange testExchange() { - return new TopicExchange("test.exchange"); - } - - @Bean - public Binding bindToTestExchange() { - return bind(testQueue()).to(testExchange()).with("test.key.#"); - } - - public static void main(String[] args) { - new SpringApplicationBuilder(Main.class).run(args); - } -} diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerTest.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerTest.java index 36f86d8..25cb5ce 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerTest.java +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerTest.java @@ -1,23 +1,18 @@ package com.infobip.testcontainers.spring.rabbit; -import static org.assertj.core.api.BDDAssertions.then; - +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; + +import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("test") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@TestConfiguration -@SpringBootTest(classes = Main.class) -class RabbitContainerInitializerTest { +class RabbitContainerInitializerTest extends TestBase { private final RabbitTemplate rabbitTemplate; diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java index 42c6fac..8f380ea 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithReusableTest.java @@ -1,24 +1,15 @@ package com.infobip.testcontainers.spring.rabbit; +import com.infobip.testcontainers.ReusableTestBase; import lombok.AllArgsConstructor; -import org.assertj.core.api.BDDAssertions; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.boot.autoconfigure.amqp.RabbitProperties; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("reusable") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@TestConfiguration -@SpringBootTest(classes = Main.class) -class RabbitContainerInitializerWithReusableTest { +class RabbitContainerInitializerWithReusableTest extends ReusableTestBase { private final RabbitContainerWrapper wrapper; private final int port = RabbitContainerWrapper.PORT; diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java index 6dc3ba9..e1f1878 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java @@ -1,24 +1,19 @@ package com.infobip.testcontainers.spring.rabbit; -import static org.assertj.core.api.BDDAssertions.then; - +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.boot.autoconfigure.amqp.RabbitProperties; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; + +import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("static-port") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@TestConfiguration -@SpringBootTest(classes = Main.class) -class RabbitContainerInitializerWithStaticPortTest { +class RabbitContainerInitializerWithStaticPortTest extends TestBase { private final RabbitTemplate rabbitTemplate; private final RabbitProperties rabbitProperties; diff --git a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml index 8ce30d9..80af7dc 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml +++ b/infobip-rabbitmq-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yml @@ -1,3 +1 @@ -testcontainers.rabbit.docker.image: rabbitmq:3.6.14-alpine - -testcontainers.reuse.enable: true \ No newline at end of file +testcontainers.rabbit.docker.image: rabbitmq:3.6.14-alpine \ No newline at end of file diff --git a/infobip-redis-testcontainers-spring-boot-starter/pom.xml b/infobip-redis-testcontainers-spring-boot-starter/pom.xml index e94b32e..dc03c94 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/pom.xml +++ b/infobip-redis-testcontainers-spring-boot-starter/pom.xml @@ -28,5 +28,13 @@ lettuce-core test + + + + com.infobip + infobip-testcontainers-test-common + test + ${project.version} + diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java b/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java index 1dc3480..5e52e04 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java +++ b/infobip-redis-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializer.java @@ -6,7 +6,6 @@ import com.infobip.testcontainers.InitializerBase; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.Environment; public class RedisContainerInitializer extends InitializerBase { @@ -17,7 +16,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var wrapper = Optional.ofNullable(environment.getProperty("testcontainers.redis.docker.image")) .map(RedisContainerWrapper::new) .orElseGet(() -> new RedisContainerWrapper("redis:6.2.6-alpine")); - var container = handleReusable(environment, wrapper); + var container = handleReusable(wrapper); resolveStaticPort(redisUrl, GENERIC_URL_WITH_PORT_GROUP_PATTERN) .ifPresent(staticPort -> bindPort(container, staticPort, RedisContainerWrapper.PORT)); diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/Main.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/Main.java deleted file mode 100644 index 46d80d7..0000000 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/Main.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.infobip.testcontainers.spring.redis; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; - -@SpringBootApplication -public class Main { - - public static void main(String[] args) { - new SpringApplicationBuilder(Main.class).run(args); - } -} \ No newline at end of file diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerTest.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerTest.java index e641992..50a8014 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerTest.java +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerTest.java @@ -1,5 +1,6 @@ package com.infobip.testcontainers.spring.redis; +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -11,9 +12,7 @@ @AllArgsConstructor @ActiveProfiles("test") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class RedisContainerInitializerTest { +class RedisContainerInitializerTest extends TestBase { private final RedisTemplate template; diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java index 5bd5ba8..7bfb4fe 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithReusableTest.java @@ -1,19 +1,15 @@ package com.infobip.testcontainers.spring.redis; +import com.infobip.testcontainers.ReusableTestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("reusable") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class RedisContainerInitializerWithReusableTest { +class RedisContainerInitializerWithReusableTest extends ReusableTestBase { private final RedisContainerWrapper wrapper; private final int port = RedisContainerWrapper.PORT; diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java index 3369c6a..e59a688 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java @@ -1,20 +1,17 @@ package com.infobip.testcontainers.spring.redis; -import static org.assertj.core.api.BDDAssertions.then; - +import com.infobip.testcontainers.TestBase; import lombok.AllArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestConstructor; + +import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ActiveProfiles("static-port") -@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) -@SpringBootTest(classes = Main.class) -class RedisContainerInitializerWithStaticPortTest { +class RedisContainerInitializerWithStaticPortTest extends TestBase { private final RedisTemplate template; private final RedisProperties redisProperties; diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml index 69275e3..a54ff00 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-reusable.yaml @@ -1,6 +1,4 @@ spring: data: redis: - url: redis://: - -testcontainers.reuse.enable: true \ No newline at end of file + url: redis://: \ No newline at end of file diff --git a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java index 1616d2c..0b473fb 100644 --- a/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java +++ b/infobip-testcontainers-common/src/main/java/com/infobip/testcontainers/InitializerBase.java @@ -1,20 +1,19 @@ package com.infobip.testcontainers; -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import org.springframework.context.*; import org.springframework.context.event.ContextClosedEvent; -import org.springframework.core.env.Environment; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.lifecycle.Startable; import org.testcontainers.utility.TestcontainersConfiguration; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public abstract class InitializerBase - implements ApplicationContextInitializer, ApplicationListener { + implements ApplicationContextInitializer, ApplicationListener { public static final String PORT_PLACEHOLDER = ""; public static final String HOST_PLACEHOLDER = ""; @@ -36,7 +35,9 @@ protected void start(C container) { container.start(); } - protected String replaceHostAndPortPlaceholders(String source, Container container, Integer originalContainerPort) { + protected String replaceHostAndPortPlaceholders(String source, + Container container, + Integer originalContainerPort) { return source.replaceAll(HOST_PLACEHOLDER, container.getHost()) .replaceAll(PORT_PLACEHOLDER, container.getMappedPort(originalContainerPort).toString()); } @@ -49,10 +50,11 @@ protected Optional resolveStaticPort(String connectionString, Pattern u .map(Integer::valueOf); } - protected Optional resolveStaticPort(Collection connectionStrings, Pattern urlPatternWithPortGroup) { + protected Optional resolveStaticPort(Collection connectionStrings, + Pattern urlPatternWithPortGroup) { return connectionStrings.stream() .flatMap(connectionString -> resolveStaticPort(connectionString, - urlPatternWithPortGroup).stream()) + urlPatternWithPortGroup).stream()) .findFirst(); } @@ -60,10 +62,9 @@ protected void bindPort(Container container, Integer hostPort, Integer contai container.setPortBindings(Collections.singletonList(hostPort + ":" + containerPort)); } - protected , T extends GenericContainer> T handleReusable(Environment environment, T container) { + protected , T extends GenericContainer> T handleReusable(T container) { - if(Objects.equals(environment.getProperty("testcontainers.reuse.enable"), "true")) { - TestcontainersConfiguration.getInstance().updateUserConfig("testcontainers.reuse.enable", "true"); + if (TestcontainersConfiguration.getInstance().environmentSupportsReuse()) { container.withReuse(true); } @@ -77,5 +78,4 @@ protected void registerContainerAsBean(ConfigurableApplicationContext applicatio applicationContext.getBeanFactory() .registerSingleton(beanName, c); } - } diff --git a/infobip-testcontainers-test-common/pom.xml b/infobip-testcontainers-test-common/pom.xml new file mode 100644 index 0000000..2ae02e2 --- /dev/null +++ b/infobip-testcontainers-test-common/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + + + com.infobip + infobip-testcontainers-spring-boot-starter + 4.2.0-SNAPSHOT + + + infobip-testcontainers-test-common + + + + ${project.groupId} + infobip-testcontainers-common + ${project.version} + + + + org.springframework.boot + spring-boot-starter-test + + + + org.projectlombok + lombok + + + \ No newline at end of file diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/Main.java b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/Main.java similarity index 85% rename from infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/Main.java rename to infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/Main.java index 165e45b..a1f7f7d 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/Main.java +++ b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/Main.java @@ -1,4 +1,4 @@ -package com.infobip.testcontainers.spring.mssql; +package com.infobip.testcontainers; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; diff --git a/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java new file mode 100644 index 0000000..e4a1084 --- /dev/null +++ b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java @@ -0,0 +1,36 @@ +package com.infobip.testcontainers; + +import org.junit.jupiter.api.BeforeAll; + +import java.io.*; +import java.nio.file.*; + +public class ReusableTestBase extends TestBase { + + @BeforeAll + static void setup() { + var home = System.getProperty("user.home"); + var filename = ".testcontainers.properties"; + var file = new File(home, filename); + var tempFile = new File(home, filename + ".tmp"); + if (file.exists()) { + file.renameTo(tempFile); + } + + Path newFile; + try { + newFile = Files.writeString(Paths.get(home, filename), "testcontainers.reuse.enable=true"); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + Files.delete(newFile); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + tempFile.renameTo(file); + })); + } +} diff --git a/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/TestBase.java b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/TestBase.java new file mode 100644 index 0000000..f0bf72f --- /dev/null +++ b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/TestBase.java @@ -0,0 +1,10 @@ +package com.infobip.testcontainers; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestConstructor; + +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +public class TestBase { + +} diff --git a/pom.xml b/pom.xml index 635dd80..b9e198f 100644 --- a/pom.xml +++ b/pom.xml @@ -38,9 +38,10 @@ infobip-postgresql-testcontainers-spring-boot-starter infobip-kafka-testcontainers-spring-boot-starter infobip-redis-testcontainers-spring-boot-starter - infobip-testcontainers-common infobip-rabbitmq-testcontainers-spring-boot-starter infobip-clickhouse-testcontainers-spring-boot-starter + infobip-testcontainers-common + infobip-testcontainers-test-common @@ -125,19 +126,6 @@ org.springframework.boot spring-boot-autoconfigure - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.projectlombok - lombok - test - From 03ca11794f87f62d5585658516e75177d4b42b03 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 15:05:14 +0200 Subject: [PATCH 11/14] updated CHANGELOG.md --- CHANGELOG.md | 3 +++ README.md | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f0b094..48560b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### 4.2.0 +* Added reusable support + ### 4.1.0 * Added the testcontainers.db-name.init-script property to all the database starters diff --git a/README.md b/README.md index 09e2c4b..7af63ad 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Usual use cases include: * [Changelog](#Changelog) * [Usage](#Usage) + * [General](#General) + * [Reusable](#Reusable) * [MSSQL](#MSSQL) * [Tests](#MSSQLTests) * [Local development](#MSSQLLocalDevelopment) @@ -59,6 +61,10 @@ Generally, in cases where port placeholders are used (``), the library wil a randomly selected open port and that the selected value will be used by the configuration in the runtime. You can use a concrete value instead of the placeholder - in that case the library will attempt to start the container on the specified port. + +### Reusable +If [reuse is enabled](https://java.testcontainers.org/features/reuse/) this project automatically marks all created containers for reuse. + ### MSSQL From db09313035c4dca32fae721e8d3cec60e306a9b0 Mon Sep 17 00:00:00 2001 From: lpandzic Date: Mon, 7 Aug 2023 15:48:37 +0200 Subject: [PATCH 12/14] fixed ReusableTestBase --- .../testcontainers/ReusableTestBase.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java index e4a1084..5a03565 100644 --- a/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java +++ b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java @@ -1,36 +1,39 @@ package com.infobip.testcontainers; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestConstructor; +import org.testcontainers.utility.TestcontainersConfiguration; import java.io.*; -import java.nio.file.*; +import java.nio.file.Files; +import java.nio.file.Paths; -public class ReusableTestBase extends TestBase { +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +public class ReusableTestBase { + + private static final String HOME = System.getProperty("user.home"); + private static final String FILENAME = ".testcontainers.properties"; + private static final File FILE = new File(HOME, FILENAME); + private static final File TEMP_FILE = new File(HOME, FILENAME + ".tmp"); @BeforeAll - static void setup() { - var home = System.getProperty("user.home"); - var filename = ".testcontainers.properties"; - var file = new File(home, filename); - var tempFile = new File(home, filename + ".tmp"); - if (file.exists()) { - file.renameTo(tempFile); + static void createTestcontainersPropertiesFile() { + if (FILE.exists()) { + FILE.renameTo(TEMP_FILE); } - Path newFile; - try { - newFile = Files.writeString(Paths.get(home, filename), "testcontainers.reuse.enable=true"); - } catch (IOException e) { - throw new UncheckedIOException(e); - } + TestcontainersConfiguration.getInstance().updateUserConfig("testcontainers.reuse.enable", "true"); + } - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - try { - Files.delete(newFile); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - tempFile.renameTo(file); - })); + @AfterAll + static void cleanupTestcontainersPropertiesFile() { + FILE.delete(); + + if (TEMP_FILE.exists()) { + TEMP_FILE.renameTo(FILE); + } } } From bf136e41bc8e321fc56aa5a8effed2e29b0942aa Mon Sep 17 00:00:00 2001 From: lpandzic Date: Wed, 9 Aug 2023 09:06:53 +0200 Subject: [PATCH 13/14] ReusableTestBase fixes --- .../spring/kafka/KafkaContainerInitializer.java | 16 ++-------------- .../infobip/testcontainers/ReusableTestBase.java | 5 ++--- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java index 5df2b6d..6a7c1bf 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java @@ -46,30 +46,18 @@ public void initialize(ConfigurableApplicationContext applicationContext) { private static void createTestKafkaTopics(String bootstrapServers, String[] topics) { try (var client = AdminClient.create(Collections.singletonMap("bootstrap.servers", bootstrapServers))) { - deleteTopics(client, topics); createTopics(client, topics); } catch (Exception e) { throw new RuntimeException(e); } } - private static void deleteTopics(AdminClient client, String[] topics) throws InterruptedException, - ExecutionException, TimeoutException { - var existingTopics = client.listTopics().names().get(60, TimeUnit.SECONDS); - var deleteTopics = Stream.of(topics) - .map(topic -> topic.split(":")) - .map(topicParts -> topicParts[0]) - .filter(existingTopics::contains) - .collect(Collectors.toList()); - client.deleteTopics(deleteTopics) - .all() - .get(60, TimeUnit.SECONDS); - } - private static void createTopics(AdminClient client, String[] topics) throws InterruptedException, ExecutionException, TimeoutException { + var existingTopics = client.listTopics().names().get(60, TimeUnit.SECONDS); var newTopics = Stream.of(topics) .map(topic -> topic.split(":")) + .filter(topic -> !existingTopics.contains(topic[0])) .map(topicParts -> new NewTopic(topicParts[0], parseInt(topicParts[1]), parseShort(topicParts[2]))) .collect(Collectors.toList()); diff --git a/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java index 5a03565..ff5fb37 100644 --- a/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java +++ b/infobip-testcontainers-test-common/src/main/java/com/infobip/testcontainers/ReusableTestBase.java @@ -6,9 +6,7 @@ import org.springframework.test.context.TestConstructor; import org.testcontainers.utility.TestcontainersConfiguration; -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.io.File; @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) @@ -30,6 +28,7 @@ static void createTestcontainersPropertiesFile() { @AfterAll static void cleanupTestcontainersPropertiesFile() { + TestcontainersConfiguration.getInstance().updateUserConfig("testcontainers.reuse.enable", "false"); FILE.delete(); if (TEMP_FILE.exists()) { From ec87ca8575dcb85f63ea8a3788f1addf4f51375c Mon Sep 17 00:00:00 2001 From: lpandzic Date: Wed, 9 Aug 2023 09:14:01 +0200 Subject: [PATCH 14/14] added removal of topics for reuse true --- .../kafka/KafkaContainerInitializer.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java index 6a7c1bf..ff55707 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializer.java @@ -35,7 +35,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { var url = replaceHostAndPortPlaceholders(bootstrapServers, container, KafkaContainerWrapper.KAFKA_PORT); Optional.ofNullable(environment.getProperty("testcontainers.kafka.topics", String[].class)) - .ifPresent(topics -> createTestKafkaTopics(url, topics)); + .ifPresent(topics -> createTestKafkaTopics(container, url, topics)); var values = TestPropertyValues.of( "spring.kafka.bootstrap-servers=" + url); values.applyTo(applicationContext); @@ -43,15 +43,30 @@ public void initialize(ConfigurableApplicationContext applicationContext) { registerContainerAsBean(applicationContext); } - private static void createTestKafkaTopics(String bootstrapServers, String[] topics) { + private static void createTestKafkaTopics(KafkaContainerWrapper container, String bootstrapServers, String[] topics) { try (var client = AdminClient.create(Collections.singletonMap("bootstrap.servers", bootstrapServers))) { + if(container.isShouldBeReused()) { + deleteTopics(client, topics); + } createTopics(client, topics); } catch (Exception e) { throw new RuntimeException(e); } } + private static void deleteTopics(AdminClient client, String[] topics) throws ExecutionException, + InterruptedException, TimeoutException { + var existingTopics = client.listTopics().names().get(60, TimeUnit.SECONDS); + var deleteTopics = Stream.of(topics) + .map(topic -> topic.split(":")) + .filter(topic -> !existingTopics.contains(topic[0])) + .map(topicParts -> topicParts[0]) + .toList(); + + client.deleteTopics(deleteTopics); + } + private static void createTopics(AdminClient client, String[] topics) throws InterruptedException, ExecutionException, TimeoutException { var existingTopics = client.listTopics().names().get(60, TimeUnit.SECONDS); @@ -60,7 +75,7 @@ private static void createTopics(AdminClient client, String[] topics) throws Int .filter(topic -> !existingTopics.contains(topic[0])) .map(topicParts -> new NewTopic(topicParts[0], parseInt(topicParts[1]), parseShort(topicParts[2]))) - .collect(Collectors.toList()); + .toList(); client.createTopics(newTopics) .all()