From d065c5bdc9f03218303183c25c746970e8602036 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Tue, 15 Jun 2021 13:53:14 +0200 Subject: [PATCH 01/18] Added support for static port for Sql Server --- .../MSSQLServerContainerInitializer.java | 43 +++++++--- .../mssql/StaticPortSqlServerDockerTest.java | 79 +++++++++++++++++++ .../resources/application-static-port.yaml | 7 ++ 3 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java create mode 100644 infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.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 103d8c6..56612ba 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 @@ -1,20 +1,30 @@ package com.infobip.testcontainers.spring.mssql; +import static org.testcontainers.containers.MSSQLServerContainer.MS_SQL_SERVER_PORT; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + 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.*; -import java.util.stream.Collectors; - -import static org.testcontainers.containers.MSSQLServerContainer.MS_SQL_SERVER_PORT; - public class MSSQLServerContainerInitializer extends InitializerBase { private static final List DEFAULT_PROPERTY_NAMES = Arrays.asList("spring.datasource.url", "spring.flyway.url", "spring.r2dbc.url"); + private static final Pattern JDBC_URL_WITH_FIXED_PORT_PATTERN = Pattern.compile(".*://.*:(\\d+)/.*"); @Override public void initialize(ConfigurableApplicationContext applicationContext) { @@ -23,31 +33,31 @@ public void initialize(ConfigurableApplicationContext applicationContext) { Map urlPropertyNameToValue = getUrlPropertyNameToValue(environment, urlPropertyNames); MSSQLServerContainerWrapper container = Optional.ofNullable( - environment.getProperty("testcontainers.mssql.docker.image")) + environment.getProperty("testcontainers.mssql.docker.image")) .map(MSSQLServerContainerWrapper::new) .orElseGet(MSSQLServerContainerWrapper::new); + + resolveStaticPort(urlPropertyNameToValue.values()) + .ifPresent(fixedPort -> container.setPortBindings(Collections.singletonList(fixedPort + ":" + MS_SQL_SERVER_PORT))); + start(container); Map replacedNameToValue = replaceHostAndPort(urlPropertyNameToValue, container); Map testPropertyValues = addMissingUsernameAndPassword(replacedNameToValue, container); TestPropertyValues values = TestPropertyValues.of(testPropertyValues); values.applyTo(applicationContext); - 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.createDatabaseIfItDoesntExist(); } private List getUrlPropertyNames(Environment environment) { - String 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); - if (Objects.nonNull(names)) { return Arrays.asList(names); } @@ -56,7 +66,6 @@ private List getUrlPropertyNames(Environment environment) { } private Map getUrlPropertyNameToValue(Environment environment, List names) { - Map propertyNameToValue = new HashMap<>(); for (String name : names) { @@ -69,6 +78,15 @@ private Map getUrlPropertyNameToValue(Environment environment, L return propertyNameToValue; } + private Optional resolveStaticPort(Collection connectionStrings) { + return connectionStrings.stream() + .map(JDBC_URL_WITH_FIXED_PORT_PATTERN::matcher) + .filter(Matcher::matches) + .map(matcher -> matcher.group(1)) + .findFirst() + .map(Integer::valueOf); + } + private Map replaceHostAndPort(Map urlPropertyNameToValue, MSSQLServerContainerWrapper container) { String host = container.getContainerIpAddress(); @@ -96,4 +114,5 @@ private Map addMissingUsernameAndPassword(Map ur } return testPropertyValues; } + } diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java new file mode 100644 index 0000000..1b04b33 --- /dev/null +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java @@ -0,0 +1,79 @@ +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 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 org.testcontainers.Testcontainers; + +@AllArgsConstructor +@ActiveProfiles("static-port") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class StaticPortSqlServerDockerTest { + + private final Environment environment; + private final DataSourceProperties properties; + + @Test + void shouldCreateContainer() { + // given + JdbcTemplate jdbcTemplate = new JdbcTemplate(new SimpleDriverDataSource( + getDriver(properties.getUrl()), + properties.getUrl(), + properties.getUsername(), + properties.getPassword())); + + // when + String actual = jdbcTemplate.queryForObject("SELECT db_name()", String.class); + + // then + then(actual).isEqualTo("MicrosoftDriverTestDatabase"); + } + + @Test + void shouldReplaceHostInJdbcUrl() { + // when + String actual = environment.getProperty("spring.datasource.url"); + + // then + then(actual).contains("localhost:1433"); + } + + @Test + void shouldReplaceHostInR2dbc() { + // when + String actual = environment.getProperty("spring.r2dbc.url"); + + // then + then(actual).contains("localhost:1433"); + } + + @Test + void shouldReplaceHostInFlyway() { + // when + String actual = environment.getProperty("spring.flyway.url"); + + // then + then(actual).contains("localhost:1433"); + } + + private Driver getDriver(String jdbcUrl) { + try { + return DriverManager.getDriver(jdbcUrl); + } catch (SQLException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml new file mode 100644 index 0000000..cf1ce7f --- /dev/null +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -0,0 +1,7 @@ +spring: + datasource: + url: jdbc:sqlserver://:1433;database=MicrosoftDriverTestDatabase + r2dbc: + url: r2dbc:pool:mssql://:1433/InfobipSpringDataJdbcQuerydslTest + flyway: + url: jdbc:sqlserver://:1433;database=MicrosoftDriverTestDatabase From 640d87329182ab9a1c286bbc38cccc9892bbb46b Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 08:43:58 +0200 Subject: [PATCH 02/18] Added support for static port for Clickhouse --- .../ClickhouseContainerInitializer.java | 23 +++++++++-- .../ClickhouseContainerStaticPortTest.java | 38 +++++++++++++++++++ .../spring/clickhouse/DataSourceConfig.java | 17 ++++----- .../resources/application-static-port.yaml | 8 ++++ .../MSSQLServerContainerInitializer.java | 6 +-- 5 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java create mode 100644 infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.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 512581b..cb19c60 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,7 +1,10 @@ package com.infobip.testcontainers.spring.clickhouse; +import java.util.Collections; import java.util.Objects; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.infobip.testcontainers.InitializerBase; import org.springframework.boot.test.util.TestPropertyValues; @@ -10,24 +13,38 @@ public class ClickhouseContainerInitializer extends InitializerBase { + private static final Pattern JDBC_URL_WITH_DEFINED_PORT_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); + @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 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); + resolveStaticPort(jdbcUrlValue) + .ifPresent(staticPort -> container.setPortBindings(Collections.singletonList(staticPort + ":" + ClickhouseContainerWrapper.HTTP_PORT))); + start(container); String url = jdbcUrlValue.replace("", container.getContainerIpAddress()) - .replace("", container.getMappedPort(ClickhouseContainerWrapper.HTTP_PORT) - .toString()); + .replace("", container.getMappedPort(ClickhouseContainerWrapper.HTTP_PORT) + .toString()); TestPropertyValues values = TestPropertyValues.of( String.format("%s=%s", jdbcUrlPropertyPath, url)); values.applyTo(applicationContext); } + // todo - unduplicate + private Optional resolveStaticPort(String connectionString) { + return Optional.ofNullable(connectionString) + .map(JDBC_URL_WITH_DEFINED_PORT_PATTERN::matcher) + .filter(Matcher::matches) + .map(matcher -> matcher.group(1)) + .map(Integer::valueOf); + } + } diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java new file mode 100644 index 0000000..4b570a6 --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java @@ -0,0 +1,38 @@ +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 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; + +@AllArgsConstructor +@ActiveProfiles("static-port") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class ClickhouseContainerStaticPortTest { + + Environment environment; + DataSource dataSource; + + @Test + void shouldCreateContainerWithStaticPort() { + //given + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + + //when + String result = jdbcTemplate.queryForObject("SELECT 1", String.class); + + //then + then(environment.getProperty(CLICKHOUSE_URL_PROPERTY_NAME)).isEqualTo("jdbc:clickhouse://localhost:5000"); + then(result).isEqualTo("1"); + } + +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java index 80057e7..eb72a98 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java @@ -2,24 +2,23 @@ import javax.sql.DataSource; -import lombok.AllArgsConstructor; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; +import ru.yandex.clickhouse.ClickHouseDriver; @Configuration -@AllArgsConstructor public class DataSourceConfig { - private final Environment environment; + static final String CLICKHOUSE_URL_PROPERTY_NAME = "spring.datasource.clickhouse.jdbc-url"; @Bean - public DataSource getDataSource() { - String url = environment.getProperty("spring.datasource.clickhouse.jdbc-url"); - DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); - dataSourceBuilder.driverClassName("ru.yandex.clickhouse.ClickHouseDriver"); - dataSourceBuilder.url(url); - return dataSourceBuilder.build(); + public DataSource getDataSource(Environment environment) { + return DataSourceBuilder.create() + .driverClassName(ClickHouseDriver.class.getName()) + .url(environment.getProperty(CLICKHOUSE_URL_PROPERTY_NAME)) + .build(); } + } diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml new file mode 100644 index 0000000..47a4f4c --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -0,0 +1,8 @@ +spring: + datasource: + clickhouse: + jdbc-url: jdbc:clickhouse://:5000 + +testcontainers: + clickhouse: + custom-path: "spring.datasource.clickhouse" 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 56612ba..20e0f2e 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 @@ -24,7 +24,7 @@ public class MSSQLServerContainerInitializer extends InitializerBase DEFAULT_PROPERTY_NAMES = Arrays.asList("spring.datasource.url", "spring.flyway.url", "spring.r2dbc.url"); - private static final Pattern JDBC_URL_WITH_FIXED_PORT_PATTERN = Pattern.compile(".*://.*:(\\d+)/.*"); + private static final Pattern JDBC_URL_WITH_DEFINED_PORT_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); @Override public void initialize(ConfigurableApplicationContext applicationContext) { @@ -38,7 +38,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .orElseGet(MSSQLServerContainerWrapper::new); resolveStaticPort(urlPropertyNameToValue.values()) - .ifPresent(fixedPort -> container.setPortBindings(Collections.singletonList(fixedPort + ":" + MS_SQL_SERVER_PORT))); + .ifPresent(staticPort -> container.setPortBindings(Collections.singletonList(staticPort + ":" + MS_SQL_SERVER_PORT))); start(container); Map replacedNameToValue = replaceHostAndPort(urlPropertyNameToValue, container); @@ -80,7 +80,7 @@ private Map getUrlPropertyNameToValue(Environment environment, L private Optional resolveStaticPort(Collection connectionStrings) { return connectionStrings.stream() - .map(JDBC_URL_WITH_FIXED_PORT_PATTERN::matcher) + .map(JDBC_URL_WITH_DEFINED_PORT_PATTERN::matcher) .filter(Matcher::matches) .map(matcher -> matcher.group(1)) .findFirst() From 1e52a0b4a1b014cc0099eeeb385537c600365d3e Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 10:13:16 +0200 Subject: [PATCH 03/18] Extracted some common stuff to InitializerBase --- .../ClickhouseContainerInitializer.java | 23 +++----- .../MSSQLServerContainerInitializer.java | 20 ++----- .../testcontainers/InitializerBase.java | 54 +++++++++++++++---- 3 files changed, 53 insertions(+), 44 deletions(-) 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 cb19c60..2d6172b 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 @@ -3,8 +3,6 @@ import java.util.Collections; import java.util.Objects; import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import com.infobip.testcontainers.InitializerBase; import org.springframework.boot.test.util.TestPropertyValues; @@ -13,8 +11,6 @@ public class ClickhouseContainerInitializer extends InitializerBase { - private static final Pattern JDBC_URL_WITH_DEFINED_PORT_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); - @Override public void initialize(ConfigurableApplicationContext applicationContext) { Environment environment = applicationContext.getEnvironment(); @@ -26,25 +22,18 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .map(ClickhouseContainerWrapper::new) .orElseGet(ClickhouseContainerWrapper::new); - resolveStaticPort(jdbcUrlValue) + resolveStaticPort(jdbcUrlValue, JDBC_URL_WITH_PORT_GROUP_PATTERN) .ifPresent(staticPort -> container.setPortBindings(Collections.singletonList(staticPort + ":" + ClickhouseContainerWrapper.HTTP_PORT))); start(container); - String url = jdbcUrlValue.replace("", container.getContainerIpAddress()) - .replace("", container.getMappedPort(ClickhouseContainerWrapper.HTTP_PORT) - .toString()); + + String url = replaceHostAndPortPlaceholders(jdbcUrlValue, + container.getContainerIpAddress(), + container.getMappedPort(ClickhouseContainerWrapper.HTTP_PORT)); + TestPropertyValues values = TestPropertyValues.of( String.format("%s=%s", jdbcUrlPropertyPath, url)); values.applyTo(applicationContext); } - // todo - unduplicate - private Optional resolveStaticPort(String connectionString) { - return Optional.ofNullable(connectionString) - .map(JDBC_URL_WITH_DEFINED_PORT_PATTERN::matcher) - .filter(Matcher::matches) - .map(matcher -> matcher.group(1)) - .map(Integer::valueOf); - } - } 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 20e0f2e..54cf0b6 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 @@ -3,15 +3,12 @@ import static org.testcontainers.containers.MSSQLServerContainer.MS_SQL_SERVER_PORT; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; import com.infobip.testcontainers.InitializerBase; @@ -24,7 +21,6 @@ public class MSSQLServerContainerInitializer extends InitializerBase DEFAULT_PROPERTY_NAMES = Arrays.asList("spring.datasource.url", "spring.flyway.url", "spring.r2dbc.url"); - private static final Pattern JDBC_URL_WITH_DEFINED_PORT_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); @Override public void initialize(ConfigurableApplicationContext applicationContext) { @@ -37,7 +33,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .map(MSSQLServerContainerWrapper::new) .orElseGet(MSSQLServerContainerWrapper::new); - resolveStaticPort(urlPropertyNameToValue.values()) + resolveStaticPort(urlPropertyNameToValue.values(), JDBC_URL_WITH_PORT_GROUP_PATTERN) .ifPresent(staticPort -> container.setPortBindings(Collections.singletonList(staticPort + ":" + MS_SQL_SERVER_PORT))); start(container); @@ -78,24 +74,14 @@ private Map getUrlPropertyNameToValue(Environment environment, L return propertyNameToValue; } - private Optional resolveStaticPort(Collection connectionStrings) { - return connectionStrings.stream() - .map(JDBC_URL_WITH_DEFINED_PORT_PATTERN::matcher) - .filter(Matcher::matches) - .map(matcher -> matcher.group(1)) - .findFirst() - .map(Integer::valueOf); - } - private Map replaceHostAndPort(Map urlPropertyNameToValue, MSSQLServerContainerWrapper container) { String host = container.getContainerIpAddress(); - String port = container.getMappedPort(MS_SQL_SERVER_PORT).toString(); + Integer port = container.getMappedPort(MS_SQL_SERVER_PORT); return urlPropertyNameToValue.entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getKey, - entry -> entry.getValue().replace("", host) - .replace("", port))); + entry -> replaceHostAndPortPlaceholders(entry.getValue(), host, port))); } private Map addMissingUsernameAndPassword(Map urlPropertyNameToValue, 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 923dda5..b3ec7db 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,26 +1,60 @@ package com.infobip.testcontainers; -import org.springframework.context.*; +import java.util.Collection; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ApplicationListener; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.event.ContextClosedEvent; import org.testcontainers.lifecycle.Startable; -import java.util.concurrent.atomic.AtomicReference; - public abstract class InitializerBase - implements ApplicationContextInitializer, ApplicationListener { + implements ApplicationContextInitializer, ApplicationListener { - private final AtomicReference container = new AtomicReference<>(); + public static final String PORT_PLACEHOLDER = ""; + public static final String HOST_PLACEHOLDER = ""; - protected void start(C container) { - this.container.set(container); - container.start(); - } + protected static final Pattern JDBC_URL_WITH_PORT_GROUP_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); + + private final AtomicReference container = new AtomicReference<>(); @Override public void onApplicationEvent(ContextClosedEvent event) { C value = container.get(); - if(value != null) { + if (value != null) { value.stop(); } } + + protected void start(C container) { + this.container.set(container); + container.start(); + } + + protected String replaceHostAndPortPlaceholders(String source, String host, Integer port) { + return source.replace(HOST_PLACEHOLDER, host) + .replace(PORT_PLACEHOLDER, port.toString()); + } + + protected Optional resolveStaticPort(String connectionString, Pattern urlPatternWithPortGroup) { + return Optional.ofNullable(connectionString) + .map(urlPatternWithPortGroup::matcher) + .filter(Matcher::matches) + .map(matcher -> matcher.group(1)) + .map(Integer::valueOf); + } + + protected Optional resolveStaticPort(Collection connectionStrings, Pattern urlPatternWithPortGroup) { + return connectionStrings.stream() + .flatMap(connectionString -> resolveStaticPort(connectionString, urlPatternWithPortGroup) + .map(Stream::of) + .orElseGet(Stream::empty)) + .findFirst(); + } + } From b9420ff6af9a49d99c4085444aaecc612a17da6a Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 10:40:28 +0200 Subject: [PATCH 04/18] Kafka --- .../ClickhouseContainerInitializer.java | 2 +- .../kafka/KafkaContainerInitializer.java | 37 +++++++----- .../KafkaContainerWithStaticPortTest.java | 57 +++++++++++++++++++ .../resources/application-static-port.yaml | 7 +++ .../MSSQLServerContainerInitializer.java | 2 +- .../testcontainers/InitializerBase.java | 10 +++- 6 files changed, 98 insertions(+), 17 deletions(-) create mode 100644 infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java create mode 100644 infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.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 2d6172b..9f0f110 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 @@ -23,7 +23,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .orElseGet(ClickhouseContainerWrapper::new); resolveStaticPort(jdbcUrlValue, JDBC_URL_WITH_PORT_GROUP_PATTERN) - .ifPresent(staticPort -> container.setPortBindings(Collections.singletonList(staticPort + ":" + ClickhouseContainerWrapper.HTTP_PORT))); + .ifPresent(staticPort -> bindPort(container, staticPort, ClickhouseContainerWrapper.HTTP_PORT)); start(container); 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 55c91d2..a64a2be 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,5 +1,17 @@ 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; @@ -7,33 +19,31 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.Environment; -import java.util.*; -import java.util.concurrent.TimeUnit; -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 { + private static final Pattern KAFKA_SERVER_PATTERN = Pattern.compile("^.*:(\\d+).*"); + @Override public void initialize(ConfigurableApplicationContext applicationContext) { Environment environment = applicationContext.getEnvironment(); String bootstrapServers = Objects.requireNonNull(environment.getProperty("spring.kafka.bootstrap-servers")); KafkaContainerWrapper container = Optional.ofNullable( - environment.getProperty("testcontainers.kafka.docker.image.version")) + environment.getProperty("testcontainers.kafka.docker.image.version")) .map(KafkaContainerWrapper::new) .orElseGet(KafkaContainerWrapper::new); + resolveStaticPort(bootstrapServers, KAFKA_SERVER_PATTERN) + .ifPresent(staticPort -> bindPort(container, staticPort, KafkaContainerWrapper.KAFKA_PORT)); + start(container); - String url = bootstrapServers.replace("", container.getContainerIpAddress()) - .replace("", container.getMappedPort(KafkaContainerWrapper.KAFKA_PORT) - .toString()); + String url = replaceHostAndPortPlaceholders(bootstrapServers, + container.getContainerIpAddress(), + container.getMappedPort(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); + "spring.kafka.bootstrap-servers=" + url); values.applyTo(applicationContext); } @@ -54,4 +64,5 @@ private static void createTestKafkaTopics(String bootstrapServers, String[] topi throw new RuntimeException(e); } } + } diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java new file mode 100644 index 0000000..682d59d --- /dev/null +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java @@ -0,0 +1,57 @@ +package com.infobip.testcontainers.spring.kafka; + +import static org.assertj.core.api.BDDAssertions.then; + +import java.time.Duration; +import java.util.Objects; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import lombok.AllArgsConstructor; +import org.awaitility.Awaitility; +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; + +@AllArgsConstructor +@ActiveProfiles("static-port") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class KafkaContainerWithStaticPortTest { + + final static String TOPIC_NAME = "test-topic"; + + private final KafkaTemplate kafkaTemplate; + private final Listener listener; + private final KafkaProperties kafkaProperties; + + @Test + void shouldCreateContainer() throws InterruptedException, ExecutionException, TimeoutException { + // given + String givenData = "givenData"; + + // when + SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenData) + .completable() + .get(10, TimeUnit.SECONDS); + + // then + then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5000"); + then(actual).isNotNull(); + Awaitility.await().atMost(Duration.ofSeconds(10)).until(() -> { + String value = listener.getValue(); + + if(Objects.isNull(value)) { + return false; + } + + then(value).isEqualTo(givenData); + return true; + }); + } +} diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml new file mode 100644 index 0000000..fe33d46 --- /dev/null +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -0,0 +1,7 @@ +spring: + kafka: + consumer: + groupId: test + bootstrap-servers: :5000 + +testcontainers.kafka.topics: test-topic:1:1 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 54cf0b6..56dff74 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 @@ -34,7 +34,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .orElseGet(MSSQLServerContainerWrapper::new); resolveStaticPort(urlPropertyNameToValue.values(), JDBC_URL_WITH_PORT_GROUP_PATTERN) - .ifPresent(staticPort -> container.setPortBindings(Collections.singletonList(staticPort + ":" + MS_SQL_SERVER_PORT))); + .ifPresent(staticPort -> bindPort(container, staticPort, MS_SQL_SERVER_PORT)); start(container); Map replacedNameToValue = replaceHostAndPort(urlPropertyNameToValue, container); 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 b3ec7db..558be02 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,6 +1,7 @@ package com.infobip.testcontainers; import java.util.Collection; +import java.util.Collections; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; @@ -11,6 +12,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.event.ContextClosedEvent; +import org.testcontainers.containers.GenericContainer; import org.testcontainers.lifecycle.Startable; public abstract class InitializerBase @@ -37,8 +39,8 @@ protected void start(C container) { } protected String replaceHostAndPortPlaceholders(String source, String host, Integer port) { - return source.replace(HOST_PLACEHOLDER, host) - .replace(PORT_PLACEHOLDER, port.toString()); + return source.replaceAll(HOST_PLACEHOLDER, host) + .replaceAll(PORT_PLACEHOLDER, port.toString()); } protected Optional resolveStaticPort(String connectionString, Pattern urlPatternWithPortGroup) { @@ -57,4 +59,8 @@ protected Optional resolveStaticPort(Collection connectionStrin .findFirst(); } + protected void bindPort(GenericContainer container, Integer hostPort, Integer containerPort) { + container.setPortBindings(Collections.singletonList(hostPort + ":" + containerPort)); + } + } From 273b1fdd67ffceb1012e2b61f232d5c1bc5b4a5c Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 11:04:47 +0200 Subject: [PATCH 05/18] Postgres --- ....java => SqlServerWithStaticPortTest.java} | 2 +- .../PostgreSQLContainerInitializer.java | 23 +++++--- ...PostgreSQLContainerWithStaticPortTest.java | 58 +++++++++++++++++++ .../resources/application-static-port.yaml | 7 +++ 4 files changed, 80 insertions(+), 10 deletions(-) rename infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/{StaticPortSqlServerDockerTest.java => SqlServerWithStaticPortTest.java} (98%) create mode 100644 infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java create mode 100644 infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/SqlServerWithStaticPortTest.java similarity index 98% rename from infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java rename to infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/SqlServerWithStaticPortTest.java index 1b04b33..9c5193f 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/StaticPortSqlServerDockerTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/SqlServerWithStaticPortTest.java @@ -21,7 +21,7 @@ @ActiveProfiles("static-port") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class StaticPortSqlServerDockerTest { +class SqlServerWithStaticPortTest { private final Environment environment; private final DataSourceProperties properties; 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 63b73aa..ee94915 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,21 +1,21 @@ 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"); + environment.getProperty("testcontainers.postgresql.datasource.url.property.name")) + .orElse("spring.datasource.url"); String dataSourceUrl = environment.getProperty(dataSourceUrlPropertyName); if (StringUtils.isEmpty(dataSourceUrl)) { @@ -24,15 +24,20 @@ public void initialize(ConfigurableApplicationContext applicationContext) { 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)); + .map(imageName -> new PostgreSQLContainerWrapper(database, imageName)) + .orElseGet(() -> new PostgreSQLContainerWrapper(database)); + + resolveStaticPort(dataSourceUrl, JDBC_URL_WITH_PORT_GROUP_PATTERN) + .ifPresent(staticPort -> bindPort(container, staticPort, PostgreSQLContainerWrapper.POSTGRESQL_PORT)); + start(container); - String url = dataSourceUrl.replace("", container.getContainerIpAddress()) - .replace("", container.getMappedPort(PostgreSQLContainerWrapper.POSTGRESQL_PORT) - .toString()); + String url = replaceHostAndPortPlaceholders(dataSourceUrl, + container.getContainerIpAddress(), + container.getMappedPort(PostgreSQLContainerWrapper.POSTGRESQL_PORT)); TestPropertyValues values = TestPropertyValues.of(dataSourceUrlPropertyName + "=" + url); values.applyTo(applicationContext); } + } diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java new file mode 100644 index 0000000..f2e48f8 --- /dev/null +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java @@ -0,0 +1,58 @@ +package com.infobip.testcontainers.spring.postgresql; + +import static org.assertj.core.api.BDDAssertions.then; + +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.SQLException; + +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; + +@AllArgsConstructor +@ActiveProfiles("static-port") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class PostgreSQLContainerWithStaticPortTest { + + private final DataSourceProperties properties; + + @Test + void shouldCreateContainer() { + // given + JdbcTemplate jdbcTemplate = new JdbcTemplate(new SimpleDriverDataSource( + getDriver(properties.getUrl()), + properties.getUrl(), + properties.getUsername(), + properties.getPassword())); + + // when + String actual = jdbcTemplate.queryForObject("SELECT current_database();", String.class); + + // then + then(actual).isEqualTo("TestDatabase"); + } + + @Test + void shouldReplaceHostInJdbcUrl() { + // when + String actual = properties.getUrl(); + + // then + then(actual).contains("localhost:5000"); + } + + private Driver getDriver(String jdbcUrl) { + try { + return DriverManager.getDriver(jdbcUrl); + } catch (SQLException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml new file mode 100644 index 0000000..e312724 --- /dev/null +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -0,0 +1,7 @@ +spring: + datasource: + url: jdbc:postgresql://:5000/TestDatabase + username: test + password: test + +testcontainers.postgresql.docker.image: postgres:10 From 9fba2e7755c83cde59368789ae6755b8b4cecdb0 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 11:19:11 +0200 Subject: [PATCH 06/18] Rabbit --- .../rabbit/RabbitContainerInitializer.java | 25 ++++++---- .../RabbitContainerWithStaticPortTest.java | 46 +++++++++++++++++++ .../resources/application-static-port.yml | 5 ++ 3 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java create mode 100644 infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml diff --git a/infobip-rabbitmq-testcontainers-spring-boot/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java b/infobip-rabbitmq-testcontainers-spring-boot/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java index a735e1d..9539f9a 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java +++ b/infobip-rabbitmq-testcontainers-spring-boot/src/main/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializer.java @@ -1,32 +1,41 @@ package com.infobip.testcontainers.spring.rabbit; +import static com.infobip.testcontainers.spring.rabbit.RabbitContainerWrapper.PORT; + +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.testcontainers.containers.wait.strategy.Wait; -import java.util.Optional; - -import static com.infobip.testcontainers.spring.rabbit.RabbitContainerWrapper.PORT; - 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")) + environment.getProperty("testcontainers.rabbit.docker.image")) .map(RabbitContainerWrapper::new) .orElseGet( - () -> new RabbitContainerWrapper("rabbitmq:3.8.9-alpine")); + () -> new RabbitContainerWrapper("rabbitmq:3.8.9-alpine")); + + resolveStaticPort(environment) + .ifPresent(staticPort -> bindPort(container, staticPort, PORT)); container.waitingFor(Wait.forListeningPort()); start(container); TestPropertyValues values = TestPropertyValues.of( - String.format("spring.rabbitmq.addresses=%s:%d", container.getContainerIpAddress(), - container.getMappedPort(PORT))); + String.format("spring.rabbitmq.addresses=%s:%d", container.getContainerIpAddress(), + container.getMappedPort(PORT))); values.applyTo(configurableApplicationContext); } + + private Optional resolveStaticPort(Environment environment) { + return Optional.ofNullable(environment.getProperty("spring.rabbitmq.port")) + .map(Integer::valueOf); + } + } diff --git a/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java b/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java new file mode 100644 index 0000000..9767fd6 --- /dev/null +++ b/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java @@ -0,0 +1,46 @@ +package com.infobip.testcontainers.spring.rabbit; + +import static org.assertj.core.api.BDDAssertions.then; + +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; + +@AllArgsConstructor +@ActiveProfiles("static-port") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@TestConfiguration +@SpringBootTest(classes = Main.class) +class RabbitContainerWithStaticPortTest { + + private final RabbitTemplate rabbitTemplate; + private final RabbitProperties rabbitProperties; + + @Test + @DisplayName("Should initialize rabbit container and send message to exchange") + void shouldInitialize() { + // given + String givenMessage = "test"; + + // when + Throwable actual = BDDAssertions.catchThrowable( + () -> rabbitTemplate.convertAndSend("test.exchange", "test.key.bar", givenMessage)); + + // then + then(actual).isNull(); + } + + @Test + void shouldUseStaticPort() { + // then + then(rabbitProperties.getAddresses()).contains("localhost:5000"); + } + +} diff --git a/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml b/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml new file mode 100644 index 0000000..fe705a1 --- /dev/null +++ b/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml @@ -0,0 +1,5 @@ +spring: + rabbitmq: + port: 5000 + docker: + image: rabbitmq:3.6.14-alpine From 82c9d623151347c7f0a7ab6ce03b03d32aef5286 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 11:30:01 +0200 Subject: [PATCH 07/18] Redis --- .../ClickhouseContainerInitializer.java | 7 +-- .../kafka/KafkaContainerInitializer.java | 4 +- .../MSSQLServerContainerInitializer.java | 6 +-- .../PostgreSQLContainerInitializer.java | 6 +-- .../redis/RedisContainerInitializer.java | 18 ++++---- .../RedisContainerWithStaticPortTest.java | 43 +++++++++++++++++++ .../resources/application-static-port.yaml | 3 ++ .../testcontainers/InitializerBase.java | 12 +++--- 8 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java create mode 100644 infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.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 9f0f110..906a43f 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,6 +1,5 @@ package com.infobip.testcontainers.spring.clickhouse; -import java.util.Collections; import java.util.Objects; import java.util.Optional; @@ -22,14 +21,12 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .map(ClickhouseContainerWrapper::new) .orElseGet(ClickhouseContainerWrapper::new); - resolveStaticPort(jdbcUrlValue, JDBC_URL_WITH_PORT_GROUP_PATTERN) + resolveStaticPort(jdbcUrlValue, GENERIC_URL_WITH_PORT_GROUP_PATTERN) .ifPresent(staticPort -> bindPort(container, staticPort, ClickhouseContainerWrapper.HTTP_PORT)); start(container); - String url = replaceHostAndPortPlaceholders(jdbcUrlValue, - container.getContainerIpAddress(), - container.getMappedPort(ClickhouseContainerWrapper.HTTP_PORT)); + String url = replaceHostAndPortPlaceholders(jdbcUrlValue, container, ClickhouseContainerWrapper.HTTP_PORT); TestPropertyValues values = TestPropertyValues.of( String.format("%s=%s", jdbcUrlPropertyPath, url)); 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 a64a2be..615c5af 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 @@ -36,9 +36,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .ifPresent(staticPort -> bindPort(container, staticPort, KafkaContainerWrapper.KAFKA_PORT)); start(container); - String url = replaceHostAndPortPlaceholders(bootstrapServers, - container.getContainerIpAddress(), - container.getMappedPort(KafkaContainerWrapper.KAFKA_PORT)); + String url = replaceHostAndPortPlaceholders(bootstrapServers, container, KafkaContainerWrapper.KAFKA_PORT); Optional.ofNullable(environment.getProperty("testcontainers.kafka.topics", String[].class)) .ifPresent(topics -> createTestKafkaTopics(url, topics)); 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 56dff74..5506bb4 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 @@ -33,7 +33,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .map(MSSQLServerContainerWrapper::new) .orElseGet(MSSQLServerContainerWrapper::new); - resolveStaticPort(urlPropertyNameToValue.values(), JDBC_URL_WITH_PORT_GROUP_PATTERN) + resolveStaticPort(urlPropertyNameToValue.values(), GENERIC_URL_WITH_PORT_GROUP_PATTERN) .ifPresent(staticPort -> bindPort(container, staticPort, MS_SQL_SERVER_PORT)); start(container); @@ -76,12 +76,10 @@ private Map getUrlPropertyNameToValue(Environment environment, L private Map replaceHostAndPort(Map urlPropertyNameToValue, MSSQLServerContainerWrapper container) { - String host = container.getContainerIpAddress(); - Integer port = container.getMappedPort(MS_SQL_SERVER_PORT); return urlPropertyNameToValue.entrySet() .stream() .collect(Collectors.toMap(Map.Entry::getKey, - entry -> replaceHostAndPortPlaceholders(entry.getValue(), host, port))); + entry -> replaceHostAndPortPlaceholders(entry.getValue(), container, MS_SQL_SERVER_PORT))); } private Map addMissingUsernameAndPassword(Map urlPropertyNameToValue, 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 ee94915..cc0e0e1 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 @@ -27,14 +27,12 @@ public void initialize(ConfigurableApplicationContext applicationContext) { .map(imageName -> new PostgreSQLContainerWrapper(database, imageName)) .orElseGet(() -> new PostgreSQLContainerWrapper(database)); - resolveStaticPort(dataSourceUrl, JDBC_URL_WITH_PORT_GROUP_PATTERN) + resolveStaticPort(dataSourceUrl, GENERIC_URL_WITH_PORT_GROUP_PATTERN) .ifPresent(staticPort -> bindPort(container, staticPort, PostgreSQLContainerWrapper.POSTGRESQL_PORT)); start(container); - String url = replaceHostAndPortPlaceholders(dataSourceUrl, - container.getContainerIpAddress(), - container.getMappedPort(PostgreSQLContainerWrapper.POSTGRESQL_PORT)); + String url = replaceHostAndPortPlaceholders(dataSourceUrl, container, PostgreSQLContainerWrapper.POSTGRESQL_PORT); TestPropertyValues values = TestPropertyValues.of(dataSourceUrlPropertyName + "=" + url); values.applyTo(applicationContext); 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 7a3e8d0..4b5e5c4 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 @@ -1,15 +1,13 @@ package com.infobip.testcontainers.spring.redis; +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; - -import static com.infobip.testcontainers.spring.redis.RedisContainerWrapper.PORT; - public class RedisContainerInitializer extends InitializerBase { @Override @@ -17,13 +15,17 @@ public void initialize(ConfigurableApplicationContext applicationContext) { Environment environment = applicationContext.getEnvironment(); String redisUrl = Objects.requireNonNull(environment.getProperty("spring.redis.url")); RedisContainerWrapper container = Optional.ofNullable( - environment.getProperty("testcontainers.redis.docker.image")) + environment.getProperty("testcontainers.redis.docker.image")) .map(RedisContainerWrapper::new) .orElseGet(() -> new RedisContainerWrapper("redis:5.0.7-alpine")); + resolveStaticPort(redisUrl, GENERIC_URL_WITH_PORT_GROUP_PATTERN) + .ifPresent(staticPort -> bindPort(container, staticPort, RedisContainerWrapper.PORT)); + start(container); - String url = redisUrl.replace("", container.getContainerIpAddress()) - .replace("", container.getMappedPort(PORT).toString()); + + String url = replaceHostAndPortPlaceholders(redisUrl, container, RedisContainerWrapper.PORT); TestPropertyValues values = TestPropertyValues.of("spring.redis.url=" + url); values.applyTo(applicationContext); } + } diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java new file mode 100644 index 0000000..9477941 --- /dev/null +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java @@ -0,0 +1,43 @@ +package com.infobip.testcontainers.spring.redis; + +import static org.assertj.core.api.BDDAssertions.then; + +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; + +@AllArgsConstructor +@ActiveProfiles("static-port") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class RedisContainerWithStaticPortTest { + + private final RedisTemplate template; + private final RedisProperties redisProperties; + + @Test + void shouldCreateContainer() { + // given + String givenKey = "givenKey"; + String givenHashKey = "givenHashKey"; + String givenData = "givenData"; + template.opsForHash().put(givenKey, givenHashKey, givenData); + + // when + Object actual = template.opsForHash().get(givenKey, givenHashKey); + + // then + then(actual).isEqualTo(givenData); + } + + @Test + void shouldSetHostInProperties() { + // then + then(redisProperties.getUrl()).contains("localhost:5000"); + } + +} diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml new file mode 100644 index 0000000..eea35d1 --- /dev/null +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -0,0 +1,3 @@ +spring: + redis: + url: redis://:5000 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 558be02..8c4d901 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 @@ -12,7 +12,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.event.ContextClosedEvent; -import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Container; import org.testcontainers.lifecycle.Startable; public abstract class InitializerBase @@ -21,7 +21,7 @@ public abstract class InitializerBase public static final String PORT_PLACEHOLDER = ""; public static final String HOST_PLACEHOLDER = ""; - protected static final Pattern JDBC_URL_WITH_PORT_GROUP_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); + protected static final Pattern GENERIC_URL_WITH_PORT_GROUP_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?"); private final AtomicReference container = new AtomicReference<>(); @@ -38,9 +38,9 @@ protected void start(C container) { container.start(); } - protected String replaceHostAndPortPlaceholders(String source, String host, Integer port) { - return source.replaceAll(HOST_PLACEHOLDER, host) - .replaceAll(PORT_PLACEHOLDER, port.toString()); + protected String replaceHostAndPortPlaceholders(String source, Container container, Integer originalContainerPort) { + return source.replaceAll(HOST_PLACEHOLDER, container.getContainerIpAddress()) + .replaceAll(PORT_PLACEHOLDER, container.getMappedPort(originalContainerPort).toString()); } protected Optional resolveStaticPort(String connectionString, Pattern urlPatternWithPortGroup) { @@ -59,7 +59,7 @@ protected Optional resolveStaticPort(Collection connectionStrin .findFirst(); } - protected void bindPort(GenericContainer container, Integer hostPort, Integer containerPort) { + protected void bindPort(Container container, Integer hostPort, Integer containerPort) { container.setPortBindings(Collections.singletonList(hostPort + ":" + containerPort)); } From 8178bfad6c1d21f9664f86646be7a456e36f6453 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 11:41:39 +0200 Subject: [PATCH 08/18] Readme and naming --- README.md | 10 +++++++++- ...ckhouseContainerInitializerWithStaticPortTest.java} | 2 +- ...> KafkaContainerInitializerWithStaticPortTest.java} | 2 +- ...LServerContainerInitializerWithJtdsDriverTest.java} | 4 ++-- ...erContainerInitializerWithMicrosoftDriverTest.java} | 2 +- ...LServerContainerInitializerWithStaticPortTest.java} | 2 +- ...tgreSQLContainerInitializerWithStaticPortTest.java} | 2 +- ... RabbitContainerInitializerWithStaticPortTest.java} | 2 +- ...> RedisContainerInitializerWithStaticPortTest.java} | 2 +- 9 files changed, 18 insertions(+), 10 deletions(-) rename infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/{ClickhouseContainerStaticPortTest.java => ClickhouseContainerInitializerWithStaticPortTest.java} (95%) rename infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/{KafkaContainerWithStaticPortTest.java => KafkaContainerInitializerWithStaticPortTest.java} (97%) rename infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/{JtdsDriverSqlServerDockerTest.java => MSSQLServerContainerInitializerWithJtdsDriverTest.java} (96%) rename infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/{MicrosoftDriverSqlServerDockerTest.java => MSSQLServerContainerInitializerWithMicrosoftDriverTest.java} (98%) rename infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/{SqlServerWithStaticPortTest.java => MSSQLServerContainerInitializerWithStaticPortTest.java} (97%) rename infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/{PostgreSQLContainerWithStaticPortTest.java => PostgreSQLContainerInitializerWithStaticPortTest.java} (96%) rename infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/{RabbitContainerWithStaticPortTest.java => RabbitContainerInitializerWithStaticPortTest.java} (96%) rename infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/{RedisContainerWithStaticPortTest.java => RedisContainerInitializerWithStaticPortTest.java} (96%) diff --git a/README.md b/README.md index 744bd11..540176e 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,14 @@ For changes check the [changelog](CHANGELOG.md). ## Usage + +### General + +This library tries to reuse existing Spring Boot configuration classes and enhance their behaviour by performing some extra steps around them. +Generally, in cases where port placeholders are used (``), the library will make sure that the appropriate Docker container is started on +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. + ### MSSQL @@ -86,7 +94,7 @@ spring: Logical database is automatically created. Container IP address is resolved based on running host, meaning on local machine `` will resolve to `localhost` while inside Docker placeholder will resolve to `containerIp`. -Docker container is mapped on random port so `` placeholder is used and will be automatically substituted. +When `` placeholder is used, container will be mapped on random port and automatically substituted. #### Local Development: diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java similarity index 95% rename from infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java rename to infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java index 4b570a6..6c2395a 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerStaticPortTest.java +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerWithStaticPortTest.java @@ -17,7 +17,7 @@ @ActiveProfiles("static-port") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class ClickhouseContainerStaticPortTest { +class ClickhouseContainerInitializerWithStaticPortTest { Environment environment; DataSource dataSource; diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java similarity index 97% rename from infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java rename to infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java index 682d59d..c778957 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerWithStaticPortTest.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/KafkaContainerInitializerWithStaticPortTest.java @@ -22,7 +22,7 @@ @ActiveProfiles("static-port") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class KafkaContainerWithStaticPortTest { +class KafkaContainerInitializerWithStaticPortTest { final static String TOPIC_NAME = "test-topic"; diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/JtdsDriverSqlServerDockerTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java similarity index 96% rename from infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/JtdsDriverSqlServerDockerTest.java rename to infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java index afc8ca3..ba28913 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/JtdsDriverSqlServerDockerTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithJtdsDriverTest.java @@ -17,7 +17,7 @@ @ActiveProfiles("jtds") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class JtdsDriverSqlServerDockerTest { +class MSSQLServerContainerInitializerWithJtdsDriverTest { private final DataSourceProperties properties; @@ -45,4 +45,4 @@ private Driver getDriver(String jdbcUrl) { throw new IllegalArgumentException(e); } } -} \ No newline at end of file +} diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MicrosoftDriverSqlServerDockerTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java similarity index 98% rename from infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MicrosoftDriverSqlServerDockerTest.java rename to infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java index d0c1352..8fde32e 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MicrosoftDriverSqlServerDockerTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithMicrosoftDriverTest.java @@ -18,7 +18,7 @@ @ActiveProfiles("microsoft-driver") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class MicrosoftDriverSqlServerDockerTest { +class MSSQLServerContainerInitializerWithMicrosoftDriverTest { 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/SqlServerWithStaticPortTest.java b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java similarity index 97% rename from infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/SqlServerWithStaticPortTest.java rename to infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java index 9c5193f..b97bca9 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/SqlServerWithStaticPortTest.java +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/mssql/MSSQLServerContainerInitializerWithStaticPortTest.java @@ -21,7 +21,7 @@ @ActiveProfiles("static-port") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class SqlServerWithStaticPortTest { +class MSSQLServerContainerInitializerWithStaticPortTest { private final Environment environment; private final DataSourceProperties properties; diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java similarity index 96% rename from infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java rename to infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java index f2e48f8..fdba5ed 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerWithStaticPortTest.java +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/postgresql/PostgreSQLContainerInitializerWithStaticPortTest.java @@ -19,7 +19,7 @@ @ActiveProfiles("static-port") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class PostgreSQLContainerWithStaticPortTest { +class PostgreSQLContainerInitializerWithStaticPortTest { private final DataSourceProperties properties; diff --git a/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java b/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java similarity index 96% rename from infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java rename to infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java index 9767fd6..12e785c 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerWithStaticPortTest.java +++ b/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java @@ -18,7 +18,7 @@ @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @TestConfiguration @SpringBootTest(classes = Main.class) -class RabbitContainerWithStaticPortTest { +class RabbitContainerInitializerWithStaticPortTest { private final RabbitTemplate rabbitTemplate; private final RabbitProperties rabbitProperties; diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java similarity index 96% rename from infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java rename to infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java index 9477941..e474652 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerWithStaticPortTest.java +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/redis/RedisContainerInitializerWithStaticPortTest.java @@ -14,7 +14,7 @@ @ActiveProfiles("static-port") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @SpringBootTest(classes = Main.class) -class RedisContainerWithStaticPortTest { +class RedisContainerInitializerWithStaticPortTest { private final RedisTemplate template; private final RedisProperties redisProperties; From ea7119cbca913588b885623581cd441540f86197 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 11:44:38 +0200 Subject: [PATCH 09/18] Readme and naming --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 540176e..e7de1e7 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ spring: Logical database is automatically created. Container IP address is resolved based on running host, meaning on local machine `` will resolve to `localhost` while inside Docker placeholder will resolve to `containerIp`. -Docker container is mapped on random port so `` placeholder is used and will be automatically substituted. +When `` placeholder is used, container will be mapped on random port and automatically substituted. #### Local Development: @@ -250,7 +250,7 @@ spring: Container IP address is resolved based on running host, meaning on local machine `` will resolve to `localhost` while inside Docker placeholder will resolve to `containerIp`. -Docker container is mapped on random port so `` placeholder is used and will be automatically substituted. +When `` placeholder is used, container will be mapped on random port and automatically substituted. #### Local Development: @@ -331,7 +331,7 @@ spring: Logical database is automatically created. Container IP address is resolved based on running host, meaning on local machine `` will resolve to `localhost` while inside Docker placeholder will resolve to `containerIp`. -Docker container is mapped on random port so `` placeholder is used and will be automatically substituted. +When `` placeholder is used, container will be mapped on random port and automatically substituted. #### Local Development: From 329f68551425733ec064093d586074d018c1455c Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 11:50:51 +0200 Subject: [PATCH 10/18] Readme and naming --- .../ClickhouseContainerInitializerWithStaticPortTest.java | 7 ++++++- .../KafkaContainerInitializerWithStaticPortTest.java | 8 +++++++- ...MSSQLServerContainerInitializerWithStaticPortTest.java | 6 +++--- .../src/test/resources/application-static-port.yaml | 6 +++--- 4 files changed, 19 insertions(+), 8 deletions(-) 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 6c2395a..d90a57a 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 @@ -31,8 +31,13 @@ void shouldCreateContainerWithStaticPort() { String result = jdbcTemplate.queryForObject("SELECT 1", String.class); //then - then(environment.getProperty(CLICKHOUSE_URL_PROPERTY_NAME)).isEqualTo("jdbc:clickhouse://localhost:5000"); then(result).isEqualTo("1"); } + @Test + void shouldResolveHostInUrl() { + // then + then(environment.getProperty(CLICKHOUSE_URL_PROPERTY_NAME)).isEqualTo("jdbc:clickhouse://localhost:5000"); + } + } 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 c778957..a1d73d4 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 @@ -41,7 +41,6 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti .get(10, TimeUnit.SECONDS); // then - then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5000"); then(actual).isNotNull(); Awaitility.await().atMost(Duration.ofSeconds(10)).until(() -> { String value = listener.getValue(); @@ -54,4 +53,11 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti return true; }); } + + @Test + void shouldResolveHostInUrl() { + // then + then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5000"); + } + } 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 b97bca9..b52d0c9 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 @@ -48,7 +48,7 @@ void shouldReplaceHostInJdbcUrl() { String actual = environment.getProperty("spring.datasource.url"); // then - then(actual).contains("localhost:1433"); + then(actual).contains("localhost:5000"); } @Test @@ -57,7 +57,7 @@ void shouldReplaceHostInR2dbc() { String actual = environment.getProperty("spring.r2dbc.url"); // then - then(actual).contains("localhost:1433"); + then(actual).contains("localhost:5000"); } @Test @@ -66,7 +66,7 @@ void shouldReplaceHostInFlyway() { String actual = environment.getProperty("spring.flyway.url"); // then - then(actual).contains("localhost:1433"); + then(actual).contains("localhost:5000"); } private Driver getDriver(String jdbcUrl) { diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index cf1ce7f..5659f7c 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -1,7 +1,7 @@ spring: datasource: - url: jdbc:sqlserver://:1433;database=MicrosoftDriverTestDatabase + url: jdbc:sqlserver://:5000;database=MicrosoftDriverTestDatabase r2dbc: - url: r2dbc:pool:mssql://:1433/InfobipSpringDataJdbcQuerydslTest + url: r2dbc:pool:mssql://:5000/InfobipSpringDataJdbcQuerydslTest flyway: - url: jdbc:sqlserver://:1433;database=MicrosoftDriverTestDatabase + url: jdbc:sqlserver://:5000;database=MicrosoftDriverTestDatabase From 9cbd368783e0df0719a17b22d22d79518c0969e5 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 12:48:26 +0200 Subject: [PATCH 11/18] Added changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d4e61d..dcb2cb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### 3.3.0 +General: +* Added support for starting containers on a predefined port + ### 3.2.0 #### ClickHouse: From 7f424ac5fbc94d4d2a7685b9991bd799f620f560 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 12:49:39 +0200 Subject: [PATCH 12/18] Added changelog --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 51a2f6d..dc2fdeb 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,12 @@ igor.susic@infobip.com Infobip Ltd. + + tin-stavinoha + Tin Stavinoha + tin.stavinoha@infobip.com + Infobip Ltd. + From 7532dd9594d72bdc0ce5697fc08fba151c9d08db Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 13:37:44 +0200 Subject: [PATCH 13/18] Increased timeout --- .../spring/kafka/KafkaContainerInitializerTest.java | 2 +- .../kafka/KafkaContainerInitializerWithStaticPortTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 30b9526..b167363 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 @@ -39,7 +39,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti // then then(actual).isNotNull(); - Awaitility.await().atMost(Duration.ofSeconds(10)).until(() -> { + Awaitility.await().atMost(Duration.ofSeconds(30)).until(() -> { String value = listener.getValue(); if(Objects.isNull(value)) { 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 a1d73d4..f89caab 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 @@ -42,7 +42,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti // then then(actual).isNotNull(); - Awaitility.await().atMost(Duration.ofSeconds(10)).until(() -> { + Awaitility.await().atMost(Duration.ofSeconds(30)).until(() -> { String value = listener.getValue(); if(Objects.isNull(value)) { From e275a10aec84d9098d62c579675f7b8891fb2ddc Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Wed, 16 Jun 2021 13:52:56 +0200 Subject: [PATCH 14/18] Increased timeout --- .../spring/kafka/KafkaContainerInitializerTest.java | 2 +- .../kafka/KafkaContainerInitializerWithStaticPortTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 b167363..61fb515 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 @@ -35,7 +35,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti // when SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenData) .completable() - .get(10, TimeUnit.SECONDS); + .get(30, TimeUnit.SECONDS); // then then(actual).isNotNull(); 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 f89caab..97ef5af 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 @@ -38,7 +38,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti // when SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenData) .completable() - .get(10, TimeUnit.SECONDS); + .get(30, TimeUnit.SECONDS); // then then(actual).isNotNull(); From 1e95f2b102ea3cc781bd65edb2d8d97d14bb798e Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Thu, 17 Jun 2021 07:58:33 +0200 Subject: [PATCH 15/18] Fixed tests --- .../kafka/KafkaContainerInitializerTest.java | 33 ++++++++----------- ...ontainerInitializerWithStaticPortTest.java | 21 ++++-------- .../testcontainers/spring/kafka/Listener.java | 7 ++-- .../resources/application-static-port.yaml | 5 +-- .../src/test/resources/application-test.yaml | 3 +- 5 files changed, 27 insertions(+), 42 deletions(-) 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 61fb515..745b85b 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 @@ -1,7 +1,14 @@ package com.infobip.testcontainers.spring.kafka; +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 lombok.AllArgsConstructor; -import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.kafka.core.KafkaTemplate; @@ -9,12 +16,6 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestConstructor; -import java.time.Duration; -import java.util.Objects; -import java.util.concurrent.*; - -import static org.assertj.core.api.BDDAssertions.then; - @AllArgsConstructor @ActiveProfiles("test") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @@ -28,26 +29,18 @@ class KafkaContainerInitializerTest { @Test void shouldCreateContainer() throws InterruptedException, ExecutionException, TimeoutException { - // given - String givenData = "givenData"; + String givenValue = this.getClass().getName(); // when - SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenData) + SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenValue) .completable() .get(30, TimeUnit.SECONDS); // then then(actual).isNotNull(); - Awaitility.await().atMost(Duration.ofSeconds(30)).until(() -> { - String value = listener.getValue(); - - if(Objects.isNull(value)) { - return false; - } - - then(value).isEqualTo(givenData); - return true; - }); + await().atMost(Duration.ofSeconds(10)) + .untilAsserted(() -> then(listener.getValue()).isEqualTo(givenValue)); } + } 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 97ef5af..a2036b0 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,15 +1,14 @@ package com.infobip.testcontainers.spring.kafka; import static org.assertj.core.api.BDDAssertions.then; +import static org.awaitility.Awaitility.await; import java.time.Duration; -import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import lombok.AllArgsConstructor; -import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.kafka.KafkaProperties; import org.springframework.boot.test.context.SpringBootTest; @@ -33,31 +32,23 @@ class KafkaContainerInitializerWithStaticPortTest { @Test void shouldCreateContainer() throws InterruptedException, ExecutionException, TimeoutException { // given - String givenData = "givenData"; + String givenValue = this.getClass().getName(); // when - SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenData) + SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenValue) .completable() .get(30, TimeUnit.SECONDS); // then then(actual).isNotNull(); - Awaitility.await().atMost(Duration.ofSeconds(30)).until(() -> { - String value = listener.getValue(); - - if(Objects.isNull(value)) { - return false; - } - - then(value).isEqualTo(givenData); - return true; - }); + await().atMost(Duration.ofSeconds(10)) + .untilAsserted(() -> then(listener.getValue()).isEqualTo(givenValue)); } @Test void shouldResolveHostInUrl() { // then - then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5000"); + then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5001"); } } diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Listener.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Listener.java index 4aa173f..40380ba 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Listener.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Listener.java @@ -1,14 +1,12 @@ package com.infobip.testcontainers.spring.kafka; +import java.util.concurrent.atomic.AtomicReference; + import lombok.AllArgsConstructor; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.messaging.handler.annotation.Payload; import org.springframework.stereotype.Component; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.atomic.AtomicReference; - @AllArgsConstructor @Component class Listener { @@ -23,4 +21,5 @@ public void handle(@Payload String value) { String getValue() { return value.get(); } + } diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index fe33d46..1858e68 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -1,7 +1,8 @@ spring: kafka: consumer: - groupId: test - bootstrap-servers: :5000 + groupId: static + autoOffsetReset: earliest + bootstrap-servers: :5001 testcontainers.kafka.topics: test-topic:1:1 diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml index 0d68e2c..391e111 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml @@ -2,6 +2,7 @@ spring: kafka: consumer: groupId: test + autoOffsetReset: earliest bootstrap-servers: : -testcontainers.kafka.topics: test-topic:1:1 \ No newline at end of file +testcontainers.kafka.topics: test-topic:1:1 From e5de065d726302e333c8384e49c0372d3e1c6e70 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Thu, 17 Jun 2021 08:04:36 +0200 Subject: [PATCH 16/18] Reduced timeouts --- .../spring/kafka/KafkaContainerInitializerTest.java | 2 +- .../kafka/KafkaContainerInitializerWithStaticPortTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 745b85b..ef9aeee 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 @@ -35,7 +35,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti // when SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenValue) .completable() - .get(30, TimeUnit.SECONDS); + .get(10, TimeUnit.SECONDS); // then then(actual).isNotNull(); 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 a2036b0..bbd06ef 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 @@ -37,7 +37,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti // when SendResult actual = kafkaTemplate.send(TOPIC_NAME, "key", givenValue) .completable() - .get(30, TimeUnit.SECONDS); + .get(10, TimeUnit.SECONDS); // then then(actual).isNotNull(); From efe7e8459250a185026e9472c576f2a43ba9d218 Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Thu, 17 Jun 2021 08:14:35 +0200 Subject: [PATCH 17/18] No port reuse --- .../ClickhouseContainerInitializerWithStaticPortTest.java | 2 +- .../src/test/resources/application-static-port.yaml | 2 +- .../kafka/KafkaContainerInitializerWithStaticPortTest.java | 2 +- .../src/test/resources/application-static-port.yaml | 2 +- .../MSSQLServerContainerInitializerWithStaticPortTest.java | 6 +++--- .../src/test/resources/application-static-port.yaml | 6 +++--- .../PostgreSQLContainerInitializerWithStaticPortTest.java | 2 +- .../src/test/resources/application-static-port.yaml | 2 +- .../RabbitContainerInitializerWithStaticPortTest.java | 2 +- .../src/test/resources/application-static-port.yml | 2 +- .../redis/RedisContainerInitializerWithStaticPortTest.java | 2 +- .../src/test/resources/application-static-port.yaml | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) 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 d90a57a..27be7cc 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 @@ -37,7 +37,7 @@ void shouldCreateContainerWithStaticPort() { @Test void shouldResolveHostInUrl() { // then - then(environment.getProperty(CLICKHOUSE_URL_PROPERTY_NAME)).isEqualTo("jdbc:clickhouse://localhost:5000"); + then(environment.getProperty(CLICKHOUSE_URL_PROPERTY_NAME)).isEqualTo("jdbc:clickhouse://localhost:5001"); } } diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index 47a4f4c..5a25158 100644 --- a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -1,7 +1,7 @@ spring: datasource: clickhouse: - jdbc-url: jdbc:clickhouse://:5000 + jdbc-url: jdbc:clickhouse://:5001 testcontainers: clickhouse: 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 bbd06ef..29f18c4 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 @@ -48,7 +48,7 @@ void shouldCreateContainer() throws InterruptedException, ExecutionException, Ti @Test void shouldResolveHostInUrl() { // then - then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5001"); + then(kafkaProperties.getBootstrapServers()).containsExactly("localhost:5002"); } } diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index 1858e68..ba61be8 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -3,6 +3,6 @@ spring: consumer: groupId: static autoOffsetReset: earliest - bootstrap-servers: :5001 + bootstrap-servers: :5002 testcontainers.kafka.topics: test-topic:1:1 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 b52d0c9..d4a07fd 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 @@ -48,7 +48,7 @@ void shouldReplaceHostInJdbcUrl() { String actual = environment.getProperty("spring.datasource.url"); // then - then(actual).contains("localhost:5000"); + then(actual).contains("localhost:5003"); } @Test @@ -57,7 +57,7 @@ void shouldReplaceHostInR2dbc() { String actual = environment.getProperty("spring.r2dbc.url"); // then - then(actual).contains("localhost:5000"); + then(actual).contains("localhost:5003"); } @Test @@ -66,7 +66,7 @@ void shouldReplaceHostInFlyway() { String actual = environment.getProperty("spring.flyway.url"); // then - then(actual).contains("localhost:5000"); + then(actual).contains("localhost:5003"); } private Driver getDriver(String jdbcUrl) { diff --git a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index 5659f7c..1d94150 100644 --- a/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-mssql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -1,7 +1,7 @@ spring: datasource: - url: jdbc:sqlserver://:5000;database=MicrosoftDriverTestDatabase + url: jdbc:sqlserver://:5003;database=MicrosoftDriverTestDatabase r2dbc: - url: r2dbc:pool:mssql://:5000/InfobipSpringDataJdbcQuerydslTest + url: r2dbc:pool:mssql://:5003/InfobipSpringDataJdbcQuerydslTest flyway: - url: jdbc:sqlserver://:5000;database=MicrosoftDriverTestDatabase + url: jdbc:sqlserver://:5003;database=MicrosoftDriverTestDatabase 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 fdba5ed..049df15 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 @@ -45,7 +45,7 @@ void shouldReplaceHostInJdbcUrl() { String actual = properties.getUrl(); // then - then(actual).contains("localhost:5000"); + then(actual).contains("localhost:5004"); } private Driver getDriver(String jdbcUrl) { diff --git a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index e312724..32b257c 100644 --- a/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-postgresql-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -1,6 +1,6 @@ spring: datasource: - url: jdbc:postgresql://:5000/TestDatabase + url: jdbc:postgresql://:5004/TestDatabase username: test password: test diff --git a/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java b/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java index 12e785c..3e4c448 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java +++ b/infobip-rabbitmq-testcontainers-spring-boot/src/test/java/com/infobip/testcontainers/spring/rabbit/RabbitContainerInitializerWithStaticPortTest.java @@ -40,7 +40,7 @@ void shouldInitialize() { @Test void shouldUseStaticPort() { // then - then(rabbitProperties.getAddresses()).contains("localhost:5000"); + then(rabbitProperties.getAddresses()).contains("localhost:5005"); } } diff --git a/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml b/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml index fe705a1..6b76d0e 100644 --- a/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml +++ b/infobip-rabbitmq-testcontainers-spring-boot/src/test/resources/application-static-port.yml @@ -1,5 +1,5 @@ spring: rabbitmq: - port: 5000 + port: 5005 docker: image: rabbitmq:3.6.14-alpine 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 e474652..3369c6a 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 @@ -37,7 +37,7 @@ void shouldCreateContainer() { @Test void shouldSetHostInProperties() { // then - then(redisProperties.getUrl()).contains("localhost:5000"); + then(redisProperties.getUrl()).contains("localhost:5006"); } } diff --git a/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml index eea35d1..c849f03 100644 --- a/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml +++ b/infobip-redis-testcontainers-spring-boot-starter/src/test/resources/application-static-port.yaml @@ -1,3 +1,3 @@ spring: redis: - url: redis://:5000 + url: redis://:5006 From 7d944ad3380562b8e715149626e8e046dfe835af Mon Sep 17 00:00:00 2001 From: tstavinoha Date: Thu, 17 Jun 2021 09:44:46 +0200 Subject: [PATCH 18/18] Sequential Workflow --- .github/workflows/maven.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 0052938..2bc91f8 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -10,6 +10,7 @@ jobs: build: runs-on: ubuntu-latest + concurrency: sequential steps: - uses: actions/checkout@v2