From 1706a24487b0e009a4e20a011cdc6762a21cc674 Mon Sep 17 00:00:00 2001 From: admitrov Date: Sun, 1 Jun 2025 08:10:09 +0200 Subject: [PATCH 01/11] replace usage of MapPropertySource as DynamicPropertyRegistrar --- embedded-aerospike/pom.xml | 4 + ...beddedAerospikeBootstrapConfiguration.java | 65 ++++--- embedded-artifactory/pom.xml | 4 + ...ddedArtifactoryBootstrapConfiguration.java | 76 ++++----- embedded-azurite/pom.xml | 4 + ...EmbeddedAzuriteBootstrapConfiguration.java | 158 +++++++++--------- embedded-cassandra/pom.xml | 4 + ...beddedCassandraBootstrapConfiguration.java | 81 +++++---- embedded-clickhouse/pom.xml | 4 + ...eddedClickHouseBootstrapConfiguration.java | 77 ++++----- embedded-cockroachdb/pom.xml | 4 + ...ddedCockroachDBBootstrapConfiguration.java | 71 ++++---- embedded-consul/pom.xml | 4 + .../EmbeddedConsulBootstrapConfiguration.java | 59 +++---- ...dConsulBootstrapConfigurationBaseTest.java | 15 +- ...onsulBootstrapConfigurationConfigTest.java | 8 +- ...eddedConsulBootstrapConfigurationTest.java | 10 +- embedded-couchbase/pom.xml | 4 + ...beddedCouchbaseBootstrapConfiguration.java | 79 ++++----- embedded-db2/pom.xml | 4 + .../EmbeddedDb2BootstrapConfiguration.java | 77 ++++----- embedded-dynamodb/pom.xml | 4 + ...mbeddedDynamoDBBootstrapConfiguration.java | 70 +++----- embedded-elasticsearch/pom.xml | 4 + ...edElasticSearchBootstrapConfiguration.java | 72 ++++---- .../EmbeddedGitBootstrapConfiguration.java | 71 ++++---- embedded-google-pubsub/pom.xml | 4 + .../EmbeddedPubsubBootstrapConfiguration.java | 59 +++---- ...EmbeddedStorageBootstrapConfiguration.java | 70 ++++---- embedded-grafana/pom.xml | 4 + ...EmbeddedGrafanaBootstrapConfiguration.java | 72 ++++---- embedded-influxdb/pom.xml | 4 + ...mbeddedInfluxDBBootstrapConfiguration.java | 85 ++++------ embedded-k3s/pom.xml | 4 + .../EmbeddedK3sBootstrapConfiguration.java | 28 ++-- embedded-kafka/pom.xml | 4 + .../KafkaContainerConfiguration.java | 128 ++++++-------- .../SchemaRegistryContainerConfiguration.java | 30 +++- embedded-keycloak/pom.xml | 4 + ...mbeddedKeycloakBootstrapConfiguration.java | 63 +++---- .../keycloak/KeycloakContainerFactory.java | 51 ------ embedded-keydb/pom.xml | 4 + .../EmbeddedKeyDbBootstrapConfiguration.java | 55 +++--- .../testcontainer/keydb/EnvUtils.java | 31 ---- embedded-localstack/pom.xml | 4 + ...eddedLocalStackBootstrapConfiguration.java | 90 ++++------ ...EmbeddedMailHogBootstrapConfiguration.java | 64 +++---- embedded-mariadb/pom.xml | 4 + ...EmbeddedMariaDBBootstrapConfiguration.java | 74 ++++---- ...ddedMariaDBBootstrapConfigurationTest.java | 1 + .../EmbeddedMemSqlBootstrapConfiguration.java | 67 ++++---- embedded-minio/pom.xml | 4 + .../EmbeddedMinioBootstrapConfiguration.java | 70 ++++---- embedded-mockserver/pom.xml | 4 + ...eddedMockServerBootstrapConfiguration.java | 37 ++-- embedded-mongodb/pom.xml | 4 + ...EmbeddedMongodbBootstrapConfiguration.java | 74 ++++---- embedded-mssqlserver/pom.xml | 4 + ...ddedMSSQLServerBootstrapConfiguration.java | 95 +++-------- embedded-mysql/pom.xml | 4 + .../EmbeddedMySQLBootstrapConfiguration.java | 64 +++---- embedded-nats/pom.xml | 4 + .../EmbeddedNatsBootstrapConfiguration.java | 74 ++++---- .../EmbeddedNeo4jBootstrapConfiguration.java | 81 ++++----- embedded-opensearch/pom.xml | 4 + ...eddedOpenSearchBootstrapConfiguration.java | 72 ++++---- .../EmbeddedOracleBootstrapConfiguration.java | 72 ++++---- embedded-postgresql/pom.xml | 4 + ...eddedPostgreSQLBootstrapConfiguration.java | 76 ++++----- ...dPostgreSQLBootstrapConfigurationTest.java | 1 + embedded-prometheus/pom.xml | 4 + ...eddedPrometheusBootstrapConfiguration.java | 61 +++---- embedded-pulsar/pom.xml | 4 + .../EmbeddedPulsarBootstrapConfiguration.java | 83 ++++----- embedded-rabbitmq/pom.xml | 4 + ...mbeddedRabbitMQBootstrapConfiguration.java | 83 ++++----- embedded-redis/pom.xml | 4 + .../EmbeddedRedisBootstrapConfiguration.java | 47 +++--- .../testcontainer/redis/EnvUtils.java | 29 ---- embedded-selenium/pom.xml | 5 + ...mbeddedSeleniumBootstrapConfiguration.java | 36 +++- embedded-solr/pom.xml | 4 + .../EmbeddedSolrBootstrapConfiguration.java | 64 +++---- embedded-spicedb/pom.xml | 4 + ...EmbeddedSpiceDBBootstrapConfiguration.java | 92 ++++------ embedded-temporal/pom.xml | 4 + ...mbeddedTemporalBootstrapConfiguration.java | 49 ++---- embedded-toxiproxy/pom.xml | 4 + ...beddedToxiProxyBootstrapConfiguration.java | 30 ++-- embedded-vault/pom.xml | 4 + .../EmbeddedVaultBootstrapConfiguration.java | 62 +++---- embedded-vertica/pom.xml | 4 + ...EmbeddedVerticaBootstrapConfiguration.java | 75 ++++----- embedded-victoriametrics/pom.xml | 4 + ...VictoriaMetricsBootstrapConfiguration.java | 88 ++++------ embedded-wiremock/pom.xml | 5 + ...mbeddedWiremockBootstrapConfiguration.java | 53 +++--- ...beddedZookeeperBootstrapConfiguration.java | 38 ++--- pom.xml | 106 ++++++------ 99 files changed, 1663 insertions(+), 2172 deletions(-) delete mode 100644 embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/KeycloakContainerFactory.java delete mode 100644 embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EnvUtils.java delete mode 100644 embedded-redis/src/main/java/com/playtika/testcontainer/redis/EnvUtils.java diff --git a/embedded-aerospike/pom.xml b/embedded-aerospike/pom.xml index 0a8ea8c0b..56a5f29e0 100644 --- a/embedded-aerospike/pom.xml +++ b/embedded-aerospike/pom.xml @@ -41,5 +41,9 @@ org.assertj assertj-core + + org.springframework + spring-test + diff --git a/embedded-aerospike/src/main/java/com/playtika/testcontainer/aerospike/EmbeddedAerospikeBootstrapConfiguration.java b/embedded-aerospike/src/main/java/com/playtika/testcontainer/aerospike/EmbeddedAerospikeBootstrapConfiguration.java index 0d178aa7f..b66ba87e8 100644 --- a/embedded-aerospike/src/main/java/com/playtika/testcontainer/aerospike/EmbeddedAerospikeBootstrapConfiguration.java +++ b/embedded-aerospike/src/main/java/com/playtika/testcontainer/aerospike/EmbeddedAerospikeBootstrapConfiguration.java @@ -6,6 +6,7 @@ import com.playtika.testcontainer.toxiproxy.EmbeddedToxiProxyBootstrapConfiguration; import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; @@ -14,8 +15,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; @@ -23,8 +23,6 @@ import org.testcontainers.containers.wait.strategy.WaitAllStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.aerospike.AerospikeProperties.BEAN_NAME_AEROSPIKE; @@ -51,26 +49,37 @@ public AerospikeWaitStrategy aerospikeStartupCheckStrategy(AerospikeProperties p @ConditionalOnToxiProxyEnabled(module = "aerospike") ToxiproxyContainer.ContainerProxy aerospikeContainerProxy(ToxiproxyContainer toxiproxyContainer, GenericContainer aerospike, - AerospikeProperties properties, - ConfigurableEnvironment environment) { + AerospikeProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(aerospike, properties.port); - - Map map = new LinkedHashMap<>(); - map.put("embedded.aerospike.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.aerospike.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.aerospike.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedAerospikeToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Aerospike ToxiProxy connection details {}", map); - + log.info("Started Aerospike ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + public DynamicPropertyRegistrar aerospikeDynamicPropertyRegistrar(GenericContainer aerospike, AerospikeProperties properties) { + return registry -> { + registry.add("embedded.aerospike.host", aerospike::getHost); + registry.add("embedded.aerospike.port", () -> aerospike.getMappedPort(properties.port)); + registry.add("embedded.aerospike.namespace", () -> properties.namespace); + registry.add("embedded.aerospike.networkAlias", () -> AEROSPIKE_NETWORK_ALIAS); + registry.add("embedded.aerospike.internalPort", () -> properties.port); + }; + } + + @Bean + @ConditionalOnToxiProxyEnabled(module = "aerospike") + public DynamicPropertyRegistrar aerospikeToxiProxyDynamicPropertyRegistrar( + @Qualifier("aerospikeContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.aerospike.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.aerospike.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.aerospike.toxiproxy.proxyName", proxy::getName); + log.info("Started Aerospike ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); + }; + } @Bean(name = BEAN_NAME_AEROSPIKE, destroyMethod = "stop") public GenericContainer aerospike(AerospikeWaitStrategy aerospikeWaitStrategy, - ConfigurableEnvironment environment, AerospikeProperties properties, Optional network) { WaitStrategy waitStrategy = new WaitAllStrategy() @@ -97,26 +106,8 @@ public GenericContainer aerospike(AerospikeWaitStrategy aerospikeWaitStrategy .withEnv("FEATURE_KEY_FILE", "env-b64:FEATURES"); } aerospike = configureCommonsAndStart(aerospike, properties, log); - registerAerospikeEnvironment(aerospike, environment, properties); + log.info("Started aerospike server. Connection details host={}, port={}, namespace={}, networkAlias={}, internalPort={}", + aerospike.getHost(), aerospike.getMappedPort(properties.port), properties.namespace, AEROSPIKE_NETWORK_ALIAS, properties.port); return aerospike; } - - private void registerAerospikeEnvironment(GenericContainer aerospike, - ConfigurableEnvironment environment, - AerospikeProperties properties) { - Integer mappedPort = aerospike.getMappedPort(properties.port); - String host = aerospike.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.aerospike.host", host); - map.put("embedded.aerospike.port", mappedPort); - map.put("embedded.aerospike.namespace", properties.namespace); - map.put("embedded.aerospike.networkAlias", AEROSPIKE_NETWORK_ALIAS); - map.put("embedded.aerospike.internalPort", properties.port); - - log.info("Started aerospike server. Connection details {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedAerospikeInfo", map); - environment.getPropertySources().addFirst(propertySource); - } } diff --git a/embedded-artifactory/pom.xml b/embedded-artifactory/pom.xml index 21d2b6128..8f455bcc5 100644 --- a/embedded-artifactory/pom.xml +++ b/embedded-artifactory/pom.xml @@ -46,5 +46,9 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-artifactory/src/main/java/com/playtika/testcontainer/artifactory/EmbeddedArtifactoryBootstrapConfiguration.java b/embedded-artifactory/src/main/java/com/playtika/testcontainer/artifactory/EmbeddedArtifactoryBootstrapConfiguration.java index 4b5ed31d0..ddbb3edd1 100644 --- a/embedded-artifactory/src/main/java/com/playtika/testcontainer/artifactory/EmbeddedArtifactoryBootstrapConfiguration.java +++ b/embedded-artifactory/src/main/java/com/playtika/testcontainer/artifactory/EmbeddedArtifactoryBootstrapConfiguration.java @@ -12,16 +12,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.artifactory.ArtifactoryProperties.ARTIFACTORY_BEAN_NAME; @@ -48,64 +45,53 @@ public WaitStrategy artifactoryWaitStrategy(ArtifactoryProperties properties) { @Bean @ConditionalOnToxiProxyEnabled(module = "artifactory") - ToxiproxyContainer.ContainerProxy artifactoryContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(ARTIFACTORY_BEAN_NAME) GenericContainer artifactory, - ArtifactoryProperties properties, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy artifactoryContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(ARTIFACTORY_BEAN_NAME) GenericContainer artifactory, + ArtifactoryProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(artifactory, properties.getRestApiPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.artifactory.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.artifactory.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.artifactory.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedArtifactoryToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Artifactory ToxiProxy connection details {}", map); - + log.info("Started Artifactory ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "artifactory") + public DynamicPropertyRegistrar artifactoryToxiProxyDynamicPropertyRegistrar(@Qualifier("artifactoryContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.artifactory.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.artifactory.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.artifactory.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = ARTIFACTORY_BEAN_NAME, destroyMethod = "stop") - public GenericContainer artifactory(ConfigurableEnvironment environment, - ArtifactoryProperties properties, + public GenericContainer artifactory(ArtifactoryProperties properties, WaitStrategy artifactoryWaitStrategy, Optional network) { - GenericContainer container = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getRestApiPort(), properties.getGeneralPort()) .withNetwork(Network.SHARED) .withNetworkAliases(properties.getNetworkAlias(), ARTIFACTORY_NETWORK_ALIAS) .waitingFor(artifactoryWaitStrategy); - network.ifPresent(container::withNetwork); configureCommonsAndStart(container, properties, log); - - registerEnvironment(container, environment, properties); - + Integer mappedPort = container.getMappedPort(properties.generalPort); + String host = container.getHost(); + log.info("Started Artifactory server. Connection details: host={}, port={}, username={}, password={}, staticNetworkAlias={}, internalRestApiPort={}, internalGeneralPort={}", + host, mappedPort, properties.getUsername(), properties.getPassword(), ARTIFACTORY_NETWORK_ALIAS, properties.getRestApiPort(), properties.getGeneralPort()); return container; } - private void registerEnvironment(GenericContainer artifactory, - ConfigurableEnvironment environment, - ArtifactoryProperties properties) { - - Integer mappedPort = artifactory.getMappedPort(properties.generalPort); - String host = artifactory.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.artifactory.host", host); - map.put("embedded.artifactory.port", mappedPort); - map.put("embedded.artifactory.username", properties.getUsername()); - map.put("embedded.artifactory.password", properties.getPassword()); - map.put("embedded.artifactory.staticNetworkAlias", ARTIFACTORY_NETWORK_ALIAS); - map.put("embedded.artifactory.internalRestApiPort", properties.getRestApiPort()); - map.put("embedded.artifactory.internalGeneralPort", properties.getGeneralPort()); - - log.info("Started Artifactory server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedArtifactoryInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar artifactoryDynamicPropertyRegistrar(@Qualifier(ARTIFACTORY_BEAN_NAME) GenericContainer artifactory, ArtifactoryProperties properties) { + return registry -> { + registry.add("embedded.artifactory.host", artifactory::getHost); + registry.add("embedded.artifactory.port", () -> artifactory.getMappedPort(properties.generalPort)); + registry.add("embedded.artifactory.username", properties::getUsername); + registry.add("embedded.artifactory.password", properties::getPassword); + registry.add("embedded.artifactory.staticNetworkAlias", () -> ARTIFACTORY_NETWORK_ALIAS); + registry.add("embedded.artifactory.internalRestApiPort", properties::getRestApiPort); + registry.add("embedded.artifactory.internalGeneralPort", properties::getGeneralPort); + }; } } diff --git a/embedded-azurite/pom.xml b/embedded-azurite/pom.xml index 184148b54..55852d2cb 100644 --- a/embedded-azurite/pom.xml +++ b/embedded-azurite/pom.xml @@ -32,6 +32,10 @@ com.playtika.testcontainers embedded-toxiproxy + + org.springframework + spring-test + diff --git a/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java b/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java index 626ff729d..6bc83a367 100644 --- a/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java +++ b/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java @@ -11,13 +11,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; @@ -36,68 +34,64 @@ public class EmbeddedAzuriteBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "azurite") - ToxiproxyContainer.ContainerProxy azuriteBlobContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, - AzuriteProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getBlobStoragePort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.azurite.toxiproxy.blobStoragePort", proxy.getProxyPort()); - map.put("embedded.azurite.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteBlobToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Azurite ToxiProxy connection details {}", map); + ToxiproxyContainer.ContainerProxy azuriteQueueContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, + AzuriteProperties properties) { + return toxiproxyContainer.getProxy(azurite, properties.getQueueStoragePort()); + } - return proxy; + @Bean + public DynamicPropertyRegistrar azuriteBlobToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.azurite.toxiproxy.blobStoragePort", proxy::getProxyPort); + registry.add("embedded.azurite.toxiproxy.proxyName", proxy::getName); + log.info("Started Azurite ToxiProxy connection details {}", Map.of( + "embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress(), + "embedded.azurite.toxiproxy.blobStoragePort", proxy.getProxyPort(), + "embedded.azurite.toxiproxy.proxyName", proxy.getName() + )); + }; } @Bean @ConditionalOnToxiProxyEnabled(module = "azurite") - ToxiproxyContainer.ContainerProxy azuriteQueueContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, - AzuriteProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getQueueStoragePort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.azurite.toxiproxy.queueStoragePor", proxy.getProxyPort()); - map.put("embedded.azurite.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteQueueToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Azurite ToxiProxy connection details {}", map); - - return proxy; + public DynamicPropertyRegistrar azuriteQueueToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer toxiproxyContainer, + @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, + AzuriteProperties properties) { + return registry -> { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getQueueStoragePort()); + registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.azurite.toxiproxy.queueStoragePor", proxy::getProxyPort); + registry.add("embedded.azurite.toxiproxy.proxyName", proxy::getName); + log.info("Started Azurite ToxiProxy connection details {}", Map.of( + "embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress(), + "embedded.azurite.toxiproxy.queueStoragePor", proxy.getProxyPort(), + "embedded.azurite.toxiproxy.proxyName", proxy.getName() + )); + }; } @Bean @ConditionalOnToxiProxyEnabled(module = "azurite") - ToxiproxyContainer.ContainerProxy azuriteTableContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, - AzuriteProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getTableStoragePort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.azurite.toxiproxy.tableStoragePort", proxy.getProxyPort()); - map.put("embedded.azurite.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteTableToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Azurite ToxiProxy connection details {}", map); - - return proxy; + public DynamicPropertyRegistrar azuriteTableToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer toxiproxyContainer, + @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, + AzuriteProperties properties) { + return registry -> { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getTableStoragePort()); + registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.azurite.toxiproxy.tableStoragePort", proxy::getProxyPort); + registry.add("embedded.azurite.toxiproxy.proxyName", proxy::getName); + log.info("Started Azurite ToxiProxy connection details {}", Map.of( + "embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress(), + "embedded.azurite.toxiproxy.tableStoragePort", proxy.getProxyPort(), + "embedded.azurite.toxiproxy.proxyName", proxy.getName() + )); + }; } @Bean(name = AZURITE_BEAN_NAME, destroyMethod = "stop") - public GenericContainer azurite(ConfigurableEnvironment environment, - AzuriteProperties properties, - Optional network) { + public GenericContainer azurite(AzuriteProperties properties, Optional network) { GenericContainer azuriteContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getBlobStoragePort(), properties.getQueueStoragePort(), properties.getTableStoragePort()) .withNetworkAliases(AZURITE_BLOB_NETWORK_ALIAS) @@ -110,39 +104,41 @@ public GenericContainer azurite(ConfigurableEnvironment environment, "--tableHost", "0.0.0.0", "--tablePort", String.valueOf(properties.getTableStoragePort()), "--skipApiVersionCheck"); - network.ifPresent(azuriteContainer::withNetwork); - configureCommonsAndStart(azuriteContainer, properties, log); - registerEnvironment(azuriteContainer, environment, properties); return azuriteContainer; } - private void registerEnvironment(GenericContainer azurite, - ConfigurableEnvironment environment, - AzuriteProperties properties) { - - Integer mappedBlobStoragePort = azurite.getMappedPort(properties.getBlobStoragePort()); - Integer mappedQueueStoragePort = azurite.getMappedPort(properties.getQueueStoragePort()); - Integer mappedTableStoragePort = azurite.getMappedPort(properties.getTableStoragePort()); - String host = azurite.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.azurite.host", host); - map.put("embedded.azurite.blobStoragePort", mappedBlobStoragePort); - map.put("embedded.azurite.queueStoragePor", mappedQueueStoragePort); - map.put("embedded.azurite.tableStoragePort", mappedTableStoragePort); - map.put("embedded.azurite.account-name", AzuriteProperties.ACCOUNT_NAME); - map.put("embedded.azurite.account-key", AzuriteProperties.ACCOUNT_KEY); - map.put("embedded.azurite.blob-endpoint", "http://" + host + ":" + mappedBlobStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); - map.put("embedded.azurite.queue-endpoint", "http://" + host + ":" + mappedQueueStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); - map.put("embedded.azurite.table-endpoint", "http://" + host + ":" + mappedTableStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); - map.put("embedded.azurite.networkAlias", AZURITE_BLOB_NETWORK_ALIAS); - - log.info("Started Azurite. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar azuriteDynamicPropertyRegistrar(@Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, AzuriteProperties properties) { + return registry -> { + Integer mappedBlobStoragePort = azurite.getMappedPort(properties.getBlobStoragePort()); + Integer mappedQueueStoragePort = azurite.getMappedPort(properties.getQueueStoragePort()); + Integer mappedTableStoragePort = azurite.getMappedPort(properties.getTableStoragePort()); + String host = azurite.getHost(); + registry.add("embedded.azurite.host", () -> host); + registry.add("embedded.azurite.blobStoragePort", () -> mappedBlobStoragePort); + registry.add("embedded.azurite.queueStoragePor", () -> mappedQueueStoragePort); + registry.add("embedded.azurite.tableStoragePort", () -> mappedTableStoragePort); + registry.add("embedded.azurite.account-name", () -> AzuriteProperties.ACCOUNT_NAME); + registry.add("embedded.azurite.account-key", () -> AzuriteProperties.ACCOUNT_KEY); + registry.add("embedded.azurite.blob-endpoint", () -> "http://" + host + ":" + mappedBlobStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); + registry.add("embedded.azurite.queue-endpoint", () -> "http://" + host + ":" + mappedQueueStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); + registry.add("embedded.azurite.table-endpoint", () -> "http://" + host + ":" + mappedTableStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); + registry.add("embedded.azurite.networkAlias", () -> AZURITE_BLOB_NETWORK_ALIAS); + log.info("Started Azurite. Connection details: {}", Map.of( + "embedded.azurite.host", host, + "embedded.azurite.blobStoragePort", mappedBlobStoragePort, + "embedded.azurite.queueStoragePor", mappedQueueStoragePort, + "embedded.azurite.tableStoragePort", mappedTableStoragePort, + "embedded.azurite.account-name", AzuriteProperties.ACCOUNT_NAME, + "embedded.azurite.account-key", AzuriteProperties.ACCOUNT_KEY, + "embedded.azurite.blob-endpoint", "http://" + host + ":" + mappedBlobStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME, + "embedded.azurite.queue-endpoint", "http://" + host + ":" + mappedQueueStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME, + "embedded.azurite.table-endpoint", "http://" + host + ":" + mappedTableStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME, + "embedded.azurite.networkAlias", AZURITE_BLOB_NETWORK_ALIAS + )); + }; } } diff --git a/embedded-cassandra/pom.xml b/embedded-cassandra/pom.xml index 2013d67ce..23b054dd8 100644 --- a/embedded-cassandra/pom.xml +++ b/embedded-cassandra/pom.xml @@ -32,5 +32,9 @@ spring-data-cassandra true + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-cassandra/src/main/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraBootstrapConfiguration.java b/embedded-cassandra/src/main/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraBootstrapConfiguration.java index 0ce559731..acd586e66 100644 --- a/embedded-cassandra/src/main/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraBootstrapConfiguration.java +++ b/embedded-cassandra/src/main/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraBootstrapConfiguration.java @@ -3,7 +3,6 @@ import com.playtika.testcontainer.common.utils.ContainerUtils; import com.playtika.testcontainer.common.utils.FileUtils; import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureOrder; @@ -12,9 +11,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; import org.springframework.core.io.ResourceLoader; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.CassandraContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; @@ -24,8 +22,6 @@ import javax.script.ScriptException; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.cassandra.CassandraProperties.BEAN_NAME_EMBEDDED_CASSANDRA; @@ -38,65 +34,64 @@ @ConditionalOnExpression("${embedded.containers.enabled:true}") @ConditionalOnProperty(name = "embedded.cassandra.enabled", matchIfMissing = true) @EnableConfigurationProperties(CassandraProperties.class) -@RequiredArgsConstructor public class EmbeddedCassandraBootstrapConfiguration { private static final String CASSANDRA_NETWORK_ALIAS = "cassandra.testcontainer.docker"; private final ResourceLoader resourceLoader; + public EmbeddedCassandraBootstrapConfiguration(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + @Bean @ConditionalOnToxiProxyEnabled(module = "cassandra") ToxiproxyContainer.ContainerProxy cassandraContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_CASSANDRA) CassandraContainer cassandra, - CassandraProperties properties, - ConfigurableEnvironment environment) { + @Qualifier(BEAN_NAME_EMBEDDED_CASSANDRA) CassandraContainer cassandra, + CassandraProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(cassandra, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.cassandra.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.cassandra.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.cassandra.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedCassandraToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Cassandra ToxiProxy connection details {}", map); - + log.info("Started Cassandra ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "cassandra") + public DynamicPropertyRegistrar cassandraToxiProxyDynamicPropertyRegistrar( + @Qualifier("cassandraContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.cassandra.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.cassandra.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.cassandra.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_CASSANDRA, destroyMethod = "stop") - public CassandraContainer cassandra(ConfigurableEnvironment environment, - CassandraProperties properties, + public CassandraContainer cassandra(CassandraProperties properties, Optional network) throws Exception { - CassandraContainer cassandra = new CassandraContainer<>(ContainerUtils.getDockerImageName(properties)) - .withExposedPorts(properties.getPort()) - .withNetworkAliases(CASSANDRA_NETWORK_ALIAS); - + .withExposedPorts(properties.getPort()) + .withNetworkAliases(CASSANDRA_NETWORK_ALIAS); network.ifPresent(cassandra::withNetwork); cassandra = (CassandraContainer) configureCommonsAndStart(cassandra, properties, log); initKeyspace(properties, cassandra); - Map cassandraEnv = registerCassandraEnvironment(environment, cassandra, properties); - log.info("Started Cassandra. Connection details: {}", cassandraEnv); + String host = cassandra.getHost(); + Integer mappedPort = cassandra.getMappedPort(properties.getPort()); + log.info("Started Cassandra. Connection details: host={}, port={}, datacenter={}, keyspace-name={}, networkAlias={}, internalPort={}", + host, mappedPort, DEFAULT_DATACENTER, properties.keyspaceName, CASSANDRA_NETWORK_ALIAS, properties.getPort()); return cassandra; } - static Map registerCassandraEnvironment(ConfigurableEnvironment environment, - CassandraContainer cassandra, - CassandraProperties properties) { - String host = cassandra.getHost(); - Integer mappedPort = cassandra.getMappedPort(properties.getPort()); - LinkedHashMap cassandraEnv = new LinkedHashMap<>(); - cassandraEnv.put("embedded.cassandra.port", mappedPort); - cassandraEnv.put("embedded.cassandra.host", host); - cassandraEnv.put("embedded.cassandra.datacenter", DEFAULT_DATACENTER); - cassandraEnv.put("embedded.cassandra.keyspace-name", properties.keyspaceName); - cassandraEnv.put("embedded.cassandra.networkAlias", CASSANDRA_NETWORK_ALIAS); - cassandraEnv.put("embedded.cassandra.internalPort", properties.getPort()); - MapPropertySource propertySource = new MapPropertySource("embeddedCassandraInfo", cassandraEnv); - environment.getPropertySources().addFirst(propertySource); - return cassandraEnv; + @Bean + public DynamicPropertyRegistrar cassandraDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_CASSANDRA) CassandraContainer cassandra, CassandraProperties properties) { + return registry -> { + registry.add("embedded.cassandra.port", () -> cassandra.getMappedPort(properties.getPort())); + registry.add("embedded.cassandra.host", cassandra::getHost); + registry.add("embedded.cassandra.datacenter", () -> DEFAULT_DATACENTER); + registry.add("embedded.cassandra.keyspace-name", () -> properties.keyspaceName); + registry.add("embedded.cassandra.networkAlias", () -> CASSANDRA_NETWORK_ALIAS); + registry.add("embedded.cassandra.internalPort", properties::getPort); + }; } private void initKeyspace(CassandraProperties properties, CassandraContainer cassandra) throws ScriptException { @@ -109,6 +104,6 @@ private void initKeyspace(CassandraProperties properties, CassandraContainer private String prepareCassandraInitScript(CassandraProperties properties) { return FileUtils.resolveTemplateAsString(resourceLoader, "cassandra-init.sql", content -> content .replace("{{keyspaceName}}", properties.keyspaceName)) - .replace("{{replicationFactor}}", Integer.toString(properties.replicationFactor)); + .replace("{{replicationFactor}}", Integer.toString(properties.replicationFactor)); } } diff --git a/embedded-clickhouse/pom.xml b/embedded-clickhouse/pom.xml index 72c18b785..befae48af 100644 --- a/embedded-clickhouse/pom.xml +++ b/embedded-clickhouse/pom.xml @@ -52,5 +52,9 @@ tomcat-jdbc test + + org.springframework + spring-test + diff --git a/embedded-clickhouse/src/main/java/com/playtika/testcontainer/clickhouse/EmbeddedClickHouseBootstrapConfiguration.java b/embedded-clickhouse/src/main/java/com/playtika/testcontainer/clickhouse/EmbeddedClickHouseBootstrapConfiguration.java index 9f62cec55..a282f85b0 100644 --- a/embedded-clickhouse/src/main/java/com/playtika/testcontainer/clickhouse/EmbeddedClickHouseBootstrapConfiguration.java +++ b/embedded-clickhouse/src/main/java/com/playtika/testcontainer/clickhouse/EmbeddedClickHouseBootstrapConfiguration.java @@ -11,15 +11,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.springframework.util.StringUtils; import org.testcontainers.containers.ClickHouseContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.clickhouse.ClickHouseProperties.BEAN_NAME_EMBEDDED_CLICK_HOUSE; @@ -37,66 +34,54 @@ public class EmbeddedClickHouseBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "clickhouse") - ToxiproxyContainer.ContainerProxy clickhouseContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_CLICK_HOUSE) ClickHouseContainer clickHouseContainer, - ClickHouseProperties properties, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy clickhouseContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_CLICK_HOUSE) ClickHouseContainer clickHouseContainer, + ClickHouseProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(clickHouseContainer, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.clickhouse.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.clickhouse.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.clickhouse.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedClickHouseToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started ClickHouse ToxiProxy connection details {}", map); - + log.info("Started ClickHouse ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "clickhouse") + public DynamicPropertyRegistrar clickhouseToxiProxyDynamicPropertyRegistrar(@Qualifier("clickhouseContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.clickhouse.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.clickhouse.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.clickhouse.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_CLICK_HOUSE, destroyMethod = "stop") - public ClickHouseContainer clickHouseContainer(ConfigurableEnvironment environment, - ClickHouseProperties properties, + public ClickHouseContainer clickHouseContainer(ClickHouseProperties properties, Optional network) { ClickHouseContainer clickHouseContainer = new ClickHouseContainer(ContainerUtils.getDockerImageName(properties)) .withInitScript(properties.getInitScriptPath()) .withNetworkAliases(CLICKHOUSE_NETWORK_ALIAS); - network.ifPresent(clickHouseContainer::withNetwork); - String username = !StringUtils.hasLength(properties.getUser()) ? clickHouseContainer.getUsername() : properties.getUser(); String password = !StringUtils.hasLength(properties.getPassword()) ? clickHouseContainer.getPassword() : properties.getPassword(); clickHouseContainer.addEnv("CLICKHOUSE_USER", username); clickHouseContainer.addEnv("CLICKHOUSE_PASSWORD", password == null ? "" : password); - clickHouseContainer = (ClickHouseContainer) configureCommonsAndStart(clickHouseContainer, properties, log); - - registerClickHouseEnvironment(clickHouseContainer, environment, properties, username, password); - - return clickHouseContainer; - } - - private void registerClickHouseEnvironment(ClickHouseContainer clickHouseContainer, - ConfigurableEnvironment environment, - ClickHouseProperties properties, - String username, String password) { Integer mappedPort = clickHouseContainer.getMappedPort(properties.port); String host = clickHouseContainer.getHost(); + log.info("Started ClickHouse server. Connection details: schema=default, host={}, port={}, user={}, password={}, networkAlias={}, internalPort={}", + host, mappedPort, username, password, CLICKHOUSE_NETWORK_ALIAS, properties.getPort()); + return clickHouseContainer; + } - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.clickhouse.schema", "default"); - map.put("embedded.clickhouse.host", host); - map.put("embedded.clickhouse.port", mappedPort); - map.put("embedded.clickhouse.user", username); - map.put("embedded.clickhouse.password", password); - map.put("embedded.clickhouse.networkAlias", CLICKHOUSE_NETWORK_ALIAS); - map.put("embedded.clickhouse.internalPort", properties.getPort()); - - log.info("Started ClickHouse server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedClickHouseInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar clickhouseDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_CLICK_HOUSE) ClickHouseContainer clickHouseContainer, ClickHouseProperties properties) { + return registry -> { + registry.add("embedded.clickhouse.schema", () -> "default"); + registry.add("embedded.clickhouse.host", clickHouseContainer::getHost); + registry.add("embedded.clickhouse.port", () -> clickHouseContainer.getMappedPort(properties.port)); + registry.add("embedded.clickhouse.user", () -> !StringUtils.hasLength(properties.getUser()) ? clickHouseContainer.getUsername() : properties.getUser()); + registry.add("embedded.clickhouse.password", () -> !StringUtils.hasLength(properties.getPassword()) ? clickHouseContainer.getPassword() : properties.getPassword()); + registry.add("embedded.clickhouse.networkAlias", () -> CLICKHOUSE_NETWORK_ALIAS); + registry.add("embedded.clickhouse.internalPort", properties::getPort); + }; } } diff --git a/embedded-cockroachdb/pom.xml b/embedded-cockroachdb/pom.xml index 06512c21d..4fefad379 100644 --- a/embedded-cockroachdb/pom.xml +++ b/embedded-cockroachdb/pom.xml @@ -40,6 +40,10 @@ tomcat-jdbc test + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-cockroachdb/src/main/java/com/playtika/testcontainer/cockroach/EmbeddedCockroachDBBootstrapConfiguration.java b/embedded-cockroachdb/src/main/java/com/playtika/testcontainer/cockroach/EmbeddedCockroachDBBootstrapConfiguration.java index 30bee8349..d070bfa43 100644 --- a/embedded-cockroachdb/src/main/java/com/playtika/testcontainer/cockroach/EmbeddedCockroachDBBootstrapConfiguration.java +++ b/embedded-cockroachdb/src/main/java/com/playtika/testcontainer/cockroach/EmbeddedCockroachDBBootstrapConfiguration.java @@ -11,14 +11,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.CockroachContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.cockroach.CockroachDBProperties.BEAN_NAME_EMBEDDED_COCKROACHDB; @@ -36,28 +33,14 @@ public class EmbeddedCockroachDBBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "cockroach") - ToxiproxyContainer.ContainerProxy cockroachContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_COCKROACHDB) CockroachContainer cockroachContainer, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(cockroachContainer, CockroachDBProperties.PORT); - - Map map = new LinkedHashMap<>(); - map.put("embedded.cockroach.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.cockroach.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.cockroach.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedДockroachdbToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started ДockroachDB ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy cockroachContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_COCKROACHDB) CockroachContainer cockroachContainer) { + return toxiproxyContainer.getProxy(cockroachContainer, CockroachDBProperties.PORT); } @Bean(name = BEAN_NAME_EMBEDDED_COCKROACHDB, destroyMethod = "stop") - public CockroachContainer cockroach(ConfigurableEnvironment environment, - CockroachDBProperties properties, - Optional network) throws Exception { - + public CockroachContainer cockroach(CockroachDBProperties properties, + Optional network) throws Exception { CockroachContainer cockroachContainer = new CockroachContainer(ContainerUtils.getDockerImageName(properties)) .withInitScript(properties.getInitScriptPath()) .withNetworkAliases(COCKROACHDB_NETWORK_ALIAS); @@ -65,29 +48,31 @@ public CockroachContainer cockroach(ConfigurableEnvironment environment, network.ifPresent(cockroachContainer::withNetwork); cockroachContainer = (CockroachContainer) configureCommonsAndStart(cockroachContainer, properties, log); - registerCockroachDBEnvironment(cockroachContainer, environment); return cockroachContainer; } - private void registerCockroachDBEnvironment(CockroachContainer cockroach, - ConfigurableEnvironment environment) { - Integer mappedPort = cockroach.getMappedPort(CockroachDBProperties.PORT); - String host = cockroach.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.cockroach.port", mappedPort); - map.put("embedded.cockroach.host", host); - map.put("embedded.cockroach.schema", cockroach.getDatabaseName()); - map.put("embedded.cockroach.user", cockroach.getUsername()); - map.put("embedded.cockroach.password", cockroach.getPassword()); - map.put("embedded.cockroach.networkAlias", COCKROACHDB_NETWORK_ALIAS); - map.put("embedded.cockroach.internalPort", CockroachDBProperties.PORT); - - String jdbcURL = "jdbc:postgresql://{}:{}/{}"; - log.info("Started CockroachDB server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, cockroach.getDatabaseName()); + @Bean + public DynamicPropertyRegistrar cockroachDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_COCKROACHDB) CockroachContainer cockroach) { + return registry -> { + registry.add("embedded.cockroach.port", () -> cockroach.getMappedPort(CockroachDBProperties.PORT)); + registry.add("embedded.cockroach.host", cockroach::getHost); + registry.add("embedded.cockroach.schema", cockroach::getDatabaseName); + registry.add("embedded.cockroach.user", cockroach::getUsername); + registry.add("embedded.cockroach.password", cockroach::getPassword); + registry.add("embedded.cockroach.networkAlias", () -> COCKROACHDB_NETWORK_ALIAS); + registry.add("embedded.cockroach.internalPort", () -> CockroachDBProperties.PORT); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedCockroachDBInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "cockroach") + public DynamicPropertyRegistrar cockroachToxiProxyDynamicPropertyRegistrar( + @Qualifier("cockroachContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.cockroach.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.cockroach.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.cockroach.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-consul/pom.xml b/embedded-consul/pom.xml index 7e981ad7f..8a96514cf 100644 --- a/embedded-consul/pom.xml +++ b/embedded-consul/pom.xml @@ -38,6 +38,10 @@ + + org.springframework + spring-test + diff --git a/embedded-consul/src/main/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfiguration.java b/embedded-consul/src/main/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfiguration.java index a4125fa1e..15d23642c 100644 --- a/embedded-consul/src/main/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfiguration.java +++ b/embedded-consul/src/main/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfiguration.java @@ -11,16 +11,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.Wait; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -38,28 +35,26 @@ public class EmbeddedConsulBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "consul") - ToxiproxyContainer.ContainerProxy consulContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy consulContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_CONSUL) GenericContainer consulContainer, - ConsulProperties properties, - ConfigurableEnvironment environment) { + ConsulProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(consulContainer, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.consul.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.consul.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.consul.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedConsulToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Consul ToxiProxy connection details {}", map); - + log.info("Started Consul ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "consul") + public DynamicPropertyRegistrar consulToxiProxyDynamicPropertyRegistrar(@Qualifier("consulContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.consul.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.consul.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.consul.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_CONSUL, destroyMethod = "stop") - public GenericContainer consulContainer(ConfigurableEnvironment environment, - ConsulProperties properties, - Optional network) { + public GenericContainer consulContainer(ConsulProperties properties, Optional network) { GenericContainer consul = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) .waitingFor( @@ -77,24 +72,16 @@ public GenericContainer consulContainer(ConfigurableEnvironment environment, } consul = configureCommonsAndStart(consul, properties, log); - registerConsulEnvironment(consul, environment, properties); return consul; } - private void registerConsulEnvironment(GenericContainer consul, ConfigurableEnvironment environment, - ConsulProperties properties) { - Integer mappedPort = consul.getMappedPort(properties.getPort()); - String host = consul.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.consul.port", mappedPort); - map.put("embedded.consul.host", host); - map.put("embedded.consul.networkAlias", CONSUL_NETWORK_ALIAS); - map.put("embedded.consul.internalPort", properties.getPort()); - - log.info("Started consul. Connection Details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedConsulInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar consulDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_CONSUL) GenericContainer consul, ConsulProperties properties) { + return registry -> { + registry.add("embedded.consul.port", () -> consul.getMappedPort(properties.getPort())); + registry.add("embedded.consul.host", consul::getHost); + registry.add("embedded.consul.networkAlias", () -> CONSUL_NETWORK_ALIAS); + registry.add("embedded.consul.internalPort", properties::getPort); + }; } } diff --git a/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationBaseTest.java b/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationBaseTest.java index 640409230..29009b05a 100644 --- a/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationBaseTest.java +++ b/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationBaseTest.java @@ -2,12 +2,21 @@ import com.ecwid.consul.v1.ConsulClient; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.beans.factory.annotation.Value; import org.testcontainers.containers.GenericContainer; public class EmbeddedConsulBootstrapConfigurationBaseTest { - @Autowired - protected ConfigurableEnvironment environment; + @Value("${embedded.consul.host}") + protected String consulHost; + + @Value("${embedded.consul.port}") + protected String consulPort; + + @Value("${embedded.consul.enabled:false}") + protected String consulEnabled; + + @Value("${embedded.consul.configurationFile:}") + protected String consulConfigurationFile; @Autowired protected GenericContainer consulContainer; diff --git a/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationConfigTest.java b/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationConfigTest.java index 38f27548c..8a34a75fe 100644 --- a/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationConfigTest.java +++ b/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationConfigTest.java @@ -19,13 +19,13 @@ public class EmbeddedConsulBootstrapConfigurationConfigTest extends EmbeddedCons @Test public void propertiesAvailable() { - assertThat(environment.getProperty("embedded.consul.enabled")) + assertThat(consulEnabled) .isEqualTo("true"); - assertThat(environment.getProperty("embedded.consul.host")) + assertThat(consulHost) .isEqualTo(consulContainer.getHost()); - assertThat(environment.getProperty("embedded.consul.port")) + assertThat(consulPort) .isEqualTo(consulContainer.getFirstMappedPort().toString()); - assertThat(environment.getProperty("embedded.consul.configurationFile")) + assertThat(consulConfigurationFile) .isEqualTo("consul.hcl"); } diff --git a/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationTest.java b/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationTest.java index c7541f852..4a1361790 100644 --- a/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationTest.java +++ b/embedded-consul/src/test/java/com/playtika/testcontainer/consul/EmbeddedConsulBootstrapConfigurationTest.java @@ -15,13 +15,13 @@ public class EmbeddedConsulBootstrapConfigurationTest extends EmbeddedConsulBoot @Test public void propertiesAvailable() { - assertThat(environment.getProperty("embedded.consul.enabled")) + assertThat(consulEnabled) .isEqualTo("true"); - assertThat(environment.getProperty("embedded.consul.configurationFile")) - .isEqualTo(null); - assertThat(environment.getProperty("embedded.consul.host")) + assertThat(consulConfigurationFile) + .isEqualTo(""); + assertThat(consulHost) .isEqualTo(consulContainer.getHost()); - assertThat(environment.getProperty("embedded.consul.port")) + assertThat(consulPort) .isEqualTo(consulContainer.getFirstMappedPort().toString()); } diff --git a/embedded-couchbase/pom.xml b/embedded-couchbase/pom.xml index 95ca90811..d763e43a4 100644 --- a/embedded-couchbase/pom.xml +++ b/embedded-couchbase/pom.xml @@ -57,5 +57,9 @@ awaitility test + + org.springframework + spring-test + diff --git a/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java b/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java index d1bc8dd0c..a762ebad6 100644 --- a/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java +++ b/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java @@ -11,15 +11,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.couchbase.BucketDefinition; import org.testcontainers.couchbase.CouchbaseContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -38,26 +35,24 @@ public class EmbeddedCouchbaseBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "couchbase") ToxiproxyContainer.ContainerProxy couchbaseContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_COUCHBASE) CouchbaseContainer couchbase, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(couchbase, couchbase.getBootstrapHttpDirectPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.couchbase.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.couchbase.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.couchbase.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedCouchbaseToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Couchbase ToxiProxy connection details {}", map); + @Qualifier(BEAN_NAME_EMBEDDED_COUCHBASE) CouchbaseContainer couchbase) { + return toxiproxyContainer.getProxy(couchbase, couchbase.getBootstrapHttpDirectPort()); + } - return proxy; + @Bean + @ConditionalOnToxiProxyEnabled(module = "couchbase") + public DynamicPropertyRegistrar couchbaseToxiProxyDynamicPropertyRegistrar( + @Qualifier("couchbaseContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.couchbase.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.couchbase.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.couchbase.toxiproxy.proxyName", proxy::getName); + log.info("Started Couchbase ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); + }; } @Bean(name = BEAN_NAME_EMBEDDED_COUCHBASE, destroyMethod = "stop") - public CouchbaseContainer couchbase(ConfigurableEnvironment environment, - CouchbaseProperties properties, - Optional network) { + public CouchbaseContainer couchbase(CouchbaseProperties properties, Optional network) { BucketDefinition bucketDefinition = new BucketDefinition(properties.getBucket()) .withPrimaryIndex(true) .withQuota(properties.getBucketRamMb()); @@ -69,37 +64,23 @@ public CouchbaseContainer couchbase(ConfigurableEnvironment environment, .withNetworkAliases(COUCHBASE_NETWORK_ALIAS); network.ifPresent(couchbase::withNetwork); - couchbase = (CouchbaseContainer) configureCommonsAndStart(couchbase, properties, log); - - registerCouchbaseEnvironment(couchbase, environment, properties); + configureCommonsAndStart(couchbase, properties, log); return couchbase; } - private void registerCouchbaseEnvironment(CouchbaseContainer couchbase, - ConfigurableEnvironment environment, - CouchbaseProperties properties) { - - Integer mappedHttpPort = couchbase.getBootstrapHttpDirectPort(); - Integer mappedCarrierPort = couchbase.getBootstrapCarrierDirectPort(); - String host = couchbase.getHost(); - - System.setProperty("com.couchbase.bootstrapHttpDirectPort", String.valueOf(mappedHttpPort)); - System.setProperty("com.couchbase.bootstrapCarrierDirectPort", String.valueOf(mappedCarrierPort)); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.couchbase.bootstrapHttpDirectPort", mappedHttpPort); - map.put("embedded.couchbase.bootstrapCarrierDirectPort", mappedCarrierPort); - map.put("embedded.couchbase.host", host); - map.put("embedded.couchbase.bucket", properties.bucket); - map.put("embedded.couchbase.user", properties.user); - map.put("embedded.couchbase.password", properties.password); - map.put("embedded.couchbase.networkAlias", COUCHBASE_NETWORK_ALIAS); - - log.info("Started couchbase server. Connection details {}, " + - "Admin UI: http://localhost:{}, user: {}, password: {}", - map, mappedHttpPort, properties.getUser(), properties.getPassword()); - - MapPropertySource propertySource = new MapPropertySource("embeddedCouchbaseInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar couchbaseDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_COUCHBASE) CouchbaseContainer couchbase, + CouchbaseProperties properties) { + return registry -> { + registry.add("embedded.couchbase.host", couchbase::getHost); + registry.add("embedded.couchbase.bootstrapHttpDirectPort", couchbase::getBootstrapHttpDirectPort); + registry.add("embedded.couchbase.bootstrapCarrierDirectPort", couchbase::getBootstrapCarrierDirectPort); + registry.add("embedded.couchbase.networkAlias", () -> COUCHBASE_NETWORK_ALIAS); + + registry.add("embedded.couchbase.bucket", () -> properties.bucket); + registry.add("embedded.couchbase.user", () -> properties.user); + registry.add("embedded.couchbase.password", () -> properties.password); + }; } } diff --git a/embedded-db2/pom.xml b/embedded-db2/pom.xml index 91c0772d1..44db36cd4 100644 --- a/embedded-db2/pom.xml +++ b/embedded-db2/pom.xml @@ -47,6 +47,10 @@ ${db2.jcc.version} test + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-db2/src/main/java/com/playtika/testcontainer/db2/EmbeddedDb2BootstrapConfiguration.java b/embedded-db2/src/main/java/com/playtika/testcontainer/db2/EmbeddedDb2BootstrapConfiguration.java index 60ece2a9e..06a360d22 100644 --- a/embedded-db2/src/main/java/com/playtika/testcontainer/db2/EmbeddedDb2BootstrapConfiguration.java +++ b/embedded-db2/src/main/java/com/playtika/testcontainer/db2/EmbeddedDb2BootstrapConfiguration.java @@ -11,8 +11,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.springframework.util.StringUtils; import org.testcontainers.containers.Db2Container; import org.testcontainers.containers.Network; @@ -20,8 +19,6 @@ import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -39,26 +36,25 @@ public class EmbeddedDb2BootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "db2") - ToxiproxyContainer.ContainerProxy db2ContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_DB2) Db2Container db2, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy db2ContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_DB2) Db2Container db2) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(db2, Db2Container.DB2_PORT); - - Map map = new LinkedHashMap<>(); - map.put("embedded.db2.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.db2.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.db2.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedDb2ToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started DB2 ToxiProxy connection details {}", map); - + log.info("Started DB2 ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "db2") + public DynamicPropertyRegistrar db2ToxiProxyDynamicPropertyRegistrar(@Qualifier("db2ContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.db2.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.db2.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.db2.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_DB2, destroyMethod = "stop") - public Db2Container db2(ConfigurableEnvironment environment, - Db2Properties properties, + public Db2Container db2(Db2Properties properties, Optional network) { Db2Container db2Container = new Db2Container(ContainerUtils.getDockerImageName(properties)) .withDatabaseName(properties.getDatabase()) @@ -66,47 +62,36 @@ public Db2Container db2(ConfigurableEnvironment environment, .withPassword(properties.getPassword()) .withInitScript(properties.getInitScriptPath()) .withNetworkAliases(DB2_NETWORK_ALIAS); - network.ifPresent(db2Container::withNetwork); - String startupLogCheckRegex = properties.getStartupLogCheckRegex(); if (StringUtils.hasLength(startupLogCheckRegex)) { WaitStrategy waitStrategy = new LogMessageWaitStrategy() .withRegEx(startupLogCheckRegex); db2Container.waitingFor(waitStrategy); } - if (properties.isAcceptLicence()) { db2Container.acceptLicense(); } - db2Container = (Db2Container) configureCommonsAndStart(db2Container, properties, log); - registerDb2Environment(db2Container, environment, properties); - - return db2Container; - } - - private void registerDb2Environment(Db2Container db2Container, - ConfigurableEnvironment environment, - Db2Properties properties) { Integer mappedPort = db2Container.getMappedPort(Db2Container.DB2_PORT); String host = db2Container.getHost(); + String jdbcURL = "jdbc:db2://" + host + ":" + mappedPort + "/" + properties.getDatabase(); + log.info("Started db2 server. Connection details: host={}, port={}, database={}, user={}, password={}, networkAlias={}, internalPort={}, JDBC connection url: {}", + host, mappedPort, properties.getDatabase(), properties.getUser(), properties.getPassword(), DB2_NETWORK_ALIAS, Db2Container.DB2_PORT, jdbcURL); + return db2Container; + } - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.db2.port", mappedPort); - map.put("embedded.db2.host", host); - map.put("embedded.db2.database", properties.getDatabase()); - map.put("embedded.db2.user", properties.getUser()); - map.put("embedded.db2.password", properties.getPassword()); - map.put("embedded.db2.networkAlias", DB2_NETWORK_ALIAS); - map.put("embedded.db2.internalPort", Db2Container.DB2_PORT); - - String jdbcURL = "jdbc:db2://{}:{}/{}"; - log.info("Started db2 server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, properties.getDatabase()); - - MapPropertySource propertySource = new MapPropertySource("embeddedDb2Info", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar db2DynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_DB2) Db2Container db2Container, Db2Properties properties) { + return registry -> { + registry.add("embedded.db2.port", () -> db2Container.getMappedPort(Db2Container.DB2_PORT)); + registry.add("embedded.db2.host", db2Container::getHost); + registry.add("embedded.db2.database", properties::getDatabase); + registry.add("embedded.db2.user", properties::getUser); + registry.add("embedded.db2.password", properties::getPassword); + registry.add("embedded.db2.networkAlias", () -> DB2_NETWORK_ALIAS); + registry.add("embedded.db2.internalPort", () -> Db2Container.DB2_PORT); + }; } } diff --git a/embedded-dynamodb/pom.xml b/embedded-dynamodb/pom.xml index 1099e1efe..9050a5880 100644 --- a/embedded-dynamodb/pom.xml +++ b/embedded-dynamodb/pom.xml @@ -54,6 +54,10 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java b/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java index 6d4581459..0f2e8538a 100644 --- a/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java +++ b/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java @@ -12,15 +12,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -38,29 +35,27 @@ public class EmbeddedDynamoDBBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "dynamodb") - ToxiproxyContainer.ContainerProxy dynamodbContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy dynamodbContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_DYNAMODB) GenericContainer dynamoDb, - DynamoDBProperties properties, - ConfigurableEnvironment environment) { + DynamoDBProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(dynamoDb, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.dynamodb.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.dynamodb.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.dynamodb.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedDynamoDBToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started DynamoDB ToxiProxy connection details {}", map); - + log.info("Started DynamoDB ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } - @Bean(name = BEAN_NAME_EMBEDDED_DYNAMODB, destroyMethod = "stop") - public GenericContainer dynamoDb(ConfigurableEnvironment environment, - DynamoDBProperties properties, - Optional network) { + @Bean + @ConditionalOnToxiProxyEnabled(module = "dynamodb") + public DynamicPropertyRegistrar dynamodbToxiProxyDynamicPropertyRegistrar( + @Qualifier("dynamodbContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.dynamodb.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.dynamodb.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.dynamodb.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_DYNAMODB, destroyMethod = "stop") + public GenericContainer dynamoDb(DynamoDBProperties properties, Optional network) { GenericContainer dynamodbContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) .waitingFor(new HostPortWaitStrategy()) @@ -69,32 +64,19 @@ public GenericContainer dynamoDb(ConfigurableEnvironment environment, network.ifPresent(dynamodbContainer::withNetwork); dynamodbContainer = configureCommonsAndStart(dynamodbContainer, properties, log); - - registerDynamodbEnvironment(dynamodbContainer, environment, properties); return dynamodbContainer; } - private void registerDynamodbEnvironment(GenericContainer container, - ConfigurableEnvironment environment, - DynamoDBProperties properties) { - Integer mappedPort = container.getMappedPort(properties.port); - String host = container.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.dynamodb.port", mappedPort); - map.put("embedded.dynamodb.host", host); - map.put("embedded.dynamodb.accessKey", properties.getAccessKey()); - map.put("embedded.dynamodb.secretKey", properties.getSecretKey()); - map.put("embedded.dynamodb.networkAlias", DYNAMODB_NETWORK_ALIAS); - map.put("embedded.dynamodb.internalPort", properties.getPort()); - - log.info("Started DynamoDb server. Connection details: {}, ", map); - log.info("Consult with the doc " + - "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html " + - "for more details"); - - MapPropertySource propertySource = new MapPropertySource("embeddedDynamodbInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar dynamodbDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_DYNAMODB) GenericContainer container, DynamoDBProperties properties) { + return registry -> { + registry.add("embedded.dynamodb.port", () -> container.getMappedPort(properties.port)); + registry.add("embedded.dynamodb.host", container::getHost); + registry.add("embedded.dynamodb.accessKey", properties::getAccessKey); + registry.add("embedded.dynamodb.secretKey", properties::getSecretKey); + registry.add("embedded.dynamodb.networkAlias", () -> DYNAMODB_NETWORK_ALIAS); + registry.add("embedded.dynamodb.internalPort", properties::getPort); + }; } } diff --git a/embedded-elasticsearch/pom.xml b/embedded-elasticsearch/pom.xml index fe83cebd3..f30395f71 100644 --- a/embedded-elasticsearch/pom.xml +++ b/embedded-elasticsearch/pom.xml @@ -42,5 +42,9 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-elasticsearch/src/main/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfiguration.java b/embedded-elasticsearch/src/main/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfiguration.java index bb7981399..c4dfb56b5 100644 --- a/embedded-elasticsearch/src/main/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfiguration.java +++ b/embedded-elasticsearch/src/main/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfiguration.java @@ -11,14 +11,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.elasticsearch.ElasticsearchContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -36,57 +33,50 @@ public class EmbeddedElasticSearchBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "elasticsearch") - ToxiproxyContainer.ContainerProxy elasticsearchContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_ELASTIC_SEARCH) ElasticsearchContainer elasticSearch, - ElasticSearchProperties properties, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy elasticsearchContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_ELASTIC_SEARCH) ElasticsearchContainer elasticSearch, + ElasticSearchProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(elasticSearch, properties.getHttpPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.elasticsearch.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.elasticsearch.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.elasticsearch.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedElasticSearchToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started ElasticSearch ToxiProxy connection details {}", map); - + log.info("Started ElasticSearch ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "elasticsearch") + public DynamicPropertyRegistrar elasticsearchToxiProxyDynamicPropertyRegistrar(@Qualifier("elasticsearchContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.elasticsearch.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.elasticsearch.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.elasticsearch.toxiproxy.proxyName", proxy::getName); + }; + } + @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_ELASTIC_SEARCH) @Bean(name = BEAN_NAME_EMBEDDED_ELASTIC_SEARCH, destroyMethod = "stop") - public ElasticsearchContainer elasticSearch(ConfigurableEnvironment environment, - ElasticSearchProperties properties, + public ElasticsearchContainer elasticSearch(ElasticSearchProperties properties, Optional network) { - ElasticsearchContainer elasticSearch = ElasticSearchContainerFactory.create(properties) .withNetworkAliases(ELASTICSEARCH_NETWORK_ALIAS); network.ifPresent(elasticSearch::withNetwork); elasticSearch = (ElasticsearchContainer) configureCommonsAndStart(elasticSearch, properties, log); - registerElasticSearchEnvironment(elasticSearch, environment, properties); - return elasticSearch; - } - - private void registerElasticSearchEnvironment(ElasticsearchContainer elasticSearch, - ConfigurableEnvironment environment, - ElasticSearchProperties properties) { Integer httpPort = elasticSearch.getMappedPort(properties.getHttpPort()); Integer transportPort = elasticSearch.getMappedPort(properties.getTransportPort()); String host = elasticSearch.getHost(); + log.info("Started ElasticSearch server. Connection details: clusterName={}, host={}, httpPort={}, transportPort={}, networkAlias={}, internalHttpPort={}, internalTransportPort={}", + properties.getClusterName(), host, httpPort, transportPort, ELASTICSEARCH_NETWORK_ALIAS, properties.getHttpPort(), properties.getTransportPort()); + return elasticSearch; + } - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.elasticsearch.clusterName", properties.getClusterName()); - map.put("embedded.elasticsearch.host", host); - map.put("embedded.elasticsearch.httpPort", httpPort); - map.put("embedded.elasticsearch.transportPort", transportPort); - map.put("embedded.elasticsearch.networkAlias", ELASTICSEARCH_NETWORK_ALIAS); - map.put("embedded.elasticsearch.internalHttpPort", properties.getHttpPort()); - map.put("embedded.elasticsearch.internalTransportPort", properties.getTransportPort()); - - log.info("Started ElasticSearch server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedElasticSearchInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar elasticsearchDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_ELASTIC_SEARCH) ElasticsearchContainer elasticSearch, ElasticSearchProperties properties) { + return registry -> { + registry.add("embedded.elasticsearch.clusterName", properties::getClusterName); + registry.add("embedded.elasticsearch.host", elasticSearch::getHost); + registry.add("embedded.elasticsearch.httpPort", () -> elasticSearch.getMappedPort(properties.getHttpPort())); + registry.add("embedded.elasticsearch.transportPort", () -> elasticSearch.getMappedPort(properties.getTransportPort())); + registry.add("embedded.elasticsearch.networkAlias", () -> ELASTICSEARCH_NETWORK_ALIAS); + registry.add("embedded.elasticsearch.internalHttpPort", properties::getHttpPort); + registry.add("embedded.elasticsearch.internalTransportPort", properties::getTransportPort); + }; } } diff --git a/embedded-git/src/main/java/com/playtika/testcontainer/git/EmbeddedGitBootstrapConfiguration.java b/embedded-git/src/main/java/com/playtika/testcontainer/git/EmbeddedGitBootstrapConfiguration.java index 9d2a0b740..1ebdeacf9 100644 --- a/embedded-git/src/main/java/com/playtika/testcontainer/git/EmbeddedGitBootstrapConfiguration.java +++ b/embedded-git/src/main/java/com/playtika/testcontainer/git/EmbeddedGitBootstrapConfiguration.java @@ -12,15 +12,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -41,34 +38,45 @@ public class EmbeddedGitBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "git") - ToxiproxyContainer.ContainerProxy gitContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy gitContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_GIT) GenericContainer embeddedGit, - ConfigurableEnvironment environment, GitProperties gitProperties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(embeddedGit, gitProperties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.git.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.git.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.git.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedGitToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Git ToxiProxy connection details {}", map); - + log.info("Started Git ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "git") + public DynamicPropertyRegistrar gitToxiProxyDynamicPropertyRegistrar(@Qualifier("gitContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.git.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.git.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.git.toxiproxy.proxyName", proxy::getName); + }; + } + @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_GIT) @Bean(name = BEAN_NAME_EMBEDDED_GIT, destroyMethod = "stop") - public GenericContainer embeddedGit(ConfigurableEnvironment environment, - GitProperties properties, - Optional network) { + public GenericContainer embeddedGit(GitProperties properties, Optional network) { GenericContainer gitContainer = configureCommonsAndStart(createContainer(properties, network), properties, log); - registerGitEnvironment(gitContainer, environment, properties); return gitContainer; } + @Bean + public DynamicPropertyRegistrar gitDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_GIT) GenericContainer gitContainer, GitProperties properties) { + return registry -> { + Integer mappedPort = gitContainer.getMappedPort(properties.getPort()); + String host = gitContainer.getHost(); + String password = properties.getPassword(); + registry.add("embedded.git.port", () -> mappedPort); + registry.add("embedded.git.host", () -> host); + registry.add("embedded.git.password", () -> password); + registry.add("embedded.git.networkAlias", () -> GIT_NETWORK_ALIAS); + registry.add("embedded.git.internalPort", properties::getPort); + }; + } + private GenericContainer createContainer(GitProperties properties, Optional network) { if (isEmpty(properties.getPathToRepositories())) { throw new RuntimeException("embedded.git.path-to-repositories is required"); @@ -87,27 +95,4 @@ private GenericContainer createContainer(GitProperties properties, Optional gitContainer, - ConfigurableEnvironment environment, - GitProperties properties) { - Integer mappedPort = gitContainer.getMappedPort(properties.getPort()); - String host = gitContainer.getHost(); - String password = properties.getPassword(); - String connectionString = "ssh://git@" + host + ":" + mappedPort + "/projects/%YOUR_REPO_NAME%"; - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.git.port", mappedPort); - map.put("embedded.git.host", host); - map.put("embedded.git.password", password); - map.put("embedded.git.networkAlias", GIT_NETWORK_ALIAS); - map.put("embedded.git.internalPort", properties.getPort()); - - MapPropertySource propertySource = new MapPropertySource("embeddedGitInfo", map); - environment.getPropertySources().addFirst(propertySource); - - log.info("Started Git server. You can clone repo by using the following link: {}. " + - "%YOUR_REPO_NAME% is a name of a git repository folder inside {}", - connectionString, properties.getPathToRepositories()); - } } diff --git a/embedded-google-pubsub/pom.xml b/embedded-google-pubsub/pom.xml index f34449778..20adb353c 100644 --- a/embedded-google-pubsub/pom.xml +++ b/embedded-google-pubsub/pom.xml @@ -34,5 +34,9 @@ true + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java index bbf3f6cb7..4bafd8541 100644 --- a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java +++ b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java @@ -13,16 +13,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -43,29 +40,26 @@ public class EmbeddedPubsubBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "google.pubsub") - ToxiproxyContainer.ContainerProxy googlePubSubContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy googlePubSubContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB) GenericContainer pubsub, - PubsubProperties properties, - ConfigurableEnvironment environment) { + PubsubProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(pubsub, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.google.pubsub.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.google.pubsub.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.google.pubsub.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedGooglePubSubToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Google PubSub ToxiProxy connection details {}", map); - + log.info("Started Google PubSub ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "google.pubsub") + public DynamicPropertyRegistrar googlePubSubToxiProxyDynamicPropertyRegistrar(@Qualifier("googlePubSubContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.google.pubsub.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.google.pubsub.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.google.pubsub.toxiproxy.proxyName", proxy::getName); + }; + } @Bean(name = BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB, destroyMethod = "stop") - public GenericContainer pubsub(ConfigurableEnvironment environment, - PubsubProperties properties, - Optional network) { + public GenericContainer pubsub(PubsubProperties properties, Optional network) { GenericContainer pubsubContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) .withCommand( @@ -83,25 +77,18 @@ public GenericContainer pubsub(ConfigurableEnvironment environment, network.ifPresent(pubsubContainer::withNetwork); pubsubContainer = configureCommonsAndStart(pubsubContainer, properties, log); - registerPubsubEnvironment(pubsubContainer, environment, properties); return pubsubContainer; } - private void registerPubsubEnvironment(GenericContainer container, - ConfigurableEnvironment environment, - PubsubProperties properties) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.google.pubsub.port", container.getMappedPort(properties.getPort())); - map.put("embedded.google.pubsub.host", container.getHost()); - map.put("embedded.google.pubsub.project-id", properties.getProjectId()); - map.put("embedded.google.pubsub.networkAlias", GOOGLE_PUB_SUB_NETWORK_ALIAS); - map.put("embedded.google.pubsub.internalPort", properties.getPort()); - - log.info("Started Google Cloud Pubsub emulator. Connection details: {}, ", map); - log.info("Consult with the doc https://cloud.google.com/pubsub/docs/emulator for more details"); - - MapPropertySource propertySource = new MapPropertySource("embeddedGooglePubsubInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar googlePubSubDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB) GenericContainer container, PubsubProperties properties) { + return registry -> { + registry.add("embedded.google.pubsub.port", () -> container.getMappedPort(properties.getPort())); + registry.add("embedded.google.pubsub.host", container::getHost); + registry.add("embedded.google.pubsub.project-id", properties::getProjectId); + registry.add("embedded.google.pubsub.networkAlias", () -> GOOGLE_PUB_SUB_NETWORK_ALIAS); + registry.add("embedded.google.pubsub.internalPort", properties::getPort); + }; } @Bean(name = BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB_MANAGED_CHANNEL) diff --git a/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java b/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java index 5ba21fc94..74da58492 100644 --- a/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java +++ b/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java @@ -13,15 +13,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -41,28 +38,25 @@ public class EmbeddedStorageBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "google.storage") - ToxiproxyContainer.ContainerProxy googleStorageContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_STORAGE_SERVER) GenericContainer storageServer, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy googleStorageContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_STORAGE_SERVER) GenericContainer storageServer) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(storageServer, StorageProperties.PORT); - - Map map = new LinkedHashMap<>(); - map.put("embedded.google.storage.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.google.storage.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.google.storage.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedGoogleStorageToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Google Storage ToxiProxy connection details {}", map); - + log.info("Started Google Storage ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } - @Bean(name = BEAN_NAME_EMBEDDED_GOOGLE_STORAGE_SERVER, destroyMethod = "stop") - GenericContainer storageServer(ConfigurableEnvironment environment, - StorageProperties properties, - Optional network) throws IOException { + @Bean + @ConditionalOnToxiProxyEnabled(module = "google.storage") + public DynamicPropertyRegistrar googleStorageToxiProxyDynamicPropertyRegistrar(@Qualifier("googleStorageContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.google.storage.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.google.storage.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.google.storage.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_GOOGLE_STORAGE_SERVER, destroyMethod = "stop") + public GenericContainer storageServer(StorageProperties properties, Optional network) throws IOException { GenericContainer storageContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(StorageProperties.PORT) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint( @@ -79,10 +73,22 @@ GenericContainer storageServer(ConfigurableEnvironment environment, storageContainer = configureCommonsAndStart(storageContainer, properties, log); prepareContainerConfiguration(storageContainer); - registerStorageEnvironment(storageContainer, environment, properties); return storageContainer; } + @Bean + public DynamicPropertyRegistrar googleStorageDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_STORAGE_SERVER) GenericContainer container, StorageProperties properties) { + return registry -> { + registry.add("embedded.google.storage.host", container::getHost); + registry.add("embedded.google.storage.port", () -> container.getMappedPort(StorageProperties.PORT)); + registry.add("embedded.google.storage.endpoint", () -> buildContainerEndpoint(container)); + registry.add("embedded.google.storage.project-id", properties::getProjectId); + registry.add("embedded.google.storage.bucket-location", properties::getBucketLocation); + registry.add("embedded.google.storage.networkAlias", () -> GOOGLE_STORAGE_NETWORK_ALIAS); + registry.add("embedded.google.storage.internalPort", () -> StorageProperties.PORT); + }; + } + private void prepareContainerConfiguration(GenericContainer container) throws IOException { String containerEndpoint = buildContainerEndpoint(container); @@ -91,26 +97,6 @@ private void prepareContainerConfiguration(GenericContainer container) throws .sendUpdateConfigRequest(containerEndpoint); } - private void registerStorageEnvironment( - GenericContainer container, - ConfigurableEnvironment environment, - StorageProperties properties) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.google.storage.host", container.getHost()); - map.put("embedded.google.storage.port", container.getMappedPort(StorageProperties.PORT)); - map.put("embedded.google.storage.endpoint", buildContainerEndpoint(container)); - map.put("embedded.google.storage.project-id", properties.getProjectId()); - map.put("embedded.google.storage.bucket-location", properties.getBucketLocation()); - map.put("embedded.google.storage.networkAlias", GOOGLE_STORAGE_NETWORK_ALIAS); - map.put("embedded.google.storage.internalPort", StorageProperties.PORT); - - log.info("Started Google Cloud Fake Storage Server. Connection details: {}, ", map); - log.info("Consult with the doc https://github.com/fsouza/fake-gcs-server for more details"); - - MapPropertySource propertySource = new MapPropertySource("embeddedGoogleStorageInfo", map); - environment.getPropertySources().addFirst(propertySource); - } - @Bean StorageResourcesGenerator storageResourcesGenerator( @Value("${embedded.google.storage.endpoint}") String endpoint, diff --git a/embedded-grafana/pom.xml b/embedded-grafana/pom.xml index ae1a4ac8a..57c4eba9a 100644 --- a/embedded-grafana/pom.xml +++ b/embedded-grafana/pom.xml @@ -45,6 +45,10 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-grafana/src/main/java/com/playtika/testcontainer/grafana/EmbeddedGrafanaBootstrapConfiguration.java b/embedded-grafana/src/main/java/com/playtika/testcontainer/grafana/EmbeddedGrafanaBootstrapConfiguration.java index a4298e1ff..03b313f6e 100644 --- a/embedded-grafana/src/main/java/com/playtika/testcontainer/grafana/EmbeddedGrafanaBootstrapConfiguration.java +++ b/embedded-grafana/src/main/java/com/playtika/testcontainer/grafana/EmbeddedGrafanaBootstrapConfiguration.java @@ -12,16 +12,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -48,30 +45,16 @@ public WaitStrategy grafanaWaitStrategy(GrafanaProperties properties) { @Bean @ConditionalOnToxiProxyEnabled(module = "grafana") - ToxiproxyContainer.ContainerProxy grafanaContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(GRAFANA_BEAN_NAME) GenericContainer grafana, - GrafanaProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(grafana, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.grafana.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.grafana.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.grafana.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedGrafanaToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Grafana ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy grafanaContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(GRAFANA_BEAN_NAME) GenericContainer grafana, + GrafanaProperties properties) { + return toxiproxyContainer.getProxy(grafana, properties.getPort()); } @Bean(name = GRAFANA_BEAN_NAME, destroyMethod = "stop") - public GenericContainer grafana(ConfigurableEnvironment environment, - GrafanaProperties properties, + public GenericContainer grafana(GrafanaProperties properties, WaitStrategy grafanaWaitStrategy, Optional network) { - GenericContainer container = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withEnv("GF_SECURITY_ADMIN_USER", properties.getUsername()) @@ -84,30 +67,31 @@ public GenericContainer grafana(ConfigurableEnvironment environment, network.ifPresent(container::withNetwork); configureCommonsAndStart(container, properties, log); - - registerEnvironment(container, environment, properties); - return container; } - private void registerEnvironment(GenericContainer grafana, - ConfigurableEnvironment environment, - GrafanaProperties properties) { - - Integer mappedPort = grafana.getMappedPort(properties.port); - String host = grafana.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.grafana.host", host); - map.put("embedded.grafana.port", mappedPort); - map.put("embedded.grafana.username", properties.getUsername()); - map.put("embedded.grafana.password", properties.getPassword()); - map.put("embedded.grafana.networkAlias", GRAFANA_NETWORK_ALIAS); - map.put("embedded.grafana.internalPort", properties.getPort()); - - log.info("Started Grafana server. Connection details: {}", map); + @Bean + public DynamicPropertyRegistrar grafanaDynamicPropertyRegistrar( + @Qualifier(GRAFANA_BEAN_NAME) GenericContainer grafana, + GrafanaProperties properties) { + return registry -> { + registry.add("embedded.grafana.host", grafana::getHost); + registry.add("embedded.grafana.port", () -> grafana.getMappedPort(properties.port)); + registry.add("embedded.grafana.username", properties::getUsername); + registry.add("embedded.grafana.password", properties::getPassword); + registry.add("embedded.grafana.networkAlias", () -> GRAFANA_NETWORK_ALIAS); + registry.add("embedded.grafana.internalPort", properties::getPort); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedGrafanaInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "grafana") + public DynamicPropertyRegistrar grafanaToxiProxyDynamicPropertyRegistrar( + @Qualifier("grafanaContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.grafana.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.grafana.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.grafana.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-influxdb/pom.xml b/embedded-influxdb/pom.xml index 0a0231bd8..3a0d04630 100644 --- a/embedded-influxdb/pom.xml +++ b/embedded-influxdb/pom.xml @@ -47,6 +47,10 @@ jackson-databind test + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-influxdb/src/main/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfiguration.java b/embedded-influxdb/src/main/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfiguration.java index 0639dd29a..6e0704183 100644 --- a/embedded-influxdb/src/main/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfiguration.java +++ b/embedded-influxdb/src/main/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfiguration.java @@ -11,8 +11,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.InfluxDBContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; @@ -20,8 +19,6 @@ import org.testcontainers.containers.wait.strategy.WaitAllStrategy; import org.testcontainers.utility.DockerImageName; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -39,28 +36,27 @@ public class EmbeddedInfluxDBBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "influxdb") - ToxiproxyContainer.ContainerProxy influxdbContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy influxdbContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(EMBEDDED_INFLUX_DB) ConcreteInfluxDbContainer influxdb, - InfluxDBProperties properties, - ConfigurableEnvironment environment) { + InfluxDBProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(influxdb, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.influxdb.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.influxdb.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.influxdb.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedInfluxDBToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started InfluxDB ToxiProxy connection details {}", map); - + log.info("Started InfluxDB ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "influxdb") + public DynamicPropertyRegistrar influxdbToxiProxyDynamicPropertyRegistrar( + @Qualifier("influxdbContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.influxdb.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.influxdb.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.influxdb.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = EMBEDDED_INFLUX_DB, destroyMethod = "stop") - public ConcreteInfluxDbContainer influxdb(ConfigurableEnvironment environment, - InfluxDBProperties properties, - Optional network) { + public ConcreteInfluxDbContainer influxdb(InfluxDBProperties properties, Optional network) { ConcreteInfluxDbContainer influxDBContainer = new ConcreteInfluxDbContainer(ContainerUtils.getDockerImageName(properties)); influxDBContainer .withAdmin(properties.getAdminUser()) @@ -77,38 +73,22 @@ public ConcreteInfluxDbContainer influxdb(ConfigurableEnvironment environment, influxDBContainer.waitingFor(getInfluxWaitStrategy(properties.getUser(), properties.getPassword())); influxDBContainer = (ConcreteInfluxDbContainer) configureCommonsAndStart(influxDBContainer, properties, log); - registerInfluxEnvironment(influxDBContainer, environment, properties); return influxDBContainer; } - private void registerInfluxEnvironment(ConcreteInfluxDbContainer influx, - ConfigurableEnvironment environment, - InfluxDBProperties properties) { - Integer mappedPort = influx.getMappedPort(properties.getPort()); - String host = influx.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.influxdb.port", mappedPort); - map.put("embedded.influxdb.host", host); - map.put("embedded.influxdb.database", properties.getDatabase()); - map.put("embedded.influxdb.user", properties.getUser()); - map.put("embedded.influxdb.password", properties.getPassword()); - map.put("embedded.influxdb.networkAlias", INFLUXDB_NETWORK_ALIAS); - map.put("embedded.influxdb.internalPort", properties.getPort()); - - String influxDBURL = "http://{}:{}"; - log.info("Started InfluxDB server. Connection details: {}, " + - "HTTP connection url: " + influxDBURL, map, host, mappedPort); - - MapPropertySource propertySource = new MapPropertySource("embeddedInfluxDBInfo", map); - environment.getPropertySources().addFirst(propertySource); - } - - private static class ConcreteInfluxDbContainer extends InfluxDBContainer { - ConcreteInfluxDbContainer(final DockerImageName dockerImageName) { - super(dockerImageName); - addExposedPort(INFLUXDB_PORT); - } + @Bean + public DynamicPropertyRegistrar influxdbDynamicPropertyRegistrar(@Qualifier(EMBEDDED_INFLUX_DB) ConcreteInfluxDbContainer influx, InfluxDBProperties properties) { + return registry -> { + Integer mappedPort = influx.getMappedPort(properties.getPort()); + String host = influx.getHost(); + registry.add("embedded.influxdb.port", () -> mappedPort); + registry.add("embedded.influxdb.host", () -> host); + registry.add("embedded.influxdb.database", properties::getDatabase); + registry.add("embedded.influxdb.user", properties::getUser); + registry.add("embedded.influxdb.password", properties::getPassword); + registry.add("embedded.influxdb.networkAlias", () -> INFLUXDB_NETWORK_ALIAS); + registry.add("embedded.influxdb.internalPort", properties::getPort); + }; } private WaitAllStrategy getInfluxWaitStrategy(String user, String password) { @@ -118,4 +98,11 @@ private WaitAllStrategy getInfluxWaitStrategy(String user, String password) { .forStatusCode(204)) .withStrategy(Wait.forListeningPort()); } + + private static class ConcreteInfluxDbContainer extends InfluxDBContainer { + ConcreteInfluxDbContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + addExposedPort(INFLUXDB_PORT); + } + } } diff --git a/embedded-k3s/pom.xml b/embedded-k3s/pom.xml index 47a4ebb74..69fe60dca 100644 --- a/embedded-k3s/pom.xml +++ b/embedded-k3s/pom.xml @@ -47,6 +47,10 @@ openshift-client test + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-k3s/src/main/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfiguration.java b/embedded-k3s/src/main/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfiguration.java index fdc51112e..31153860c 100644 --- a/embedded-k3s/src/main/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfiguration.java +++ b/embedded-k3s/src/main/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfiguration.java @@ -3,19 +3,18 @@ import com.playtika.testcontainer.common.spring.DockerPresenceBootstrapConfiguration; import com.playtika.testcontainer.common.utils.ContainerUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import org.testcontainers.k3s.K3sContainer; -import java.util.LinkedHashMap; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -32,8 +31,7 @@ public class EmbeddedK3sBootstrapConfiguration { private static final String K3S_NETWORK_ALIAS = "k3s.testcontainer.docker"; @Bean(name = EMBEDDED_K3S, destroyMethod = "stop") - public K3sContainer k3s(ConfigurableEnvironment environment, - K3sProperties properties, + public K3sContainer k3s(K3sProperties properties, Optional network) { K3sContainer k3sContainer = new K3sContainer(ContainerUtils.getDockerImageName(properties)); k3sContainer @@ -45,24 +43,18 @@ public K3sContainer k3s(ConfigurableEnvironment environment, network.ifPresent(k3sContainer::withNetwork); k3sContainer = (K3sContainer) configureCommonsAndStart(k3sContainer, properties, log); - registerK3sEnvironment(k3sContainer, environment, properties); log.info("Started K3s"); return k3sContainer; } - private void registerK3sEnvironment(K3sContainer k3s, - ConfigurableEnvironment environment, - K3sProperties properties) { - String kubeConfigYaml = k3s.getKubeConfigYaml(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.k3s.kubeconfig", kubeConfigYaml); - map.put("embedded.k3s.networkAlias", K3S_NETWORK_ALIAS); - map.put("embedded.k3s.internalPort", properties.getPort()); - - MapPropertySource propertySource = new MapPropertySource("embeddedK3sInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar k3sDynamicPropertyRegistrar(@Qualifier(EMBEDDED_K3S) K3sContainer k3s, K3sProperties properties) { + return registry -> { + registry.add("embedded.k3s.kubeconfig", k3s::getKubeConfigYaml); + registry.add("embedded.k3s.networkAlias", () -> K3S_NETWORK_ALIAS); + registry.add("embedded.k3s.internalPort", properties::getPort); + }; } } diff --git a/embedded-kafka/pom.xml b/embedded-kafka/pom.xml index f2970c93a..bd86fb777 100644 --- a/embedded-kafka/pom.xml +++ b/embedded-kafka/pom.xml @@ -93,6 +93,10 @@ + + org.springframework + spring-test + diff --git a/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/KafkaContainerConfiguration.java b/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/KafkaContainerConfiguration.java index e9995cd6b..6f9e0d47d 100644 --- a/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/KafkaContainerConfiguration.java +++ b/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/KafkaContainerConfiguration.java @@ -16,8 +16,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.KafkaContainer; @@ -36,9 +35,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.stream.Stream; @@ -73,46 +70,36 @@ public KafkaStatusCheck kafkaStartupCheckStrategy(KafkaConfigurationProperties k @Bean(name = KAFKA_PLAIN_TEXT_TOXI_PROXY_BEAN_NAME) @ConditionalOnToxiProxyEnabled(module = "kafka") - ToxiproxyContainer.ContainerProxy kafkaContainerPlainTextProxy(ToxiproxyContainer toxiproxyContainer, - KafkaConfigurationProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy plainTextProxy = - toxiproxyContainer.getProxy(KAFKA_HOST_NAME, properties.getToxiProxyContainerBrokerPort()); - - Map map = new LinkedHashMap<>(); - - String plaintextToxiProxyBrokerList = - format("%s:%d", plainTextProxy.getContainerIpAddress(), plainTextProxy.getProxyPort()); - map.put("embedded.kafka.toxiproxy.brokerList", plaintextToxiProxyBrokerList); - map.put("embedded.kafka.toxiproxy.proxyName", plainTextProxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedKafkaPlainToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Kafka ToxiProxy plain-text connection details {}", map); + public ToxiproxyContainer.ContainerProxy kafkaContainerPlainTextProxy(ToxiproxyContainer toxiproxyContainer, + KafkaConfigurationProperties properties) { + return toxiproxyContainer.getProxy(KAFKA_HOST_NAME, properties.getToxiProxyContainerBrokerPort()); + } - return plainTextProxy; + @Bean + @ConditionalOnToxiProxyEnabled(module = "kafka") + public DynamicPropertyRegistrar kafkaPlainTextToxiProxyDynamicPropertyRegistrar(@Qualifier(KAFKA_PLAIN_TEXT_TOXI_PROXY_BEAN_NAME) ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.kafka.toxiproxy.brokerList", () -> + format("%s:%d", proxy.getContainerIpAddress(), proxy.getProxyPort())); + registry.add("embedded.kafka.toxiproxy.proxyName", proxy::getName); + }; } @Bean(name = KAFKA_SASL_TOXI_PROXY_BEAN_NAME) @ConditionalOnToxiProxyEnabled(module = "kafka") - ToxiproxyContainer.ContainerProxy kafkaContainerSaslProxy(ToxiproxyContainer toxiproxyContainer, - KafkaConfigurationProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy saslProxy = - toxiproxyContainer.getProxy(KAFKA_HOST_NAME, properties.getToxiProxySaslPlaintextContainerBrokerPort()); - - Map map = new LinkedHashMap<>(); - - String saslToxiProxyBrokerList = - format("%s:%d", saslProxy.getContainerIpAddress(), saslProxy.getProxyPort()); - map.put("embedded.kafka.toxiproxy.saslPlaintext.brokerList", saslToxiProxyBrokerList); - map.put("embedded.kafka.toxiproxy.saslPlaintext.proxyName", saslProxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedKafkaSaslToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Kafka ToxiProxy SASL connection details {}", map); + public ToxiproxyContainer.ContainerProxy kafkaContainerSaslProxy(ToxiproxyContainer toxiproxyContainer, + KafkaConfigurationProperties properties) { + return toxiproxyContainer.getProxy(KAFKA_HOST_NAME, properties.getToxiProxySaslPlaintextContainerBrokerPort()); + } - return saslProxy; + @Bean + @ConditionalOnToxiProxyEnabled(module = "kafka") + public DynamicPropertyRegistrar kafkaSaslToxiProxyDynamicPropertyRegistrar(@Qualifier(KAFKA_SASL_TOXI_PROXY_BEAN_NAME) ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.kafka.toxiproxy.saslPlaintext.brokerList", () -> + format("%s:%d", proxy.getContainerIpAddress(), proxy.getProxyPort())); + registry.add("embedded.kafka.toxiproxy.saslPlaintext.proxyName", proxy::getName); + }; } @Bean(name = KAFKA_BEAN_NAME, destroyMethod = "stop") @@ -120,7 +107,6 @@ public GenericContainer kafka( KafkaStatusCheck kafkaStatusCheck, KafkaConfigurationProperties kafkaProperties, ZookeeperConfigurationProperties zookeeperProperties, - ConfigurableEnvironment environment, Network network, @Autowired(required = false) @Qualifier(KAFKA_PLAIN_TEXT_TOXI_PROXY_BEAN_NAME) ToxiproxyContainer.ContainerProxy plainTextProxy, @@ -205,7 +191,6 @@ public String getBootstrapServers() { zookeperFileSystemBind(zookeeperProperties, kafka); kafka = (KafkaContainer) configureCommonsAndStart(kafka, kafkaProperties, log); - registerKafkaEnvironment(kafka, environment, kafkaProperties); return kafka; } @@ -242,42 +227,27 @@ private void zookeperFileSystemBind(ZookeeperConfigurationProperties zookeeperPr } } - private void registerKafkaEnvironment(GenericContainer kafka, - ConfigurableEnvironment environment, - KafkaConfigurationProperties kafkaProperties) { - LinkedHashMap map = new LinkedHashMap<>(); - - String host = kafka.getHost(); - Integer mappedBrokerPort = kafka.getMappedPort(kafkaProperties.getBrokerPort()); - String kafkaBrokerList = format("%s:%d", host, mappedBrokerPort); - map.put("embedded.kafka.brokerList", kafkaBrokerList); - - Integer mappedSaslBrokerPort = kafka.getMappedPort(kafkaProperties.getSaslPlaintextBrokerPort()); - String saslPlaintextKafkaBrokerList = format("%s:%d", host, mappedSaslBrokerPort); - map.put("embedded.kafka.saslPlaintext.brokerList", saslPlaintextKafkaBrokerList); - map.put("embedded.kafka.saslPlaintext.user", KafkaConfigurationProperties.KAFKA_USER); - map.put("embedded.kafka.saslPlaintext.password", KafkaConfigurationProperties.KAFKA_PASSWORD); - map.put("embedded.kafka.networkAlias", KAFKA_HOST_NAME); - map.put("embedded.kafka.internalPort", kafkaProperties.getInternalBrokerPort()); - map.put("embedded.kafka.internalSaslPlaintextPort", kafkaProperties.getInternalSaslPlaintextBrokerPort()); - - Integer containerPort = kafkaProperties.getContainerBrokerPort(); - String kafkaBrokerListForContainers = format("%s:%d", KAFKA_HOST_NAME, containerPort); - map.put("embedded.kafka.containerBrokerList", kafkaBrokerListForContainers); - - MapPropertySource propertySource = new MapPropertySource("embeddedKafkaInfo", map); - - log.info("Started kafka broker. Connection details: {}", map); - - environment.getPropertySources().addFirst(propertySource); - } - @Bean - public KafkaTopicsConfigurer kafkaConfigurer( - @Qualifier(KAFKA_BEAN_NAME) GenericContainer kafka, - KafkaConfigurationProperties kafkaProperties, - ZookeeperConfigurationProperties zookeeperProperties) { - return new KafkaTopicsConfigurer(kafka, zookeeperProperties, kafkaProperties); + public DynamicPropertyRegistrar kafkaDynamicPropertyRegistrar(@Qualifier(KAFKA_BEAN_NAME) GenericContainer kafka, KafkaConfigurationProperties kafkaProperties) { + return registry -> { + String host = kafka.getHost(); + Integer mappedBrokerPort = kafka.getMappedPort(kafkaProperties.getBrokerPort()); + String kafkaBrokerList = format("%s:%d", host, mappedBrokerPort); + registry.add("embedded.kafka.brokerList", () -> kafkaBrokerList); + + Integer mappedSaslBrokerPort = kafka.getMappedPort(kafkaProperties.getSaslPlaintextBrokerPort()); + String saslPlaintextKafkaBrokerList = format("%s:%d", host, mappedSaslBrokerPort); + registry.add("embedded.kafka.saslPlaintext.brokerList", () -> saslPlaintextKafkaBrokerList); + registry.add("embedded.kafka.saslPlaintext.user", () -> KafkaConfigurationProperties.KAFKA_USER); + registry.add("embedded.kafka.saslPlaintext.password", () -> KafkaConfigurationProperties.KAFKA_PASSWORD); + registry.add("embedded.kafka.networkAlias", () -> KAFKA_HOST_NAME); + registry.add("embedded.kafka.internalPort", kafkaProperties::getInternalBrokerPort); + registry.add("embedded.kafka.internalSaslPlaintextPort", kafkaProperties::getInternalSaslPlaintextBrokerPort); + + Integer containerPort = kafkaProperties.getContainerBrokerPort(); + String kafkaBrokerListForContainers = format("%s:%d", KAFKA_HOST_NAME, containerPort); + registry.add("embedded.kafka.containerBrokerList", () -> kafkaBrokerListForContainers); + }; } /** @@ -324,4 +294,12 @@ private void makeWritable(Path path) { } } + @Bean + public KafkaTopicsConfigurer kafkaConfigurer( + @Qualifier(KAFKA_BEAN_NAME) GenericContainer kafka, + KafkaConfigurationProperties kafkaProperties, + ZookeeperConfigurationProperties zookeeperProperties) { + return new KafkaTopicsConfigurer(kafka, zookeeperProperties, kafkaProperties); + } + } diff --git a/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java b/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java index 86fe6a5de..3dd5ee204 100644 --- a/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java +++ b/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java @@ -3,13 +3,13 @@ import com.playtika.testcontainer.common.utils.ContainerUtils; import com.playtika.testcontainer.kafka.properties.SchemaRegistryConfigurationProperties; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; @@ -29,7 +29,6 @@ public class SchemaRegistryContainerConfiguration { @Bean(name = SCHEMA_REGISTRY_BEAN_NAME, destroyMethod = "stop") public GenericContainer schemaRegistry( - ConfigurableEnvironment environment, SchemaRegistryConfigurationProperties properties, @Value("${embedded.kafka.containerBrokerList}") String kafkaContainerBrokerList, Network network) { @@ -55,12 +54,11 @@ public GenericContainer schemaRegistry( } schemaRegistry = configureCommonsAndStart(schemaRegistry, properties, log); - registerSchemaRegistryEnvironment(schemaRegistry, environment, properties); + registerSchemaRegistryEnvironment(schemaRegistry, properties); return schemaRegistry; } - private void registerSchemaRegistryEnvironment(GenericContainer schemaRegistry, ConfigurableEnvironment environment, - SchemaRegistryConfigurationProperties properties) { + private void registerSchemaRegistryEnvironment(GenericContainer schemaRegistry, SchemaRegistryConfigurationProperties properties) { String host = schemaRegistry.getHost(); Integer port = schemaRegistry.getMappedPort(properties.getPort()); @@ -74,8 +72,24 @@ private void registerSchemaRegistryEnvironment(GenericContainer schemaRegistr } log.info("Started Schema Registry. Connection Details: {}, Connection URI: http://{}:{}", map, host, port); + } - MapPropertySource propertySource = new MapPropertySource("embeddedSchemaRegistryInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar schemaRegistryDynamicPropertyRegistrar(@Qualifier(SCHEMA_REGISTRY_BEAN_NAME) GenericContainer schemaRegistry, SchemaRegistryConfigurationProperties properties) { + return registry -> { + String host = schemaRegistry.getHost(); + Integer port = schemaRegistry.getMappedPort(properties.getPort()); + registry.add("embedded.kafka.schema-registry.host", () -> host); + registry.add("embedded.kafka.schema-registry.port", () -> port); + if (properties.isBasicAuthenticationEnabled()) { + registry.add("embedded.kafka.schema-registry.username", () -> SchemaRegistryConfigurationProperties.USERNAME); + registry.add("embedded.kafka.schema-registry.password", () -> SchemaRegistryConfigurationProperties.PASSWORD); + } + log.info("Started Schema Registry. Connection Details: host={}, port={}, username={}, password={}, Connection URI: http://{}:{}", + host, port, + properties.isBasicAuthenticationEnabled() ? SchemaRegistryConfigurationProperties.USERNAME : null, + properties.isBasicAuthenticationEnabled() ? SchemaRegistryConfigurationProperties.PASSWORD : null, + host, port); + }; } } diff --git a/embedded-keycloak/pom.xml b/embedded-keycloak/pom.xml index 23f70eb36..d8319ace0 100644 --- a/embedded-keycloak/pom.xml +++ b/embedded-keycloak/pom.xml @@ -62,6 +62,10 @@ spring-boot-starter-oauth2-resource-server test + + org.springframework + spring-test + diff --git a/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java b/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java index fbb2caa4f..c17e8a7f2 100644 --- a/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java +++ b/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java @@ -10,18 +10,16 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; import org.springframework.core.io.ResourceLoader; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; +import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; +import static com.playtika.testcontainer.keycloak.KeycloakContainer.KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL; import static com.playtika.testcontainer.keycloak.KeycloakProperties.BEAN_NAME_EMBEDDED_KEYCLOAK; -import static java.util.Objects.requireNonNull; @Slf4j @Configuration @@ -31,32 +29,25 @@ @ConditionalOnProperty(name = "embedded.keycloak.enabled", matchIfMissing = true) public class EmbeddedKeycloakBootstrapConfiguration { + private static final String KEYCLOAK_NETWORK_ALIAS = "keycloak.testcontainer.docker"; + @Bean @ConditionalOnToxiProxyEnabled(module = "keycloak") - ToxiproxyContainer.ContainerProxy keycloakContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_KEYCLOAK) KeycloakContainer keycloakContainer, - KeycloakProperties properties, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy keycloakContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_KEYCLOAK) KeycloakContainer keycloakContainer) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(keycloakContainer, keycloakContainer.getHttpPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.keycloak.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.keycloak.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.keycloak.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedKeycloakToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Keycloak ToxiProxy connection details {}", map); - + log.info("Started Keycloak ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } @Bean - public KeycloakContainerFactory keycloakContainerFactory(ConfigurableEnvironment environment, - KeycloakProperties properties, - ResourceLoader resourceLoader, - Optional network) { - return new KeycloakContainerFactory(environment, properties, resourceLoader, network); + @ConditionalOnToxiProxyEnabled(module = "keycloak") + public DynamicPropertyRegistrar keycloakToxiProxyDynamicPropertyRegistrar(@Qualifier("keycloakContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.keycloak.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.keycloak.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.keycloak.toxiproxy.proxyName", proxy::getName); + }; } /** @@ -65,12 +56,28 @@ public KeycloakContainerFactory keycloakContainerFactory(ConfigurableEnvironment * on the classpath or any Spring adapter. The container will always be needed. Also registers a * shutdown hook to stop the container on context shutdown. * - * @param factory The {@link KeycloakContainerFactory} to use, injected by Spring, must not be - * null * @return The created {@link KeycloakContainer} instance to be registered as bean */ @Bean(name = BEAN_NAME_EMBEDDED_KEYCLOAK, destroyMethod = "stop") - public KeycloakContainer keycloakContainer(KeycloakContainerFactory factory) { - return requireNonNull(factory).newKeycloakContainer(); + public KeycloakContainer keycloak(KeycloakProperties properties, ResourceLoader resourceLoader, Optional network) { + KeycloakContainer keycloak = new KeycloakContainer(properties, resourceLoader) + .withNetworkAliases(KEYCLOAK_NETWORK_ALIAS); + network.ifPresent(keycloak::withNetwork); + configureCommonsAndStart(keycloak, properties, log); + return keycloak; + } + + @Bean + public DynamicPropertyRegistrar keycloakDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_KEYCLOAK) KeycloakContainer keycloak, + KeycloakProperties properties) { + return registry -> { + registry.add("embedded.keycloak.host", keycloak::getHost); + registry.add("embedded.keycloak.http-port", () -> keycloak.getMappedPort(KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL)); + registry.add("embedded.keycloak.auth-server-url", keycloak::getAuthServerUrl); + registry.add("embedded.keycloak.port", () -> keycloak.getMappedPort(KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL)); + registry.add("embedded.keycloak.networkAlias", () -> KEYCLOAK_NETWORK_ALIAS); + registry.add("embedded.keycloak.internalPort", () -> KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL); + }; } } diff --git a/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/KeycloakContainerFactory.java b/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/KeycloakContainerFactory.java deleted file mode 100644 index 04929e815..000000000 --- a/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/KeycloakContainerFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.playtika.testcontainer.keycloak; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; -import org.springframework.core.io.ResourceLoader; -import org.testcontainers.containers.Network; - -import java.util.LinkedHashMap; -import java.util.Optional; - -import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; -import static com.playtika.testcontainer.keycloak.KeycloakContainer.KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL; - -@Slf4j -@RequiredArgsConstructor -public class KeycloakContainerFactory { - - private static final String KEYCLOAK_NETWORK_ALIAS = "keycloak.testcontainer.docker"; - - private final ConfigurableEnvironment environment; - private final KeycloakProperties properties; - private final ResourceLoader resourceLoader; - private final Optional network; - - public KeycloakContainer newKeycloakContainer() { - KeycloakContainer keycloak = new KeycloakContainer(properties, resourceLoader) - .withNetworkAliases(KEYCLOAK_NETWORK_ALIAS); - - network.ifPresent(keycloak::withNetwork); - - keycloak = (KeycloakContainer) configureCommonsAndStart(keycloak, properties, log); - registerKeycloakEnvironment(keycloak); - return keycloak; - } - - private void registerKeycloakEnvironment(KeycloakContainer keycloak) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.keycloak.host", keycloak.getIp()); - map.put("embedded.keycloak.http-port", keycloak.getHttpPort()); - map.put("embedded.keycloak.auth-server-url", keycloak.getAuthServerUrl()); - map.put("embedded.keycloak.networkAlias", KEYCLOAK_NETWORK_ALIAS); - map.put("embedded.keycloak.internalPort", KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL); - - log.info("Started Keycloak server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedKeycloakInfo", map); - environment.getPropertySources().addFirst(propertySource); - } -} diff --git a/embedded-keydb/pom.xml b/embedded-keydb/pom.xml index d3fe619a1..706165ae5 100644 --- a/embedded-keydb/pom.xml +++ b/embedded-keydb/pom.xml @@ -34,6 +34,10 @@ jedis true + + org.springframework + spring-test + diff --git a/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EmbeddedKeyDbBootstrapConfiguration.java b/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EmbeddedKeyDbBootstrapConfiguration.java index 3e0d33ecf..23930c329 100644 --- a/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EmbeddedKeyDbBootstrapConfiguration.java +++ b/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EmbeddedKeyDbBootstrapConfiguration.java @@ -16,9 +16,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; import org.springframework.core.io.ResourceLoader; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.FixedHostPortGenericContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; @@ -28,12 +27,9 @@ import java.io.IOException; import java.nio.file.Path; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; -import static com.playtika.testcontainer.keydb.EnvUtils.registerKeyDbEnvironment; import static com.playtika.testcontainer.keydb.KeyDbProperties.BEAN_NAME_EMBEDDED_KEYDB; @Slf4j @@ -67,31 +63,27 @@ public WaitStrategy keydbClusterWaitStrategy(KeyDbProperties properties) { @Bean @ConditionalOnToxiProxyEnabled(module = "keydb") - ToxiproxyContainer.ContainerProxy keydbContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_KEYDB) GenericContainer keydb, - KeyDbProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(keydb, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.keydb.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.keydb.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.keydb.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedKeyDbToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started KeyDb ToxiProxy connection details {}", map); + public ToxiproxyContainer.ContainerProxy keydbToxiProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_KEYDB) GenericContainer keydb, + KeyDbProperties properties) { + return toxiproxyContainer.getProxy(keydb, properties.getPort()); + } - return proxy; + @Bean + @ConditionalOnToxiProxyEnabled(module = "keydb") + public DynamicPropertyRegistrar keydbToxiProxyDynamicPropertyRegistrar( + @Qualifier("keydbToxiProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.keydb.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.keydb.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.keydb.toxiproxy.proxyName", proxy::getName); + log.info("Started KeyDb ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); + }; } @Bean(name = BEAN_NAME_EMBEDDED_KEYDB, destroyMethod = "stop") - public GenericContainer keydb(ConfigurableEnvironment environment, - @Qualifier(KEYDB_WAIT_STRATEGY_BEAN_NAME) WaitStrategy keydbStartupCheckStrategy, + public GenericContainer keydb(@Qualifier(KEYDB_WAIT_STRATEGY_BEAN_NAME) WaitStrategy keydbStartupCheckStrategy, Optional network) throws Exception { - - // CLUSTER SLOTS command returns IP:port for each node, so ports outside and inside - // container must be the same GenericContainer keydb = new FixedHostPortGenericContainer(ContainerUtils.getDockerImageName(properties).asCanonicalNameString()) .withFixedExposedPort(properties.getPort(), properties.getPort()) @@ -105,11 +97,20 @@ public GenericContainer keydb(ConfigurableEnvironment environment, .withNetworkAliases(KEYDB_NETWORK_ALIAS); network.ifPresent(keydb::withNetwork); keydb = configureCommonsAndStart(keydb, properties, log); - Map keydbEnv = registerKeyDbEnvironment(environment, keydb, properties, properties.getPort()); - log.info("Started KeyDb cluster. Connection details: {}", keydbEnv); return keydb; } + @Bean + public DynamicPropertyRegistrar keydbDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_KEYDB) GenericContainer keydb, KeyDbProperties properties) { + return registry -> { + registry.add("embedded.keydb.port", properties::getPort); + registry.add("embedded.keydb.host", keydb::getHost); + registry.add("embedded.keydb.password", properties::getPassword); + registry.add("embedded.keydb.user", properties::getUser); + registry.add("embedded.keydb.networkAlias", () -> KEYDB_NETWORK_ALIAS); + }; + } + private Path prepareKeyDbConf() throws IOException { return FileUtils.resolveTemplateAsPath(resourceLoader, "keydb.conf", content -> content .replace("{{requirepass}}", properties.isRequirepass() ? "yes" : "no") diff --git a/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EnvUtils.java b/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EnvUtils.java deleted file mode 100644 index a15149761..000000000 --- a/embedded-keydb/src/main/java/com/playtika/testcontainer/keydb/EnvUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.playtika.testcontainer.keydb; - -import lombok.experimental.UtilityClass; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; -import org.testcontainers.containers.GenericContainer; - -import java.util.LinkedHashMap; -import java.util.Map; - -import static com.playtika.testcontainer.keydb.EmbeddedKeyDbBootstrapConfiguration.KEYDB_NETWORK_ALIAS; - -@UtilityClass -public class EnvUtils { - - static Map registerKeyDbEnvironment(ConfigurableEnvironment environment, GenericContainer keyDb, - KeyDbProperties properties, int port) { - String host = keyDb.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.keydb.port", port); - map.put("embedded.keydb.host", host); - map.put("embedded.keydb.password", properties.getPassword()); - map.put("embedded.keydb.user", properties.getUser()); - map.put("embedded.keydb.networkAlias", KEYDB_NETWORK_ALIAS); - MapPropertySource propertySource = new MapPropertySource("embeddedKeyDbInfo", map); - environment.getPropertySources().addFirst(propertySource); - return map; - } - -} diff --git a/embedded-localstack/pom.xml b/embedded-localstack/pom.xml index 8b904aef9..f0db1cd47 100644 --- a/embedded-localstack/pom.xml +++ b/embedded-localstack/pom.xml @@ -48,5 +48,9 @@ ${aws-java-sdk.version} provided + + org.springframework + spring-test + diff --git a/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java b/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java index 99bcc5b1d..2a9cdfc4d 100644 --- a/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java +++ b/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java @@ -12,14 +12,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.localstack.LocalStackContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -39,73 +36,42 @@ public class EmbeddedLocalStackBootstrapConfiguration { @ConditionalOnToxiProxyEnabled(module = "localstack") ToxiproxyContainer.ContainerProxy localstackContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_LOCALSTACK) LocalStackContainer localStack, - LocalStackProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(localStack, properties.getEdgePort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.localstack.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.localstack.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.localstack.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedLocalstackToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Localstack ToxiProxy connection details {}", map); + LocalStackProperties properties) { + return toxiproxyContainer.getProxy(localStack, properties.getEdgePort()); + } - return proxy; + @Bean + @ConditionalOnToxiProxyEnabled(module = "localstack") + public DynamicPropertyRegistrar localstackToxiProxyDynamicPropertyRegistrar( + @Qualifier("localstackContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.localstack.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.localstack.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.localstack.toxiproxy.proxyName", proxy::getName); + }; } @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_LOCALSTACK) @Bean(name = BEAN_NAME_EMBEDDED_LOCALSTACK, destroyMethod = "stop") - public LocalStackContainer localStack(ConfigurableEnvironment environment, - LocalStackProperties properties, - Optional network) { - LocalStackContainer localStackContainer = new LocalStackContainer(ContainerUtils.getDockerImageName(properties)); - localStackContainer + public LocalStackContainer localStack(LocalStackProperties properties, Optional network) { + LocalStackContainer localStack = new LocalStackContainer(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getEdgePort()) - .withEnv("EDGE_PORT", String.valueOf(properties.getEdgePort())) - .withEnv("HOSTNAME", properties.getHostname()) - .withEnv("LOCALSTACK_HOST", properties.getHostnameExternal()) - .withEnv("SKIP_SSL_CERT_DOWNLOAD", "1") .withNetworkAliases(LOCALSTACK_NETWORK_ALIAS); - - network.ifPresent(localStackContainer::withNetwork); - - for (LocalStackContainer.Service service : properties.services) { - localStackContainer.withServices(service); - } - localStackContainer = (LocalStackContainer) configureCommonsAndStart(localStackContainer, properties, log); - registerLocalStackEnvironment(localStackContainer, environment, properties); - return localStackContainer; - } - - private void registerLocalStackEnvironment(LocalStackContainer localStack, - ConfigurableEnvironment environment, - LocalStackProperties properties) { - String host = localStack.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.localstack.host", host); - map.put("embedded.localstack.accessKey", localStack.getAccessKey()); - map.put("embedded.localstack.secretKey", localStack.getSecretKey()); - map.put("embedded.localstack.networkAlias", LOCALSTACK_NETWORK_ALIAS); - map.put("embedded.localstack.internalEdgePort", properties.getEdgePort()); - String prefix = "embedded.localstack."; - Integer mappedPort = localStack.getMappedPort(properties.getEdgePort()); - for (LocalStackContainer.Service service : properties.services) { - map.put(prefix + service, localStack.getEndpointOverride(service)); - map.put(prefix + service + ".port", mappedPort); - } - log.info("Started Localstack. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedLocalStackInfo", map); - environment.getPropertySources().addFirst(propertySource); - setSystemProperties(localStack); + network.ifPresent(localStack::withNetwork); + configureCommonsAndStart(localStack, properties, log); + return localStack; } - private static void setSystemProperties(LocalStackContainer localStack) { - System.setProperty("aws.accessKeyId", localStack.getAccessKey()); - System.setProperty("aws.secretKey", localStack.getAccessKey()); + @Bean + public DynamicPropertyRegistrar localStackDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_LOCALSTACK) LocalStackContainer localStack, + LocalStackProperties properties) { + return registry -> { + registry.add("embedded.localstack.host", localStack::getHost); + registry.add("embedded.localstack.port", () -> localStack.getMappedPort(properties.getEdgePort())); + registry.add("embedded.localstack.networkAlias", () -> LOCALSTACK_NETWORK_ALIAS); + registry.add("embedded.localstack.internalPort", properties::getEdgePort); + }; } } diff --git a/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java b/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java index 5cfbc31d3..94c84dddd 100644 --- a/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java +++ b/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java @@ -12,15 +12,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.Wait; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -38,29 +35,27 @@ public class EmbeddedMailHogBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "mailhog") - ToxiproxyContainer.ContainerProxy mailhogSmtpContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy mailhogSmtpContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_MAILHOG) GenericContainer mailhogContainer, - MailHogProperties properties, - ConfigurableEnvironment environment) { + MailHogProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(mailhogContainer, properties.getSmtpPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.mailhog.smtp.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.mailhog.smtp.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.mailhog.smtp.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMailhogSmtpToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started MailHog SMTP ToxiProxy connection details {}", map); - + log.info("Started MailHog SMTP ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "mailhog") + public DynamicPropertyRegistrar mailhogSmtpToxiProxyDynamicPropertyRegistrar(@Qualifier("mailhogSmtpContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.mailhog.smtp.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.mailhog.smtp.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.mailhog.smtp.toxiproxy.proxyName", proxy::getName); + }; + } + @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_MAILHOG) @Bean(name = BEAN_NAME_EMBEDDED_MAILHOG, destroyMethod = "stop") - public GenericContainer mailHog(ConfigurableEnvironment environment, - MailHogProperties properties, - Optional network) { + public GenericContainer mailHog(MailHogProperties properties, Optional network) { GenericContainer mailHog = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getSmtpPort(), properties.getHttpPort()) .withNetworkAliases(MAILHOG_NETWORK_ALIAS) @@ -69,26 +64,21 @@ public GenericContainer mailHog(ConfigurableEnvironment environment, network.ifPresent(mailHog::withNetwork); mailHog = configureCommonsAndStart(mailHog, properties, log); - registerMailHogEnvironment(mailHog, environment, properties); return mailHog; } - private void registerMailHogEnvironment(GenericContainer mailHog, ConfigurableEnvironment environment, MailHogProperties properties) { - Integer smtpMappedPort = mailHog.getMappedPort(properties.getSmtpPort()); - Integer httpMappedPort = mailHog.getMappedPort(properties.getHttpPort()); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.mailhog.host", mailHog.getHost()); - map.put("embedded.mailhog.smtp-port", smtpMappedPort); - map.put("embedded.mailhog.http-port", httpMappedPort); - map.put("embedded.mailhog.networkAlias", MAILHOG_NETWORK_ALIAS); - map.put("embedded.mailhog.internalSmtpPort", properties.getSmtpPort()); - map.put("embedded.mailhog.internalHttpPort", properties.getHttpPort()); - - log.info("Started MailHog. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedMailHogInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar mailhogDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_MAILHOG) GenericContainer mailHog, MailHogProperties properties) { + return registry -> { + Integer smtpMappedPort = mailHog.getMappedPort(properties.getSmtpPort()); + Integer httpMappedPort = mailHog.getMappedPort(properties.getHttpPort()); + registry.add("embedded.mailhog.host", mailHog::getHost); + registry.add("embedded.mailhog.smtp-port", () -> smtpMappedPort); + registry.add("embedded.mailhog.http-port", () -> httpMappedPort); + registry.add("embedded.mailhog.networkAlias", () -> MAILHOG_NETWORK_ALIAS); + registry.add("embedded.mailhog.internalSmtpPort", properties::getSmtpPort); + registry.add("embedded.mailhog.internalHttpPort", properties::getHttpPort); + }; } } diff --git a/embedded-mariadb/pom.xml b/embedded-mariadb/pom.xml index 184328506..90b91b0fa 100644 --- a/embedded-mariadb/pom.xml +++ b/embedded-mariadb/pom.xml @@ -42,5 +42,9 @@ tomcat-jdbc test + + org.springframework + spring-test + diff --git a/embedded-mariadb/src/main/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfiguration.java b/embedded-mariadb/src/main/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfiguration.java index 3fc22ae8b..f1bc1ecd1 100644 --- a/embedded-mariadb/src/main/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfiguration.java +++ b/embedded-mariadb/src/main/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfiguration.java @@ -11,14 +11,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -36,29 +33,15 @@ public class EmbeddedMariaDBBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "mariadb") - ToxiproxyContainer.ContainerProxy mariadbContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_MARIADB) MariaDBContainer mariadbContainer, - MariaDBProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(mariadbContainer, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.mariadb.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.mariadb.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.mariadb.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMariadbToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started MariaDB ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy mariadbContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_MARIADB) MariaDBContainer mariadbContainer, + MariaDBProperties properties) { + return toxiproxyContainer.getProxy(mariadbContainer, properties.getPort()); } @Bean(name = BEAN_NAME_EMBEDDED_MARIADB, destroyMethod = "stop") - public MariaDBContainer mariadb(ConfigurableEnvironment environment, - MariaDBProperties properties, + public MariaDBContainer mariadb(MariaDBProperties properties, Optional network) throws Exception { - MariaDBContainer mariadb = new MariaDBContainer<>(ContainerUtils.getDockerImageName(properties)) .withEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes") @@ -74,32 +57,33 @@ public MariaDBContainer mariadb(ConfigurableEnvironment environment, .withNetworkAliases(MARIADB_NETWORK_ALIAS); network.ifPresent(mariadb::withNetwork); - mariadb = (MariaDBContainer) configureCommonsAndStart(mariadb, properties, log); - registerMariadbEnvironment(mariadb, environment, properties); return mariadb; } - private void registerMariadbEnvironment(MariaDBContainer mariadb, - ConfigurableEnvironment environment, - MariaDBProperties properties) { - Integer mappedPort = mariadb.getMappedPort(properties.getPort()); - String host = mariadb.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.mariadb.port", mappedPort); - map.put("embedded.mariadb.host", host); - map.put("embedded.mariadb.schema", properties.getDatabase()); - map.put("embedded.mariadb.user", properties.getUser()); - map.put("embedded.mariadb.password", properties.getPassword()); - map.put("embedded.mariadb.networkAlias", MARIADB_NETWORK_ALIAS); - map.put("embedded.mariadb.internalPort", properties.getPort()); - - String jdbcURL = "jdbc:mysql://{}:{}/{}"; - log.info("Started mariadb server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, properties.getDatabase()); + @Bean + public DynamicPropertyRegistrar mariadbDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_MARIADB) MariaDBContainer mariadb, + MariaDBProperties properties) { + return registry -> { + registry.add("embedded.mariadb.port", () -> mariadb.getMappedPort(properties.getPort())); + registry.add("embedded.mariadb.host", mariadb::getHost); + registry.add("embedded.mariadb.schema", properties::getDatabase); + registry.add("embedded.mariadb.user", properties::getUser); + registry.add("embedded.mariadb.password", properties::getPassword); + registry.add("embedded.mariadb.networkAlias", () -> MARIADB_NETWORK_ALIAS); + registry.add("embedded.mariadb.internalPort", properties::getPort); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedMariaInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "mariadb") + public DynamicPropertyRegistrar mariadbToxiProxyDynamicPropertyRegistrar( + @Qualifier("mariadbContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.mariadb.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.mariadb.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.mariadb.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java b/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java index 77ccd211c..4376df2af 100644 --- a/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java +++ b/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java @@ -84,6 +84,7 @@ public void shouldInitDBForMariaDB() throws Exception { @Test public void propertiesAreAvailable() { + //refactor to use value fields assertThat(environment.getProperty("embedded.mariadb.port")).isNotEmpty(); assertThat(environment.getProperty("embedded.mariadb.host")).isNotEmpty(); assertThat(environment.getProperty("embedded.mariadb.schema")).isNotEmpty(); diff --git a/embedded-memsql/src/main/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfiguration.java b/embedded-memsql/src/main/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfiguration.java index ffa452b7e..724135844 100644 --- a/embedded-memsql/src/main/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfiguration.java +++ b/embedded-memsql/src/main/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfiguration.java @@ -12,15 +12,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.utility.MountableFile; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -44,27 +41,26 @@ MemSqlStatusCheck memSqlStartupCheckStrategy(MemSqlProperties properties) { @Bean @ConditionalOnToxiProxyEnabled(module = "memsql") - ToxiproxyContainer.ContainerProxy memsqlContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy memsqlContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_MEMSQL) GenericContainer memsql, - MemSqlProperties properties, - ConfigurableEnvironment environment) { + MemSqlProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(memsql, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.memsql.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.memsql.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.memsql.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMemsqlToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Memsql ToxiProxy connection details {}", map); - + log.info("Started Memsql ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "memsql") + public DynamicPropertyRegistrar memsqlToxiProxyDynamicPropertyRegistrar(@Qualifier("memsqlContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.memsql.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.memsql.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.memsql.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_MEMSQL, destroyMethod = "stop") - public GenericContainer memsql(ConfigurableEnvironment environment, - MemSqlProperties properties, + public GenericContainer memsql(MemSqlProperties properties, MemSqlStatusCheck memSqlStatusCheck, Optional network) { GenericContainer memsql = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) @@ -83,28 +79,21 @@ public GenericContainer memsql(ConfigurableEnvironment environment, } network.ifPresent(memsql::withNetwork); memsql = configureCommonsAndStart(memsql, properties, log); - registerMemSqlEnvironment(memsql, environment, properties); return memsql; } - private void registerMemSqlEnvironment(GenericContainer memsql, - ConfigurableEnvironment environment, - MemSqlProperties properties) { - Integer mappedPort = memsql.getMappedPort(properties.port); - String host = memsql.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.memsql.port", mappedPort); - map.put("embedded.memsql.host", host); - map.put("embedded.memsql.schema", properties.getDatabase()); - map.put("embedded.memsql.user", properties.getUser()); - map.put("embedded.memsql.password", properties.getPassword()); - map.put("embedded.memsql.networkAlias", MEMSQL_NETWORK_ALIAS); - map.put("embedded.memsql.internalPort", properties.getPort()); - - log.info("Started memsql server. Connection details {} ", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedMemSqlInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar memsqlDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_MEMSQL) GenericContainer memsql, MemSqlProperties properties) { + return registry -> { + Integer mappedPort = memsql.getMappedPort(properties.port); + String host = memsql.getHost(); + registry.add("embedded.memsql.port", () -> mappedPort); + registry.add("embedded.memsql.host", () -> host); + registry.add("embedded.memsql.schema", properties::getDatabase); + registry.add("embedded.memsql.user", properties::getUser); + registry.add("embedded.memsql.password", properties::getPassword); + registry.add("embedded.memsql.networkAlias", () -> MEMSQL_NETWORK_ALIAS); + registry.add("embedded.memsql.internalPort", properties::getPort); + }; } } diff --git a/embedded-minio/pom.xml b/embedded-minio/pom.xml index 3f7ebcc71..a2bb4f6b6 100644 --- a/embedded-minio/pom.xml +++ b/embedded-minio/pom.xml @@ -34,6 +34,10 @@ ${minio.version} provided + + org.springframework + spring-test + diff --git a/embedded-minio/src/main/java/com/playtika/testcontainer/minio/EmbeddedMinioBootstrapConfiguration.java b/embedded-minio/src/main/java/com/playtika/testcontainer/minio/EmbeddedMinioBootstrapConfiguration.java index 88400f7c2..9630bf4cf 100644 --- a/embedded-minio/src/main/java/com/playtika/testcontainer/minio/EmbeddedMinioBootstrapConfiguration.java +++ b/embedded-minio/src/main/java/com/playtika/testcontainer/minio/EmbeddedMinioBootstrapConfiguration.java @@ -11,14 +11,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -47,30 +44,16 @@ public MinioWaitStrategy minioWaitStrategy(MinioProperties properties) { @Bean @ConditionalOnToxiProxyEnabled(module = "minio") - ToxiproxyContainer.ContainerProxy minioContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_MINIO) GenericContainer minio, - ConfigurableEnvironment environment, - MinioProperties properties) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(minio, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.minio.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.minio.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.minio.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMinioToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Minio ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy minioContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_MINIO) GenericContainer minio, + MinioProperties properties) { + return toxiproxyContainer.getProxy(minio, properties.getPort()); } @Bean(name = BEAN_NAME_EMBEDDED_MINIO, destroyMethod = "stop") public GenericContainer minio(MinioWaitStrategy minioWaitStrategy, - ConfigurableEnvironment environment, MinioProperties properties, Optional network) { - GenericContainer minio = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort(), properties.getConsolePort()) @@ -85,28 +68,35 @@ public GenericContainer minio(MinioWaitStrategy minioWaitStrategy, network.ifPresent(minio::withNetwork); minio = configureCommonsAndStart(minio, properties, log); - registerEnvironment(minio, environment, properties); return minio; } - private void registerEnvironment(GenericContainer container, - ConfigurableEnvironment environment, - MinioProperties properties) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.minio.host", container.getHost()); - map.put("embedded.minio.port", container.getMappedPort(properties.port)); - map.put("embedded.minio.consolePort", container.getMappedPort(properties.consolePort)); - map.put("embedded.minio.accessKey", properties.accessKey); - map.put("embedded.minio.secretKey", properties.secretKey); - map.put("embedded.minio.region", properties.region); - map.put("embedded.minio.networkAlias", MINIO_NETWORK_ALIAS); - map.put("embedded.minio.internalPort", properties.getPort()); - map.put("embedded.minio.internalConsolePort", properties.getConsolePort()); - - log.info("Started Minio server. Connection details: {}", map); + @Bean + public DynamicPropertyRegistrar minioDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_MINIO) GenericContainer minio, + MinioProperties properties) { + return registry -> { + registry.add("embedded.minio.host", minio::getHost); + registry.add("embedded.minio.port", () -> minio.getMappedPort(properties.port)); + registry.add("embedded.minio.consolePort", () -> minio.getMappedPort(properties.consolePort)); + registry.add("embedded.minio.accessKey", properties::getAccessKey); + registry.add("embedded.minio.secretKey", properties::getSecretKey); + registry.add("embedded.minio.region", properties::getRegion); + registry.add("embedded.minio.networkAlias", () -> MINIO_NETWORK_ALIAS); + registry.add("embedded.minio.internalPort", properties::getPort); + registry.add("embedded.minio.internalConsolePort", properties::getConsolePort); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedMinioInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "minio") + public DynamicPropertyRegistrar minioToxiProxyDynamicPropertyRegistrar( + @Qualifier("minioContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.minio.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.minio.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.minio.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-mockserver/pom.xml b/embedded-mockserver/pom.xml index 0be47bdee..41691156d 100644 --- a/embedded-mockserver/pom.xml +++ b/embedded-mockserver/pom.xml @@ -43,5 +43,9 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-mockserver/src/main/java/com/playtika/testcontainer/mockserver/EmbeddedMockServerBootstrapConfiguration.java b/embedded-mockserver/src/main/java/com/playtika/testcontainer/mockserver/EmbeddedMockServerBootstrapConfiguration.java index bf7531b29..e189fe535 100644 --- a/embedded-mockserver/src/main/java/com/playtika/testcontainer/mockserver/EmbeddedMockServerBootstrapConfiguration.java +++ b/embedded-mockserver/src/main/java/com/playtika/testcontainer/mockserver/EmbeddedMockServerBootstrapConfiguration.java @@ -9,12 +9,10 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.MockServerContainer; import org.testcontainers.containers.Network; -import java.util.LinkedHashMap; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -31,8 +29,7 @@ public class EmbeddedMockServerBootstrapConfiguration { private static final String MOCKSERVER_NETWORK_ALIAS = "mockserver.testcontainer.docker"; @Bean(name = EMBEDDED_MOCK_SERVER, destroyMethod = "stop") - public MockServerContainer mockServerContainer(ConfigurableEnvironment environment, - MockServerProperties properties, + public MockServerContainer mockServerContainer(MockServerProperties properties, Optional network) { MockServerContainer mockServerContainer = new MockServerContainer(ContainerUtils.getDockerImageName(properties)); mockServerContainer @@ -42,25 +39,21 @@ public MockServerContainer mockServerContainer(ConfigurableEnvironment environme network.ifPresent(mockServerContainer::withNetwork); mockServerContainer = (MockServerContainer) configureCommonsAndStart(mockServerContainer, properties, log); - registerMockServerEnvironment(mockServerContainer, properties, environment); + log.info("Started MockServer server. Connection details: host={}, port={}, networkAlias={}, internalPort={}", + mockServerContainer.getHost(), + mockServerContainer.getMappedPort(properties.getPort()), + MOCKSERVER_NETWORK_ALIAS, + properties.getPort()); return mockServerContainer; } - private void registerMockServerEnvironment(MockServerContainer mockServerContainer, - MockServerProperties properties, - ConfigurableEnvironment environment) { - int mappedPort = mockServerContainer.getMappedPort(properties.getPort()); - String host = mockServerContainer.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.mockserver.host", host); - map.put("embedded.mockserver.port", mappedPort); - map.put("embedded.mockserver.networkAlias", MOCKSERVER_NETWORK_ALIAS); - map.put("embedded.mockserver.internalPort", properties.getPort()); - - log.info("Started MockServer server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedMockServerInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar mockServerDynamicPropertyRegistrar(MockServerContainer mockServerContainer, MockServerProperties properties) { + return registry -> { + registry.add("embedded.mockserver.host", mockServerContainer::getHost); + registry.add("embedded.mockserver.port", () -> mockServerContainer.getMappedPort(properties.getPort())); + registry.add("embedded.mockserver.networkAlias", () -> MOCKSERVER_NETWORK_ALIAS); + registry.add("embedded.mockserver.internalPort", properties::getPort); + }; } } diff --git a/embedded-mongodb/pom.xml b/embedded-mongodb/pom.xml index 254eb23ae..f114be531 100644 --- a/embedded-mongodb/pom.xml +++ b/embedded-mongodb/pom.xml @@ -34,5 +34,9 @@ mongodb-driver-sync true + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-mongodb/src/main/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfiguration.java b/embedded-mongodb/src/main/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfiguration.java index b3f5a34f7..e2dc95dcc 100644 --- a/embedded-mongodb/src/main/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfiguration.java +++ b/embedded-mongodb/src/main/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfiguration.java @@ -12,15 +12,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -41,27 +38,14 @@ public class EmbeddedMongodbBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "mongodb") - ToxiproxyContainer.ContainerProxy mongodbContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_MONGODB) GenericContainer mongodb, - MongodbProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(mongodb, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.mongodb.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.mongodb.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.mongodb.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMongodbToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Mongodb ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy mongodbContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_MONGODB) GenericContainer mongodb, + MongodbProperties properties) { + return toxiproxyContainer.getProxy(mongodb, properties.getPort()); } @Bean(value = BEAN_NAME_EMBEDDED_MONGODB, destroyMethod = "stop") - public GenericContainer mongodb(ConfigurableEnvironment environment, - MongodbProperties properties, + public GenericContainer mongodb(MongodbProperties properties, MongodbStatusCheck mongodbStatusCheck, Optional network) { GenericContainer mongodb = @@ -76,32 +60,38 @@ public GenericContainer mongodb(ConfigurableEnvironment environment, network.ifPresent(mongodb::withNetwork); mongodb = configureCommonsAndStart(mongodb, properties, log); - registerMongodbEnvironment(mongodb, environment, properties); return mongodb; } @Bean - @ConditionalOnMissingBean - MongodbStatusCheck mongodbStartupCheckStrategy(MongodbProperties properties) { - return new MongodbStatusCheck(properties); + public DynamicPropertyRegistrar mongodbDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_MONGODB) GenericContainer mongodb, + MongodbProperties properties) { + return registry -> { + registry.add("embedded.mongodb.port", () -> mongodb.getMappedPort(properties.getPort())); + registry.add("embedded.mongodb.host", mongodb::getHost); + registry.add("embedded.mongodb.username", properties::getUsername); + registry.add("embedded.mongodb.password", properties::getPassword); + registry.add("embedded.mongodb.database", properties::getDatabase); + registry.add("embedded.mongodb.networkAlias", () -> MONGODB_NETWORK_ALIAS); + registry.add("embedded.mongodb.internalPort", properties::getPort); + }; } - private void registerMongodbEnvironment(GenericContainer mongodb, ConfigurableEnvironment environment, MongodbProperties properties) { - Integer mappedPort = mongodb.getMappedPort(properties.getPort()); - String host = mongodb.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.mongodb.port", mappedPort); - map.put("embedded.mongodb.host", host); - map.compute("embedded.mongodb.username", (k, v) -> properties.getUsername()); - map.compute("embedded.mongodb.password", (k, v) -> properties.getPassword()); - map.put("embedded.mongodb.database", properties.getDatabase()); - map.put("embedded.mongodb.networkAlias", MONGODB_NETWORK_ALIAS); - map.put("embedded.mongodb.internalPort", properties.getPort()); - - log.info("Started mongodb. Connection Details: {}, Connection URI: mongodb://{}:{}/{}", map, host, mappedPort, properties.getDatabase()); + @Bean + @ConditionalOnToxiProxyEnabled(module = "mongodb") + public DynamicPropertyRegistrar mongodbToxiProxyDynamicPropertyRegistrar( + @Qualifier("mongodbContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.mongodb.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.mongodb.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.mongodb.toxiproxy.proxyName", proxy::getName); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedMongoInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnMissingBean + MongodbStatusCheck mongodbStartupCheckStrategy(MongodbProperties properties) { + return new MongodbStatusCheck(properties); } } diff --git a/embedded-mssqlserver/pom.xml b/embedded-mssqlserver/pom.xml index 3c9c7013d..45d0183a7 100644 --- a/embedded-mssqlserver/pom.xml +++ b/embedded-mssqlserver/pom.xml @@ -47,6 +47,10 @@ ${mssql-jdbc.version} test + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java b/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java index 399b929a8..c7d88ec8b 100644 --- a/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java +++ b/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java @@ -11,17 +11,10 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; -import org.springframework.util.StringUtils; -import org.testcontainers.containers.MSSQLServerContainer; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; -import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -35,78 +28,44 @@ @EnableConfigurationProperties(MSSQLServerProperties.class) public class EmbeddedMSSQLServerBootstrapConfiguration { - private static final String MSSQLSERVER_NETWORK_ALIAS = "mssqlserver.testcontainer.docker"; - @Bean @ConditionalOnToxiProxyEnabled(module = "mssqlserver") - ToxiproxyContainer.ContainerProxy mssqlserverContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_MSSQLSERVER) EmbeddedMSSQLServerContainer mssqlserver, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(mssqlserver, MSSQLServerContainer.MS_SQL_SERVER_PORT); - - Map map = new LinkedHashMap<>(); - map.put("embedded.mssqlserver.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.mssqlserver.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.mssqlserver.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMSSQLServerToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started MSSQLServer ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy mssqlServerContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_MSSQLSERVER) EmbeddedMSSQLServerContainer mssqlServer) { + return toxiproxyContainer.getProxy(mssqlServer, 1433); } @Bean(name = BEAN_NAME_EMBEDDED_MSSQLSERVER, destroyMethod = "stop") - public EmbeddedMSSQLServerContainer mssqlserver(ConfigurableEnvironment environment, - MSSQLServerProperties properties, + public EmbeddedMSSQLServerContainer mssqlServer(MSSQLServerProperties properties, Optional network) { - EmbeddedMSSQLServerContainer mssqlServerContainer = new EmbeddedMSSQLServerContainer(ContainerUtils.getDockerImageName(properties)) - .withPassword(properties.getPassword()) - .withInitScript(properties.getInitScriptPath()) - .withNetworkAliases(MSSQLSERVER_NETWORK_ALIAS); - + .withNetworkAliases("mssqlserver.testcontainer.docker"); network.ifPresent(mssqlServerContainer::withNetwork); - - String startupLogCheckRegex = properties.getStartupLogCheckRegex(); - if (StringUtils.hasLength(startupLogCheckRegex)) { - WaitStrategy waitStrategy = new LogMessageWaitStrategy() - .withRegEx(startupLogCheckRegex); - mssqlServerContainer.waitingFor(waitStrategy); - } - - if (properties.isAcceptLicence()) { - mssqlServerContainer.acceptLicense(); - } - - mssqlServerContainer = (EmbeddedMSSQLServerContainer) configureCommonsAndStart(mssqlServerContainer, properties, log); - registerMSSQLServerEnvironment(mssqlServerContainer, environment, properties); - + configureCommonsAndStart(mssqlServerContainer, properties, log); return mssqlServerContainer; } - private void registerMSSQLServerEnvironment(MSSQLServerContainer mssqlServerContainer, - ConfigurableEnvironment environment, - MSSQLServerProperties properties) { - Integer mappedPort = mssqlServerContainer.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT); - String host = mssqlServerContainer.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.mssqlserver.port", mappedPort); - map.put("embedded.mssqlserver.host", host); - // Database and user cannot be chosen when starting the MSSQL image - map.put("embedded.mssqlserver.database", "master"); - map.put("embedded.mssqlserver.user", "sa"); - map.put("embedded.mssqlserver.password", properties.getPassword()); - map.put("embedded.mssqlserver.networkAlias", MSSQLSERVER_NETWORK_ALIAS); - map.put("embedded.mssqlserver.internalPort", MSSQLServerContainer.MS_SQL_SERVER_PORT); - - String jdbcURL = "jdbc:sqlserver://{}:{};databaseName={};trustServerCertificate=true"; - log.info("Started mssql server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, "master"); + @Bean + public DynamicPropertyRegistrar mssqlServerDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_MSSQLSERVER) EmbeddedMSSQLServerContainer mssqlServer, + MSSQLServerProperties properties) { + return registry -> { + registry.add("embedded.mssqlserver.host", mssqlServer::getHost); + registry.add("embedded.mssqlserver.port", () -> mssqlServer.getMappedPort(1433)); + registry.add("embedded.mssqlserver.networkAlias", () -> "mssqlserver.testcontainer.docker"); + registry.add("embedded.mssqlserver.internalPort", () -> 1433); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedMSSQLServerInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "mssqlserver") + public DynamicPropertyRegistrar mssqlServerToxiProxyDynamicPropertyRegistrar( + @Qualifier("mssqlServerContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.mssqlserver.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.mssqlserver.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.mssqlserver.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-mysql/pom.xml b/embedded-mysql/pom.xml index 0c28642ac..4c5925f4c 100644 --- a/embedded-mysql/pom.xml +++ b/embedded-mysql/pom.xml @@ -47,5 +47,9 @@ tomcat-jdbc test + + org.springframework + spring-test + diff --git a/embedded-mysql/src/main/java/com/playtika/testcontainer/mysql/EmbeddedMySQLBootstrapConfiguration.java b/embedded-mysql/src/main/java/com/playtika/testcontainer/mysql/EmbeddedMySQLBootstrapConfiguration.java index 3e661d4dc..c913994e9 100644 --- a/embedded-mysql/src/main/java/com/playtika/testcontainer/mysql/EmbeddedMySQLBootstrapConfiguration.java +++ b/embedded-mysql/src/main/java/com/playtika/testcontainer/mysql/EmbeddedMySQLBootstrapConfiguration.java @@ -12,13 +12,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -38,20 +36,9 @@ public class EmbeddedMySQLBootstrapConfiguration { @ConditionalOnToxiProxyEnabled(module = "mysql") ToxiproxyContainer.ContainerProxy mysqlContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_MYSQL) MySQLContainer mysql, - MySQLProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(mysql, properties.getPort()); + MySQLProperties properties) { - Map map = new LinkedHashMap<>(); - map.put("embedded.mysql.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.mysql.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.mysql.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedMysqlToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Mysql ToxiProxy connection details {}", map); - - return proxy; + return toxiproxyContainer.getProxy(mysql, properties.getPort()); } @Bean(name = BEAN_NAME_EMBEDDED_MYSQL, destroyMethod = "stop") @@ -73,30 +60,33 @@ public MySQLContainer mysql(ConfigurableEnvironment environment, network.ifPresent(mysql::withNetwork); mysql = (MySQLContainer) configureCommonsAndStart(mysql, properties, log); - registerMySQLEnvironment(mysql, environment, properties); return mysql; } - private void registerMySQLEnvironment(MySQLContainer mysql, - ConfigurableEnvironment environment, - MySQLProperties properties) { - Integer mappedPort = mysql.getMappedPort(properties.getPort()); - String host = mysql.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.mysql.port", mappedPort); - map.put("embedded.mysql.host", host); - map.put("embedded.mysql.schema", properties.getDatabase()); - map.put("embedded.mysql.user", properties.getUser()); - map.put("embedded.mysql.password", properties.getPassword()); - map.put("embedded.mysql.networkAlias", MYSQL_NETWORK_ALIAS); - map.put("embedded.mysql.internalPort", properties.getPort()); - - String jdbcURL = "jdbc:mysql://{}:{}/{}"; - log.info("Started mysql server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, properties.getDatabase()); + @Bean + public DynamicPropertyRegistrar mysqlDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_MYSQL) MySQLContainer mysql, + MySQLProperties properties) { + return registry -> { + registry.add("embedded.mysql.port", () -> mysql.getMappedPort(properties.getPort())); + registry.add("embedded.mysql.host", mysql::getHost); + registry.add("embedded.mysql.schema", properties::getDatabase); + registry.add("embedded.mysql.user", properties::getUser); + registry.add("embedded.mysql.password", properties::getPassword); + registry.add("embedded.mysql.networkAlias", () -> MYSQL_NETWORK_ALIAS); + registry.add("embedded.mysql.internalPort", properties::getPort); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedMySQLInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "mysql") + public DynamicPropertyRegistrar mysqlToxiProxyDynamicPropertyRegistrar( + MySQLProperties properties, + @Qualifier("mysqlContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.mysql.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.mysql.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.mysql.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-nats/pom.xml b/embedded-nats/pom.xml index ace23fe2a..62d54eaa1 100644 --- a/embedded-nats/pom.xml +++ b/embedded-nats/pom.xml @@ -31,5 +31,9 @@ jnats ${jnats.version} + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-nats/src/main/java/com/playtika/testcontainer/nats/EmbeddedNatsBootstrapConfiguration.java b/embedded-nats/src/main/java/com/playtika/testcontainer/nats/EmbeddedNatsBootstrapConfiguration.java index b2c29355b..fbafdccea 100644 --- a/embedded-nats/src/main/java/com/playtika/testcontainer/nats/EmbeddedNatsBootstrapConfiguration.java +++ b/embedded-nats/src/main/java/com/playtika/testcontainer/nats/EmbeddedNatsBootstrapConfiguration.java @@ -12,8 +12,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; @@ -22,8 +21,6 @@ import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.utility.MountableFile; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -42,27 +39,26 @@ public class EmbeddedNatsBootstrapConfiguration { @Bean(name = BEAN_NAME_EMBEDDED_NATS_TOXI_PROXY) @ConditionalOnToxiProxyEnabled(module = "nats") - ToxiproxyContainer.ContainerProxy natsContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_NATS) GenericContainer natsContainer, - NatsProperties properties, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy natsContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_NATS) GenericContainer natsContainer, + NatsProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(natsContainer, properties.getClientPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.nats.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.nats.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.nats.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedNatsToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started NATS ToxiProxy connection details {}", map); - + log.info("Started NATS ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "nats") + public DynamicPropertyRegistrar natsToxiProxyDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_NATS_TOXI_PROXY) ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.nats.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.nats.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.nats.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_NATS, destroyMethod = "stop") - public GenericContainer natsContainer(ConfigurableEnvironment environment, - NatsProperties properties, + public GenericContainer natsContainer(NatsProperties properties, Optional network) { WaitStrategy waitStrategy = new WaitAllStrategy() .withStrategy(new HostPortWaitStrategy()) @@ -78,32 +74,26 @@ public GenericContainer natsContainer(ConfigurableEnvironment environment, natsContainer = configureCommonsAndStart(natsContainer, properties, log); - registerNatsEnvironment(natsContainer, environment, properties); - return natsContainer; - } - - private void registerNatsEnvironment(GenericContainer natsContainer, - ConfigurableEnvironment environment, - NatsProperties properties) { Integer clientMappedPort = natsContainer.getMappedPort(properties.getClientPort()); Integer httpMonitorMappedPort = natsContainer.getMappedPort(properties.getHttpMonitorPort()); Integer routeConnectionsMappedPort = natsContainer.getMappedPort(properties.getRouteConnectionsPort()); String host = natsContainer.getHost(); + log.info("Started NATS server. Connection details host={}, port={}, httpMonitorPort={}, routeConnectionsPort={}, networkAlias={}, internalClientPort={}, internalHttpMonitorPort={}, internalRouteConnectionsPort={}", + host, clientMappedPort, httpMonitorMappedPort, routeConnectionsMappedPort, NATS_NETWORK_ALIAS, properties.getClientPort(), properties.getHttpMonitorPort(), properties.getRouteConnectionsPort()); + return natsContainer; + } - LinkedHashMap map = new LinkedHashMap<>(); - - map.put("embedded.nats.host", host); - map.put("embedded.nats.port", clientMappedPort); - map.put("embedded.nats.httpMonitorPort", httpMonitorMappedPort); - map.put("embedded.nats.routeConnectionsPort", routeConnectionsMappedPort); - map.put("embedded.nats.networkAlias", NATS_NETWORK_ALIAS); - map.put("embedded.nats.internalClientPort", properties.getClientPort()); - map.put("embedded.nats.internalHttpMonitorPort", properties.getHttpMonitorPort()); - map.put("embedded.nats.internalRouteConnectionsPort", properties.getRouteConnectionsPort()); - - log.info("Started NATS server. Connection details {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedNatsInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar natsDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_NATS) GenericContainer natsContainer, NatsProperties properties) { + return registry -> { + registry.add("embedded.nats.host", natsContainer::getHost); + registry.add("embedded.nats.port", () -> natsContainer.getMappedPort(properties.getClientPort())); + registry.add("embedded.nats.httpMonitorPort", () -> natsContainer.getMappedPort(properties.getHttpMonitorPort())); + registry.add("embedded.nats.routeConnectionsPort", () -> natsContainer.getMappedPort(properties.getRouteConnectionsPort())); + registry.add("embedded.nats.networkAlias", () -> NATS_NETWORK_ALIAS); + registry.add("embedded.nats.internalClientPort", properties::getClientPort); + registry.add("embedded.nats.internalHttpMonitorPort", properties::getHttpMonitorPort); + registry.add("embedded.nats.internalRouteConnectionsPort", properties::getRouteConnectionsPort); + }; } } diff --git a/embedded-neo4j/src/main/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4jBootstrapConfiguration.java b/embedded-neo4j/src/main/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4jBootstrapConfiguration.java index 038a51be9..7bbe75f7e 100644 --- a/embedded-neo4j/src/main/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4jBootstrapConfiguration.java +++ b/embedded-neo4j/src/main/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4jBootstrapConfiguration.java @@ -11,14 +11,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Neo4jContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -36,64 +33,52 @@ public class EmbeddedNeo4jBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "neo4j") - ToxiproxyContainer.ContainerProxy neo4jContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy neo4jContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_NEO4J) Neo4jContainer neo4j, - Neo4jProperties properties, - ConfigurableEnvironment environment) { - + Neo4jProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(neo4j, properties.getBoltPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.neo4j.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.neo4j.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.neo4j.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedNeo4jToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Neo4j ToxiProxy connection details {}", map); - + log.info("Started Neo4j ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "neo4j") + public DynamicPropertyRegistrar neo4jToxiProxyDynamicPropertyRegistrar(@Qualifier("neo4jContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.neo4j.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.neo4j.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.neo4j.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_NEO4J, destroyMethod = "stop") - public Neo4jContainer neo4j(ConfigurableEnvironment environment, - Neo4jProperties properties, - Optional network) { + public Neo4jContainer neo4j(Neo4jProperties properties, Optional network) { Neo4jContainer neo4j = new Neo4jContainer<>(ContainerUtils.getDockerImageName(properties)) .withAdminPassword(properties.password) .withNetworkAliases(NEO4J_NETWORK_ALIAS); network.ifPresent(neo4j::withNetwork); neo4j = (Neo4jContainer) configureCommonsAndStart(neo4j, properties, log); - registerNeo4jEnvironment(neo4j, environment, properties); return neo4j; } - private void registerNeo4jEnvironment(Neo4jContainer neo4j, - ConfigurableEnvironment environment, - Neo4jProperties properties) { - Integer httpsPort = neo4j.getMappedPort(properties.httpsPort); - Integer httpPort = neo4j.getMappedPort(properties.httpPort); - Integer boltPort = neo4j.getMappedPort(properties.boltPort); - String host = neo4j.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.neo4j.httpsPort", httpsPort); - map.put("embedded.neo4j.httpPort", httpPort); - map.put("embedded.neo4j.boltPort", boltPort); - map.put("embedded.neo4j.host", host); - map.put("embedded.neo4j.password", properties.getPassword()); - map.put("embedded.neo4j.user", properties.getUser()); - map.put("embedded.neo4j.networkAlias", NEO4J_NETWORK_ALIAS); - map.put("embedded.neo4j.internalHttpsPort", properties.getHttpsPort()); - map.put("embedded.neo4j.internalHttpPort", properties.getHttpPort()); - map.put("embedded.neo4j.internalBoltPort", properties.getBoltPort()); - - log.info("Started neo4j server. Connection details {}, " + - "Admin UI: http://localhost:{}, user: {}, password: {}", - map, httpPort, properties.getUser(), properties.getPassword()); - - MapPropertySource propertySource = new MapPropertySource("embeddedNeo4jInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar neo4jDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_NEO4J) Neo4jContainer neo4j, Neo4jProperties properties) { + return registry -> { + Integer httpsPort = neo4j.getMappedPort(properties.httpsPort); + Integer httpPort = neo4j.getMappedPort(properties.httpPort); + Integer boltPort = neo4j.getMappedPort(properties.boltPort); + String host = neo4j.getHost(); + registry.add("embedded.neo4j.httpsPort", () -> httpsPort); + registry.add("embedded.neo4j.httpPort", () -> httpPort); + registry.add("embedded.neo4j.boltPort", () -> boltPort); + registry.add("embedded.neo4j.host", () -> host); + registry.add("embedded.neo4j.password", properties::getPassword); + registry.add("embedded.neo4j.user", properties::getUser); + registry.add("embedded.neo4j.networkAlias", () -> NEO4J_NETWORK_ALIAS); + registry.add("embedded.neo4j.internalHttpsPort", properties::getHttpsPort); + registry.add("embedded.neo4j.internalHttpPort", properties::getHttpPort); + registry.add("embedded.neo4j.internalBoltPort", properties::getBoltPort); + }; } } diff --git a/embedded-opensearch/pom.xml b/embedded-opensearch/pom.xml index bc6872d97..7f09afa44 100644 --- a/embedded-opensearch/pom.xml +++ b/embedded-opensearch/pom.xml @@ -48,5 +48,9 @@ + + org.springframework + spring-test + diff --git a/embedded-opensearch/src/main/java/com/playtika/testcontainer/opensearch/EmbeddedOpenSearchBootstrapConfiguration.java b/embedded-opensearch/src/main/java/com/playtika/testcontainer/opensearch/EmbeddedOpenSearchBootstrapConfiguration.java index 7ad591098..50bfa0d70 100644 --- a/embedded-opensearch/src/main/java/com/playtika/testcontainer/opensearch/EmbeddedOpenSearchBootstrapConfiguration.java +++ b/embedded-opensearch/src/main/java/com/playtika/testcontainer/opensearch/EmbeddedOpenSearchBootstrapConfiguration.java @@ -12,14 +12,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -37,57 +34,44 @@ public class EmbeddedOpenSearchBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "opensearch") - ToxiproxyContainer.ContainerProxy opensearchContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_OPEN_SEARCH) OpensearchContainer opensearch, - OpenSearchProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(opensearch, properties.getHttpPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.opensearch.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.opensearch.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.opensearch.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedOpenSearchToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started OpenSearch ToxiProxy connection details {}", map); - - return proxy; + public DynamicPropertyRegistrar opensearchToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_OPEN_SEARCH) OpensearchContainer opensearch, + OpenSearchProperties properties) { + return registry -> { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(opensearch, properties.getHttpPort()); + registry.add("embedded.opensearch.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.opensearch.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.opensearch.toxiproxy.proxyName", proxy::getName); + log.info("Started OpenSearch ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); + }; } @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_OPEN_SEARCH) @Bean(name = BEAN_NAME_EMBEDDED_OPEN_SEARCH, destroyMethod = "stop") - public GenericContainer openSearch(ConfigurableEnvironment environment, - OpenSearchProperties properties, - Optional network) { - + public GenericContainer openSearch(OpenSearchProperties properties, + Optional network) { GenericContainer openSearch = OpenSearchContainerFactory.create(properties) .withNetworkAliases(OPENSEARCH_NETWORK_ALIAS); network.ifPresent(openSearch::withNetwork); openSearch = configureCommonsAndStart(openSearch, properties, log); - registerOpenSearchEnvironment(openSearch, environment, properties); - return openSearch; - } - - private void registerOpenSearchEnvironment(GenericContainer openSearch, - ConfigurableEnvironment environment, - OpenSearchProperties properties) { Integer httpPort = openSearch.getMappedPort(properties.getHttpPort()); Integer transportPort = openSearch.getMappedPort(properties.getTransportPort()); String host = openSearch.getHost(); + log.info("Started OpenSearch server. Connection details: clusterName={}, host={}, httpPort={}, transportPort={}, networkAlias={}, internalHttpPort={}, internalTransportPort={}", + properties.getClusterName(), host, httpPort, transportPort, OPENSEARCH_NETWORK_ALIAS, properties.getHttpPort(), properties.getTransportPort()); + return openSearch; + } - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.opensearch.clusterName", properties.getClusterName()); - map.put("embedded.opensearch.host", host); - map.put("embedded.opensearch.httpPort", httpPort); - map.put("embedded.opensearch.transportPort", transportPort); - map.put("embedded.opensearch.networkAlias", OPENSEARCH_NETWORK_ALIAS); - map.put("embedded.opensearch.internalHttpPort", properties.getHttpPort()); - map.put("embedded.opensearch.internalTransportPort", properties.getTransportPort()); - - log.info("Started OpenSearch server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedOpenSearchInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar opensearchDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_OPEN_SEARCH) GenericContainer openSearch, OpenSearchProperties properties) { + return registry -> { + registry.add("embedded.opensearch.clusterName", properties::getClusterName); + registry.add("embedded.opensearch.host", openSearch::getHost); + registry.add("embedded.opensearch.httpPort", () -> openSearch.getMappedPort(properties.getHttpPort())); + registry.add("embedded.opensearch.transportPort", () -> openSearch.getMappedPort(properties.getTransportPort())); + registry.add("embedded.opensearch.networkAlias", () -> OPENSEARCH_NETWORK_ALIAS); + registry.add("embedded.opensearch.internalHttpPort", properties::getHttpPort); + registry.add("embedded.opensearch.internalTransportPort", properties::getTransportPort); + }; } } diff --git a/embedded-oracle-xe/src/main/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfiguration.java b/embedded-oracle-xe/src/main/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfiguration.java index 0be82bee4..b1a7c8c7d 100644 --- a/embedded-oracle-xe/src/main/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfiguration.java +++ b/embedded-oracle-xe/src/main/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfiguration.java @@ -11,19 +11,15 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.OracleContainer; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; import static com.playtika.testcontainer.oracle.OracleProperties.BEAN_NAME_EMBEDDED_ORACLE; -import static com.playtika.testcontainer.oracle.OracleProperties.ORACLE_DB; import static com.playtika.testcontainer.oracle.OracleProperties.ORACLE_PORT; @Slf4j @@ -38,28 +34,25 @@ public class EmbeddedOracleBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "oracle") - ToxiproxyContainer.ContainerProxy oracleContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_ORACLE) OracleContainer oracle, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy oracleContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_ORACLE) OracleContainer oracle) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(oracle, ORACLE_PORT); - - Map map = new LinkedHashMap<>(); - map.put("embedded.oracle.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.oracle.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.oracle.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedOracleToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Oracle ToxiProxy connection details {}", map); - + log.info("Started Oracle ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } - @Bean(name = BEAN_NAME_EMBEDDED_ORACLE, destroyMethod = "stop") - public OracleContainer oracle(ConfigurableEnvironment environment, - OracleProperties properties, - Optional network) { + @Bean + @ConditionalOnToxiProxyEnabled(module = "oracle") + public DynamicPropertyRegistrar oracleToxiProxyDynamicPropertyRegistrar(@Qualifier("oracleContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.oracle.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.oracle.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.oracle.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_ORACLE, destroyMethod = "stop") + public OracleContainer oracle(OracleProperties properties, Optional network) { OracleContainer oracle = new OracleContainer(ContainerUtils.getDockerImageName(properties)) .withUsername(properties.getUser()) @@ -69,30 +62,21 @@ public OracleContainer oracle(ConfigurableEnvironment environment, network.ifPresent(oracle::withNetwork); oracle = (OracleContainer) configureCommonsAndStart(oracle, properties, log); - registerOracleEnvironment(oracle, environment, properties); return oracle; } - private void registerOracleEnvironment(OracleContainer oracle, - ConfigurableEnvironment environment, - OracleProperties properties) { - Integer mappedPort = oracle.getMappedPort(ORACLE_PORT); - String host = oracle.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.oracle.port", mappedPort); - map.put("embedded.oracle.host", host); - map.put("embedded.oracle.database", properties.getDatabase()); - map.put("embedded.oracle.user", properties.getUser()); - map.put("embedded.oracle.password", properties.getPassword()); - map.put("embedded.oracle.networkAlias", ORACLE_NETWORK_ALIAS); - map.put("embedded.oracle.internalPort", ORACLE_PORT); - - String jdbcURL = "jdbc:oracle://{}:{}/{}"; - log.info("Started oracle server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, ORACLE_DB); - - MapPropertySource propertySource = new MapPropertySource("embeddedOracleInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar oracleDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_ORACLE) OracleContainer oracle, OracleProperties properties) { + return registry -> { + Integer mappedPort = oracle.getMappedPort(ORACLE_PORT); + String host = oracle.getHost(); + registry.add("embedded.oracle.port", () -> mappedPort); + registry.add("embedded.oracle.host", () -> host); + registry.add("embedded.oracle.database", properties::getDatabase); + registry.add("embedded.oracle.user", properties::getUser); + registry.add("embedded.oracle.password", properties::getPassword); + registry.add("embedded.oracle.networkAlias", () -> ORACLE_NETWORK_ALIAS); + registry.add("embedded.oracle.internalPort", () -> ORACLE_PORT); + }; } } diff --git a/embedded-postgresql/pom.xml b/embedded-postgresql/pom.xml index bbed35e40..f9a5d2945 100644 --- a/embedded-postgresql/pom.xml +++ b/embedded-postgresql/pom.xml @@ -46,6 +46,10 @@ tomcat-jdbc test + + org.springframework + spring-test + diff --git a/embedded-postgresql/src/main/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfiguration.java b/embedded-postgresql/src/main/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfiguration.java index 8d46673e9..60fcc6252 100644 --- a/embedded-postgresql/src/main/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfiguration.java +++ b/embedded-postgresql/src/main/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfiguration.java @@ -11,8 +11,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.springframework.util.StringUtils; import org.testcontainers.containers.Network; import org.testcontainers.containers.PostgreSQLContainer; @@ -20,8 +19,6 @@ import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -39,28 +36,26 @@ public class EmbeddedPostgreSQLBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "postgresql") - ToxiproxyContainer.ContainerProxy postgresqlContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_POSTGRESQL) PostgreSQLContainer postgresql, - ConfigurableEnvironment environment) { + public ToxiproxyContainer.ContainerProxy postgresqlContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_POSTGRESQL) PostgreSQLContainer postgresql) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(postgresql, PostgreSQLContainer.POSTGRESQL_PORT); - - Map map = new LinkedHashMap<>(); - map.put("embedded.postgresql.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.postgresql.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.postgresql.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedPostgresqlToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Postgresql ToxiProxy connection details {}", map); - + log.info("Started Postgresql ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "postgresql") + public DynamicPropertyRegistrar postgresqlToxiProxyDynamicPropertyRegistrar(@Qualifier("postgresqlContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.postgresql.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.postgresql.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.postgresql.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_POSTGRESQL, destroyMethod = "stop") - public PostgreSQLContainer postgresql(ConfigurableEnvironment environment, - PostgreSQLProperties properties, + public PostgreSQLContainer postgresql(PostgreSQLProperties properties, Optional network) { - PostgreSQLContainer postgresql = new PostgreSQLContainer<>(ContainerUtils.getDockerImageName(properties)) .withUsername(properties.getUser()) @@ -68,42 +63,33 @@ public PostgreSQLContainer postgresql(ConfigurableEnvironment environment, .withDatabaseName(properties.getDatabase()) .withInitScript(properties.initScriptPath) .withNetworkAliases(POSTGRESQL_NETWORK_ALIAS); - network.ifPresent(postgresql::withNetwork); - String startupLogCheckRegex = properties.getStartupLogCheckRegex(); if (StringUtils.hasLength(startupLogCheckRegex)) { WaitStrategy waitStrategy = new LogMessageWaitStrategy() .withRegEx(startupLogCheckRegex); postgresql.waitingFor(waitStrategy); } - postgresql = (PostgreSQLContainer) configureCommonsAndStart(postgresql, properties, log); - registerPostgresqlEnvironment(postgresql, environment, properties); - return postgresql; - } - - private void registerPostgresqlEnvironment(PostgreSQLContainer postgresql, - ConfigurableEnvironment environment, - PostgreSQLProperties properties) { Integer mappedPort = postgresql.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT); String host = postgresql.getHost(); + String jdbcURL = "jdbc:postgresql://" + host + ":" + mappedPort + "/" + properties.getDatabase(); + log.info("Started postgresql server. Connection details: host={}, port={}, schema={}, user={}, password={}, networkAlias={}, internalPort={}, JDBC connection url: {}", + host, mappedPort, properties.getDatabase(), properties.getUser(), properties.getPassword(), POSTGRESQL_NETWORK_ALIAS, PostgreSQLContainer.POSTGRESQL_PORT, jdbcURL); + return postgresql; + } - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.postgresql.port", mappedPort); - map.put("embedded.postgresql.host", host); - map.put("embedded.postgresql.schema", properties.getDatabase()); - map.put("embedded.postgresql.user", properties.getUser()); - map.put("embedded.postgresql.password", properties.getPassword()); - map.put("embedded.postgresql.networkAlias", POSTGRESQL_NETWORK_ALIAS); - map.put("embedded.postgresql.internalPort", PostgreSQLContainer.POSTGRESQL_PORT); - - String jdbcURL = "jdbc:postgresql://{}:{}/{}"; - log.info("Started postgresql server. Connection details: {}, " + - "JDBC connection url: " + jdbcURL, map, host, mappedPort, properties.getDatabase()); - - MapPropertySource propertySource = new MapPropertySource("embeddedPostgreInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar postgresqlDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_POSTGRESQL) PostgreSQLContainer postgresql, PostgreSQLProperties properties) { + return registry -> { + registry.add("embedded.postgresql.port", () -> postgresql.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT)); + registry.add("embedded.postgresql.host", postgresql::getHost); + registry.add("embedded.postgresql.schema", properties::getDatabase); + registry.add("embedded.postgresql.user", properties::getUser); + registry.add("embedded.postgresql.password", properties::getPassword); + registry.add("embedded.postgresql.networkAlias", () -> POSTGRESQL_NETWORK_ALIAS); + registry.add("embedded.postgresql.internalPort", () -> PostgreSQLContainer.POSTGRESQL_PORT); + }; } } diff --git a/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java b/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java index 88152bf3a..ab3af8c62 100644 --- a/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java +++ b/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java @@ -87,6 +87,7 @@ public void shouldEmulateLatency() throws Exception { @Test void propertiesAreAvailable() { + //refactor to use value fields assertThat(environment.getProperty("embedded.postgresql.port")).isNotEmpty(); assertThat(environment.getProperty("embedded.postgresql.host")).isNotEmpty(); assertThat(environment.getProperty("embedded.postgresql.schema")).isNotEmpty(); diff --git a/embedded-prometheus/pom.xml b/embedded-prometheus/pom.xml index 4c84a8fcf..6eb516a32 100644 --- a/embedded-prometheus/pom.xml +++ b/embedded-prometheus/pom.xml @@ -45,6 +45,10 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-prometheus/src/main/java/com/playtika/testcontainer/prometheus/EmbeddedPrometheusBootstrapConfiguration.java b/embedded-prometheus/src/main/java/com/playtika/testcontainer/prometheus/EmbeddedPrometheusBootstrapConfiguration.java index c8ce85514..592f74df8 100644 --- a/embedded-prometheus/src/main/java/com/playtika/testcontainer/prometheus/EmbeddedPrometheusBootstrapConfiguration.java +++ b/embedded-prometheus/src/main/java/com/playtika/testcontainer/prometheus/EmbeddedPrometheusBootstrapConfiguration.java @@ -12,16 +12,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -49,27 +46,26 @@ public WaitStrategy prometheusWaitStrategy(PrometheusProperties properties) { @Bean @ConditionalOnToxiProxyEnabled(module = "prometheus") - ToxiproxyContainer.ContainerProxy prometheusContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy prometheusContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(PROMETHEUS_BEAN_NAME) GenericContainer prometheus, - ConfigurableEnvironment environment, PrometheusProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(prometheus, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.prometheus.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.prometheus.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.prometheus.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedPrometheusToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Prometheus ToxiProxy connection details {}", map); - + log.info("Started Prometheus ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "prometheus") + public DynamicPropertyRegistrar prometheusToxiProxyDynamicPropertyRegistrar(@Qualifier("prometheusContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.prometheus.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.prometheus.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.prometheus.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = PROMETHEUS_BEAN_NAME, destroyMethod = "stop") - public GenericContainer prometheus(ConfigurableEnvironment environment, - PrometheusProperties properties, + public GenericContainer prometheus(PrometheusProperties properties, WaitStrategy prometheusWaitStrategy, Optional network) { @@ -84,28 +80,19 @@ public GenericContainer prometheus(ConfigurableEnvironment environment, configureCommonsAndStart(container, properties, log); - registerEnvironment(container, environment, properties); - return container; } - private void registerEnvironment(GenericContainer prometheus, - ConfigurableEnvironment environment, - PrometheusProperties properties) { - - Integer mappedPort = prometheus.getMappedPort(properties.port); - String host = prometheus.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.prometheus.host", host); - map.put("embedded.prometheus.port", mappedPort); - map.put("embedded.prometheus.staticNetworkAlias", PROMETHEUS_NETWORK_ALIAS); - map.put("embedded.prometheus.internalPort", properties.getPort()); - - log.info("Started Prometheus server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedPrometheusInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar prometheusDynamicPropertyRegistrar(@Qualifier(PROMETHEUS_BEAN_NAME) GenericContainer prometheus, PrometheusProperties properties) { + return registry -> { + Integer mappedPort = prometheus.getMappedPort(properties.port); + String host = prometheus.getHost(); + registry.add("embedded.prometheus.host", () -> host); + registry.add("embedded.prometheus.port", () -> mappedPort); + registry.add("embedded.prometheus.staticNetworkAlias", () -> PROMETHEUS_NETWORK_ALIAS); + registry.add("embedded.prometheus.internalPort", properties::getPort); + }; } } diff --git a/embedded-pulsar/pom.xml b/embedded-pulsar/pom.xml index 2184a688c..8f3cb5a03 100644 --- a/embedded-pulsar/pom.xml +++ b/embedded-pulsar/pom.xml @@ -66,5 +66,9 @@ + + org.springframework + spring-test + diff --git a/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java b/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java index ff9d21d32..75e997f73 100644 --- a/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java +++ b/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java @@ -4,23 +4,19 @@ import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.PulsarContainer; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; -import static com.playtika.testcontainer.pulsar.PulsarProperties.EMBEDDED_PULSAR; +import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @Slf4j @Configuration @@ -33,54 +29,41 @@ public class EmbeddedPulsarBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "pulsar") - ToxiproxyContainer.ContainerProxy pulsarContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(EMBEDDED_PULSAR) PulsarContainer embeddedPulsar, - PulsarProperties pulsarProperties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(embeddedPulsar, pulsarProperties.getBrokerPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.pulsar.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.pulsar.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.pulsar.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedPulsarToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Pulsar ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy pulsarContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier("embeddedPulsar") PulsarContainer embeddedPulsar, + PulsarProperties properties) { + return toxiproxyContainer.getProxy(embeddedPulsar, properties.getBrokerPort()); } - @Bean(name = EMBEDDED_PULSAR) - public PulsarContainer embeddedPulsar(PulsarProperties pulsarProperties, - ConfigurableEnvironment environment, - @Deprecated @Value("${embedded.pulsar.imageTag:#{null}}") String deprImageTag, - Optional network) { - if (deprImageTag != null) { - throw new IllegalArgumentException("Property `embedded.pulsar.imageTag` is deprecated. Please replace property `embedded.pulsar.imageTag` with `embedded.pulsar.dockerImageVersion`."); - } - PulsarContainer pulsarContainer = new PulsarContainer(ContainerUtils.getDockerImageName(pulsarProperties)) - .withNetworkAliases(PULSAR_NETWORK_ALIAS); - - network.ifPresent(pulsarContainer::withNetwork); - pulsarContainer = (PulsarContainer) ContainerUtils.configureCommonsAndStart(pulsarContainer, pulsarProperties, log); - registerEmbeddedPulsarEnvironment(environment, pulsarContainer, pulsarProperties); - return pulsarContainer; + @Bean(name = "embeddedPulsar", destroyMethod = "stop") + public PulsarContainer pulsar(PulsarProperties properties, + Optional network) { + PulsarContainer pulsar = new PulsarContainer(ContainerUtils.getDockerImageName(properties)) + .withNetworkAliases("pulsar.testcontainer.docker"); + network.ifPresent(pulsar::withNetwork); + configureCommonsAndStart(pulsar, properties, log); + return pulsar; } - private static void registerEmbeddedPulsarEnvironment(final ConfigurableEnvironment environment, - final PulsarContainer pulsarContainer, - PulsarProperties properties) { - String pulsarBrokerUrl = pulsarContainer.getPulsarBrokerUrl(); - String pulsarHttpServiceUrl = pulsarContainer.getHttpServiceUrl(); - - Map pulsarEnv = new LinkedHashMap<>(); - pulsarEnv.put("embedded.pulsar.brokerUrl", pulsarBrokerUrl); - pulsarEnv.put("embedded.pulsar.httpServiceUrl", pulsarHttpServiceUrl); - pulsarEnv.put("embedded.pulsar.networkAlias", PULSAR_NETWORK_ALIAS); - pulsarEnv.put("embedded.pulsar.internalBrokerPort", properties.getBrokerPort()); + @Bean + public DynamicPropertyRegistrar pulsarDynamicPropertyRegistrar( + @Qualifier("embeddedPulsar") PulsarContainer pulsar, + PulsarProperties properties) { + return registry -> { + registry.add("embedded.pulsar.brokerPort", () -> pulsar.getMappedPort(properties.getBrokerPort())); + registry.add("embedded.pulsar.networkAlias", () -> "pulsar.testcontainer.docker"); + registry.add("embedded.pulsar.internalBrokerPort", properties::getBrokerPort); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedPulsarInfo", pulsarEnv); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "pulsar") + public DynamicPropertyRegistrar pulsarToxiProxyDynamicPropertyRegistrar( + @Qualifier("pulsarContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.pulsar.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.pulsar.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.pulsar.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-rabbitmq/pom.xml b/embedded-rabbitmq/pom.xml index 312fa73fc..b05b1a6a2 100644 --- a/embedded-rabbitmq/pom.xml +++ b/embedded-rabbitmq/pom.xml @@ -37,5 +37,9 @@ spring-rabbit-stream test + + org.springframework + spring-test + diff --git a/embedded-rabbitmq/src/main/java/com/playtika/testcontainer/rabbitmq/EmbeddedRabbitMQBootstrapConfiguration.java b/embedded-rabbitmq/src/main/java/com/playtika/testcontainer/rabbitmq/EmbeddedRabbitMQBootstrapConfiguration.java index ee3bfdab6..bef2b70fb 100644 --- a/embedded-rabbitmq/src/main/java/com/playtika/testcontainer/rabbitmq/EmbeddedRabbitMQBootstrapConfiguration.java +++ b/embedded-rabbitmq/src/main/java/com/playtika/testcontainer/rabbitmq/EmbeddedRabbitMQBootstrapConfiguration.java @@ -11,8 +11,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.RabbitMQContainer; import org.testcontainers.containers.ToxiproxyContainer; @@ -37,29 +36,27 @@ public class EmbeddedRabbitMQBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "rabbitmq") - ToxiproxyContainer.ContainerProxy rabbitmqContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_RABBITMQ) RabbitMQContainer rabbitmq, - ConfigurableEnvironment environment, - RabbitMQProperties properties) { + public ToxiproxyContainer.ContainerProxy rabbitmqContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_RABBITMQ) RabbitMQContainer rabbitmq, + RabbitMQProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(rabbitmq, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.rabbitmq.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.rabbitmq.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.rabbitmq.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedRabbitmqToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Rabbitmq ToxiProxy connection details {}", map); - + log.info("Started Rabbitmq ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "rabbitmq") + public DynamicPropertyRegistrar rabbitmqToxiProxyDynamicPropertyRegistrar(@Qualifier("rabbitmqContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.rabbitmq.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.rabbitmq.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.rabbitmq.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_RABBITMQ, destroyMethod = "stop") - public RabbitMQContainer rabbitmq(ConfigurableEnvironment environment, - RabbitMQProperties properties, + public RabbitMQContainer rabbitmq(RabbitMQProperties properties, Optional network) { - Integer[] exposedPorts = Stream.concat(properties.getAdditionalPorts().stream(), Stream.of(properties.getPort(), properties.getHttpPort())) .distinct() .toArray(Integer[]::new); @@ -77,40 +74,34 @@ public RabbitMQContainer rabbitmq(ConfigurableEnvironment environment, network.ifPresent(rabbitMQ::withNetwork); rabbitMQ = (RabbitMQContainer) configureCommonsAndStart(rabbitMQ, properties, log); - registerRabbitMQEnvironment(rabbitMQ, environment, properties); - return rabbitMQ; - } - - private void registerRabbitMQEnvironment(RabbitMQContainer rabbitMQ, - ConfigurableEnvironment environment, - RabbitMQProperties properties) { Integer mappedPort = rabbitMQ.getMappedPort(properties.getPort()); Integer mappedHttpPort = rabbitMQ.getMappedPort(properties.getHttpPort()); - Map additionalPorts = new LinkedHashMap<>(); for (Integer port : properties.getAdditionalPorts()) { additionalPorts.put(port, rabbitMQ.getMappedPort(port)); } - String host = rabbitMQ.getHost(); + log.info("Started RabbitMQ server. Connection details: port={}, host={}, vhost={}, user={}, password={}, httpPort={}, networkAlias={}, internalPort={}, internalHttpPort={}, additionalPorts={}", + mappedPort, host, properties.getVhost(), rabbitMQ.getAdminUsername(), rabbitMQ.getAdminPassword(), mappedHttpPort, RABBITMQ_NETWORK_ALIAS, properties.getPort(), properties.getHttpPort(), additionalPorts); + return rabbitMQ; + } - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.rabbitmq.port", mappedPort); - map.put("embedded.rabbitmq.host", host); - map.put("embedded.rabbitmq.vhost", properties.getVhost()); - map.put("embedded.rabbitmq.user", rabbitMQ.getAdminUsername()); - map.put("embedded.rabbitmq.password", rabbitMQ.getAdminPassword()); - map.put("embedded.rabbitmq.httpPort", mappedHttpPort); - map.put("embedded.rabbitmq.networkAlias", RABBITMQ_NETWORK_ALIAS); - map.put("embedded.rabbitmq.internalPort", properties.getPort()); - map.put("embedded.rabbitmq.internalHttpPort", properties.getHttpPort()); - for (Integer port : additionalPorts.keySet()) { - map.put("embedded.rabbitmq.additionalPorts." + port, additionalPorts.get(port)); - } - - log.info("Started RabbitMQ server. Connection details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedRabbitMqInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar rabbitmqDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_RABBITMQ) RabbitMQContainer rabbitMQ, RabbitMQProperties properties) { + return registry -> { + registry.add("embedded.rabbitmq.port", () -> rabbitMQ.getMappedPort(properties.getPort())); + registry.add("embedded.rabbitmq.host", rabbitMQ::getHost); + registry.add("embedded.rabbitmq.vhost", properties::getVhost); + registry.add("embedded.rabbitmq.user", rabbitMQ::getAdminUsername); + registry.add("embedded.rabbitmq.password", rabbitMQ::getAdminPassword); + registry.add("embedded.rabbitmq.httpPort", () -> rabbitMQ.getMappedPort(properties.getHttpPort())); + registry.add("embedded.rabbitmq.networkAlias", () -> RABBITMQ_NETWORK_ALIAS); + registry.add("embedded.rabbitmq.internalPort", properties::getPort); + registry.add("embedded.rabbitmq.internalHttpPort", properties::getHttpPort); + for (Integer port : properties.getAdditionalPorts()) { + int mapped = rabbitMQ.getMappedPort(port); + registry.add("embedded.rabbitmq.additionalPorts." + port, () -> mapped); + } + }; } } diff --git a/embedded-redis/pom.xml b/embedded-redis/pom.xml index 5af83e80a..9c4ec9b8f 100644 --- a/embedded-redis/pom.xml +++ b/embedded-redis/pom.xml @@ -38,5 +38,9 @@ ${jedis.version} true + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EmbeddedRedisBootstrapConfiguration.java b/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EmbeddedRedisBootstrapConfiguration.java index 67b818538..ec555754e 100644 --- a/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EmbeddedRedisBootstrapConfiguration.java +++ b/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EmbeddedRedisBootstrapConfiguration.java @@ -16,9 +16,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; import org.springframework.core.io.ResourceLoader; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.FixedHostPortGenericContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; @@ -28,12 +27,9 @@ import java.io.IOException; import java.nio.file.Path; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; -import static com.playtika.testcontainer.redis.EnvUtils.registerRedisEnvironment; import static com.playtika.testcontainer.redis.RedisProperties.BEAN_NAME_EMBEDDED_REDIS; @Slf4j @@ -69,29 +65,27 @@ public WaitStrategy redisClusterWaitStrategy(RedisProperties properties) { @ConditionalOnToxiProxyEnabled(module = "redis") ToxiproxyContainer.ContainerProxy redisContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_REDIS) GenericContainer redis, - RedisProperties properties, - ConfigurableEnvironment environment) { + RedisProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(redis, properties.getPort()); - Map map = new LinkedHashMap<>(); - map.put("embedded.redis.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.redis.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.redis.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedRedisToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Redis ToxiProxy connection details {}", map); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "redis") + public DynamicPropertyRegistrar redisToxiProxyDynamicPropertyRegistrar( + @Qualifier("redisContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.redis.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.redis.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.redis.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_REDIS, destroyMethod = "stop") - public GenericContainer redis(ConfigurableEnvironment environment, - @Qualifier(REDIS_WAIT_STRATEGY_BEAN_NAME) WaitStrategy redisStartupCheckStrategy, + public GenericContainer redis(@Qualifier(REDIS_WAIT_STRATEGY_BEAN_NAME) WaitStrategy redisStartupCheckStrategy, Optional network) throws Exception { - - // CLUSTER SLOTS command returns IP:port for each node, so ports outside and inside - // container must be the same GenericContainer redis = new FixedHostPortGenericContainer(ContainerUtils.getDockerImageName(properties).asCanonicalNameString()) .withFixedExposedPort(properties.getPort(), properties.getPort()) @@ -105,11 +99,20 @@ public GenericContainer redis(ConfigurableEnvironment environment, .withNetworkAliases(REDIS_NETWORK_ALIAS); network.ifPresent(redis::withNetwork); redis = configureCommonsAndStart(redis, properties, log); - Map redisEnv = registerRedisEnvironment(environment, redis, properties, properties.getPort()); - log.info("Started Redis cluster. Connection details: {}", redisEnv); return redis; } + @Bean + public DynamicPropertyRegistrar redisDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_REDIS) GenericContainer redis, RedisProperties properties) { + return registry -> { + registry.add("embedded.redis.port", properties::getPort); + registry.add("embedded.redis.host", redis::getHost); + registry.add("embedded.redis.password", properties::getPassword); + registry.add("embedded.redis.user", properties::getUser); + registry.add("embedded.redis.networkAlias", () -> REDIS_NETWORK_ALIAS); + }; + } + private Path prepareRedisConf() throws IOException { return FileUtils.resolveTemplateAsPath(resourceLoader, "redis.conf", content -> content .replace("{{requirepass}}", properties.isRequirepass() ? "yes" : "no") diff --git a/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EnvUtils.java b/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EnvUtils.java deleted file mode 100644 index 4a05d921e..000000000 --- a/embedded-redis/src/main/java/com/playtika/testcontainer/redis/EnvUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.playtika.testcontainer.redis; - -import lombok.experimental.UtilityClass; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; -import org.testcontainers.containers.GenericContainer; - -import java.util.LinkedHashMap; -import java.util.Map; - -import static com.playtika.testcontainer.redis.EmbeddedRedisBootstrapConfiguration.REDIS_NETWORK_ALIAS; - -@UtilityClass -class EnvUtils { - static Map registerRedisEnvironment(ConfigurableEnvironment environment, GenericContainer redis, - RedisProperties properties, int port) { - String host = redis.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.redis.port", port); - map.put("embedded.redis.host", host); - map.put("embedded.redis.password", properties.getPassword()); - map.put("embedded.redis.user", properties.getUser()); - map.put("embedded.redis.networkAlias", REDIS_NETWORK_ALIAS); - MapPropertySource propertySource = new MapPropertySource("embeddedRedisInfo", map); - environment.getPropertySources().addFirst(propertySource); - return map; - } -} diff --git a/embedded-selenium/pom.xml b/embedded-selenium/pom.xml index 45d9e61e1..e8cd53079 100644 --- a/embedded-selenium/pom.xml +++ b/embedded-selenium/pom.xml @@ -56,5 +56,10 @@ true + + org.springframework + spring-test + + \ No newline at end of file diff --git a/embedded-selenium/src/main/java/com/playtika/testcontainer/selenium/EmbeddedSeleniumBootstrapConfiguration.java b/embedded-selenium/src/main/java/com/playtika/testcontainer/selenium/EmbeddedSeleniumBootstrapConfiguration.java index 5033beeab..73c5cc12d 100644 --- a/embedded-selenium/src/main/java/com/playtika/testcontainer/selenium/EmbeddedSeleniumBootstrapConfiguration.java +++ b/embedded-selenium/src/main/java/com/playtika/testcontainer/selenium/EmbeddedSeleniumBootstrapConfiguration.java @@ -8,14 +8,14 @@ import org.openqa.selenium.MutableCapabilities; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.firefox.FirefoxOptions; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.containers.Container; import org.testcontainers.containers.ContainerLaunchException; @@ -79,7 +79,7 @@ public FirefoxOptions firefoxOptions(SeleniumProperties properties) { @Bean(name = BEAN_NAME_EMBEDDED_SELENIUM, destroyMethod = "stop") @ConditionalOnMissingBean - public BrowserWebDriverContainer selenium(ConfigurableEnvironment environment, + public BrowserWebDriverContainer selenium( SeleniumProperties properties, MutableCapabilities capabilities, Optional network) { @@ -101,7 +101,7 @@ public BrowserWebDriverContainer selenium(ConfigurableEnvironment environment, ContainerUtils.configureCommonsAndStart(container, properties, log); - Map seleniumEnv = registerSeleniumEnvironment(environment, container, properties.getVnc().getMode().convert(), recordingDirOrNull); + Map seleniumEnv = registerSeleniumEnvironment(container, properties.getVnc().getMode().convert(), recordingDirOrNull); log.info("Started Selenium server. Connection details: {}", seleniumEnv); return container; } @@ -152,7 +152,7 @@ public RecordingFileFactory getRecordingFileFactory() { return new DefaultRecordingFileFactory(); } - private Map registerSeleniumEnvironment(ConfigurableEnvironment environment, BrowserWebDriverContainer container, BrowserWebDriverContainer.VncRecordingMode vncMode, File recordingDirOrNull) { + private Map registerSeleniumEnvironment(BrowserWebDriverContainer container, BrowserWebDriverContainer.VncRecordingMode vncMode, File recordingDirOrNull) { URL seleniumAddress = container.getSeleniumAddress(); String vncAddress = container.getVncAddress(); URI vncURI = URI.create(vncAddress); @@ -169,8 +169,6 @@ private Map registerSeleniumEnvironment(ConfigurableEnvironment map.put("embedded.selenium.dockerhost", getHostName(container)); map.put("embedded.selenium.networkAlias", SELENIUM_NETWORK_ALIAS); - MapPropertySource propertySource = new MapPropertySource("embeddedSeleniumInfo", map); - environment.getPropertySources().addFirst(propertySource); return map; } @@ -225,4 +223,28 @@ private boolean isValidIpAddress(String ipAddress) { private boolean isNotBlank(String str) { return str != null && !str.trim().isEmpty(); } + + @Bean + public DynamicPropertyRegistrar seleniumDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_SELENIUM) BrowserWebDriverContainer selenium, + SeleniumProperties properties) { + return registry -> { + URL seleniumAddress = selenium.getSeleniumAddress(); + String vncAddress = selenium.getVncAddress(); + URI vncURI = URI.create(vncAddress); + registry.add("embedded.selenium.port", seleniumAddress::getPort); + registry.add("embedded.selenium.host", seleniumAddress::getHost); + registry.add("embedded.selenium.vnc.port", vncURI::getPort); + registry.add("embedded.selenium.vnc.host", vncURI::getHost); + registry.add("embedded.selenium.vnc.username", () -> DEFINED_VNC_USERNAME); + registry.add("embedded.selenium.vnc.password", () -> DEFINED_VNC_PASSWORD); + registry.add("embedded.selenium.vnc.recording-dir", () -> properties.getVnc().getRecordingDir()); + registry.add("embedded.selenium.vnc.mode", () -> properties.getVnc().getMode()); + registry.add("embedded.selenium.dockerhost", () -> getHostName(selenium)); + registry.add("embedded.selenium.networkAlias", () -> SELENIUM_NETWORK_ALIAS); + log.info("Started Selenium server. Connection details: port={}, host={}, vnc.port={}, vnc.host={}, vnc.username={}, vnc.password={}, vnc.recording-dir={}, vnc.mode={}, dockerhost={}, networkAlias={}", + seleniumAddress.getPort(), seleniumAddress.getHost(), vncURI.getPort(), vncURI.getHost(), + DEFINED_VNC_USERNAME, DEFINED_VNC_PASSWORD, properties.getVnc().getRecordingDir(), properties.getVnc().getMode(), + getHostName(selenium), SELENIUM_NETWORK_ALIAS); + }; + } } \ No newline at end of file diff --git a/embedded-solr/pom.xml b/embedded-solr/pom.xml index e7f46e778..f1b237970 100644 --- a/embedded-solr/pom.xml +++ b/embedded-solr/pom.xml @@ -36,5 +36,9 @@ ${solr-solrj.version} test + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-solr/src/main/java/com/playtika/testcontainer/solr/EmbeddedSolrBootstrapConfiguration.java b/embedded-solr/src/main/java/com/playtika/testcontainer/solr/EmbeddedSolrBootstrapConfiguration.java index f69dcf6a2..1a3057169 100644 --- a/embedded-solr/src/main/java/com/playtika/testcontainer/solr/EmbeddedSolrBootstrapConfiguration.java +++ b/embedded-solr/src/main/java/com/playtika/testcontainer/solr/EmbeddedSolrBootstrapConfiguration.java @@ -11,15 +11,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.SolrContainer; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -37,29 +34,26 @@ public class EmbeddedSolrBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "solr") - ToxiproxyContainer.ContainerProxy solrContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy solrContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_SOLR) SolrContainer solrContainer, - SolrProperties properties, - ConfigurableEnvironment environment) { + SolrProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(solrContainer, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.solr.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.solr.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.solr.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedSolrToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Solr ToxiProxy connection details {}", map); - + log.info("Started Solr ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } - @Bean(name = BEAN_NAME_EMBEDDED_SOLR, destroyMethod = "stop") - public GenericContainer solrContainer(ConfigurableEnvironment environment, - SolrProperties properties, - Optional network) { + @Bean + @ConditionalOnToxiProxyEnabled(module = "solr") + public DynamicPropertyRegistrar solrToxiProxyDynamicPropertyRegistrar(@Qualifier("solrContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.solr.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.solr.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.solr.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_SOLR, destroyMethod = "stop") + public GenericContainer solrContainer(SolrProperties properties, Optional network) { SolrContainer solrContainer = new SolrContainer(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) .withNetworkAliases(SOLR_NETWORK_ALIAS); @@ -68,27 +62,19 @@ public GenericContainer solrContainer(ConfigurableEnvironment environment, solrContainer = (SolrContainer) configureCommonsAndStart(solrContainer, properties, log); - registerNatsEnvironment(solrContainer, environment, properties); return solrContainer; } - private void registerNatsEnvironment(GenericContainer natsContainer, - ConfigurableEnvironment environment, - SolrProperties properties) { - Integer port = natsContainer.getMappedPort(properties.getPort()); - String host = natsContainer.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - - map.put("embedded.solr.host", host); - map.put("embedded.solr.port", port); - map.put("embedded.solr.networkAlias", SOLR_NETWORK_ALIAS); - map.put("embedded.solr.internalPort", properties.getPort()); - - log.info("Started Solr server. Connection details {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedSolrInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar solrDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_SOLR) GenericContainer natsContainer, SolrProperties properties) { + return registry -> { + Integer port = natsContainer.getMappedPort(properties.getPort()); + String host = natsContainer.getHost(); + registry.add("embedded.solr.host", () -> host); + registry.add("embedded.solr.port", () -> port); + registry.add("embedded.solr.networkAlias", () -> SOLR_NETWORK_ALIAS); + registry.add("embedded.solr.internalPort", properties::getPort); + }; } } diff --git a/embedded-spicedb/pom.xml b/embedded-spicedb/pom.xml index af025f0b5..63db0b576 100644 --- a/embedded-spicedb/pom.xml +++ b/embedded-spicedb/pom.xml @@ -53,5 +53,9 @@ ${protobuf-java.version} test + + org.springframework + spring-test + diff --git a/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java b/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java index 05f4a5e25..f0499e8d8 100644 --- a/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java +++ b/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java @@ -12,22 +12,15 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; -import org.testcontainers.containers.wait.strategy.WaitAllStrategy; -import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; import static com.playtika.testcontainer.spicedb.SpiceDBProperties.BEAN_NAME_EMBEDDED_SPICEDB; -import static com.playtika.testcontainer.spicedb.SpiceDBProperties.BEAN_NAME_EMBEDDED_SPICEDB_TOXI_PROXY; @Slf4j @Configuration @@ -39,64 +32,45 @@ public class EmbeddedSpiceDBBootstrapConfiguration { private static final String NATS_NETWORK_ALIAS = "spicedb.testcontainer.docker"; - @Bean(name = BEAN_NAME_EMBEDDED_SPICEDB_TOXI_PROXY) + @Bean @ConditionalOnToxiProxyEnabled(module = "spicedb") - ToxiproxyContainer.ContainerProxy spicedbContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_SPICEDB) GenericContainer spicedbContainer, - SpiceDBProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(spicedbContainer, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.spicedb.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.spicedb.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.spicedb.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedSpicedbToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Spicedb ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy spicedbContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_SPICEDB) GenericContainer spicedb, + SpiceDBProperties properties) { + return toxiproxyContainer.getProxy(spicedb, properties.getPort()); } @Bean(name = BEAN_NAME_EMBEDDED_SPICEDB, destroyMethod = "stop") - public GenericContainer spicedbContainer(ConfigurableEnvironment environment, - SpiceDBProperties properties, - Optional network) { - WaitStrategy waitStrategy = new WaitAllStrategy() - .withStrategy(new HostPortWaitStrategy()) - .withStartupTimeout(properties.getTimeoutDuration()); - - GenericContainer spicedbContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) + public GenericContainer spicedb(SpiceDBProperties properties, + Optional network) { + GenericContainer spicedb = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) - .withCommand("serve", "--grpc-preshared-key", properties.getPresharedKey(), "--skip-release-check") - .waitingFor(waitStrategy) - .withNetworkAliases(NATS_NETWORK_ALIAS); - - network.ifPresent(spicedbContainer::withNetwork); - - spicedbContainer = configureCommonsAndStart(spicedbContainer, properties, log); - - registerNatsEnvironment(spicedbContainer, environment, properties); - return spicedbContainer; + .withNetworkAliases("spicedb.testcontainer.docker"); + network.ifPresent(spicedb::withNetwork); + configureCommonsAndStart(spicedb, properties, log); + return spicedb; } - private void registerNatsEnvironment(GenericContainer natsContainer, - ConfigurableEnvironment environment, - SpiceDBProperties properties) { - Integer clientMappedPort = natsContainer.getMappedPort(properties.getPort()); - String host = natsContainer.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - - map.put("embedded.spicedb.host", host); - map.put("embedded.spicedb.port", clientMappedPort); - map.put("embedded.spicedb.token", properties.getPresharedKey()); - map.put("embedded.spicedb.networkAlias", NATS_NETWORK_ALIAS); - - log.info("Started SpiceDb server. Connection details {}", map); + @Bean + public DynamicPropertyRegistrar spicedbDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_SPICEDB) GenericContainer spicedb, + SpiceDBProperties properties) { + return registry -> { + registry.add("embedded.spicedb.host", spicedb::getHost); + registry.add("embedded.spicedb.port", () -> spicedb.getMappedPort(properties.getPort())); + registry.add("embedded.spicedb.networkAlias", () -> "spicedb.testcontainer.docker"); + registry.add("embedded.spicedb.internalPort", properties::getPort); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedSpicedbInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "spicedb") + public DynamicPropertyRegistrar spicedbToxiProxyDynamicPropertyRegistrar( + @Qualifier("spicedbContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.spicedb.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.spicedb.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.spicedb.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-temporal/pom.xml b/embedded-temporal/pom.xml index ed8dbba78..0d32e1a54 100644 --- a/embedded-temporal/pom.xml +++ b/embedded-temporal/pom.xml @@ -57,6 +57,10 @@ + + org.springframework + spring-test + diff --git a/embedded-temporal/src/main/java/com/playtika/testcontainer/temporal/EmbeddedTemporalBootstrapConfiguration.java b/embedded-temporal/src/main/java/com/playtika/testcontainer/temporal/EmbeddedTemporalBootstrapConfiguration.java index aa8870f7b..eccd48429 100644 --- a/embedded-temporal/src/main/java/com/playtika/testcontainer/temporal/EmbeddedTemporalBootstrapConfiguration.java +++ b/embedded-temporal/src/main/java/com/playtika/testcontainer/temporal/EmbeddedTemporalBootstrapConfiguration.java @@ -3,19 +3,18 @@ import com.playtika.testcontainer.common.spring.DockerPresenceBootstrapConfiguration; import com.playtika.testcontainer.common.utils.ContainerUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; -import java.util.LinkedHashMap; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -37,10 +36,7 @@ public class EmbeddedTemporalBootstrapConfiguration { private static final String TEMPORAL_NETWORK_ALIAS = "temporal.testcontainer.docker"; @Bean(value = BEAN_NAME_EMBEDDED_TEMPORAL, destroyMethod = "stop") - public GenericContainer temporal(ConfigurableEnvironment environment, - TemporalProperties properties, - Optional network) { - + public GenericContainer temporal(TemporalProperties properties, Optional network) { GenericContainer container = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint( @@ -65,33 +61,22 @@ public GenericContainer temporal(ConfigurableEnvironment environment, configureCommonsAndStart(container, properties, log); - registerTemporalEnvironment(container, environment, properties); - return container; } - private void registerTemporalEnvironment(GenericContainer container, - ConfigurableEnvironment environment, - TemporalProperties properties) { - - String host = container.getHost(); - Integer port = container.getMappedPort(INTERNAL_PORT); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.temporal.host", host); - map.put("embedded.temporal.port", port); - map.put("embedded.temporal.networkAlias", TEMPORAL_NETWORK_ALIAS); - map.put("embedded.temporal.internalPort", INTERNAL_PORT); - - log.info("Temporal Server started. Available on: http://{}:{}", host, port); - - if (properties.isUiEnabled()) { - Integer uiPort = container.getMappedPort(INTERNAL_UI_PORT); - map.put("embedded.temporal.uiPort", uiPort); - log.info("Temporal UI started. Available on: http://{}:{}", host, uiPort); - } - - MapPropertySource propertySource = new MapPropertySource("embeddedTemporalInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar temporalDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_TEMPORAL) GenericContainer container, TemporalProperties properties) { + return registry -> { + String host = container.getHost(); + Integer port = container.getMappedPort(INTERNAL_PORT); + registry.add("embedded.temporal.host", () -> host); + registry.add("embedded.temporal.port", () -> port); + registry.add("embedded.temporal.networkAlias", () -> TEMPORAL_NETWORK_ALIAS); + registry.add("embedded.temporal.internalPort", () -> INTERNAL_PORT); + if (properties.isUiEnabled()) { + Integer uiPort = container.getMappedPort(INTERNAL_UI_PORT); + registry.add("embedded.temporal.uiPort", () -> uiPort); + } + }; } } diff --git a/embedded-toxiproxy/pom.xml b/embedded-toxiproxy/pom.xml index 3b50f5131..6962c8000 100644 --- a/embedded-toxiproxy/pom.xml +++ b/embedded-toxiproxy/pom.xml @@ -22,5 +22,9 @@ com.playtika.testcontainers testcontainers-common + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-toxiproxy/src/main/java/com/playtika/testcontainer/toxiproxy/EmbeddedToxiProxyBootstrapConfiguration.java b/embedded-toxiproxy/src/main/java/com/playtika/testcontainer/toxiproxy/EmbeddedToxiProxyBootstrapConfiguration.java index cb17404e3..21a630dfa 100644 --- a/embedded-toxiproxy/src/main/java/com/playtika/testcontainer/toxiproxy/EmbeddedToxiProxyBootstrapConfiguration.java +++ b/embedded-toxiproxy/src/main/java/com/playtika/testcontainer/toxiproxy/EmbeddedToxiProxyBootstrapConfiguration.java @@ -4,20 +4,17 @@ import com.playtika.testcontainer.common.utils.ContainerUtils; import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; -import java.util.LinkedHashMap; -import java.util.Map; - @Slf4j @Configuration @ConditionalOnExpression("${embedded.containers.enabled:true}") @@ -40,27 +37,22 @@ Network toxiproxyNetwork() { @Bean(name = "toxiproxy", destroyMethod = "stop") ToxiproxyContainer toxiproxy(ToxiProxyProperties toxiProxyProperties, - Network network, - ConfigurableEnvironment environment) { + Network network) { ToxiproxyContainer toxiproxyContainer = new ToxiproxyContainer(ContainerUtils.getDockerImageName(toxiProxyProperties)) .withNetwork(network) .withNetworkAliases(TOXIPROXY_NETWORK_ALIAS, TOXIPROXY_NETWORK_ALIAS_OLD); toxiproxyContainer = (ToxiproxyContainer) ContainerUtils.configureCommonsAndStart(toxiproxyContainer, toxiProxyProperties, log); - registerEnvironment(toxiproxyContainer, environment); return toxiproxyContainer; } - private void registerEnvironment(ToxiproxyContainer container, - ConfigurableEnvironment environment) { - Map map = new LinkedHashMap<>(); - map.put("embedded.toxiproxy.host", container.getHost()); - map.put("embedded.toxiproxy.controlPort", container.getControlPort()); - map.put("embedded.toxiproxy.networkAlias", TOXIPROXY_NETWORK_ALIAS); - - log.info("Started ToxiProxy server. Connection details {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar toxiproxyDynamicPropertyRegistrar( + @Qualifier("toxiproxy") ToxiproxyContainer toxiproxy) { + return registry -> { + registry.add("embedded.toxiproxy.host", toxiproxy::getHost); + registry.add("embedded.toxiproxy.controlPort", () -> toxiproxy.getControlPort()); + registry.add("embedded.toxiproxy.networkAlias", () -> TOXIPROXY_NETWORK_ALIAS); + }; } } diff --git a/embedded-vault/pom.xml b/embedded-vault/pom.xml index 25a931745..608fca267 100644 --- a/embedded-vault/pom.xml +++ b/embedded-vault/pom.xml @@ -32,5 +32,9 @@ spring-cloud-starter-vault-config true + + org.springframework + spring-test + diff --git a/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java b/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java index a64df3160..630de0a95 100644 --- a/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java +++ b/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java @@ -12,16 +12,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.vault.VaultContainer; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -41,29 +38,26 @@ public class EmbeddedVaultBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "vault") - ToxiproxyContainer.ContainerProxy vaultContainerProxy(ToxiproxyContainer toxiproxyContainer, + public ToxiproxyContainer.ContainerProxy vaultContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_VAULT) VaultContainer vault, - ConfigurableEnvironment environment, VaultProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(vault, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.vault.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.vault.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.vault.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedVaultToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Vault ToxiProxy connection details {}", map); - + log.info("Started Vault ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } - @Bean(name = BEAN_NAME_EMBEDDED_VAULT, destroyMethod = "stop") - public VaultContainer vault(ConfigurableEnvironment environment, - VaultProperties properties, - Optional network) { + @Bean + @ConditionalOnToxiProxyEnabled(module = "vault") + public DynamicPropertyRegistrar vaultToxiProxyDynamicPropertyRegistrar(@Qualifier("vaultContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.vault.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.vault.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.vault.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_VAULT, destroyMethod = "stop") + public VaultContainer vault(VaultProperties properties, Optional network) { VaultContainer vault = new VaultContainer<>(ContainerUtils.getDockerImageName(properties)) .withVaultToken(properties.getToken()) .withExposedPorts(properties.getPort()) @@ -89,28 +83,22 @@ public VaultContainer vault(ConfigurableEnvironment environment, } vault = (VaultContainer) configureCommonsAndStart(vault, properties, log); - registerVaultEnvironment(vault, environment, properties); return vault; } - private void registerVaultEnvironment(VaultContainer vault, ConfigurableEnvironment environment, VaultProperties properties) { - Integer mappedPort = vault.getMappedPort(properties.getPort()); - String host = vault.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.vault.host", host); - map.put("embedded.vault.port", mappedPort); - map.put("embedded.vault.token", properties.getToken()); - map.put("embedded.vault.networkAlias", VAULT_NETWORK_ALIAS); - map.put("embedded.vault.internalPort", properties.getPort()); - - log.info("Started vault. Connection Details: {}, Connection URI: http://{}:{}", map, host, mappedPort); - - MapPropertySource propertySource = new MapPropertySource("embeddedVaultInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar vaultDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_VAULT) VaultContainer vault, VaultProperties properties) { + return registry -> { + Integer mappedPort = vault.getMappedPort(properties.getPort()); + String host = vault.getHost(); + registry.add("embedded.vault.host", () -> host); + registry.add("embedded.vault.port", () -> mappedPort); + registry.add("embedded.vault.token", properties::getToken); + registry.add("embedded.vault.networkAlias", () -> VAULT_NETWORK_ALIAS); + registry.add("embedded.vault.internalPort", properties::getPort); + }; } - private void enableCasForSubPaths(List subPaths, VaultContainer vault) { for (String subPath : subPaths) { if (!subPath.isEmpty()) { diff --git a/embedded-vertica/pom.xml b/embedded-vertica/pom.xml index bb32d8f7d..43907f1c7 100644 --- a/embedded-vertica/pom.xml +++ b/embedded-vertica/pom.xml @@ -45,5 +45,9 @@ tomcat-jdbc test + + org.springframework + spring-test + diff --git a/embedded-vertica/src/main/java/com/playtika/testcontainer/vertica/EmbeddedVerticaBootstrapConfiguration.java b/embedded-vertica/src/main/java/com/playtika/testcontainer/vertica/EmbeddedVerticaBootstrapConfiguration.java index 6a0bda7cf..e24e96fda 100644 --- a/embedded-vertica/src/main/java/com/playtika/testcontainer/vertica/EmbeddedVerticaBootstrapConfiguration.java +++ b/embedded-vertica/src/main/java/com/playtika/testcontainer/vertica/EmbeddedVerticaBootstrapConfiguration.java @@ -11,15 +11,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -37,27 +35,26 @@ public class EmbeddedVerticaBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "vertica") - ToxiproxyContainer.ContainerProxy verticaContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_VERTICA) GenericContainer embeddedVertica, - ConfigurableEnvironment environment, - VerticaProperties verticaProperties) { + public ToxiproxyContainer.ContainerProxy verticaContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_VERTICA) GenericContainer embeddedVertica, + VerticaProperties verticaProperties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(embeddedVertica, verticaProperties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.vertica.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.vertica.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.vertica.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedVerticaToxiproxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started Vertica ToxiProxy connection details {}", map); - + log.info("Started Vertica ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); return proxy; } + @Bean + @ConditionalOnToxiProxyEnabled(module = "vertica") + public DynamicPropertyRegistrar verticaToxiProxyDynamicPropertyRegistrar(@Qualifier("verticaContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.vertica.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.vertica.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.vertica.toxiproxy.proxyName", proxy::getName); + }; + } + @Bean(name = BEAN_NAME_EMBEDDED_VERTICA, destroyMethod = "stop") - public GenericContainer embeddedVertica(ConfigurableEnvironment environment, - VerticaProperties properties, + public GenericContainer embeddedVertica(VerticaProperties properties, Optional network) { GenericContainer verticaContainer = createContainer(properties) .withNetwork(Network.SHARED) @@ -66,10 +63,26 @@ public GenericContainer embeddedVertica(ConfigurableEnvironment environment, network.ifPresent(verticaContainer::withNetwork); verticaContainer = configureCommonsAndStart(verticaContainer, properties, log); - registerVerticaEnvironment(verticaContainer, environment, properties); + Integer mappedPort = verticaContainer.getMappedPort(properties.getPort()); + String host = verticaContainer.getHost(); + log.info("Started Vertica server. Connection details: port={}, host={}, database={}, user={}, password={}, networkAlias={}, internalPort={}", + mappedPort, host, properties.getDatabase(), properties.getUser(), properties.getPassword(), VERTICA_NETWORK_ALIAS, properties.getPort()); return verticaContainer; } + @Bean + public DynamicPropertyRegistrar verticaDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_VERTICA) GenericContainer verticaContainer, VerticaProperties properties) { + return registry -> { + registry.add("embedded.vertica.port", () -> verticaContainer.getMappedPort(properties.getPort())); + registry.add("embedded.vertica.host", verticaContainer::getHost); + registry.add("embedded.vertica.database", properties::getDatabase); + registry.add("embedded.vertica.user", properties::getUser); + registry.add("embedded.vertica.password", properties::getPassword); + registry.add("embedded.vertica.networkAlias", () -> VERTICA_NETWORK_ALIAS); + registry.add("embedded.vertica.internalPort", properties::getPort); + }; + } + private GenericContainer createContainer(VerticaProperties properties) { LinkedHashMap map = new LinkedHashMap<>(); map.put("DATABASE_NAME", properties.getDatabase()); @@ -80,26 +93,4 @@ private GenericContainer createContainer(VerticaProperties properties) { .withEnv(map) .waitingFor(new HostPortWaitStrategy()); } - - private void registerVerticaEnvironment(GenericContainer verticaContainer, - ConfigurableEnvironment environment, - VerticaProperties properties) { - Integer mappedPort = verticaContainer.getMappedPort(properties.getPort()); - String host = verticaContainer.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.vertica.port", mappedPort); - map.put("embedded.vertica.host", host); - map.put("embedded.vertica.database", properties.getDatabase()); - map.put("embedded.vertica.user", properties.getUser()); - map.put("embedded.vertica.password", properties.getPassword()); - map.put("embedded.vertica.networkAlias", VERTICA_NETWORK_ALIAS); - map.put("embedded.vertica.internalPort", properties.getPort()); - - - MapPropertySource propertySource = new MapPropertySource("embeddedVerticaInfo", map); - environment.getPropertySources().addFirst(propertySource); - - log.info("Started Vertica server. Connection details: {}, ", map); - } } diff --git a/embedded-victoriametrics/pom.xml b/embedded-victoriametrics/pom.xml index a5c3515e9..2483cee71 100644 --- a/embedded-victoriametrics/pom.xml +++ b/embedded-victoriametrics/pom.xml @@ -44,6 +44,10 @@ + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-victoriametrics/src/main/java/com/playtika/testcontainer/victoriametrics/EmbeddedVictoriaMetricsBootstrapConfiguration.java b/embedded-victoriametrics/src/main/java/com/playtika/testcontainer/victoriametrics/EmbeddedVictoriaMetricsBootstrapConfiguration.java index 9f7c8e131..cee520b89 100644 --- a/embedded-victoriametrics/src/main/java/com/playtika/testcontainer/victoriametrics/EmbeddedVictoriaMetricsBootstrapConfiguration.java +++ b/embedded-victoriametrics/src/main/java/com/playtika/testcontainer/victoriametrics/EmbeddedVictoriaMetricsBootstrapConfiguration.java @@ -1,9 +1,11 @@ package com.playtika.testcontainer.victoriametrics; import com.playtika.testcontainer.common.spring.DockerPresenceBootstrapConfiguration; +import com.playtika.testcontainer.common.utils.ContainerUtils; import com.playtika.testcontainer.toxiproxy.EmbeddedToxiProxyBootstrapConfiguration; import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -11,20 +13,16 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; -import static com.playtika.testcontainer.common.utils.ContainerUtils.getDockerImageName; @Slf4j @Configuration(proxyBeanMethods = false) @@ -35,6 +33,7 @@ public class EmbeddedVictoriaMetricsBootstrapConfiguration { private static final String VICTORIAMETRICS_NETWORK_ALIAS = "victoriametrics.testcontainer.docker"; + private static final String BEAN_NAME_EMBEDDED_VICTORIA_METRICS = "victoriaMetrics"; @Bean @ConditionalOnMissingBean(name = "victoriaMetricsWaitStrategy") @@ -47,62 +46,43 @@ public WaitStrategy victoriaMetricsWaitStrategy(VictoriaMetricsProperties proper @Bean @ConditionalOnToxiProxyEnabled(module = "victoriametrics") - public ToxiproxyContainer.ContainerProxy victoriaMetricsContainerProxy(ToxiproxyContainer toxiproxy, - GenericContainer victoriametrics, - VictoriaMetricsProperties properties, - ConfigurableEnvironment environment) { - ToxiproxyContainer.ContainerProxy proxy = toxiproxy.getProxy(victoriametrics, properties.getPort()); - - Map map = new LinkedHashMap<>(); - map.put("embedded.victoriametrics.toxiproxy.host", proxy.getContainerIpAddress()); - map.put("embedded.victoriametrics.toxiproxy.port", proxy.getProxyPort()); - map.put("embedded.victoriametrics.toxiproxy.proxyName", proxy.getName()); - - MapPropertySource propertySource = new MapPropertySource("embeddedVictoriaMetricsToxiProxyInfo", map); - environment.getPropertySources().addFirst(propertySource); - log.info("Started VictoriaMetrics ToxiProxy connection details {}", map); - - return proxy; + public ToxiproxyContainer.ContainerProxy victoriaMetricsContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(BEAN_NAME_EMBEDDED_VICTORIA_METRICS) GenericContainer victoriaMetrics, + VictoriaMetricsProperties properties) { + return toxiproxyContainer.getProxy(victoriaMetrics, properties.port); } - @Bean(name = VictoriaMetricsProperties.VICTORIA_METRICS_BEAN_NAME, destroyMethod = "stop") - public GenericContainer victoriaMetrics(ConfigurableEnvironment environment, - VictoriaMetricsProperties properties, - WaitStrategy victoriaMetricsWaitStrategy, - Optional network) { - - GenericContainer victoriaMetrics = - new GenericContainer<>(getDockerImageName(properties)) - .withExposedPorts(properties.getPort()) - .withNetwork(Network.SHARED) - .withNetworkAliases(properties.getNetworkAlias(), VICTORIAMETRICS_NETWORK_ALIAS) - .waitingFor(victoriaMetricsWaitStrategy); - + @Bean(name = BEAN_NAME_EMBEDDED_VICTORIA_METRICS, destroyMethod = "stop") + public GenericContainer victoriaMetrics(VictoriaMetricsProperties properties, + Optional network) { + GenericContainer victoriaMetrics = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) + .withExposedPorts(properties.port) + .withNetworkAliases("victoriametrics.testcontainer.docker"); network.ifPresent(victoriaMetrics::withNetwork); - configureCommonsAndStart(victoriaMetrics, properties, log); - - registerEnvironment(victoriaMetrics, environment, properties); - return victoriaMetrics; } - private void registerEnvironment(GenericContainer victoriaMetrics, - ConfigurableEnvironment environment, - VictoriaMetricsProperties properties) { - - Integer mappedPort = victoriaMetrics.getMappedPort(properties.port); - String host = victoriaMetrics.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.victoriametrics.host", host); - map.put("embedded.victoriametrics.port", mappedPort); - map.put("embedded.victoriametrics.staticNetworkAlias", VICTORIAMETRICS_NETWORK_ALIAS); - map.put("embedded.victoriametrics.internalPort", properties.getPort()); - - log.info("Started VictoriaMetrics server. Connection details: {}", map); + @Bean + public DynamicPropertyRegistrar victoriaMetricsDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_VICTORIA_METRICS) GenericContainer victoriaMetrics, + VictoriaMetricsProperties properties) { + return registry -> { + registry.add("embedded.victoriametrics.host", victoriaMetrics::getHost); + registry.add("embedded.victoriametrics.port", () -> victoriaMetrics.getMappedPort(properties.port)); + registry.add("embedded.victoriametrics.networkAlias", () -> "victoriametrics.testcontainer.docker"); + registry.add("embedded.victoriametrics.internalPort", () -> properties.port); + }; + } - MapPropertySource propertySource = new MapPropertySource("embeddedVictoriaMetricsInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + @ConditionalOnToxiProxyEnabled(module = "victoriametrics") + public DynamicPropertyRegistrar victoriaMetricsToxiProxyDynamicPropertyRegistrar( + @Qualifier("victoriaMetricsContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + return registry -> { + registry.add("embedded.victoriametrics.toxiproxy.host", proxy::getContainerIpAddress); + registry.add("embedded.victoriametrics.toxiproxy.port", proxy::getProxyPort); + registry.add("embedded.victoriametrics.toxiproxy.proxyName", proxy::getName); + }; } } diff --git a/embedded-wiremock/pom.xml b/embedded-wiremock/pom.xml index 0edb30cd8..732794dc2 100644 --- a/embedded-wiremock/pom.xml +++ b/embedded-wiremock/pom.xml @@ -47,5 +47,10 @@ + + + org.springframework + spring-test + \ No newline at end of file diff --git a/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java b/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java index 3ce43c1a8..9dbd531c4 100644 --- a/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java +++ b/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java @@ -3,20 +3,19 @@ import com.playtika.testcontainer.common.spring.DockerPresenceBootstrapConfiguration; import com.playtika.testcontainer.common.utils.ContainerUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -35,37 +34,25 @@ public class EmbeddedWiremockBootstrapConfiguration { .withMethod("GET") .forStatusCode(200); - @Bean(value = BEAN_NAME_EMBEDDED_WIREMOCK, destroyMethod = "stop") - public GenericContainer wiremockContainer(ConfigurableEnvironment environment, - WiremockProperties properties, - Optional network) { - GenericContainer wiremock = - new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) - .waitingFor(DEFAULT_WAITER) - .withCommand("--port " + properties.getPort()) - .withExposedPorts(properties.getPort()) - .withNetworkAliases(WIREMOCK_NETWORK_ALIAS); - - network.ifPresent(wiremock::withNetwork); - - wiremock = configureCommonsAndStart(wiremock, properties, log); - registerWiremockEnvironment(wiremock, environment, properties); - return wiremock; + @Bean(name = BEAN_NAME_EMBEDDED_WIREMOCK, destroyMethod = "stop") + public GenericContainer wiremock(WiremockProperties properties, Optional network) { + GenericContainer container = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) + .withExposedPorts(properties.getPort()) + .withNetworkAliases(WIREMOCK_NETWORK_ALIAS); + network.ifPresent(container::withNetwork); + configureCommonsAndStart(container, properties, log); + return container; } - private void registerWiremockEnvironment(GenericContainer container, ConfigurableEnvironment environment, WiremockProperties properties) { - Integer mappedPort = container.getMappedPort(properties.getPort()); - String host = container.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.wiremock.port", mappedPort); - map.put("embedded.wiremock.host", host); - map.put("embedded.wiremock.networkAlias", WIREMOCK_NETWORK_ALIAS); - map.put("embedded.wiremock.internalPort", properties.getPort()); - - log.info("Started wiremock. Connection Details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedWiremockInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar wiremockDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_WIREMOCK) GenericContainer container, + WiremockProperties properties) { + return registry -> { + registry.add("embedded.wiremock.host", container::getHost); + registry.add("embedded.wiremock.port", () -> container.getMappedPort(properties.getPort())); + registry.add("embedded.wiremock.networkAlias", () -> WIREMOCK_NETWORK_ALIAS); + registry.add("embedded.wiremock.internalPort", properties::getPort); + }; } } diff --git a/embedded-zookeeper/src/main/java/com/playtika/testcontainers/zookeeper/EmbeddedZookeeperBootstrapConfiguration.java b/embedded-zookeeper/src/main/java/com/playtika/testcontainers/zookeeper/EmbeddedZookeeperBootstrapConfiguration.java index 453edbdf9..d5c83ec99 100644 --- a/embedded-zookeeper/src/main/java/com/playtika/testcontainers/zookeeper/EmbeddedZookeeperBootstrapConfiguration.java +++ b/embedded-zookeeper/src/main/java/com/playtika/testcontainers/zookeeper/EmbeddedZookeeperBootstrapConfiguration.java @@ -3,14 +3,14 @@ import com.playtika.testcontainer.common.spring.DockerPresenceBootstrapConfiguration; import com.playtika.testcontainer.common.utils.ContainerUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; @@ -18,7 +18,6 @@ import org.testcontainers.containers.wait.strategy.WaitAllStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import java.util.LinkedHashMap; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -34,9 +33,7 @@ public class EmbeddedZookeeperBootstrapConfiguration { private static final String ZOOKEEPER_NETWORK_ALIAS = "zookeeper.testcontainer.docker"; @Bean(destroyMethod = "stop") - public GenericContainer zooKeeperContainer(ConfigurableEnvironment environment, - ZookeeperConfigurationProperties properties, - Optional network) { + public GenericContainer zooKeeperContainer(ZookeeperConfigurationProperties properties, Optional network) { WaitStrategy waitStrategy = new WaitAllStrategy() .withStrategy(new HostPortWaitStrategy()) .withStrategy(Wait.forHttp("/commands/ruok") @@ -52,26 +49,19 @@ public GenericContainer zooKeeperContainer(ConfigurableEnvironment environmen network.ifPresent(zookeeper::withNetwork); zookeeper = configureCommonsAndStart(zookeeper, properties, log); - registerZookeeperEnvironment(zookeeper, environment, properties); - return zookeeper; } - private void registerZookeeperEnvironment(GenericContainer zookeeper, ConfigurableEnvironment environment, - ZookeeperConfigurationProperties properties) { - String host = zookeeper.getHost(); - - LinkedHashMap map = new LinkedHashMap<>(); - map.put("embedded.zookeeper.port", zookeeper.getMappedPort(properties.clientPort)); - map.put("embedded.zookeeper.admin.port", zookeeper.getMappedPort(properties.adminServerPort)); - map.put("embedded.zookeeper.host", host); - map.put("embedded.zookeeper.networkAlias", ZOOKEEPER_NETWORK_ALIAS); - map.put("embedded.zookeeper.internalClientPort", properties.getClientPort()); - map.put("embedded.zookeeper.internalAdminServerPort", properties.getAdminServerPort()); - - log.info("Started Zookeeper. Connection Details: {}", map); - - MapPropertySource propertySource = new MapPropertySource("embeddedZookeeperInfo", map); - environment.getPropertySources().addFirst(propertySource); + @Bean + public DynamicPropertyRegistrar zookeeperDynamicPropertyRegistrar(@Qualifier("zooKeeperContainer") GenericContainer zookeeper, ZookeeperConfigurationProperties properties) { + return registry -> { + String host = zookeeper.getHost(); + registry.add("embedded.zookeeper.port", () -> zookeeper.getMappedPort(properties.clientPort)); + registry.add("embedded.zookeeper.admin.port", () -> zookeeper.getMappedPort(properties.adminServerPort)); + registry.add("embedded.zookeeper.host", () -> host); + registry.add("embedded.zookeeper.networkAlias", () -> ZOOKEEPER_NETWORK_ALIAS); + registry.add("embedded.zookeeper.internalClientPort", properties::getClientPort); + registry.add("embedded.zookeeper.internalAdminServerPort", properties::getAdminServerPort); + }; } } diff --git a/pom.xml b/pom.xml index d93de2ceb..f5e4b31d0 100644 --- a/pom.xml +++ b/pom.xml @@ -39,19 +39,16 @@ testcontainers-spring-boot-parent testcontainers-common embedded-kafka - embedded-native-kafka embedded-keycloak embedded-keydb embedded-aerospike embedded-mariadb - embedded-memsql embedded-mongodb embedded-redis embedded-neo4j embedded-postgresql embedded-elasticsearch embedded-opensearch - embedded-dynamodb embedded-rabbitmq embedded-minio embedded-google-pubsub @@ -88,6 +85,11 @@ embedded-aerospike-enterprise embedded-spicedb embedded-temporal + embedded-kafka + embedded-native-kafka + embedded-memsql + embedded-keycloak + embedded-dynamodb @@ -316,55 +318,55 @@ - - io.github.gitflow-incremental-builder - gitflow-incremental-builder - ${gitflow-incremental-builder.version} - true - - develop|support/* - true - refs/remotes/origin/develop - always - true - impacted - \.github[/\\].*|\.mvn[/\\].*|mvnw.* - - (.*[/\\])?README.adoc - - - - com.mycila - license-maven-plugin - 5.0.0 - - - SMILEY_STYLE - - - -
LICENSE
- - src/test/resources/** - src/main/resources/** - **/*.adoc - -
-
- - - SMILEY_STYLE - :( - ( - :( - \:\( - \:\( - false - false - - -
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
From 02d2b8d2cbb525dfe8ce576b950b561e2e445606 Mon Sep 17 00:00:00 2001 From: admitrov Date: Tue, 10 Jun 2025 12:24:08 +0200 Subject: [PATCH 02/11] fix some tests with Value --- .../cassandra/EmbeddedCassandraTest.java | 13 ++++--- ...edCouchbaseBootstrapConfigurationTest.java | 34 +++++++++++++------ .../DisabledElasticSearchTest.java | 3 +- ...asticSearchBootstrapConfigurationTest.java | 24 ++++++++----- ...dedInfluxDBBootstrapConfigurationTest.java | 28 ++++++++++----- ...EmbeddedK3sBootstrapConfigurationTest.java | 12 +++---- ...dedKeycloakBootstrapConfigurationTest.java | 8 +++-- .../spring/SpringTestApplication.java | 2 ++ .../keycloak/util/KeycloakClient.java | 8 ++--- ...ycloakRealmBootstrapConfigurationTest.java | 10 +++--- .../vanilla/VanillaTestApplication.java | 2 ++ ...ddedMailHogBootstrapConfigurationTest.java | 28 +++++++++------ ...ddedMariaDBBootstrapConfigurationTest.java | 33 ++++++++++++------ ...eddedMemSqlBootstrapConfigurationTest.java | 28 ++++++++++----- ...MongodbBootstrapAuthConfigurationTest.java | 27 ++++++++++----- ...ddedMongodbBootstrapConfigurationTest.java | 17 ++++++---- ...beddedNeo4JBootstrapConfigurationTest.java | 30 +++++++++++----- ...eddedOracleBootstrapConfigurationTest.java | 32 ++++++++++++----- ...dPostgreSQLBootstrapConfigurationTest.java | 33 ++++++++++++------ ...eddedPulsarBootstrapConfigurationTest.java | 13 ++++--- .../redis/BaseEmbeddedRedisTest.java | 23 +++++++++---- .../selenium/OtherCompatibleImageTest.java | 9 +++-- .../drivers/BaseEmbeddedSeleniumTest.java | 33 +++++++++++++----- .../drivers/EmbeddedChromiumSeleniumTest.java | 6 +++- .../drivers/VncRecordingRecordAllTest.java | 32 +++++++++++------ ...cRecordingRecordAllUserDefinesDirTest.java | 30 +++++++++------- ...ddedSpiceDbBootstrapConfigurationTest.java | 18 +++++----- ...beddedVaultBootstrapConfigurationTest.java | 23 +++++++++---- ...dedVaultWithCasEnabledForSubPathsTest.java | 28 ++++++++++----- .../EmbeddedVaultWithCasEnabledTest.java | 28 ++++++++++----- ...dedWiremockBootstrapConfigurationTest.java | 19 ++++++----- pom.xml | 7 ++-- 32 files changed, 426 insertions(+), 215 deletions(-) diff --git a/embedded-cassandra/src/test/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraTest.java b/embedded-cassandra/src/test/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraTest.java index d8cc69d42..804fe7f69 100644 --- a/embedded-cassandra/src/test/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraTest.java +++ b/embedded-cassandra/src/test/java/com/playtika/testcontainer/cassandra/EmbeddedCassandraTest.java @@ -7,11 +7,11 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; import org.springframework.data.cassandra.repository.AllowFiltering; @@ -38,8 +38,11 @@ public class EmbeddedCassandraTest { @Autowired protected DummyCassandraRepository dummyCassandraRepository; - @Autowired - protected ConfigurableEnvironment environment; + @Value("${embedded.cassandra.port}") + protected String cassandraPort; + + @Value("${embedded.cassandra.host}") + protected String cassandraHost; @Test @@ -52,8 +55,8 @@ public void springDataCassandraShouldWork() { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.cassandra.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.cassandra.host")).isNotEmpty(); + assertThat(cassandraPort).isNotEmpty(); + assertThat(cassandraHost).isNotEmpty(); } @Test diff --git a/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java b/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java index 4e64e6df0..7353baf23 100644 --- a/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java +++ b/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java @@ -1,11 +1,10 @@ package com.playtika.testcontainer.couchbase; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import static org.assertj.core.api.Assertions.assertThat; @@ -17,17 +16,32 @@ }) public abstract class EmbeddedCouchbaseBootstrapConfigurationTest { - @Autowired - ConfigurableEnvironment environment; + @Value("${embedded.couchbase.bootstrapHttpDirectPort}") + String couchbaseBootstrapHttpDirectPort; + + @Value("${embedded.couchbase.bootstrapCarrierDirectPort}") + String couchbaseBootstrapCarrierDirectPort; + + @Value("${embedded.couchbase.host}") + String couchbaseHost; + + @Value("${embedded.couchbase.bucket}") + String couchbaseBucket; + + @Value("${embedded.couchbase.user}") + String couchbaseUser; + + @Value("${embedded.couchbase.password}") + String couchbasePassword; @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.couchbase.bootstrapHttpDirectPort")).isNotEmpty(); - assertThat(environment.getProperty("embedded.couchbase.bootstrapCarrierDirectPort")).isNotEmpty(); - assertThat(environment.getProperty("embedded.couchbase.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.couchbase.bucket")).isNotEmpty(); - assertThat(environment.getProperty("embedded.couchbase.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.couchbase.password")).isNotEmpty(); + assertThat(couchbaseBootstrapHttpDirectPort).isNotEmpty(); + assertThat(couchbaseBootstrapCarrierDirectPort).isNotEmpty(); + assertThat(couchbaseHost).isNotEmpty(); + assertThat(couchbaseBucket).isNotEmpty(); + assertThat(couchbaseUser).isNotEmpty(); + assertThat(couchbasePassword).isNotEmpty(); assertThat(System.getProperty("com.couchbase.bootstrapHttpDirectPort")).isNotEmpty(); assertThat(System.getProperty("com.couchbase.bootstrapCarrierDirectPort")).isNotEmpty(); } diff --git a/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/DisabledElasticSearchTest.java b/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/DisabledElasticSearchTest.java index ea89175e9..02232a728 100644 --- a/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/DisabledElasticSearchTest.java +++ b/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/DisabledElasticSearchTest.java @@ -7,7 +7,8 @@ import static org.assertj.core.api.Assertions.assertThat; -public class DisabledElasticSearchTest { +public class +DisabledElasticSearchTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of( diff --git a/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfigurationTest.java b/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfigurationTest.java index 5359fbdcd..e7ea96da8 100644 --- a/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfigurationTest.java +++ b/embedded-elasticsearch/src/test/java/com/playtika/testcontainer/elasticsearch/EmbeddedElasticSearchBootstrapConfigurationTest.java @@ -1,11 +1,10 @@ package com.playtika.testcontainer.elasticsearch; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -17,15 +16,24 @@ }) public abstract class EmbeddedElasticSearchBootstrapConfigurationTest { - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.elasticsearch.clusterName}") + String elasticsearchClusterName; + + @Value("${embedded.elasticsearch.host}") + String elasticsearchHost; + + @Value("${embedded.elasticsearch.httpPort}") + String elasticsearchHttpPort; + + @Value("${embedded.elasticsearch.transportPort}") + String elasticsearchTransportPort; @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.elasticsearch.clusterName")).isNotEmpty(); - assertThat(environment.getProperty("embedded.elasticsearch.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.elasticsearch.httpPort")).isNotEmpty(); - assertThat(environment.getProperty("embedded.elasticsearch.transportPort")).isNotEmpty(); + assertThat(elasticsearchClusterName).isNotEmpty(); + assertThat(elasticsearchHost).isNotEmpty(); + assertThat(elasticsearchHttpPort).isNotEmpty(); + assertThat(elasticsearchTransportPort).isNotEmpty(); } @Configuration diff --git a/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java b/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java index a04cfd013..f560e8401 100644 --- a/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java +++ b/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java @@ -6,10 +6,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.context.junit.jupiter.SpringExtension; import static io.restassured.RestAssured.given; @@ -22,16 +22,28 @@ class EmbeddedInfluxDBBootstrapConfigurationTest { @Autowired private InfluxDBProperties influxDBProperties; - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.influxdb.port}") + String influxdbPort; + + @Value("${embedded.influxdb.host}") + String influxdbHost; + + @Value("${embedded.influxdb.database}") + String influxdbDatabase; + + @Value("${embedded.influxdb.user}") + String influxdbUser; + + @Value("${embedded.influxdb.password}") + String influxdbPassword; @Test void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.influxdb.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.influxdb.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.influxdb.database")).isNotEmpty(); - assertThat(environment.getProperty("embedded.influxdb.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.influxdb.password")).isNotEmpty(); + assertThat(influxdbPort).isNotEmpty(); + assertThat(influxdbHost).isNotEmpty(); + assertThat(influxdbDatabase).isNotEmpty(); + assertThat(influxdbUser).isNotEmpty(); + assertThat(influxdbPassword).isNotEmpty(); } @Test diff --git a/embedded-k3s/src/test/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfigurationTest.java b/embedded-k3s/src/test/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfigurationTest.java index 17e6fa9ee..c2b97640d 100644 --- a/embedded-k3s/src/test/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfigurationTest.java +++ b/embedded-k3s/src/test/java/com/playtika/testcontainer/k3s/EmbeddedK3sBootstrapConfigurationTest.java @@ -5,10 +5,9 @@ import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.assertj.core.api.Assertions.assertThat; @@ -18,18 +17,17 @@ @SpringBootTest class EmbeddedK3sBootstrapConfigurationTest { - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.k3s.kubeconfig}") + private String k3sKubeconfig; @Test void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.k3s.kubeconfig")).isNotEmpty(); + assertThat(k3sKubeconfig).isNotEmpty(); } @Test void k3sIsAvailable() { - final var kubeconfig = environment.getProperty("embedded.k3s.kubeconfig"); - final var config = Config.fromKubeconfig(kubeconfig); + final var config = Config.fromKubeconfig(k3sKubeconfig); try (final var client = new KubernetesClientBuilder().withConfig(config).build()) { assertFalse(client.nodes() diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java index 9baf51d78..8330886fa 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java @@ -2,6 +2,7 @@ import com.playtika.testcontainer.keycloak.KeycloakContainer; import com.playtika.testcontainer.keycloak.util.KeyCloakToken; +import com.playtika.testcontainer.keycloak.util.KeycloakClient; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -16,7 +17,6 @@ import org.springframework.web.client.RestTemplate; import static com.playtika.testcontainer.keycloak.KeycloakProperties.DEFAULT_REALM; -import static com.playtika.testcontainer.keycloak.util.KeycloakClient.newKeycloakClient; import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @@ -35,6 +35,8 @@ public class EmbeddedKeycloakBootstrapConfigurationTest { private ConfigurableListableBeanFactory beanFactory; @Autowired private KeycloakContainer keycloakContainer; + @Autowired + private KeycloakClient keycloakClient; @LocalServerPort private int httpPort; @@ -59,12 +61,12 @@ public void propertiesAreAvailable() { @Test public void shouldGetMasterRealmInfoFromKeycloak() { - String realmInfo = newKeycloakClient(environment).getRealmInfo(DEFAULT_REALM).getRealm(); + String realmInfo = keycloakClient.getRealmInfo(DEFAULT_REALM).getRealm(); assertThat(realmInfo).isEqualTo(DEFAULT_REALM); } private String callSecuredPingEndpoint() { - KeyCloakToken keyCloakToken = newKeycloakClient(environment).keycloakToken(); + KeyCloakToken keyCloakToken = keycloakClient.keycloakToken(); HttpHeaders headers = new HttpHeaders(); headers.set(AUTHORIZATION, format("Bearer %s", keyCloakToken.getAccessToken())); diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java index 95889edc5..67d3406a8 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; @@ -17,6 +18,7 @@ @EnableWebMvc @EnableMethodSecurity(jsr250Enabled = true) @SpringBootApplication +@ComponentScan(basePackages = {"com.playtika.testcontainer.keycloak"}) public class SpringTestApplication { @Value("${testing.keycloak.client}") diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java index 5e8766e32..3f37bf2db 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java @@ -17,12 +17,12 @@ public final class KeycloakClient { private final RestTemplate restTemplate; private KeycloakClient(Environment environment) { - this.environment = environment; + this.environment = requireNonNull(environment); this.restTemplate = new RestTemplate(); } public static KeycloakClient newKeycloakClient(Environment environment) { - return new KeycloakClient(requireNonNull(environment)); + return new KeycloakClient(environment); } public KeyCloakToken keycloakToken() { @@ -48,9 +48,9 @@ public String realm() { return fromEnv("testing.keycloak.realm"); } - public RealmInfo getRealmInfo(String realm) { + public RealmInfo getRealmInfo(String realmName) { return restTemplate.getForObject( - format("%s/realms/%s", baseUrl(), requireNonNull(realm)), + format("%s/realms/%s", baseUrl(), realmName), RealmInfo.class); } diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java index 37a87719c..aee563889 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java @@ -8,7 +8,6 @@ import org.springframework.core.env.Environment; import org.springframework.test.context.ActiveProfiles; -import static com.playtika.testcontainer.keycloak.util.KeycloakClient.newKeycloakClient; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = VanillaTestApplication.class) @@ -17,19 +16,20 @@ public class EmbeddedKeycloakRealmBootstrapConfigurationTest { @Autowired private Environment environment; + @Autowired + private KeycloakClient keycloakClient; @Test public void shouldGetTestRealmInfoFromKeycloak() { - KeycloakClient client = newKeycloakClient(environment); - String realm = client.realm(); - RealmInfo realmInfo = client.getRealmInfo(realm); + String realm = keycloakClient.realm(); + RealmInfo realmInfo = keycloakClient.getRealmInfo(realm); assertThat(realmInfo.getRealm()).isEqualTo(realm); } @Test public void shouldGetAccessTokenFromKeycloak() { - String token = newKeycloakClient(environment).keycloakToken().getAccessToken(); + String token = keycloakClient.keycloakToken().getAccessToken(); assertThat(token).isNotEmpty(); } } diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java index d69c006d2..7e842eb4c 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java @@ -1,8 +1,10 @@ package com.playtika.testcontainer.keycloak.vanilla; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication +@ComponentScan(basePackages = {"com.playtika.testcontainer.keycloak"}) public class VanillaTestApplication { } diff --git a/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java b/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java index 2489fe0e0..2ba9bad25 100644 --- a/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java +++ b/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; @@ -28,9 +27,6 @@ class EmbeddedMailHogBootstrapConfigurationTest { private static final String MAILHOG_API_MESSAGES = "/api/v2/messages"; - @Autowired - ConfigurableEnvironment environment; - @Autowired JavaMailSender mailSender; @@ -40,15 +36,27 @@ class EmbeddedMailHogBootstrapConfigurationTest { @Value("${embedded.mailhog.http-port}") String mailhogApiPort; + @Value("${embedded.mailhog.smtp-port}") + String mailhogSmtpPort; + + @Value("${embedded.mailhog.smtp.toxiproxy.host}") + String mailhogSmtpToxiproxyHost; + + @Value("${embedded.mailhog.smtp.toxiproxy.port}") + String mailhogSmtpToxiproxyPort; + + @Value("${embedded.mailhog.smtp.toxiproxy.proxyName}") + String mailhogSmtpToxiproxyProxyName; + @Test void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.mailhog.smtp-port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mailhog.http-port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mailhog.host")).isNotEmpty(); + assertThat(mailhogSmtpPort).isNotEmpty(); + assertThat(mailhogApiPort).isNotEmpty(); + assertThat(mailApiHost).isNotEmpty(); - assertThat(environment.getProperty("embedded.mailhog.smtp.toxiproxy.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mailhog.smtp.toxiproxy.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mailhog.smtp.toxiproxy.proxyName")).isNotEmpty(); + assertThat(mailhogSmtpToxiproxyHost).isNotEmpty(); + assertThat(mailhogSmtpToxiproxyPort).isNotEmpty(); + assertThat(mailhogSmtpToxiproxyProxyName).isNotEmpty(); } @Test diff --git a/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java b/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java index 4376df2af..822d2c0dd 100644 --- a/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java +++ b/embedded-mariadb/src/test/java/com/playtika/testcontainer/mariadb/EmbeddedMariaDBBootstrapConfigurationTest.java @@ -14,7 +14,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.jdbc.core.JdbcTemplate; import org.testcontainers.containers.ToxiproxyContainer; @@ -42,8 +41,23 @@ public class EmbeddedMariaDBBootstrapConfigurationTest { @Autowired JdbcTemplate jdbcTemplate; - @Autowired - ConfigurableEnvironment environment; + @Value("${embedded.mariadb.port}") + String mariadbPort; + + @Value("${embedded.mariadb.host}") + String mariadbHost; + + @Value("${embedded.mariadb.schema}") + String mariadbSchema; + + @Value("${embedded.mariadb.user}") + String mariadbUser; + + @Value("${embedded.mariadb.password}") + String mariadbPassword; + + @Value("${embedded.mariadb.init-script-path}") + String mariadbInitScriptPath; @Autowired ToxiproxyContainer.ContainerProxy mariadbContainerProxy; @@ -84,13 +98,12 @@ public void shouldInitDBForMariaDB() throws Exception { @Test public void propertiesAreAvailable() { - //refactor to use value fields - assertThat(environment.getProperty("embedded.mariadb.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mariadb.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mariadb.schema")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mariadb.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mariadb.password")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mariadb.init-script-path")).isNotEmpty(); + assertThat(mariadbPort).isNotEmpty(); + assertThat(mariadbHost).isNotEmpty(); + assertThat(mariadbSchema).isNotEmpty(); + assertThat(mariadbUser).isNotEmpty(); + assertThat(mariadbPassword).isNotEmpty(); + assertThat(mariadbInitScriptPath).isNotEmpty(); } @Test diff --git a/embedded-memsql/src/test/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfigurationTest.java b/embedded-memsql/src/test/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfigurationTest.java index 6ff2093c4..40be9fa82 100644 --- a/embedded-memsql/src/test/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfigurationTest.java +++ b/embedded-memsql/src/test/java/com/playtika/testcontainer/memsql/EmbeddedMemSqlBootstrapConfigurationTest.java @@ -4,11 +4,11 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @@ -32,8 +32,20 @@ public class EmbeddedMemSqlBootstrapConfigurationTest { @Autowired JdbcTemplate jdbcTemplate; - @Autowired - ConfigurableEnvironment environment; + @Value("${embedded.memsql.port}") + String memsqlPort; + + @Value("${embedded.memsql.host}") + String memsqlHost; + + @Value("${embedded.memsql.schema}") + String memsqlSchema; + + @Value("${embedded.memsql.user}") + String memsqlUser; + + @Value("${embedded.memsql.password}") + String memsqlPassword; // @Autowired // NetworkTestOperations memsqlNetworkTestOperations; @@ -86,11 +98,11 @@ private static long durationOf(Callable op) throws Exception { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.memsql.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.memsql.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.memsql.schema")).isNotEmpty(); - assertThat(environment.getProperty("embedded.memsql.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.memsql.password")).isEqualTo("pass"); + assertThat(memsqlPort).isNotEmpty(); + assertThat(memsqlHost).isNotEmpty(); + assertThat(memsqlSchema).isNotEmpty(); + assertThat(memsqlUser).isNotEmpty(); + assertThat(memsqlPassword).isEqualTo("pass"); } @EnableAutoConfiguration diff --git a/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapAuthConfigurationTest.java b/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapAuthConfigurationTest.java index 31df09a42..e9c5a4c7c 100644 --- a/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapAuthConfigurationTest.java +++ b/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapAuthConfigurationTest.java @@ -8,7 +8,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.MongoTemplate; @@ -36,8 +35,20 @@ public class EmbeddedMongodbBootstrapAuthConfigurationTest { @Autowired MongoTemplate mongoTemplate; - @Autowired - ConfigurableEnvironment environment; + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.port}") + String mongodbPort; + + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.host}") + String mongodbHost; + + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.username}") + String mongodbUsername; + + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.password}") + String mongodbPassword; + + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.database}") + String mongodbDatabase; @Test public void shouldSaveAndGet() { @@ -50,11 +61,11 @@ public void shouldSaveAndGet() { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.mongodb.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mongodb.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mongodb.username")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mongodb.password")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mongodb.database")).isNotEmpty(); + assertThat(mongodbPort).isNotEmpty(); + assertThat(mongodbHost).isNotEmpty(); + assertThat(mongodbUsername).isNotEmpty(); + assertThat(mongodbPassword).isNotEmpty(); + assertThat(mongodbDatabase).isNotEmpty(); } @Value diff --git a/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfigurationTest.java b/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfigurationTest.java index 3a418173f..f42cec7f1 100644 --- a/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfigurationTest.java +++ b/embedded-mongodb/src/test/java/com/playtika/testcontainer/mongodb/EmbeddedMongodbBootstrapConfigurationTest.java @@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.MongoTemplate; import org.testcontainers.containers.ToxiproxyContainer; @@ -33,8 +32,14 @@ public class EmbeddedMongodbBootstrapConfigurationTest { @Autowired MongoTemplate mongoTemplate; - @Autowired - ConfigurableEnvironment environment; + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.port}") + String mongodbPort; + + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.host}") + String mongodbHost; + + @org.springframework.beans.factory.annotation.Value("${embedded.mongodb.database}") + String mongodbDatabase; @Autowired ToxiproxyContainer.ContainerProxy mongodbContainerProxy; @@ -63,9 +68,9 @@ public void shouldEmulateLatency() throws Exception { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.mongodb.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mongodb.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.mongodb.database")).isNotEmpty(); + assertThat(mongodbPort).isNotEmpty(); + assertThat(mongodbHost).isNotEmpty(); + assertThat(mongodbDatabase).isNotEmpty(); } private static long durationOf(Callable op) throws Exception { diff --git a/embedded-neo4j/src/test/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4JBootstrapConfigurationTest.java b/embedded-neo4j/src/test/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4JBootstrapConfigurationTest.java index 88a590e18..f0fcfbf09 100644 --- a/embedded-neo4j/src/test/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4JBootstrapConfigurationTest.java +++ b/embedded-neo4j/src/test/java/com/playtika/testcontainer/neo4j/EmbeddedNeo4JBootstrapConfigurationTest.java @@ -9,11 +9,11 @@ import org.neo4j.driver.types.Node; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; import org.springframework.test.context.ActiveProfiles; import org.testcontainers.containers.ToxiproxyContainer; @@ -47,15 +47,27 @@ public class EmbeddedNeo4JBootstrapConfigurationTest { @Autowired ToxiproxyContainer.ContainerProxy neo4jContainerProxy; + @Value("${embedded.neo4j.httpsPort}") + String neo4jHttpsPort; + + @Value("${embedded.neo4j.boltPort}") + String neo4jBoltPort; + + @Value("${embedded.neo4j.host}") + String neo4jHost; + + @Value("${embedded.neo4j.user}") + String neo4jUser; + + @Value("${embedded.neo4j.password}") + String neo4jPassword; + @Configuration @EnableAutoConfiguration @EnableNeo4jRepositories static class TestConfiguration { } - @Autowired - ConfigurableEnvironment environment; - @Test void springDataNeo4jShouldWork() { @@ -119,10 +131,10 @@ private static long durationOf(Callable op) throws Exception { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.neo4j.httpsPort")).isNotEmpty(); - assertThat(environment.getProperty("embedded.neo4j.boltPort")).isNotEmpty(); - assertThat(environment.getProperty("embedded.neo4j.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.neo4j.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.neo4j.password")).isNotEmpty(); + assertThat(neo4jHttpsPort).isNotEmpty(); + assertThat(neo4jBoltPort).isNotEmpty(); + assertThat(neo4jHost).isNotEmpty(); + assertThat(neo4jUser).isNotEmpty(); + assertThat(neo4jPassword).isNotEmpty(); } } diff --git a/embedded-oracle-xe/src/test/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfigurationTest.java b/embedded-oracle-xe/src/test/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfigurationTest.java index c1f1affd2..7fe116b66 100644 --- a/embedded-oracle-xe/src/test/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfigurationTest.java +++ b/embedded-oracle-xe/src/test/java/com/playtika/testcontainer/oracle/EmbeddedOracleBootstrapConfigurationTest.java @@ -11,7 +11,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.ActiveProfiles; @@ -34,8 +33,23 @@ class EmbeddedOracleBootstrapConfigurationTest { @Autowired private JdbcTemplate jdbcTemplate; - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.oracle.port}") + String oraclePort; + + @Value("${embedded.oracle.host}") + String oracleHost; + + @Value("${embedded.oracle.database}") + String oracleDatabase; + + @Value("${embedded.oracle.user}") + String oracleUser; + + @Value("${embedded.oracle.password}") + String oraclePassword; + + @Value("${embedded.oracle.init-script-path}") + String oracleInitScriptPath; @Test @@ -58,12 +72,12 @@ public void shouldInitDBForOracle() throws Exception { @Test void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.oracle.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.oracle.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.oracle.database")).isNotEmpty(); - assertThat(environment.getProperty("embedded.oracle.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.oracle.password")).isNotEmpty(); - assertThat(environment.getProperty("embedded.oracle.init-script-path")).isNotEmpty(); + assertThat(oraclePort).isNotEmpty(); + assertThat(oracleHost).isNotEmpty(); + assertThat(oracleDatabase).isNotEmpty(); + assertThat(oracleUser).isNotEmpty(); + assertThat(oraclePassword).isNotEmpty(); + assertThat(oracleInitScriptPath).isNotEmpty(); } @Test diff --git a/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java b/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java index ab3af8c62..7425e631b 100644 --- a/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java +++ b/embedded-postgresql/src/test/java/com/playtika/testcontainer/postgresql/EmbeddedPostgreSQLBootstrapConfigurationTest.java @@ -13,7 +13,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.ActiveProfiles; import org.testcontainers.containers.ToxiproxyContainer; @@ -45,8 +44,23 @@ class EmbeddedPostgreSQLBootstrapConfigurationTest { @Autowired private JdbcTemplate jdbcTemplate; - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.postgresql.port}") + String postgresqlPort; + + @Value("${embedded.postgresql.host}") + String postgresqlHost; + + @Value("${embedded.postgresql.schema}") + String postgresqlSchema; + + @Value("${embedded.postgresql.user}") + String postgresqlUser; + + @Value("${embedded.postgresql.password}") + String postgresqlPassword; + + @Value("${embedded.postgresql.init-script-path}") + String postgresqlInitScriptPath; @Autowired ToxiproxyContainer.ContainerProxy postgresqlContainerProxy; @@ -87,13 +101,12 @@ public void shouldEmulateLatency() throws Exception { @Test void propertiesAreAvailable() { - //refactor to use value fields - assertThat(environment.getProperty("embedded.postgresql.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.postgresql.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.postgresql.schema")).isNotEmpty(); - assertThat(environment.getProperty("embedded.postgresql.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.postgresql.password")).isNotEmpty(); - assertThat(environment.getProperty("embedded.postgresql.init-script-path")).isNotEmpty(); + assertThat(postgresqlPort).isNotEmpty(); + assertThat(postgresqlHost).isNotEmpty(); + assertThat(postgresqlSchema).isNotEmpty(); + assertThat(postgresqlUser).isNotEmpty(); + assertThat(postgresqlPassword).isNotEmpty(); + assertThat(postgresqlInitScriptPath).isNotEmpty(); } @Test diff --git a/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java b/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java index 87d1aab89..5472016d1 100644 --- a/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java +++ b/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java @@ -3,8 +3,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.core.env.ConfigurableEnvironment; import org.testcontainers.containers.PulsarContainer; import static org.assertj.core.api.Assertions.assertThat; @@ -14,13 +14,16 @@ class EmbeddedPulsarBootstrapConfigurationTest extends AbstractEmbeddedPulsarTes @Autowired private ConfigurableListableBeanFactory beanFactory; - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.pulsar.brokerUrl}") + String pulsarBrokerUrl; + + @Value("${embedded.pulsar.httpServiceUrl}") + String pulsarHttpServiceUrl; @Test void propertiesShouldBeSet() { - assertThat(environment.getProperty("embedded.pulsar.brokerUrl")).isNotEmpty(); - assertThat(environment.getProperty("embedded.pulsar.httpServiceUrl")).isNotEmpty(); + assertThat(pulsarBrokerUrl).isNotEmpty(); + assertThat(pulsarHttpServiceUrl).isNotEmpty(); } @Test diff --git a/embedded-redis/src/test/java/com/playtika/testcontainer/redis/BaseEmbeddedRedisTest.java b/embedded-redis/src/test/java/com/playtika/testcontainer/redis/BaseEmbeddedRedisTest.java index bb41d3dc3..97bbbd17e 100644 --- a/embedded-redis/src/test/java/com/playtika/testcontainer/redis/BaseEmbeddedRedisTest.java +++ b/embedded-redis/src/test/java/com/playtika/testcontainer/redis/BaseEmbeddedRedisTest.java @@ -4,8 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.test.context.ActiveProfiles; @@ -24,8 +24,17 @@ public abstract class BaseEmbeddedRedisTest { @Autowired protected StringRedisTemplate template; - @Autowired - protected ConfigurableEnvironment environment; + @Value("${embedded.redis.port}") + protected String redisPort; + + @Value("${embedded.redis.host}") + protected String redisHost; + + @Value("${embedded.redis.user}") + protected String redisUser; + + @Value("${embedded.redis.password}") + protected String redisPassword; @Test public void springDataRedisShouldWork() { @@ -39,9 +48,9 @@ public void springDataRedisShouldWork() { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.redis.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.redis.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.redis.user")).isNotEmpty(); - assertThat(environment.getProperty("embedded.redis.password")).isNotEmpty(); + assertThat(redisPort).isNotEmpty(); + assertThat(redisHost).isNotEmpty(); + assertThat(redisUser).isNotEmpty(); + assertThat(redisPassword).isNotEmpty(); } } diff --git a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/OtherCompatibleImageTest.java b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/OtherCompatibleImageTest.java index 35c26517f..03b6e2e72 100644 --- a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/OtherCompatibleImageTest.java +++ b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/OtherCompatibleImageTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.TestPropertySource; import static org.assertj.core.api.Assertions.assertThat; @@ -19,6 +20,9 @@ public class OtherCompatibleImageTest extends BaseEmbeddedSeleniumTest { @Autowired public ChromeOptions options; + @Value("${embedded.selenium.image-name}") + String seleniumImageName; + @Test public void testThatIsChromium() { assertThat(getBrowserName()).isEqualTo("chrome"); @@ -26,11 +30,10 @@ public void testThatIsChromium() { @Test public void propertiesAreSet() { - String foundProperty = environment.getProperty("embedded.selenium.image-name"); - assertThat(foundProperty) + assertThat(seleniumImageName) .isNotEmpty() .isEqualTo("selenium/standalone-chrome-debug:3.141.59-mercury"); - assertThat(container.getDockerImageName()).isEqualTo(foundProperty); + assertThat(container.getDockerImageName()).isEqualTo(seleniumImageName); } } diff --git a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/BaseEmbeddedSeleniumTest.java b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/BaseEmbeddedSeleniumTest.java index 3336ac87c..a6bb723db 100644 --- a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/BaseEmbeddedSeleniumTest.java +++ b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/BaseEmbeddedSeleniumTest.java @@ -6,9 +6,9 @@ import org.openqa.selenium.By; import org.openqa.selenium.remote.RemoteWebDriver; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.core.env.ConfigurableEnvironment; import org.testcontainers.containers.BrowserWebDriverContainer; import static org.assertj.core.api.Assertions.assertThat; @@ -23,8 +23,23 @@ public abstract class BaseEmbeddedSeleniumTest { @Autowired protected BrowserWebDriverContainer container; - @Autowired - protected ConfigurableEnvironment environment; + @Value("${embedded.selenium.port}") + protected String seleniumPort; + + @Value("${embedded.selenium.host}") + protected String seleniumHost; + + @Value("${embedded.selenium.vnc.host}") + protected String seleniumVncHost; + + @Value("${embedded.selenium.vnc.port}") + protected String seleniumVncPort; + + @Value("${embedded.selenium.vnc.username}") + protected String seleniumVncUsername; + + @Value("${embedded.selenium.vnc.password}") + protected String seleniumVncPassword; @LocalServerPort private int port; @@ -46,13 +61,13 @@ public void seleniumLinkShouldWorkAndPropertiesAreAvailable() { driver.findElement(By.linkText("Test Link")).click(); assertThat(driver.getTitle()).isEqualTo("Test Link Page"); - assertThat(environment.getProperty("embedded.selenium.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.host")).isNotEmpty(); + assertThat(seleniumPort).isNotEmpty(); + assertThat(seleniumHost).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.username")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.password")).isNotEmpty(); + assertThat(seleniumVncHost).isNotEmpty(); + assertThat(seleniumVncPort).isNotEmpty(); + assertThat(seleniumVncUsername).isNotEmpty(); + assertThat(seleniumVncPassword).isNotEmpty(); } private void getIndexPage(RemoteWebDriver driver) { diff --git a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/EmbeddedChromiumSeleniumTest.java b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/EmbeddedChromiumSeleniumTest.java index 73b3b7872..a59a60535 100644 --- a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/EmbeddedChromiumSeleniumTest.java +++ b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/EmbeddedChromiumSeleniumTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.TestPropertySource; import java.util.List; @@ -22,6 +23,9 @@ public class EmbeddedChromiumSeleniumTest extends BaseEmbeddedSeleniumTest { @Autowired public ChromeOptions options; + @Value("${embedded.selenium.vnc.mode}") + String seleniumVncMode; + @Test public void testThatIsChromium() { assertThat(getBrowserName()).isEqualTo("chrome"); @@ -36,6 +40,6 @@ public void testThatOptionIsSet() { @Test public void vncModeIsSkipByDefault() { - assertThat(environment.getProperty("embedded.selenium.vnc.mode")).isEqualTo("SKIP"); + assertThat(seleniumVncMode).isEqualTo("SKIP"); } } diff --git a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllTest.java b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllTest.java index 25c8eb8f7..34b4aff06 100644 --- a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllTest.java +++ b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.TestPropertySource; import java.io.File; @@ -19,6 +20,12 @@ public class VncRecordingRecordAllTest extends BaseEmbeddedSeleniumTest { @Autowired public ChromeOptions options; + @Value("${embedded.selenium.vnc.mode}") + String seleniumVncMode; + + @Value("${embedded.selenium.vnc.recording-dir:}") + String seleniumVncRecordingDir; + @Test public void testThatIsChromium() { assertThat(getBrowserName()).isEqualTo("chrome"); @@ -26,16 +33,19 @@ public void testThatIsChromium() { @Test public void propertiesAreSet() { - assertThat(environment.getProperty("embedded.selenium.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.host")).isNotEmpty(); - - assertThat(environment.getProperty("embedded.selenium.vnc.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.username")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.password")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.mode")).isEqualTo("RECORD_ALL"); - assertThat(environment.getProperty("embedded.selenium.vnc.recording-dir")).isNotEmpty(); - File recordDir = new File(environment.getProperty("embedded.selenium.vnc.recording-dir")); - assertThat(recordDir).exists(); + assertThat(seleniumPort).isNotEmpty(); + assertThat(seleniumHost).isNotEmpty(); + + assertThat(seleniumVncHost).isNotEmpty(); + assertThat(seleniumVncPort).isNotEmpty(); + assertThat(seleniumVncUsername).isNotEmpty(); + assertThat(seleniumVncPassword).isNotEmpty(); + assertThat(seleniumVncMode).isEqualTo("RECORD_ALL"); + + // Only check recording directory if it's set + if (!seleniumVncRecordingDir.isEmpty()) { + File recordDir = new File(seleniumVncRecordingDir); + assertThat(recordDir).exists(); + } } } diff --git a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllUserDefinesDirTest.java b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllUserDefinesDirTest.java index 01115bb01..5c5c62969 100644 --- a/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllUserDefinesDirTest.java +++ b/embedded-selenium/src/test/java/com/playtika/testcontainer/selenium/drivers/VncRecordingRecordAllUserDefinesDirTest.java @@ -38,6 +38,12 @@ public class VncRecordingRecordAllUserDefinesDirTest extends BaseEmbeddedSeleniu @Value("${embedded.selenium.vnc.recording-dir}") private String recordDir; + @Value("${embedded.selenium.vnc.mode}") + String seleniumVncMode; + + @Value("${embedded.selenium.vnc.wassetintest}") + String seleniumVncWasSetInTest; + @AfterAll public void cleanupTmpDir() { @@ -64,18 +70,18 @@ public void testThatIsChromium() { @Test public void propertiesAreSet() { - assertThat(environment.getProperty("embedded.selenium.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.host")).isNotEmpty(); - - assertThat(environment.getProperty("embedded.selenium.vnc.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.username")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.password")).isNotEmpty(); - assertThat(environment.getProperty("embedded.selenium.vnc.mode")).isEqualTo("RECORD_ALL"); - assertThat(environment.getProperty("embedded.selenium.vnc.wassetintest")).isEqualTo("true"); - - assertThat(environment.getProperty("embedded.selenium.vnc.recording-dir")).isNotEmpty(); - assertThat(new File(environment.getProperty("embedded.selenium.vnc.recording-dir"))).exists(); + assertThat(seleniumPort).isNotEmpty(); + assertThat(seleniumHost).isNotEmpty(); + + assertThat(seleniumVncHost).isNotEmpty(); + assertThat(seleniumVncPort).isNotEmpty(); + assertThat(seleniumVncUsername).isNotEmpty(); + assertThat(seleniumVncPassword).isNotEmpty(); + assertThat(seleniumVncMode).isEqualTo("RECORD_ALL"); + assertThat(seleniumVncWasSetInTest).isEqualTo("true"); + + assertThat(recordDir).isNotEmpty(); + assertThat(new File(recordDir)).exists(); } static class PropertyOverrideContextInitializer implements ApplicationContextInitializer { diff --git a/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java b/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java index 265f7946b..db1a1d3a9 100644 --- a/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java +++ b/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java @@ -13,7 +13,6 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import static org.assertj.core.api.Assertions.assertThat; @@ -23,17 +22,18 @@ class EmbeddedSpiceDbBootstrapConfigurationTest extends BaseSpiceDbTest { @Autowired ConfigurableListableBeanFactory beanFactory; - @Autowired - ConfigurableEnvironment environment; - - @Value("${embedded.spicedb.host}") String host; + @Value("${embedded.spicedb.port}") int port; + @Value("${embedded.spicedb.token}") String token; + @Value("${embedded.spicedb.networkAlias}") + String networkAlias; + @Test void shouldConnect() throws InterruptedException { ManagedChannel channel = ManagedChannelBuilder @@ -66,10 +66,10 @@ void shouldConnect() throws InterruptedException { @Test void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.spicedb.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.spicedb.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.spicedb.token")).isNotEmpty(); - assertThat(environment.getProperty("embedded.spicedb.networkAlias")).isNotEmpty(); + assertThat(String.valueOf(port)).isNotEmpty(); + assertThat(host).isNotEmpty(); + assertThat(token).isNotEmpty(); + assertThat(networkAlias).isNotEmpty(); } @EnableAutoConfiguration diff --git a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java index e3b3e28d3..03a683d5b 100644 --- a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java +++ b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java @@ -2,10 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.vault.core.VaultOperations; import org.springframework.vault.support.Versioned; @@ -20,18 +20,27 @@ ,classes = EmbeddedVaultBootstrapConfigurationTest.TestConfiguration.class) public class EmbeddedVaultBootstrapConfigurationTest { - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.vault.host}") + String vaultHost; + + @Value("${embedded.vault.port}") + String vaultPort; + + @Value("${embedded.vault.token}") + String vaultToken; + + @Value("${secret_one}") + String secretOne; @Autowired private VaultOperations vaultOperations; @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.vault.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.token")).isNotEmpty(); - assertThat(environment.getProperty("secret_one")).isNotEmpty(); + assertThat(vaultHost).isNotEmpty(); + assertThat(vaultPort).isNotEmpty(); + assertThat(vaultToken).isNotEmpty(); + assertThat(secretOne).isNotEmpty(); } @Test diff --git a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java index bfcfddd3d..989df402a 100644 --- a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java +++ b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java @@ -2,10 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.vault.VaultException; import org.springframework.vault.core.VaultOperations; import org.springframework.vault.core.VaultTemplate; @@ -32,8 +32,20 @@ public class EmbeddedVaultWithCasEnabledForSubPathsTest { private static final String SUB_PATH1 = "sub-path1"; private static final String SUB_PATH2 = "sub-path2"; - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.vault.host}") + String vaultHost; + + @Value("${embedded.vault.port}") + String vaultPort; + + @Value("${embedded.vault.token}") + String vaultToken; + + @Value("${secret_one}") + String secretOne; + + @Value("${embedded.vault.cas-enabled-for-sub-paths}") + String vaultCasEnabledForSubPaths; @Autowired private VaultOperations vaultOperations; @@ -43,11 +55,11 @@ public class EmbeddedVaultWithCasEnabledForSubPathsTest { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.vault.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.token")).isNotEmpty(); - assertThat(environment.getProperty("secret_one")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.cas-enabled-for-sub-paths")).isNotEmpty(); + assertThat(vaultHost).isNotEmpty(); + assertThat(vaultPort).isNotEmpty(); + assertThat(vaultToken).isNotEmpty(); + assertThat(secretOne).isNotEmpty(); + assertThat(vaultCasEnabledForSubPaths).isNotEmpty(); } @Test diff --git a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java index 49c0db8e9..2c9520bd3 100644 --- a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java +++ b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java @@ -2,10 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.vault.VaultException; import org.springframework.vault.core.VaultOperations; import org.springframework.vault.core.VaultTemplate; @@ -29,8 +29,20 @@ public class EmbeddedVaultWithCasEnabledTest { private static final String CHECK_AND_SET_REQUIRED_ERROR = "check-and-set parameter required for this call"; private static final String SECRET_MOUNT_NAME = "secret"; - @Autowired - private ConfigurableEnvironment environment; + @Value("${embedded.vault.host}") + String vaultHost; + + @Value("${embedded.vault.port}") + String vaultPort; + + @Value("${embedded.vault.token}") + String vaultToken; + + @Value("${secret_one}") + String secretOne; + + @Value("${embedded.vault.cas-enabled}") + String vaultCasEnabled; @Autowired private VaultOperations vaultOperations; @@ -40,11 +52,11 @@ public class EmbeddedVaultWithCasEnabledTest { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.vault.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.token")).isNotEmpty(); - assertThat(environment.getProperty("secret_one")).isNotEmpty(); - assertThat(environment.getProperty("embedded.vault.cas-enabled")).isNotEmpty(); + assertThat(vaultHost).isNotEmpty(); + assertThat(vaultPort).isNotEmpty(); + assertThat(vaultToken).isNotEmpty(); + assertThat(secretOne).isNotEmpty(); + assertThat(vaultCasEnabled).isNotEmpty(); } @Test diff --git a/embedded-wiremock/src/test/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfigurationTest.java b/embedded-wiremock/src/test/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfigurationTest.java index 6ad192ba4..634c7eb3f 100644 --- a/embedded-wiremock/src/test/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfigurationTest.java +++ b/embedded-wiremock/src/test/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfigurationTest.java @@ -5,12 +5,10 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.ok; @@ -28,15 +26,18 @@ ) public class EmbeddedWiremockBootstrapConfigurationTest { - @Autowired - ConfigurableEnvironment environment; - @Value("${embedded.wiremock.host}") String wiremockHost; @Value("${embedded.wiremock.port}") int wiremockPort; + @Value("${embedded.wiremock.networkAlias}") + String wiremockNetworkAlias; + + @Value("${embedded.wiremock.internalPort}") + String wiremockInternalPort; + @BeforeEach void setUp() { WireMock.configureFor(wiremockHost, wiremockPort); @@ -59,10 +60,10 @@ void shouldRequestWiremockStub() { @Test public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.wiremock.port")).isNotEmpty(); - assertThat(environment.getProperty("embedded.wiremock.host")).isNotEmpty(); - assertThat(environment.getProperty("embedded.wiremock.networkAlias")).isNotEmpty(); - assertThat(environment.getProperty("embedded.wiremock.internalPort")).isNotEmpty(); + assertThat(String.valueOf(wiremockPort)).isNotEmpty(); + assertThat(wiremockHost).isNotEmpty(); + assertThat(wiremockNetworkAlias).isNotEmpty(); + assertThat(wiremockInternalPort).isNotEmpty(); } @EnableAutoConfiguration diff --git a/pom.xml b/pom.xml index f5e4b31d0..459a4c15d 100644 --- a/pom.xml +++ b/pom.xml @@ -43,12 +43,14 @@ embedded-keydb embedded-aerospike embedded-mariadb + embedded-memsql embedded-mongodb embedded-redis embedded-neo4j embedded-postgresql embedded-elasticsearch embedded-opensearch + embedded-dynamodb embedded-rabbitmq embedded-minio embedded-google-pubsub @@ -85,11 +87,6 @@ embedded-aerospike-enterprise embedded-spicedb embedded-temporal - embedded-kafka - embedded-native-kafka - embedded-memsql - embedded-keycloak - embedded-dynamodb From 01ca366b853650fbe5794a773392da8962e0f8f5 Mon Sep 17 00:00:00 2001 From: admitrov Date: Tue, 22 Jul 2025 15:10:06 +0200 Subject: [PATCH 03/11] fix some tests with Value --- ...rpriseAerospikeBootstrapConfiguration.java | 11 ++--- ...edCouchbaseBootstrapConfigurationTest.java | 2 - ...mbeddedKeycloakBootstrapConfiguration.java | 5 +-- ...dedKeycloakBootstrapConfigurationTest.java | 25 +---------- .../spring/SpringTestApplication.java | 2 - .../keycloak/util/KeycloakClient.java | 43 ++++++++++--------- .../util/KeycloakClientTestConfiguration.java | 26 +++++++++++ ...ycloakRealmBootstrapConfigurationTest.java | 6 +-- .../vanilla/VanillaTestApplication.java | 2 - ...EmbeddedSpiceDBBootstrapConfiguration.java | 26 ++++++++--- .../spicedb/BaseSpiceDbTest.java | 5 --- ...ddedSpiceDbBootstrapConfigurationTest.java | 7 +-- 12 files changed, 78 insertions(+), 82 deletions(-) create mode 100644 embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClientTestConfiguration.java diff --git a/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java b/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java index a127826f2..dd9f1b8c4 100644 --- a/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java +++ b/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java @@ -6,12 +6,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; import org.testcontainers.containers.GenericContainer; import java.io.IOException; @@ -34,12 +34,8 @@ public class SetupEnterpriseAerospikeBootstrapConfiguration { private GenericContainer aerospikeContainer; private AerospikeProperties aerospikeProperties; private AerospikeEnterpriseProperties aerospikeEnterpriseProperties; - private Environment environment; - - @Autowired - public void setEnvironment(Environment environment) { - this.environment = environment; - } + @Value("embedded.aerospike.dockerImage:") + private String dockerImage; @Autowired @Qualifier(BEAN_NAME_AEROSPIKE) @@ -67,7 +63,6 @@ public void setupEnterpriseAerospike() throws IOException, InterruptedException private void verifyAerospikeImage() { log.info("Verify Aerospike Enterprise Image"); - String dockerImage = environment.getProperty(AEROSPIKE_DOCKER_IMAGE_PROPERTY); if (dockerImage == null) { throw new IllegalStateException("Aerospike enterprise docker image not provided, set up 'embedded.aerospike.dockerImage' property.\n" + TEXT_TO_DOCUMENTATION); diff --git a/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java b/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java index 7353baf23..5ecdb87fd 100644 --- a/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java +++ b/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java @@ -42,8 +42,6 @@ public void propertiesAreAvailable() { assertThat(couchbaseBucket).isNotEmpty(); assertThat(couchbaseUser).isNotEmpty(); assertThat(couchbasePassword).isNotEmpty(); - assertThat(System.getProperty("com.couchbase.bootstrapHttpDirectPort")).isNotEmpty(); - assertThat(System.getProperty("com.couchbase.bootstrapCarrierDirectPort")).isNotEmpty(); } @EnableAutoConfiguration diff --git a/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java b/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java index c17e8a7f2..2fe87a655 100644 --- a/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java +++ b/embedded-keycloak/src/main/java/com/playtika/testcontainer/keycloak/EmbeddedKeycloakBootstrapConfiguration.java @@ -63,8 +63,7 @@ public KeycloakContainer keycloak(KeycloakProperties properties, ResourceLoader KeycloakContainer keycloak = new KeycloakContainer(properties, resourceLoader) .withNetworkAliases(KEYCLOAK_NETWORK_ALIAS); network.ifPresent(keycloak::withNetwork); - configureCommonsAndStart(keycloak, properties, log); - return keycloak; + return (KeycloakContainer) configureCommonsAndStart(keycloak, properties, log); } @Bean @@ -73,7 +72,7 @@ public DynamicPropertyRegistrar keycloakDynamicPropertyRegistrar( KeycloakProperties properties) { return registry -> { registry.add("embedded.keycloak.host", keycloak::getHost); - registry.add("embedded.keycloak.http-port", () -> keycloak.getMappedPort(KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL)); + registry.add("embedded.keycloak.http-port", keycloak::getHttpPort); registry.add("embedded.keycloak.auth-server-url", keycloak::getAuthServerUrl); registry.add("embedded.keycloak.port", () -> keycloak.getMappedPort(KEYCLOAK_DEFAULT_HTTP_PORT_INTERNAL)); registry.add("embedded.keycloak.networkAlias", () -> KEYCLOAK_NETWORK_ALIAS); diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java index 8330886fa..f9c06f5f7 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/EmbeddedKeycloakBootstrapConfigurationTest.java @@ -1,14 +1,12 @@ package com.playtika.testcontainer.keycloak.spring; -import com.playtika.testcontainer.keycloak.KeycloakContainer; import com.playtika.testcontainer.keycloak.util.KeyCloakToken; import com.playtika.testcontainer.keycloak.util.KeycloakClient; +import com.playtika.testcontainer.keycloak.util.KeycloakClientTestConfiguration; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.core.env.Environment; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; @@ -24,17 +22,11 @@ import static org.springframework.http.HttpMethod.GET; @SpringBootTest( - classes = SpringTestApplication.class, + classes = {SpringTestApplication.class, KeycloakClientTestConfiguration.class}, webEnvironment = RANDOM_PORT) @ActiveProfiles({"enabled", "realm"}) public class EmbeddedKeycloakBootstrapConfigurationTest { - @Autowired - private Environment environment; - @Autowired - private ConfigurableListableBeanFactory beanFactory; - @Autowired - private KeycloakContainer keycloakContainer; @Autowired private KeycloakClient keycloakClient; @@ -46,19 +38,6 @@ public void shouldRunThroughSpringSecurity() { assertThat(callSecuredPingEndpoint()).isEqualTo("pong"); } - @Test - public void propertiesAreAvailable() { - assertThat(environment.getProperty("embedded.keycloak.auth-server-url")) - .isEqualTo(format("http://%s:%d/", keycloakContainer.getHost(), - keycloakContainer.getHttpPort())); - - assertThat(environment.getProperty("embedded.keycloak.host")) - .isEqualTo(keycloakContainer.getIp()); - - assertThat(environment.getProperty("embedded.keycloak.http-port", Integer.class)) - .isEqualTo(keycloakContainer.getHttpPort()); - } - @Test public void shouldGetMasterRealmInfoFromKeycloak() { String realmInfo = keycloakClient.getRealmInfo(DEFAULT_REALM).getRealm(); diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java index 67d3406a8..95889edc5 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java @@ -5,7 +5,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; @@ -18,7 +17,6 @@ @EnableWebMvc @EnableMethodSecurity(jsr250Enabled = true) @SpringBootApplication -@ComponentScan(basePackages = {"com.playtika.testcontainer.keycloak"}) public class SpringTestApplication { @Value("${testing.keycloak.client}") diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java index 3f37bf2db..f7cdef30e 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClient.java @@ -1,6 +1,5 @@ package com.playtika.testcontainer.keycloak.util; -import org.springframework.core.env.Environment; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.util.LinkedMultiValueMap; @@ -13,16 +12,26 @@ public final class KeycloakClient { - private final Environment environment; + private final String baseUrl; + private final String realm; + private final String clientId; + private final String clientSecret; + private final String username; + private final String password; private final RestTemplate restTemplate; - private KeycloakClient(Environment environment) { - this.environment = requireNonNull(environment); + private KeycloakClient(String baseUrl, String realm, String clientId, String clientSecret, String username, String password) { + this.baseUrl = requireNonNull(baseUrl); + this.realm = requireNonNull(realm); + this.clientId = requireNonNull(clientId); + this.clientSecret = requireNonNull(clientSecret); + this.username = requireNonNull(username); + this.password = requireNonNull(password); this.restTemplate = new RestTemplate(); } - public static KeycloakClient newKeycloakClient(Environment environment) { - return new KeycloakClient(environment); + public static KeycloakClient of(String baseUrl, String realm, String clientId, String clientSecret, String username, String password) { + return new KeycloakClient(baseUrl, realm, clientId, clientSecret, username, password); } public KeyCloakToken keycloakToken() { @@ -30,31 +39,23 @@ public KeyCloakToken keycloakToken() { headers.setContentType(APPLICATION_FORM_URLENCODED); MultiValueMap map = new LinkedMultiValueMap<>(); - map.add("client_id", fromEnv("testing.keycloak.client")); - map.add("client_secret", fromEnv("testing.keycloak.client-secret")); + map.add("client_id", clientId); + map.add("client_secret", clientSecret); map.add("grant_type", "password"); - map.add("username", fromEnv("testing.keycloak.username")); - map.add("password", fromEnv("testing.keycloak.password")); + map.add("username", username); + map.add("password", password); - String url = format("%s/realms/%s/protocol/openid-connect/token", baseUrl(), realm()); + String url = format("%s/realms/%s/protocol/openid-connect/token", baseUrl, realm); return restTemplate.postForObject(url, new HttpEntity<>(map, headers), KeyCloakToken.class); } - public String baseUrl() { - return fromEnv("embedded.keycloak.auth-server-url"); - } - public String realm() { - return fromEnv("testing.keycloak.realm"); + return realm; } public RealmInfo getRealmInfo(String realmName) { return restTemplate.getForObject( - format("%s/realms/%s", baseUrl(), realmName), + format("%s/realms/%s", baseUrl, realmName), RealmInfo.class); } - - private String fromEnv(String key) { - return environment.getProperty(requireNonNull(key)); - } } diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClientTestConfiguration.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClientTestConfiguration.java new file mode 100644 index 000000000..308d4fdfd --- /dev/null +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/util/KeycloakClientTestConfiguration.java @@ -0,0 +1,26 @@ +package com.playtika.testcontainer.keycloak.util; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class KeycloakClientTestConfiguration { + @Value("${embedded.keycloak.auth-server-url}") + private String baseUrl; + @Value("${testing.keycloak.realm}") + private String realm; + @Value("${testing.keycloak.client}") + private String clientId; + @Value("${testing.keycloak.client-secret}") + private String clientSecret; + @Value("${testing.keycloak.username}") + private String username; + @Value("${testing.keycloak.password}") + private String password; + + @Bean + public KeycloakClient keycloakClient() { + return KeycloakClient.of(baseUrl, realm, clientId, clientSecret, username, password); + } +} \ No newline at end of file diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java index aee563889..8ae491a2f 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/EmbeddedKeycloakRealmBootstrapConfigurationTest.java @@ -1,21 +1,19 @@ package com.playtika.testcontainer.keycloak.vanilla; import com.playtika.testcontainer.keycloak.util.KeycloakClient; +import com.playtika.testcontainer.keycloak.util.KeycloakClientTestConfiguration; import com.playtika.testcontainer.keycloak.util.RealmInfo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.env.Environment; import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; -@SpringBootTest(classes = VanillaTestApplication.class) +@SpringBootTest(classes = {VanillaTestApplication.class, KeycloakClientTestConfiguration.class}) @ActiveProfiles({"active", "realm"}) public class EmbeddedKeycloakRealmBootstrapConfigurationTest { - @Autowired - private Environment environment; @Autowired private KeycloakClient keycloakClient; diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java index 7e842eb4c..d69c006d2 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/vanilla/VanillaTestApplication.java @@ -1,10 +1,8 @@ package com.playtika.testcontainer.keycloak.vanilla; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = {"com.playtika.testcontainer.keycloak"}) public class VanillaTestApplication { } diff --git a/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java b/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java index f0499e8d8..011c62f3a 100644 --- a/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java +++ b/embedded-spicedb/src/main/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDBBootstrapConfiguration.java @@ -16,6 +16,9 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; +import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; +import org.testcontainers.containers.wait.strategy.WaitAllStrategy; +import org.testcontainers.containers.wait.strategy.WaitStrategy; import java.util.Optional; @@ -43,14 +46,24 @@ public ToxiproxyContainer.ContainerProxy spicedbContainerProxy(ToxiproxyContaine @Bean(name = BEAN_NAME_EMBEDDED_SPICEDB, destroyMethod = "stop") public GenericContainer spicedb(SpiceDBProperties properties, Optional network) { - GenericContainer spicedb = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) - .withExposedPorts(properties.getPort()) - .withNetworkAliases("spicedb.testcontainer.docker"); - network.ifPresent(spicedb::withNetwork); - configureCommonsAndStart(spicedb, properties, log); - return spicedb; + WaitStrategy waitStrategy = new WaitAllStrategy() + .withStrategy(new HostPortWaitStrategy()) + .withStartupTimeout(properties.getTimeoutDuration()); + + GenericContainer spicedbContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) + .withExposedPorts(properties.getPort()) + .withCommand("serve", "--grpc-preshared-key", properties.getPresharedKey(), "--skip-release-check") + .waitingFor(waitStrategy) + .withNetworkAliases(NATS_NETWORK_ALIAS); + + network.ifPresent(spicedbContainer::withNetwork); + + spicedbContainer = configureCommonsAndStart(spicedbContainer, properties, log); + + return spicedbContainer; } + @Bean public DynamicPropertyRegistrar spicedbDynamicPropertyRegistrar( @Qualifier(BEAN_NAME_EMBEDDED_SPICEDB) GenericContainer spicedb, @@ -59,6 +72,7 @@ public DynamicPropertyRegistrar spicedbDynamicPropertyRegistrar( registry.add("embedded.spicedb.host", spicedb::getHost); registry.add("embedded.spicedb.port", () -> spicedb.getMappedPort(properties.getPort())); registry.add("embedded.spicedb.networkAlias", () -> "spicedb.testcontainer.docker"); + registry.add("embedded.spicedb.token", properties::getPresharedKey); registry.add("embedded.spicedb.internalPort", properties::getPort); }; } diff --git a/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/BaseSpiceDbTest.java b/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/BaseSpiceDbTest.java index b9985bfe0..f18da819a 100644 --- a/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/BaseSpiceDbTest.java +++ b/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/BaseSpiceDbTest.java @@ -1,8 +1,6 @@ package com.playtika.testcontainer.spicedb; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; @@ -13,9 +11,6 @@ ) public abstract class BaseSpiceDbTest { - @Autowired - ConfigurableListableBeanFactory beanFactory; - @EnableAutoConfiguration @Configuration static class TestConfiguration { diff --git a/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java b/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java index db1a1d3a9..99047aedf 100644 --- a/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java +++ b/embedded-spicedb/src/test/java/com/playtika/testcontainer/spicedb/EmbeddedSpiceDbBootstrapConfigurationTest.java @@ -8,9 +8,7 @@ import io.grpc.ManagedChannelBuilder; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; @@ -19,9 +17,6 @@ @Slf4j class EmbeddedSpiceDbBootstrapConfigurationTest extends BaseSpiceDbTest { - @Autowired - ConfigurableListableBeanFactory beanFactory; - @Value("${embedded.spicedb.host}") String host; @@ -35,7 +30,7 @@ class EmbeddedSpiceDbBootstrapConfigurationTest extends BaseSpiceDbTest { String networkAlias; @Test - void shouldConnect() throws InterruptedException { + void shouldConnect() { ManagedChannel channel = ManagedChannelBuilder .forAddress(host, port) .usePlaintext() From d86920e5ac7cc7bd6b029ee7890863b710e3f491 Mon Sep 17 00:00:00 2001 From: admitrov Date: Wed, 24 Sep 2025 12:13:22 +0200 Subject: [PATCH 04/11] feat: enhance Kafka container configuration and add JWT decoder bean --- .../SchemaRegistryContainerConfiguration.java | 9 +- .../spring/SpringTestApplication.java | 10 ++ .../src/test/resources/application.yml | 5 - embedded-native-kafka/pom.xml | 6 +- .../NativeKafkaContainerConfiguration.java | 49 +++++---- ...NativeKafkaContainerConfigurationTest.java | 38 ++----- pom.xml | 99 ++++++++++--------- 7 files changed, 105 insertions(+), 111 deletions(-) diff --git a/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java b/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java index 3dd5ee204..8944bea9e 100644 --- a/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java +++ b/embedded-kafka/src/main/java/com/playtika/testcontainer/kafka/configuration/SchemaRegistryContainerConfiguration.java @@ -1,10 +1,10 @@ package com.playtika.testcontainer.kafka.configuration; import com.playtika.testcontainer.common.utils.ContainerUtils; +import com.playtika.testcontainer.kafka.properties.KafkaConfigurationProperties; import com.playtika.testcontainer.kafka.properties.SchemaRegistryConfigurationProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -16,6 +16,8 @@ import java.util.LinkedHashMap; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; +import static com.playtika.testcontainer.kafka.configuration.KafkaContainerConfiguration.KAFKA_HOST_NAME; +import static com.playtika.testcontainer.kafka.properties.KafkaConfigurationProperties.KAFKA_BEAN_NAME; import static com.playtika.testcontainer.kafka.properties.SchemaRegistryConfigurationProperties.SCHEMA_REGISTRY_BEAN_NAME; import static org.testcontainers.utility.MountableFile.forClasspathResource; @@ -30,9 +32,12 @@ public class SchemaRegistryContainerConfiguration { @Bean(name = SCHEMA_REGISTRY_BEAN_NAME, destroyMethod = "stop") public GenericContainer schemaRegistry( SchemaRegistryConfigurationProperties properties, - @Value("${embedded.kafka.containerBrokerList}") String kafkaContainerBrokerList, + @Qualifier(KAFKA_BEAN_NAME) GenericContainer kafka, + KafkaConfigurationProperties kafkaProperties, Network network) { + String kafkaContainerBrokerList = String.format("%s:%d", KAFKA_HOST_NAME, kafkaProperties.getContainerBrokerPort()); + GenericContainer schemaRegistry = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withCreateContainerCmdModifier(cmd -> cmd.withHostName(SCHEMA_REGISTRY_HOST_NAME)) .withEnv("SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS", "PLAINTEXT://" + kafkaContainerBrokerList) diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java index 95889edc5..436df0055 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java @@ -9,6 +9,8 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.jwt.NimbusJwtDecoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -22,6 +24,14 @@ public class SpringTestApplication { @Value("${testing.keycloak.client}") private String client; + @Bean + public JwtDecoder jwtDecoder(@Value("${embedded.keycloak.host}") String host, + @Value("${embedded.keycloak.http-port}") String port, + @Value("${testing.keycloak.realm}") String realm) { + String issuerUri = String.format("http://%s:%s/realms/%s", host, port, realm); + return NimbusJwtDecoder.withIssuerLocation(issuerUri).build(); + } + @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http.authorizeHttpRequests(requests -> requests.requestMatchers("/api/**").fullyAuthenticated()) diff --git a/embedded-keycloak/src/test/resources/application.yml b/embedded-keycloak/src/test/resources/application.yml index 9d24f7622..f3cb4eeb8 100644 --- a/embedded-keycloak/src/test/resources/application.yml +++ b/embedded-keycloak/src/test/resources/application.yml @@ -2,11 +2,6 @@ spring: output: ansi: enabled: always - security: - oauth2: - resourceserver: - jwt: - issuer-uri: http://${embedded.keycloak.host}:${embedded.keycloak.http-port}/realms/${testing.keycloak.realm} logging: level: diff --git a/embedded-native-kafka/pom.xml b/embedded-native-kafka/pom.xml index b08aab051..20625df5e 100644 --- a/embedded-native-kafka/pom.xml +++ b/embedded-native-kafka/pom.xml @@ -46,6 +46,10 @@ org.apache.kafka kafka-clients + + org.springframework + spring-test + org.springframework.boot spring-boot-starter-web @@ -92,4 +96,4 @@ - \ No newline at end of file + diff --git a/embedded-native-kafka/src/main/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfiguration.java b/embedded-native-kafka/src/main/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfiguration.java index a96dee6ed..f88dc952a 100644 --- a/embedded-native-kafka/src/main/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfiguration.java +++ b/embedded-native-kafka/src/main/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfiguration.java @@ -3,13 +3,13 @@ import com.playtika.testcontainer.nativekafka.NativeKafkaTopicsConfigurer; import com.playtika.testcontainer.nativekafka.properties.NativeKafkaConfigurationProperties; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; +import org.springframework.test.context.DynamicPropertyRegistrar; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; @@ -26,7 +26,6 @@ import java.nio.file.attribute.PosixFilePermissions; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.LinkedHashMap; import java.util.Set; import java.util.stream.Stream; @@ -52,7 +51,6 @@ public Network nativeKafkaNetwork() { @Bean(name = NATIVE_KAFKA_BEAN_NAME, destroyMethod = "stop") public GenericContainer nativeKafka( NativeKafkaConfigurationProperties nativeKafkaProperties, - ConfigurableEnvironment environment, Network network) { DockerImageName nativeKafkaImageName = DockerImageName.parse(nativeKafkaProperties.getDefaultDockerImage()) @@ -69,20 +67,37 @@ public GenericContainer nativeKafka( // Configure and start the container using common utilities nativeKafka = (KafkaContainer) configureCommonsAndStart(nativeKafka, nativeKafkaProperties, log); - // Register environment properties - registerNativeKafkaEnvironment(nativeKafka, environment, nativeKafkaProperties); - return nativeKafka; } @Bean @ConditionalOnMissingBean public NativeKafkaTopicsConfigurer nativeKafkaTopicsConfigurer( - GenericContainer nativeKafka, + @Qualifier(NATIVE_KAFKA_BEAN_NAME) GenericContainer nativeKafka, NativeKafkaConfigurationProperties nativeKafkaProperties) { return new NativeKafkaTopicsConfigurer(nativeKafka, nativeKafkaProperties); } + @Bean + public DynamicPropertyRegistrar nativeKafkaDynamicPropertyRegistrar( + @Qualifier(NATIVE_KAFKA_BEAN_NAME) GenericContainer nativeKafka, + NativeKafkaConfigurationProperties nativeKafkaProperties) { + return registry -> { + String bootstrapServers = ((KafkaContainer) nativeKafka).getBootstrapServers(); + String host = nativeKafka.getHost(); + Integer port = nativeKafka.getMappedPort(nativeKafkaProperties.getKafkaPort()); + + registry.add("embedded.kafka.bootstrapServers", () -> bootstrapServers); + registry.add("embedded.kafka.brokerList", () -> bootstrapServers); + registry.add("embedded.kafka.networkAlias", () -> NATIVE_KAFKA_HOST_NAME); + registry.add("embedded.kafka.host", () -> host); + registry.add("embedded.kafka.port", () -> port); + + log.info("Started native kafka broker. Connection details: bootstrapServers={}, host={}, port={}, networkAlias={}", + bootstrapServers, host, port, NATIVE_KAFKA_HOST_NAME); + }; + } + private void configureFileSystemBind(NativeKafkaConfigurationProperties nativeKafkaProperties, KafkaContainer nativeKafka) { NativeKafkaConfigurationProperties.FileSystemBind fileSystemBind = nativeKafkaProperties.getFileSystemBind(); if (fileSystemBind.isEnabled()) { @@ -96,24 +111,6 @@ private void configureFileSystemBind(NativeKafkaConfigurationProperties nativeKa } } - private void registerNativeKafkaEnvironment(GenericContainer nativeKafka, - ConfigurableEnvironment environment, - NativeKafkaConfigurationProperties nativeKafkaProperties) { - LinkedHashMap map = new LinkedHashMap<>(); - - String bootstrapServers = ((KafkaContainer) nativeKafka).getBootstrapServers(); - map.put("embedded.kafka.bootstrapServers", bootstrapServers); - map.put("embedded.kafka.brokerList", bootstrapServers); - map.put("embedded.kafka.networkAlias", NATIVE_KAFKA_HOST_NAME); - map.put("embedded.kafka.host", nativeKafka.getHost()); - map.put("embedded.kafka.port", nativeKafka.getMappedPort(nativeKafkaProperties.getKafkaPort())); - - MapPropertySource propertySource = new MapPropertySource("embeddedKafkaInfo", map); - - log.info("Started native kafka broker. Connection details: {}", map); - - environment.getPropertySources().addFirst(propertySource); - } private void createPathAndParentOrMakeWritable(Path path) { Stream.of(path.getParent(), path).forEach(p -> { diff --git a/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java b/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java index 504b182cc..7452ffcca 100644 --- a/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java +++ b/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java @@ -10,8 +10,6 @@ import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MutablePropertySources; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.kafka.KafkaContainer; @@ -25,7 +23,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -35,9 +32,6 @@ class NativeKafkaContainerConfigurationTest { @Mock private NativeKafkaConfigurationProperties properties; - @Mock - private ConfigurableEnvironment environment; - @Mock private Network network; @@ -47,9 +41,6 @@ class NativeKafkaContainerConfigurationTest { @Mock private GenericContainer genericContainer; - @Mock - private MutablePropertySources mutablePropertySources; - @TempDir private Path tempDir; @@ -72,7 +63,6 @@ void shouldCreateNetworkWithProperConfiguration() { @Test @DisplayName("should create kafka container with proper docker image and network configuration") void shouldCreateKafkaContainerWithProperConfiguration() { - when(environment.getPropertySources()).thenReturn(mutablePropertySources); when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(new NativeKafkaConfigurationProperties.FileSystemBind()); when(properties.getKafkaPort()).thenReturn(9092); @@ -87,7 +77,7 @@ void shouldCreateKafkaContainerWithProperConfiguration() { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - GenericContainer result = configuration.nativeKafka(properties, environment, network); + GenericContainer result = configuration.nativeKafka(properties, network); assertThat(result).isEqualTo(kafkaContainer); containerUtilsMock.verify(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())); @@ -100,7 +90,6 @@ void shouldConfigureFileSystemBindWhenEnabled() throws IOException { NativeKafkaConfigurationProperties.FileSystemBind fileSystemBind = new NativeKafkaConfigurationProperties.FileSystemBind(true, tempDir.toString()); - when(environment.getPropertySources()).thenReturn(mutablePropertySources); when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); when(properties.getKafkaPort()).thenReturn(9092); @@ -115,7 +104,7 @@ void shouldConfigureFileSystemBindWhenEnabled() throws IOException { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - GenericContainer result = configuration.nativeKafka(properties, environment, network); + GenericContainer result = configuration.nativeKafka(properties, network); assertThat(result).isEqualTo(kafkaContainer); @@ -130,7 +119,6 @@ void shouldNotConfigureFileSystemBindWhenDisabled() { NativeKafkaConfigurationProperties.FileSystemBind fileSystemBind = new NativeKafkaConfigurationProperties.FileSystemBind(false, tempDir.toString()); - when(environment.getPropertySources()).thenReturn(mutablePropertySources); when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); when(properties.getKafkaPort()).thenReturn(9092); @@ -145,7 +133,7 @@ void shouldNotConfigureFileSystemBindWhenDisabled() { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - GenericContainer result = configuration.nativeKafka(properties, environment, network); + GenericContainer result = configuration.nativeKafka(properties, network); assertThat(result).isEqualTo(kafkaContainer); assertThat(Files.exists(tempDir.resolve("embedded-native-kafka-data"))).isFalse(); @@ -153,9 +141,8 @@ void shouldNotConfigureFileSystemBindWhenDisabled() { } @Test - @DisplayName("should register environment properties correctly") - void shouldRegisterEnvironmentPropertiesCorrectly() { - when(environment.getPropertySources()).thenReturn(mutablePropertySources); + @DisplayName("should register properties correctly") + void shouldRegisterPropertiesCorrectly() { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(new NativeKafkaConfigurationProperties.FileSystemBind()); when(properties.getKafkaPort()).thenReturn(9092); @@ -170,9 +157,7 @@ void shouldRegisterEnvironmentPropertiesCorrectly() { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(12345); - configuration.nativeKafka(properties, environment, network); - - verify(environment).getPropertySources(); + configuration.nativeKafka(properties, network); } } @@ -194,7 +179,6 @@ void shouldHandleDirectoryCreationWithProperPermissions() { NativeKafkaConfigurationProperties.FileSystemBind fileSystemBind = new NativeKafkaConfigurationProperties.FileSystemBind(true, testPath.toString()); - when(environment.getPropertySources()).thenReturn(mutablePropertySources); when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); when(properties.getKafkaPort()).thenReturn(9092); @@ -209,7 +193,7 @@ void shouldHandleDirectoryCreationWithProperPermissions() { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - configuration.nativeKafka(properties, environment, network); + configuration.nativeKafka(properties, network); assertThat(Files.exists(testPath)).isTrue(); assertThat(Files.isDirectory(testPath)).isTrue(); @@ -226,7 +210,6 @@ void shouldHandleParentDirectoryCreation() throws IOException { NativeKafkaConfigurationProperties.FileSystemBind fileSystemBind = new NativeKafkaConfigurationProperties.FileSystemBind(true, testPath.toString()); - when(environment.getPropertySources()).thenReturn(mutablePropertySources); when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); when(properties.getKafkaPort()).thenReturn(9092); @@ -241,7 +224,7 @@ void shouldHandleParentDirectoryCreation() throws IOException { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - configuration.nativeKafka(properties, environment, network); + configuration.nativeKafka(properties, network); assertThat(Files.exists(parentPath)).isTrue(); assertThat(Files.exists(testPath)).isTrue(); @@ -264,7 +247,6 @@ void shouldHandleExistingDirectoryScenario() throws IOException { NativeKafkaConfigurationProperties.FileSystemBind fileSystemBind = new NativeKafkaConfigurationProperties.FileSystemBind(true, existingPath.toString()); - when(environment.getPropertySources()).thenReturn(mutablePropertySources); when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); when(properties.getKafkaPort()).thenReturn(9092); @@ -279,9 +261,9 @@ void shouldHandleExistingDirectoryScenario() throws IOException { when(kafkaContainer.getHost()).thenReturn("localhost"); when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - configuration.nativeKafka(properties, environment, network); + configuration.nativeKafka(properties, network); assertThat(Files.exists(existingPath)).isTrue(); } } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 459a4c15d..d93de2ceb 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ testcontainers-spring-boot-parent testcontainers-common embedded-kafka + embedded-native-kafka embedded-keycloak embedded-keydb embedded-aerospike @@ -315,55 +316,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + io.github.gitflow-incremental-builder + gitflow-incremental-builder + ${gitflow-incremental-builder.version} + true + + develop|support/* + true + refs/remotes/origin/develop + always + true + impacted + \.github[/\\].*|\.mvn[/\\].*|mvnw.* + + (.*[/\\])?README.adoc + + + + com.mycila + license-maven-plugin + 5.0.0 + + + SMILEY_STYLE + + + +
LICENSE
+ + src/test/resources/** + src/main/resources/** + **/*.adoc + +
+
+ + + SMILEY_STYLE + :( + ( + :( + \:\( + \:\( + false + false + + +
+
From e2da60c302536de8f97bcaaa596b4184ddb5ac88 Mon Sep 17 00:00:00 2001 From: admitrov Date: Wed, 24 Sep 2025 13:56:54 +0200 Subject: [PATCH 05/11] test: remove redundant Kafka port and bootstrap server mocks --- ...NativeKafkaContainerConfigurationTest.java | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java b/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java index 7452ffcca..69dec80db 100644 --- a/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java +++ b/embedded-native-kafka/src/test/java/com/playtika/testcontainer/nativekafka/configuration/NativeKafkaContainerConfigurationTest.java @@ -65,7 +65,6 @@ void shouldCreateNetworkWithProperConfiguration() { void shouldCreateKafkaContainerWithProperConfiguration() { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(new NativeKafkaConfigurationProperties.FileSystemBind()); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -73,10 +72,6 @@ void shouldCreateKafkaContainerWithProperConfiguration() { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - GenericContainer result = configuration.nativeKafka(properties, network); assertThat(result).isEqualTo(kafkaContainer); @@ -92,7 +87,6 @@ void shouldConfigureFileSystemBindWhenEnabled() throws IOException { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -100,10 +94,6 @@ void shouldConfigureFileSystemBindWhenEnabled() throws IOException { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - GenericContainer result = configuration.nativeKafka(properties, network); assertThat(result).isEqualTo(kafkaContainer); @@ -121,7 +111,6 @@ void shouldNotConfigureFileSystemBindWhenDisabled() { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -129,10 +118,6 @@ void shouldNotConfigureFileSystemBindWhenDisabled() { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - GenericContainer result = configuration.nativeKafka(properties, network); assertThat(result).isEqualTo(kafkaContainer); @@ -145,7 +130,6 @@ void shouldNotConfigureFileSystemBindWhenDisabled() { void shouldRegisterPropertiesCorrectly() { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(new NativeKafkaConfigurationProperties.FileSystemBind()); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -153,10 +137,6 @@ void shouldRegisterPropertiesCorrectly() { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(12345); - configuration.nativeKafka(properties, network); } } @@ -181,7 +161,6 @@ void shouldHandleDirectoryCreationWithProperPermissions() { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -189,10 +168,6 @@ void shouldHandleDirectoryCreationWithProperPermissions() { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - configuration.nativeKafka(properties, network); assertThat(Files.exists(testPath)).isTrue(); @@ -212,7 +187,6 @@ void shouldHandleParentDirectoryCreation() throws IOException { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -220,10 +194,6 @@ void shouldHandleParentDirectoryCreation() throws IOException { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - configuration.nativeKafka(properties, network); assertThat(Files.exists(parentPath)).isTrue(); @@ -249,7 +219,6 @@ void shouldHandleExistingDirectoryScenario() throws IOException { when(properties.getDefaultDockerImage()).thenReturn("apache/kafka-native:4.0.0"); when(properties.getFileSystemBind()).thenReturn(fileSystemBind); - when(properties.getKafkaPort()).thenReturn(9092); try (MockedStatic containerUtilsMock = mockStatic(com.playtika.testcontainer.common.utils.ContainerUtils.class)) { @@ -257,10 +226,6 @@ void shouldHandleExistingDirectoryScenario() throws IOException { containerUtilsMock.when(() -> configureCommonsAndStart(any(KafkaContainer.class), eq(properties), any())) .thenReturn(kafkaContainer); - when(kafkaContainer.getBootstrapServers()).thenReturn("localhost:9092"); - when(kafkaContainer.getHost()).thenReturn("localhost"); - when(kafkaContainer.getMappedPort(9092)).thenReturn(9092); - configuration.nativeKafka(properties, network); assertThat(Files.exists(existingPath)).isTrue(); From b1af3b5a505cda3f3d58de6afdeb704f785b619c Mon Sep 17 00:00:00 2001 From: admitrov Date: Wed, 24 Sep 2025 15:35:32 +0200 Subject: [PATCH 06/11] fix: update JWT decoder to use JWK Set URI and adjust SSL requirement in test realm --- ...mbeddedDynamoDBBootstrapConfiguration.java | 22 ++++++++++++++----- .../spring/SpringTestApplication.java | 4 ++-- .../src/test/resources/test-realm.json | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java b/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java index 0f2e8538a..b2cee3057 100644 --- a/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java +++ b/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java @@ -68,14 +68,26 @@ public GenericContainer dynamoDb(DynamoDBProperties properties, Optional container, DynamoDBProperties properties) { + public DynamicPropertyRegistrar dynamodbDynamicPropertyRegistrar( + @Qualifier(BEAN_NAME_EMBEDDED_DYNAMODB) GenericContainer container, DynamoDBProperties properties) { return registry -> { - registry.add("embedded.dynamodb.port", () -> container.getMappedPort(properties.port)); - registry.add("embedded.dynamodb.host", container::getHost); - registry.add("embedded.dynamodb.accessKey", properties::getAccessKey); - registry.add("embedded.dynamodb.secretKey", properties::getSecretKey); + var mappedPort = container.getMappedPort(properties.port); + var host = container.getHost(); + var accessKey = properties.getAccessKey(); + var secretKey = properties.getSecretKey(); + + registry.add("embedded.dynamodb.port", () -> mappedPort); + registry.add("embedded.dynamodb.host", () -> host); + registry.add("embedded.dynamodb.accessKey", () -> accessKey); + registry.add("embedded.dynamodb.secretKey", () -> secretKey); registry.add("embedded.dynamodb.networkAlias", () -> DYNAMODB_NETWORK_ALIAS); registry.add("embedded.dynamodb.internalPort", properties::getPort); + + log.info("Started DynamoDb server. Connection details: host: {}, port: {}, accessKey:{}, secretKey: {}", + host, mappedPort, accessKey, secretKey); + log.info("Consult with the doc " + + "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html " + + "for more details"); }; } diff --git a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java index 436df0055..badc5c86e 100644 --- a/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java +++ b/embedded-keycloak/src/test/java/com/playtika/testcontainer/keycloak/spring/SpringTestApplication.java @@ -28,8 +28,8 @@ public class SpringTestApplication { public JwtDecoder jwtDecoder(@Value("${embedded.keycloak.host}") String host, @Value("${embedded.keycloak.http-port}") String port, @Value("${testing.keycloak.realm}") String realm) { - String issuerUri = String.format("http://%s:%s/realms/%s", host, port, realm); - return NimbusJwtDecoder.withIssuerLocation(issuerUri).build(); + String jwkSetUri = String.format("http://%s:%s/realms/%s/protocol/openid-connect/certs", host, port, realm); + return NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build(); } @Bean diff --git a/embedded-keycloak/src/test/resources/test-realm.json b/embedded-keycloak/src/test/resources/test-realm.json index ad6adb93d..45cd53d0c 100644 --- a/embedded-keycloak/src/test/resources/test-realm.json +++ b/embedded-keycloak/src/test/resources/test-realm.json @@ -1,7 +1,7 @@ { "realm": "test-realm", "enabled": true, - "sslRequired": "external", + "sslRequired": "none", "clients": [ { "id": "9b60057a-9bb1-44dd-8851-2794de9369ab", From c887b851e3bcae0ce8f108fc0172789e367dad56 Mon Sep 17 00:00:00 2001 From: admitrov Date: Wed, 24 Sep 2025 16:31:17 +0200 Subject: [PATCH 07/11] fix: refactor storageResourcesGenerator to use GenericContainer for endpoint retrieval --- .../storage/EmbeddedStorageBootstrapConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java b/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java index 74da58492..130aaa49f 100644 --- a/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java +++ b/embedded-google-storage/src/main/java/com/playtika/testcontainer/storage/EmbeddedStorageBootstrapConfiguration.java @@ -5,7 +5,6 @@ import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; @@ -99,8 +98,9 @@ private void prepareContainerConfiguration(GenericContainer container) throws @Bean StorageResourcesGenerator storageResourcesGenerator( - @Value("${embedded.google.storage.endpoint}") String endpoint, + @Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_STORAGE_SERVER) GenericContainer container, StorageProperties storageProperties) { + String endpoint = buildContainerEndpoint(container); return new StorageResourcesGenerator(endpoint, storageProperties); } From 6f642da8440c589ba12cce423c1ea4569df06ac8 Mon Sep 17 00:00:00 2001 From: admitrov Date: Wed, 24 Sep 2025 16:31:48 +0200 Subject: [PATCH 08/11] fix: remove unused Spring extension and refactor InfluxDB properties usage in tests --- .../EmbeddedInfluxDBBootstrapConfigurationTest.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java b/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java index f560e8401..9175e90f1 100644 --- a/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java +++ b/embedded-influxdb/src/test/java/com/playtika/testcontainer/influxdb/EmbeddedInfluxDBBootstrapConfigurationTest.java @@ -4,23 +4,17 @@ import io.restassured.response.ExtractableResponse; import org.apache.http.HttpStatus; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.junit.jupiter.SpringExtension; import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(SpringExtension.class) @SpringBootTest class EmbeddedInfluxDBBootstrapConfigurationTest { - @Autowired - private InfluxDBProperties influxDBProperties; @Value("${embedded.influxdb.port}") String influxdbPort; @@ -49,7 +43,8 @@ void propertiesAreAvailable() { @Test void influxDatabaseIsAvailable() { RestAssured.baseURI = getUrl(); - ExtractableResponse response = given() + ExtractableResponse response = given() + .auth().basic(influxdbUser, influxdbPassword) .get("/ping") .then() .statusCode(HttpStatus.SC_NO_CONTENT) @@ -59,7 +54,7 @@ void influxDatabaseIsAvailable() { } private String getUrl() { - return "http://" + influxDBProperties.getHost() + ":" + influxDBProperties.getPort(); + return "http://" + influxdbHost + ":" + influxdbPort; } @EnableAutoConfiguration From f7b1d486f79f6b84b1fef98c75866f848425a665 Mon Sep 17 00:00:00 2001 From: admitrov Date: Wed, 24 Sep 2025 16:32:14 +0200 Subject: [PATCH 09/11] fix: remove GcpPubSubEmulatorAutoConfiguration and update test configuration for PubSub transport channel --- ...edPubsubDependenciesAutoConfiguration.java | 3 +- ...eddedPubsubBootstrapConfigurationTest.java | 31 +++++++++++++++++++ .../test/resources/application-enabled.yaml | 3 +- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java index a43076844..25f78a85e 100644 --- a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java +++ b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java @@ -2,7 +2,6 @@ import com.google.cloud.spring.autoconfigure.core.GcpContextAutoConfiguration; import com.google.cloud.spring.autoconfigure.pubsub.GcpPubSubAutoConfiguration; -import com.google.cloud.spring.autoconfigure.pubsub.GcpPubSubEmulatorAutoConfiguration; import com.google.cloud.spring.pubsub.core.PubSubTemplate; import com.playtika.testcontainer.common.spring.DependsOnPostProcessor; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; @@ -18,7 +17,7 @@ @AutoConfiguration @AutoConfigureOrder -@ImportAutoConfiguration(classes = {GcpContextAutoConfiguration.class, GcpPubSubEmulatorAutoConfiguration.class, GcpPubSubAutoConfiguration.class}) +@ImportAutoConfiguration(classes = {GcpContextAutoConfiguration.class, GcpPubSubAutoConfiguration.class}) @ConditionalOnExpression("${embedded.containers.enabled:true}") @ConditionalOnClass(PubSubTemplate.class) @ConditionalOnProperty(name = "embedded.google.pubsub.enabled", matchIfMissing = true) diff --git a/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java b/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java index 3def7057d..ee914d553 100644 --- a/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java +++ b/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java @@ -1,20 +1,32 @@ package com.playtika.testcontainer.pubsub; +import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.core.FixedCredentialsProvider; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.rpc.FixedTransportChannelProvider; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.cloud.NoCredentials; import com.google.cloud.spring.pubsub.core.PubSubTemplate; import com.google.cloud.spring.pubsub.support.AcknowledgeablePubsubMessage; import com.google.pubsub.v1.DeadLetterPolicy; import com.google.pubsub.v1.ProjectSubscriptionName; import com.google.pubsub.v1.Subscription; import com.google.pubsub.v1.TopicName; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.context.ActiveProfiles; import org.testcontainers.containers.GenericContainer; @@ -48,6 +60,25 @@ class EmbeddedPubsubBootstrapConfigurationTest { @EnableAutoConfiguration @Configuration static class TestConfiguration { + + @Bean + @Primary + @ConditionalOnProperty(name = "embedded.google.pubsub.enabled", matchIfMissing = true) + public TransportChannelProvider pubsubTransportChannelProvider(@Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB) GenericContainer container, + PubsubProperties properties) { + String host = container.getHost(); + Integer port = container.getMappedPort(properties.getPort()); + ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) + .usePlaintext() + .build(); + return FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); + } + + @Bean + @Primary + public CredentialsProvider googleCredentials() { + return FixedCredentialsProvider.create(NoCredentials.getInstance()); + } } @Test diff --git a/embedded-google-pubsub/src/test/resources/application-enabled.yaml b/embedded-google-pubsub/src/test/resources/application-enabled.yaml index c6f5a775e..8d96af39e 100644 --- a/embedded-google-pubsub/src/test/resources/application-enabled.yaml +++ b/embedded-google-pubsub/src/test/resources/application-enabled.yaml @@ -1,3 +1,2 @@ spring.cloud.gcp: - project-id: ${embedded.google.pubsub.project-id} - pubsub.emulatorHost: ${embedded.google.pubsub.host}:${embedded.google.pubsub.port} \ No newline at end of file + project-id: my-project-id \ No newline at end of file From 1ee2c5c18c8e0bef07fbede6706afb93da0ecf7d Mon Sep 17 00:00:00 2001 From: admitrov Date: Thu, 13 Nov 2025 15:55:18 +0100 Subject: [PATCH 10/11] fix: update dynamic property registration and configuration for embedded services --- ...rpriseAerospikeBootstrapConfiguration.java | 2 +- ...EmbeddedAzuriteBootstrapConfiguration.java | 1 + ...properties => application-test.properties} | 0 .../resources/application-enabled.properties | 2 + embedded-google-pubsub/README.adoc | 2 +- embedded-influxdb/README.adoc | 2 +- embedded-keycloak/README.adoc | 2 +- .../{application.yml => application-test.yml} | 0 ...EmbeddedMailHogBootstrapConfiguration.java | 14 +++++- ...properties => application-test.properties} | 0 ...ddedMSSQLServerBootstrapConfiguration.java | 46 ++++++++++++++++--- ...rverDependenciesAutoConfigurationTest.java | 7 ++- ...properties => application-test.properties} | 0 embedded-vault/README.adoc | 2 +- ...properties => application-test.properties} | 0 ...mbeddedWiremockBootstrapConfiguration.java | 15 ++++-- 16 files changed, 76 insertions(+), 19 deletions(-) rename embedded-couchbase/src/test/resources/{application-enabled.properties => application-test.properties} (100%) rename embedded-keycloak/src/test/resources/{application.yml => application-test.yml} (100%) rename embedded-mailhog/src/test/resources/{application.properties => application-test.properties} (100%) rename embedded-mssqlserver/src/test/resources/{application.properties => application-test.properties} (100%) rename embedded-vault/src/test/resources/{bootstrap.properties => application-test.properties} (100%) diff --git a/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java b/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java index dd9f1b8c4..4e6cb2e7f 100644 --- a/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java +++ b/embedded-aerospike-enterprise/src/main/java/com/playtika/testcontainers/aerospike/enterprise/SetupEnterpriseAerospikeBootstrapConfiguration.java @@ -34,7 +34,7 @@ public class SetupEnterpriseAerospikeBootstrapConfiguration { private GenericContainer aerospikeContainer; private AerospikeProperties aerospikeProperties; private AerospikeEnterpriseProperties aerospikeEnterpriseProperties; - @Value("embedded.aerospike.dockerImage:") + @Value("${embedded.aerospike.dockerImage:}") private String dockerImage; @Autowired diff --git a/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java b/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java index 6bc83a367..2da1f214b 100644 --- a/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java +++ b/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java @@ -41,6 +41,7 @@ ToxiproxyContainer.ContainerProxy azuriteQueueContainerProxy(ToxiproxyContainer } @Bean + @ConditionalOnToxiProxyEnabled(module = "azurite") public DynamicPropertyRegistrar azuriteBlobToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer.ContainerProxy proxy) { return registry -> { registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); diff --git a/embedded-couchbase/src/test/resources/application-enabled.properties b/embedded-couchbase/src/test/resources/application-test.properties similarity index 100% rename from embedded-couchbase/src/test/resources/application-enabled.properties rename to embedded-couchbase/src/test/resources/application-test.properties diff --git a/embedded-elasticsearch/src/test/resources/application-enabled.properties b/embedded-elasticsearch/src/test/resources/application-enabled.properties index 40c87d3ed..673969bfa 100644 --- a/embedded-elasticsearch/src/test/resources/application-enabled.properties +++ b/embedded-elasticsearch/src/test/resources/application-enabled.properties @@ -1 +1,3 @@ spring.elasticsearch.uris=http://${embedded.elasticsearch.host}:${embedded.elasticsearch.httpPort} +embedded.elasticsearch.indices=test_index + diff --git a/embedded-google-pubsub/README.adoc b/embedded-google-pubsub/README.adoc index bb75a229c..2daa0ff19 100644 --- a/embedded-google-pubsub/README.adoc +++ b/embedded-google-pubsub/README.adoc @@ -58,7 +58,7 @@ embedded.google.pubsub: ==== Example -To auto-configure `spring-cloud-gcp-starter-pubsub` use these properties in your test `application.yaml`: +To auto-configure `spring-cloud-gcp-starter-pubsub` use these properties in your test `application-test.yaml`: ./src/test/resources/application.yaml [source,yaml] diff --git a/embedded-influxdb/README.adoc b/embedded-influxdb/README.adoc index 30252e420..63cee6357 100644 --- a/embedded-influxdb/README.adoc +++ b/embedded-influxdb/README.adoc @@ -45,7 +45,7 @@ ==== Example There is currently no starter library for using InfluxDB server version 1.x because it uses basic HTTP protocol to communicate. -You can anyway create your own properties using those values for example in your test `application.yaml`: +You can anyway create your own properties using those values for example in your test `application-test.yaml`: ./src/test/resources/application.yaml [source,yaml] diff --git a/embedded-keycloak/README.adoc b/embedded-keycloak/README.adoc index f4d9488a1..504648737 100644 --- a/embedded-keycloak/README.adoc +++ b/embedded-keycloak/README.adoc @@ -37,7 +37,7 @@ * Bean `ToxiproxyContainer.ContainerProxy keycloakContainerProxy` ==== Example -To configure for example the `keycloak-spring-boot-starter` use these properties in your test `application.yaml`: +To configure for example the `keycloak-spring-boot-starter` use these properties in your test `application-test.yaml`: ./src/test/resources/application.yaml [source,yaml] diff --git a/embedded-keycloak/src/test/resources/application.yml b/embedded-keycloak/src/test/resources/application-test.yml similarity index 100% rename from embedded-keycloak/src/test/resources/application.yml rename to embedded-keycloak/src/test/resources/application-test.yml diff --git a/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java b/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java index 94c84dddd..e6ca8e7aa 100644 --- a/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java +++ b/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java @@ -45,11 +45,16 @@ public ToxiproxyContainer.ContainerProxy mailhogSmtpContainerProxy(ToxiproxyCont @Bean @ConditionalOnToxiProxyEnabled(module = "mailhog") - public DynamicPropertyRegistrar mailhogSmtpToxiProxyDynamicPropertyRegistrar(@Qualifier("mailhogSmtpContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { + public DynamicPropertyRegistrar mailhogSmtpToxiProxyDynamicPropertyRegistrar( + @Qualifier("mailhogSmtpContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { return registry -> { registry.add("embedded.mailhog.smtp.toxiproxy.host", proxy::getContainerIpAddress); registry.add("embedded.mailhog.smtp.toxiproxy.port", proxy::getProxyPort); registry.add("embedded.mailhog.smtp.toxiproxy.proxyName", proxy::getName); + + log.info("Started MailHog SMTP ToxiProxy connection details embedded.mailhog.smtp.toxiproxy.host={}, " + + "embedded.mailhog.smtp.toxiproxy.port={}, embedded.mailhog.smtp.toxiproxy.proxyName={}", + proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); }; } @@ -78,6 +83,13 @@ public DynamicPropertyRegistrar mailhogDynamicPropertyRegistrar(@Qualifier(BEAN_ registry.add("embedded.mailhog.networkAlias", () -> MAILHOG_NETWORK_ALIAS); registry.add("embedded.mailhog.internalSmtpPort", properties::getSmtpPort); registry.add("embedded.mailhog.internalHttpPort", properties::getHttpPort); + + log.info("Started MailHog. Connection details: embedded.mailhog.host={}, " + + "embedded.mailhog.smtp-port={}, embedded.mailhog.http-port={}, " + + "embedded.mailhog.networkAlias={}, embedded.mailhog.internalSmtpPort={}, " + + "embedded.mailhog.internalHttpPort={}", mailHog.getHost(), smtpMappedPort, httpMappedPort, + MAILHOG_NETWORK_ALIAS, properties.getSmtpPort(), properties.getHttpPort()); + }; } diff --git a/embedded-mailhog/src/test/resources/application.properties b/embedded-mailhog/src/test/resources/application-test.properties similarity index 100% rename from embedded-mailhog/src/test/resources/application.properties rename to embedded-mailhog/src/test/resources/application-test.properties diff --git a/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java b/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java index c7d88ec8b..bf7fc06a6 100644 --- a/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java +++ b/embedded-mssqlserver/src/main/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerBootstrapConfiguration.java @@ -12,13 +12,17 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.util.StringUtils; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.containers.wait.strategy.WaitStrategy; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; import static com.playtika.testcontainer.mssqlserver.MSSQLServerProperties.BEAN_NAME_EMBEDDED_MSSQLSERVER; +import static org.testcontainers.containers.MSSQLServerContainer.MS_SQL_SERVER_PORT; @Slf4j @Configuration @@ -28,6 +32,8 @@ @EnableConfigurationProperties(MSSQLServerProperties.class) public class EmbeddedMSSQLServerBootstrapConfiguration { + private static final String MSSQLSERVER_NETWORK_ALIAS = "mssqlserver.testcontainer.docker"; + @Bean @ConditionalOnToxiProxyEnabled(module = "mssqlserver") public ToxiproxyContainer.ContainerProxy mssqlServerContainerProxy(ToxiproxyContainer toxiproxyContainer, @@ -39,21 +45,47 @@ public ToxiproxyContainer.ContainerProxy mssqlServerContainerProxy(ToxiproxyCont public EmbeddedMSSQLServerContainer mssqlServer(MSSQLServerProperties properties, Optional network) { EmbeddedMSSQLServerContainer mssqlServerContainer = new EmbeddedMSSQLServerContainer(ContainerUtils.getDockerImageName(properties)) - .withNetworkAliases("mssqlserver.testcontainer.docker"); + .withPassword(properties.getPassword()) + .withInitScript(properties.getInitScriptPath()) + .withNetworkAliases(MSSQLSERVER_NETWORK_ALIAS); + network.ifPresent(mssqlServerContainer::withNetwork); - configureCommonsAndStart(mssqlServerContainer, properties, log); + + String startupLogCheckRegex = properties.getStartupLogCheckRegex(); + if (StringUtils.hasLength(startupLogCheckRegex)) { + WaitStrategy waitStrategy = new LogMessageWaitStrategy() + .withRegEx(startupLogCheckRegex); + mssqlServerContainer.waitingFor(waitStrategy); + } + + if (properties.isAcceptLicence()) { + mssqlServerContainer.acceptLicense(); + } + + mssqlServerContainer = (EmbeddedMSSQLServerContainer) configureCommonsAndStart(mssqlServerContainer, properties, log); + return mssqlServerContainer; } @Bean public DynamicPropertyRegistrar mssqlServerDynamicPropertyRegistrar( - @Qualifier(BEAN_NAME_EMBEDDED_MSSQLSERVER) EmbeddedMSSQLServerContainer mssqlServer, + @Qualifier(BEAN_NAME_EMBEDDED_MSSQLSERVER) EmbeddedMSSQLServerContainer mssqlServerContainer, MSSQLServerProperties properties) { return registry -> { - registry.add("embedded.mssqlserver.host", mssqlServer::getHost); - registry.add("embedded.mssqlserver.port", () -> mssqlServer.getMappedPort(1433)); - registry.add("embedded.mssqlserver.networkAlias", () -> "mssqlserver.testcontainer.docker"); - registry.add("embedded.mssqlserver.internalPort", () -> 1433); + Integer mappedPort = mssqlServerContainer.getMappedPort(MS_SQL_SERVER_PORT); + String host = mssqlServerContainer.getHost(); + + registry.add("embedded.mssqlserver.port", () -> mappedPort); + registry.add("embedded.mssqlserver.host", () -> host); + registry.add("embedded.mssqlserver.database", () -> "master"); + registry.add("embedded.mssqlserver.user", () -> "sa"); + registry.add("embedded.mssqlserver.password", properties::getPassword); + registry.add("embedded.mssqlserver.networkAlias", () -> MSSQLSERVER_NETWORK_ALIAS); + registry.add("embedded.mssqlserver.internalPort", () -> MS_SQL_SERVER_PORT); + + log.info(""" + Started mssql server. Connection details: embedded.mssqlserver.user=sa, embedded.mssqlserver.password={}, embedded.mssqlserver.database = master, + JDBC connection url: jdbc:sqlserver://{}:{};databaseName={};trustServerCertificate=true""", properties.getPassword(), host, mappedPort, "master"); }; } diff --git a/embedded-mssqlserver/src/test/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerDependenciesAutoConfigurationTest.java b/embedded-mssqlserver/src/test/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerDependenciesAutoConfigurationTest.java index 764773bcc..392f4b3ce 100644 --- a/embedded-mssqlserver/src/test/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerDependenciesAutoConfigurationTest.java +++ b/embedded-mssqlserver/src/test/java/com/playtika/testcontainer/mssqlserver/EmbeddedMSSQLServerDependenciesAutoConfigurationTest.java @@ -15,7 +15,10 @@ @SpringBootTest( classes = EmbeddedMSSQLServerDependenciesAutoConfigurationTest.TestConfiguration.class, properties = { - "embedded.mssqlserver.enabled=true" + "embedded.mssqlserver.enabled=true", + "embedded.mssqlserver.password=Foobar1234!", + "embedded.mssqlserver.accept-licence=true", + "embedded.mssqlserver.init-script-path=initScript.sql" } ) class EmbeddedMSSQLServerDependenciesAutoConfigurationTest { @@ -46,4 +49,4 @@ void testCreateDb() { static class TestConfiguration { } -} \ No newline at end of file +} diff --git a/embedded-mssqlserver/src/test/resources/application.properties b/embedded-mssqlserver/src/test/resources/application-test.properties similarity index 100% rename from embedded-mssqlserver/src/test/resources/application.properties rename to embedded-mssqlserver/src/test/resources/application-test.properties diff --git a/embedded-vault/README.adoc b/embedded-vault/README.adoc index 4e5c1a520..d57935f30 100644 --- a/embedded-vault/README.adoc +++ b/embedded-vault/README.adoc @@ -41,7 +41,7 @@ ==== Example -To auto-configure `spring-cloud-vault-config` use these properties in your test `application.yaml`: +To auto-configure `spring-cloud-vault-config` use these properties in your test `application-test.yaml`: ./src/test/resources/application.yaml [source,yaml] diff --git a/embedded-vault/src/test/resources/bootstrap.properties b/embedded-vault/src/test/resources/application-test.properties similarity index 100% rename from embedded-vault/src/test/resources/bootstrap.properties rename to embedded-vault/src/test/resources/application-test.properties diff --git a/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java b/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java index 9dbd531c4..a2eceeb9b 100644 --- a/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java +++ b/embedded-wiremock/src/main/java/com/playtika/testcontainers/wiremock/EmbeddedWiremockBootstrapConfiguration.java @@ -36,12 +36,15 @@ public class EmbeddedWiremockBootstrapConfiguration { @Bean(name = BEAN_NAME_EMBEDDED_WIREMOCK, destroyMethod = "stop") public GenericContainer wiremock(WiremockProperties properties, Optional network) { - GenericContainer container = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) + GenericContainer wiremock = + new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) + .waitingFor(DEFAULT_WAITER) + .withCommand("--port " + properties.getPort()) .withExposedPorts(properties.getPort()) .withNetworkAliases(WIREMOCK_NETWORK_ALIAS); - network.ifPresent(container::withNetwork); - configureCommonsAndStart(container, properties, log); - return container; + network.ifPresent(wiremock::withNetwork); + configureCommonsAndStart(wiremock, properties, log); + return wiremock; } @Bean @@ -53,6 +56,10 @@ public DynamicPropertyRegistrar wiremockDynamicPropertyRegistrar( registry.add("embedded.wiremock.port", () -> container.getMappedPort(properties.getPort())); registry.add("embedded.wiremock.networkAlias", () -> WIREMOCK_NETWORK_ALIAS); registry.add("embedded.wiremock.internalPort", properties::getPort); + + log.info("Started wiremock. Connection Details: embedded.wiremock.host={}, embedded.wiremock.port={}," + + "embedded.wiremock.networkAlias={}, embedded.wiremock.internalPort={}", + container.getHost(), container.getMappedPort(properties.getPort()), WIREMOCK_NETWORK_ALIAS, properties.getPort()); }; } } From 0d77c92329a936226ed91bbedde617dcfa55cb4c Mon Sep 17 00:00:00 2001 From: admitrov Date: Thu, 13 Nov 2025 16:10:18 +0100 Subject: [PATCH 11/11] fix: refactor dynamic property registration and configuration for embedded services --- embedded-azurite/pom.xml | 4 - ...EmbeddedAzuriteBootstrapConfiguration.java | 159 +++++++++--------- embedded-couchbase/pom.xml | 4 - ...beddedCouchbaseBootstrapConfiguration.java | 79 +++++---- ...edCouchbaseBootstrapConfigurationTest.java | 36 ++-- ...perties => application-enabled.properties} | 0 embedded-dynamodb/pom.xml | 6 +- ...mbeddedDynamoDBBootstrapConfiguration.java | 82 ++++----- embedded-google-pubsub/pom.xml | 6 +- .../EmbeddedPubsubBootstrapConfiguration.java | 59 ++++--- ...edPubsubDependenciesAutoConfiguration.java | 3 +- ...eddedPubsubBootstrapConfigurationTest.java | 31 ---- .../test/resources/application-enabled.yaml | 3 +- embedded-localstack/pom.xml | 4 - ...eddedLocalStackBootstrapConfiguration.java | 90 +++++++--- ...EmbeddedMailHogBootstrapConfiguration.java | 76 ++++----- ...ddedMailHogBootstrapConfigurationTest.java | 28 ++- embedded-pulsar/pom.xml | 4 - .../EmbeddedPulsarBootstrapConfiguration.java | 83 +++++---- ...eddedPulsarBootstrapConfigurationTest.java | 13 +- embedded-vault/README.adoc | 2 +- embedded-vault/pom.xml | 4 - .../EmbeddedVaultBootstrapConfiguration.java | 62 ++++--- ...beddedVaultBootstrapConfigurationTest.java | 23 +-- ...dedVaultWithCasEnabledForSubPathsTest.java | 28 +-- .../EmbeddedVaultWithCasEnabledTest.java | 28 +-- ...n-test.properties => bootstrap.properties} | 0 27 files changed, 453 insertions(+), 464 deletions(-) rename embedded-couchbase/src/test/resources/{application-test.properties => application-enabled.properties} (100%) rename embedded-vault/src/test/resources/{application-test.properties => bootstrap.properties} (100%) diff --git a/embedded-azurite/pom.xml b/embedded-azurite/pom.xml index 55852d2cb..184148b54 100644 --- a/embedded-azurite/pom.xml +++ b/embedded-azurite/pom.xml @@ -32,10 +32,6 @@ com.playtika.testcontainers embedded-toxiproxy
- - org.springframework - spring-test - diff --git a/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java b/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java index 2da1f214b..626ff729d 100644 --- a/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java +++ b/embedded-azurite/src/main/java/com/playtika/testcontainer/azurite/EmbeddedAzuriteBootstrapConfiguration.java @@ -11,11 +11,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; @@ -34,65 +36,68 @@ public class EmbeddedAzuriteBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "azurite") - ToxiproxyContainer.ContainerProxy azuriteQueueContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, - AzuriteProperties properties) { - return toxiproxyContainer.getProxy(azurite, properties.getQueueStoragePort()); - } + ToxiproxyContainer.ContainerProxy azuriteBlobContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, + AzuriteProperties properties, + ConfigurableEnvironment environment) { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getBlobStoragePort()); - @Bean - @ConditionalOnToxiProxyEnabled(module = "azurite") - public DynamicPropertyRegistrar azuriteBlobToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.azurite.toxiproxy.blobStoragePort", proxy::getProxyPort); - registry.add("embedded.azurite.toxiproxy.proxyName", proxy::getName); - log.info("Started Azurite ToxiProxy connection details {}", Map.of( - "embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress(), - "embedded.azurite.toxiproxy.blobStoragePort", proxy.getProxyPort(), - "embedded.azurite.toxiproxy.proxyName", proxy.getName() - )); - }; + Map map = new LinkedHashMap<>(); + map.put("embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.azurite.toxiproxy.blobStoragePort", proxy.getProxyPort()); + map.put("embedded.azurite.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteBlobToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Azurite ToxiProxy connection details {}", map); + + return proxy; } @Bean @ConditionalOnToxiProxyEnabled(module = "azurite") - public DynamicPropertyRegistrar azuriteQueueToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer toxiproxyContainer, - @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, - AzuriteProperties properties) { - return registry -> { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getQueueStoragePort()); - registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.azurite.toxiproxy.queueStoragePor", proxy::getProxyPort); - registry.add("embedded.azurite.toxiproxy.proxyName", proxy::getName); - log.info("Started Azurite ToxiProxy connection details {}", Map.of( - "embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress(), - "embedded.azurite.toxiproxy.queueStoragePor", proxy.getProxyPort(), - "embedded.azurite.toxiproxy.proxyName", proxy.getName() - )); - }; + ToxiproxyContainer.ContainerProxy azuriteQueueContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, + AzuriteProperties properties, + ConfigurableEnvironment environment) { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getQueueStoragePort()); + + Map map = new LinkedHashMap<>(); + map.put("embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.azurite.toxiproxy.queueStoragePor", proxy.getProxyPort()); + map.put("embedded.azurite.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteQueueToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Azurite ToxiProxy connection details {}", map); + + return proxy; } @Bean @ConditionalOnToxiProxyEnabled(module = "azurite") - public DynamicPropertyRegistrar azuriteTableToxiProxyDynamicPropertyRegistrar(ToxiproxyContainer toxiproxyContainer, - @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, - AzuriteProperties properties) { - return registry -> { - ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getTableStoragePort()); - registry.add("embedded.azurite.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.azurite.toxiproxy.tableStoragePort", proxy::getProxyPort); - registry.add("embedded.azurite.toxiproxy.proxyName", proxy::getName); - log.info("Started Azurite ToxiProxy connection details {}", Map.of( - "embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress(), - "embedded.azurite.toxiproxy.tableStoragePort", proxy.getProxyPort(), - "embedded.azurite.toxiproxy.proxyName", proxy.getName() - )); - }; + ToxiproxyContainer.ContainerProxy azuriteTableContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(AZURITE_BEAN_NAME) GenericContainer azurite, + AzuriteProperties properties, + ConfigurableEnvironment environment) { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(azurite, properties.getTableStoragePort()); + + Map map = new LinkedHashMap<>(); + map.put("embedded.azurite.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.azurite.toxiproxy.tableStoragePort", proxy.getProxyPort()); + map.put("embedded.azurite.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteTableToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Azurite ToxiProxy connection details {}", map); + + return proxy; } @Bean(name = AZURITE_BEAN_NAME, destroyMethod = "stop") - public GenericContainer azurite(AzuriteProperties properties, Optional network) { + public GenericContainer azurite(ConfigurableEnvironment environment, + AzuriteProperties properties, + Optional network) { GenericContainer azuriteContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getBlobStoragePort(), properties.getQueueStoragePort(), properties.getTableStoragePort()) .withNetworkAliases(AZURITE_BLOB_NETWORK_ALIAS) @@ -105,41 +110,39 @@ public GenericContainer azurite(AzuriteProperties properties, Optional azurite, AzuriteProperties properties) { - return registry -> { - Integer mappedBlobStoragePort = azurite.getMappedPort(properties.getBlobStoragePort()); - Integer mappedQueueStoragePort = azurite.getMappedPort(properties.getQueueStoragePort()); - Integer mappedTableStoragePort = azurite.getMappedPort(properties.getTableStoragePort()); - String host = azurite.getHost(); - registry.add("embedded.azurite.host", () -> host); - registry.add("embedded.azurite.blobStoragePort", () -> mappedBlobStoragePort); - registry.add("embedded.azurite.queueStoragePor", () -> mappedQueueStoragePort); - registry.add("embedded.azurite.tableStoragePort", () -> mappedTableStoragePort); - registry.add("embedded.azurite.account-name", () -> AzuriteProperties.ACCOUNT_NAME); - registry.add("embedded.azurite.account-key", () -> AzuriteProperties.ACCOUNT_KEY); - registry.add("embedded.azurite.blob-endpoint", () -> "http://" + host + ":" + mappedBlobStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); - registry.add("embedded.azurite.queue-endpoint", () -> "http://" + host + ":" + mappedQueueStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); - registry.add("embedded.azurite.table-endpoint", () -> "http://" + host + ":" + mappedTableStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); - registry.add("embedded.azurite.networkAlias", () -> AZURITE_BLOB_NETWORK_ALIAS); - log.info("Started Azurite. Connection details: {}", Map.of( - "embedded.azurite.host", host, - "embedded.azurite.blobStoragePort", mappedBlobStoragePort, - "embedded.azurite.queueStoragePor", mappedQueueStoragePort, - "embedded.azurite.tableStoragePort", mappedTableStoragePort, - "embedded.azurite.account-name", AzuriteProperties.ACCOUNT_NAME, - "embedded.azurite.account-key", AzuriteProperties.ACCOUNT_KEY, - "embedded.azurite.blob-endpoint", "http://" + host + ":" + mappedBlobStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME, - "embedded.azurite.queue-endpoint", "http://" + host + ":" + mappedQueueStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME, - "embedded.azurite.table-endpoint", "http://" + host + ":" + mappedTableStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME, - "embedded.azurite.networkAlias", AZURITE_BLOB_NETWORK_ALIAS - )); - }; + private void registerEnvironment(GenericContainer azurite, + ConfigurableEnvironment environment, + AzuriteProperties properties) { + + Integer mappedBlobStoragePort = azurite.getMappedPort(properties.getBlobStoragePort()); + Integer mappedQueueStoragePort = azurite.getMappedPort(properties.getQueueStoragePort()); + Integer mappedTableStoragePort = azurite.getMappedPort(properties.getTableStoragePort()); + String host = azurite.getHost(); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.azurite.host", host); + map.put("embedded.azurite.blobStoragePort", mappedBlobStoragePort); + map.put("embedded.azurite.queueStoragePor", mappedQueueStoragePort); + map.put("embedded.azurite.tableStoragePort", mappedTableStoragePort); + map.put("embedded.azurite.account-name", AzuriteProperties.ACCOUNT_NAME); + map.put("embedded.azurite.account-key", AzuriteProperties.ACCOUNT_KEY); + map.put("embedded.azurite.blob-endpoint", "http://" + host + ":" + mappedBlobStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); + map.put("embedded.azurite.queue-endpoint", "http://" + host + ":" + mappedQueueStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); + map.put("embedded.azurite.table-endpoint", "http://" + host + ":" + mappedTableStoragePort + "/" + AzuriteProperties.ACCOUNT_NAME); + map.put("embedded.azurite.networkAlias", AZURITE_BLOB_NETWORK_ALIAS); + + log.info("Started Azurite. Connection details: {}", map); + + MapPropertySource propertySource = new MapPropertySource("embeddedAzuriteInfo", map); + environment.getPropertySources().addFirst(propertySource); } } diff --git a/embedded-couchbase/pom.xml b/embedded-couchbase/pom.xml index d763e43a4..95ca90811 100644 --- a/embedded-couchbase/pom.xml +++ b/embedded-couchbase/pom.xml @@ -57,9 +57,5 @@ awaitility test - - org.springframework - spring-test - diff --git a/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java b/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java index a762ebad6..d1bc8dd0c 100644 --- a/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java +++ b/embedded-couchbase/src/main/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfiguration.java @@ -11,12 +11,15 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.couchbase.BucketDefinition; import org.testcontainers.couchbase.CouchbaseContainer; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -35,24 +38,26 @@ public class EmbeddedCouchbaseBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "couchbase") ToxiproxyContainer.ContainerProxy couchbaseContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier(BEAN_NAME_EMBEDDED_COUCHBASE) CouchbaseContainer couchbase) { - return toxiproxyContainer.getProxy(couchbase, couchbase.getBootstrapHttpDirectPort()); - } + @Qualifier(BEAN_NAME_EMBEDDED_COUCHBASE) CouchbaseContainer couchbase, + ConfigurableEnvironment environment) { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(couchbase, couchbase.getBootstrapHttpDirectPort()); - @Bean - @ConditionalOnToxiProxyEnabled(module = "couchbase") - public DynamicPropertyRegistrar couchbaseToxiProxyDynamicPropertyRegistrar( - @Qualifier("couchbaseContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.couchbase.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.couchbase.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.couchbase.toxiproxy.proxyName", proxy::getName); - log.info("Started Couchbase ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); - }; + Map map = new LinkedHashMap<>(); + map.put("embedded.couchbase.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.couchbase.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.couchbase.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedCouchbaseToxiProxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Couchbase ToxiProxy connection details {}", map); + + return proxy; } @Bean(name = BEAN_NAME_EMBEDDED_COUCHBASE, destroyMethod = "stop") - public CouchbaseContainer couchbase(CouchbaseProperties properties, Optional network) { + public CouchbaseContainer couchbase(ConfigurableEnvironment environment, + CouchbaseProperties properties, + Optional network) { BucketDefinition bucketDefinition = new BucketDefinition(properties.getBucket()) .withPrimaryIndex(true) .withQuota(properties.getBucketRamMb()); @@ -64,23 +69,37 @@ public CouchbaseContainer couchbase(CouchbaseProperties properties, Optional { - registry.add("embedded.couchbase.host", couchbase::getHost); - registry.add("embedded.couchbase.bootstrapHttpDirectPort", couchbase::getBootstrapHttpDirectPort); - registry.add("embedded.couchbase.bootstrapCarrierDirectPort", couchbase::getBootstrapCarrierDirectPort); - registry.add("embedded.couchbase.networkAlias", () -> COUCHBASE_NETWORK_ALIAS); - - registry.add("embedded.couchbase.bucket", () -> properties.bucket); - registry.add("embedded.couchbase.user", () -> properties.user); - registry.add("embedded.couchbase.password", () -> properties.password); - }; + private void registerCouchbaseEnvironment(CouchbaseContainer couchbase, + ConfigurableEnvironment environment, + CouchbaseProperties properties) { + + Integer mappedHttpPort = couchbase.getBootstrapHttpDirectPort(); + Integer mappedCarrierPort = couchbase.getBootstrapCarrierDirectPort(); + String host = couchbase.getHost(); + + System.setProperty("com.couchbase.bootstrapHttpDirectPort", String.valueOf(mappedHttpPort)); + System.setProperty("com.couchbase.bootstrapCarrierDirectPort", String.valueOf(mappedCarrierPort)); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.couchbase.bootstrapHttpDirectPort", mappedHttpPort); + map.put("embedded.couchbase.bootstrapCarrierDirectPort", mappedCarrierPort); + map.put("embedded.couchbase.host", host); + map.put("embedded.couchbase.bucket", properties.bucket); + map.put("embedded.couchbase.user", properties.user); + map.put("embedded.couchbase.password", properties.password); + map.put("embedded.couchbase.networkAlias", COUCHBASE_NETWORK_ALIAS); + + log.info("Started couchbase server. Connection details {}, " + + "Admin UI: http://localhost:{}, user: {}, password: {}", + map, mappedHttpPort, properties.getUser(), properties.getPassword()); + + MapPropertySource propertySource = new MapPropertySource("embeddedCouchbaseInfo", map); + environment.getPropertySources().addFirst(propertySource); } } diff --git a/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java b/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java index 5ecdb87fd..4e64e6df0 100644 --- a/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java +++ b/embedded-couchbase/src/test/java/com/playtika/testcontainer/couchbase/EmbeddedCouchbaseBootstrapConfigurationTest.java @@ -1,10 +1,11 @@ package com.playtika.testcontainer.couchbase; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; import static org.assertj.core.api.Assertions.assertThat; @@ -16,32 +17,19 @@ }) public abstract class EmbeddedCouchbaseBootstrapConfigurationTest { - @Value("${embedded.couchbase.bootstrapHttpDirectPort}") - String couchbaseBootstrapHttpDirectPort; - - @Value("${embedded.couchbase.bootstrapCarrierDirectPort}") - String couchbaseBootstrapCarrierDirectPort; - - @Value("${embedded.couchbase.host}") - String couchbaseHost; - - @Value("${embedded.couchbase.bucket}") - String couchbaseBucket; - - @Value("${embedded.couchbase.user}") - String couchbaseUser; - - @Value("${embedded.couchbase.password}") - String couchbasePassword; + @Autowired + ConfigurableEnvironment environment; @Test public void propertiesAreAvailable() { - assertThat(couchbaseBootstrapHttpDirectPort).isNotEmpty(); - assertThat(couchbaseBootstrapCarrierDirectPort).isNotEmpty(); - assertThat(couchbaseHost).isNotEmpty(); - assertThat(couchbaseBucket).isNotEmpty(); - assertThat(couchbaseUser).isNotEmpty(); - assertThat(couchbasePassword).isNotEmpty(); + assertThat(environment.getProperty("embedded.couchbase.bootstrapHttpDirectPort")).isNotEmpty(); + assertThat(environment.getProperty("embedded.couchbase.bootstrapCarrierDirectPort")).isNotEmpty(); + assertThat(environment.getProperty("embedded.couchbase.host")).isNotEmpty(); + assertThat(environment.getProperty("embedded.couchbase.bucket")).isNotEmpty(); + assertThat(environment.getProperty("embedded.couchbase.user")).isNotEmpty(); + assertThat(environment.getProperty("embedded.couchbase.password")).isNotEmpty(); + assertThat(System.getProperty("com.couchbase.bootstrapHttpDirectPort")).isNotEmpty(); + assertThat(System.getProperty("com.couchbase.bootstrapCarrierDirectPort")).isNotEmpty(); } @EnableAutoConfiguration diff --git a/embedded-couchbase/src/test/resources/application-test.properties b/embedded-couchbase/src/test/resources/application-enabled.properties similarity index 100% rename from embedded-couchbase/src/test/resources/application-test.properties rename to embedded-couchbase/src/test/resources/application-enabled.properties diff --git a/embedded-dynamodb/pom.xml b/embedded-dynamodb/pom.xml index 9050a5880..d1500712c 100644 --- a/embedded-dynamodb/pom.xml +++ b/embedded-dynamodb/pom.xml @@ -54,10 +54,6 @@ - - org.springframework - spring-test - - \ No newline at end of file + diff --git a/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java b/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java index b2cee3057..6d4581459 100644 --- a/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java +++ b/embedded-dynamodb/src/main/java/com/playtika/testcontainer/dynamodb/EmbeddedDynamoDBBootstrapConfiguration.java @@ -12,12 +12,15 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -35,27 +38,29 @@ public class EmbeddedDynamoDBBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "dynamodb") - public ToxiproxyContainer.ContainerProxy dynamodbContainerProxy(ToxiproxyContainer toxiproxyContainer, + ToxiproxyContainer.ContainerProxy dynamodbContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_DYNAMODB) GenericContainer dynamoDb, - DynamoDBProperties properties) { + DynamoDBProperties properties, + ConfigurableEnvironment environment) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(dynamoDb, properties.getPort()); - log.info("Started DynamoDB ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); - return proxy; - } - @Bean - @ConditionalOnToxiProxyEnabled(module = "dynamodb") - public DynamicPropertyRegistrar dynamodbToxiProxyDynamicPropertyRegistrar( - @Qualifier("dynamodbContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.dynamodb.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.dynamodb.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.dynamodb.toxiproxy.proxyName", proxy::getName); - }; + Map map = new LinkedHashMap<>(); + map.put("embedded.dynamodb.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.dynamodb.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.dynamodb.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedDynamoDBToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started DynamoDB ToxiProxy connection details {}", map); + + return proxy; } @Bean(name = BEAN_NAME_EMBEDDED_DYNAMODB, destroyMethod = "stop") - public GenericContainer dynamoDb(DynamoDBProperties properties, Optional network) { + public GenericContainer dynamoDb(ConfigurableEnvironment environment, + DynamoDBProperties properties, + Optional network) { + GenericContainer dynamodbContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) .waitingFor(new HostPortWaitStrategy()) @@ -64,31 +69,32 @@ public GenericContainer dynamoDb(DynamoDBProperties properties, Optional container, DynamoDBProperties properties) { - return registry -> { - var mappedPort = container.getMappedPort(properties.port); - var host = container.getHost(); - var accessKey = properties.getAccessKey(); - var secretKey = properties.getSecretKey(); - - registry.add("embedded.dynamodb.port", () -> mappedPort); - registry.add("embedded.dynamodb.host", () -> host); - registry.add("embedded.dynamodb.accessKey", () -> accessKey); - registry.add("embedded.dynamodb.secretKey", () -> secretKey); - registry.add("embedded.dynamodb.networkAlias", () -> DYNAMODB_NETWORK_ALIAS); - registry.add("embedded.dynamodb.internalPort", properties::getPort); - - log.info("Started DynamoDb server. Connection details: host: {}, port: {}, accessKey:{}, secretKey: {}", - host, mappedPort, accessKey, secretKey); - log.info("Consult with the doc " + - "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html " + - "for more details"); - }; + private void registerDynamodbEnvironment(GenericContainer container, + ConfigurableEnvironment environment, + DynamoDBProperties properties) { + Integer mappedPort = container.getMappedPort(properties.port); + String host = container.getHost(); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.dynamodb.port", mappedPort); + map.put("embedded.dynamodb.host", host); + map.put("embedded.dynamodb.accessKey", properties.getAccessKey()); + map.put("embedded.dynamodb.secretKey", properties.getSecretKey()); + map.put("embedded.dynamodb.networkAlias", DYNAMODB_NETWORK_ALIAS); + map.put("embedded.dynamodb.internalPort", properties.getPort()); + + log.info("Started DynamoDb server. Connection details: {}, ", map); + log.info("Consult with the doc " + + "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html " + + "for more details"); + + MapPropertySource propertySource = new MapPropertySource("embeddedDynamodbInfo", map); + environment.getPropertySources().addFirst(propertySource); } } diff --git a/embedded-google-pubsub/pom.xml b/embedded-google-pubsub/pom.xml index 20adb353c..1138dba94 100644 --- a/embedded-google-pubsub/pom.xml +++ b/embedded-google-pubsub/pom.xml @@ -34,9 +34,5 @@ true - - org.springframework - spring-test - - \ No newline at end of file + diff --git a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java index 4bafd8541..bbf3f6cb7 100644 --- a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java +++ b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfiguration.java @@ -13,13 +13,16 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -40,26 +43,29 @@ public class EmbeddedPubsubBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "google.pubsub") - public ToxiproxyContainer.ContainerProxy googlePubSubContainerProxy(ToxiproxyContainer toxiproxyContainer, + ToxiproxyContainer.ContainerProxy googlePubSubContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB) GenericContainer pubsub, - PubsubProperties properties) { + PubsubProperties properties, + ConfigurableEnvironment environment) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(pubsub, properties.getPort()); - log.info("Started Google PubSub ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); + + Map map = new LinkedHashMap<>(); + map.put("embedded.google.pubsub.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.google.pubsub.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.google.pubsub.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedGooglePubSubToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Google PubSub ToxiProxy connection details {}", map); + return proxy; } - @Bean - @ConditionalOnToxiProxyEnabled(module = "google.pubsub") - public DynamicPropertyRegistrar googlePubSubToxiProxyDynamicPropertyRegistrar(@Qualifier("googlePubSubContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.google.pubsub.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.google.pubsub.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.google.pubsub.toxiproxy.proxyName", proxy::getName); - }; - } @Bean(name = BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB, destroyMethod = "stop") - public GenericContainer pubsub(PubsubProperties properties, Optional network) { + public GenericContainer pubsub(ConfigurableEnvironment environment, + PubsubProperties properties, + Optional network) { GenericContainer pubsubContainer = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getPort()) .withCommand( @@ -77,18 +83,25 @@ public GenericContainer pubsub(PubsubProperties properties, Optional network.ifPresent(pubsubContainer::withNetwork); pubsubContainer = configureCommonsAndStart(pubsubContainer, properties, log); + registerPubsubEnvironment(pubsubContainer, environment, properties); return pubsubContainer; } - @Bean - public DynamicPropertyRegistrar googlePubSubDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB) GenericContainer container, PubsubProperties properties) { - return registry -> { - registry.add("embedded.google.pubsub.port", () -> container.getMappedPort(properties.getPort())); - registry.add("embedded.google.pubsub.host", container::getHost); - registry.add("embedded.google.pubsub.project-id", properties::getProjectId); - registry.add("embedded.google.pubsub.networkAlias", () -> GOOGLE_PUB_SUB_NETWORK_ALIAS); - registry.add("embedded.google.pubsub.internalPort", properties::getPort); - }; + private void registerPubsubEnvironment(GenericContainer container, + ConfigurableEnvironment environment, + PubsubProperties properties) { + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.google.pubsub.port", container.getMappedPort(properties.getPort())); + map.put("embedded.google.pubsub.host", container.getHost()); + map.put("embedded.google.pubsub.project-id", properties.getProjectId()); + map.put("embedded.google.pubsub.networkAlias", GOOGLE_PUB_SUB_NETWORK_ALIAS); + map.put("embedded.google.pubsub.internalPort", properties.getPort()); + + log.info("Started Google Cloud Pubsub emulator. Connection details: {}, ", map); + log.info("Consult with the doc https://cloud.google.com/pubsub/docs/emulator for more details"); + + MapPropertySource propertySource = new MapPropertySource("embeddedGooglePubsubInfo", map); + environment.getPropertySources().addFirst(propertySource); } @Bean(name = BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB_MANAGED_CHANNEL) diff --git a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java index 25f78a85e..a43076844 100644 --- a/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java +++ b/embedded-google-pubsub/src/main/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubDependenciesAutoConfiguration.java @@ -2,6 +2,7 @@ import com.google.cloud.spring.autoconfigure.core.GcpContextAutoConfiguration; import com.google.cloud.spring.autoconfigure.pubsub.GcpPubSubAutoConfiguration; +import com.google.cloud.spring.autoconfigure.pubsub.GcpPubSubEmulatorAutoConfiguration; import com.google.cloud.spring.pubsub.core.PubSubTemplate; import com.playtika.testcontainer.common.spring.DependsOnPostProcessor; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; @@ -17,7 +18,7 @@ @AutoConfiguration @AutoConfigureOrder -@ImportAutoConfiguration(classes = {GcpContextAutoConfiguration.class, GcpPubSubAutoConfiguration.class}) +@ImportAutoConfiguration(classes = {GcpContextAutoConfiguration.class, GcpPubSubEmulatorAutoConfiguration.class, GcpPubSubAutoConfiguration.class}) @ConditionalOnExpression("${embedded.containers.enabled:true}") @ConditionalOnClass(PubSubTemplate.class) @ConditionalOnProperty(name = "embedded.google.pubsub.enabled", matchIfMissing = true) diff --git a/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java b/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java index ee914d553..3def7057d 100644 --- a/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java +++ b/embedded-google-pubsub/src/test/java/com/playtika/testcontainer/pubsub/EmbeddedPubsubBootstrapConfigurationTest.java @@ -1,32 +1,20 @@ package com.playtika.testcontainer.pubsub; -import com.google.api.gax.core.CredentialsProvider; -import com.google.api.gax.core.FixedCredentialsProvider; -import com.google.api.gax.grpc.GrpcTransportChannel; -import com.google.api.gax.rpc.FixedTransportChannelProvider; -import com.google.api.gax.rpc.TransportChannelProvider; -import com.google.cloud.NoCredentials; import com.google.cloud.spring.pubsub.core.PubSubTemplate; import com.google.cloud.spring.pubsub.support.AcknowledgeablePubsubMessage; import com.google.pubsub.v1.DeadLetterPolicy; import com.google.pubsub.v1.ProjectSubscriptionName; import com.google.pubsub.v1.Subscription; import com.google.pubsub.v1.TopicName; -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.context.ActiveProfiles; import org.testcontainers.containers.GenericContainer; @@ -60,25 +48,6 @@ class EmbeddedPubsubBootstrapConfigurationTest { @EnableAutoConfiguration @Configuration static class TestConfiguration { - - @Bean - @Primary - @ConditionalOnProperty(name = "embedded.google.pubsub.enabled", matchIfMissing = true) - public TransportChannelProvider pubsubTransportChannelProvider(@Qualifier(BEAN_NAME_EMBEDDED_GOOGLE_PUBSUB) GenericContainer container, - PubsubProperties properties) { - String host = container.getHost(); - Integer port = container.getMappedPort(properties.getPort()); - ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext() - .build(); - return FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); - } - - @Bean - @Primary - public CredentialsProvider googleCredentials() { - return FixedCredentialsProvider.create(NoCredentials.getInstance()); - } } @Test diff --git a/embedded-google-pubsub/src/test/resources/application-enabled.yaml b/embedded-google-pubsub/src/test/resources/application-enabled.yaml index 8d96af39e..9fdcfb6f1 100644 --- a/embedded-google-pubsub/src/test/resources/application-enabled.yaml +++ b/embedded-google-pubsub/src/test/resources/application-enabled.yaml @@ -1,2 +1,3 @@ spring.cloud.gcp: - project-id: my-project-id \ No newline at end of file + project-id: ${embedded.google.pubsub.project-id} + pubsub.emulatorHost: ${embedded.google.pubsub.host}:${embedded.google.pubsub.port} diff --git a/embedded-localstack/pom.xml b/embedded-localstack/pom.xml index f0db1cd47..8b904aef9 100644 --- a/embedded-localstack/pom.xml +++ b/embedded-localstack/pom.xml @@ -48,9 +48,5 @@ ${aws-java-sdk.version} provided - - org.springframework - spring-test - diff --git a/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java b/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java index 2a9cdfc4d..99bcc5b1d 100644 --- a/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java +++ b/embedded-localstack/src/main/java/com/playtika/testcontainer/localstack/EmbeddedLocalStackBootstrapConfiguration.java @@ -12,11 +12,14 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.localstack.LocalStackContainer; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -36,42 +39,73 @@ public class EmbeddedLocalStackBootstrapConfiguration { @ConditionalOnToxiProxyEnabled(module = "localstack") ToxiproxyContainer.ContainerProxy localstackContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_LOCALSTACK) LocalStackContainer localStack, - LocalStackProperties properties) { - return toxiproxyContainer.getProxy(localStack, properties.getEdgePort()); - } + LocalStackProperties properties, + ConfigurableEnvironment environment) { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(localStack, properties.getEdgePort()); - @Bean - @ConditionalOnToxiProxyEnabled(module = "localstack") - public DynamicPropertyRegistrar localstackToxiProxyDynamicPropertyRegistrar( - @Qualifier("localstackContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.localstack.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.localstack.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.localstack.toxiproxy.proxyName", proxy::getName); - }; + Map map = new LinkedHashMap<>(); + map.put("embedded.localstack.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.localstack.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.localstack.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedLocalstackToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Localstack ToxiProxy connection details {}", map); + + return proxy; } @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_LOCALSTACK) @Bean(name = BEAN_NAME_EMBEDDED_LOCALSTACK, destroyMethod = "stop") - public LocalStackContainer localStack(LocalStackProperties properties, Optional network) { - LocalStackContainer localStack = new LocalStackContainer(ContainerUtils.getDockerImageName(properties)) + public LocalStackContainer localStack(ConfigurableEnvironment environment, + LocalStackProperties properties, + Optional network) { + LocalStackContainer localStackContainer = new LocalStackContainer(ContainerUtils.getDockerImageName(properties)); + localStackContainer .withExposedPorts(properties.getEdgePort()) + .withEnv("EDGE_PORT", String.valueOf(properties.getEdgePort())) + .withEnv("HOSTNAME", properties.getHostname()) + .withEnv("LOCALSTACK_HOST", properties.getHostnameExternal()) + .withEnv("SKIP_SSL_CERT_DOWNLOAD", "1") .withNetworkAliases(LOCALSTACK_NETWORK_ALIAS); - network.ifPresent(localStack::withNetwork); - configureCommonsAndStart(localStack, properties, log); - return localStack; + + network.ifPresent(localStackContainer::withNetwork); + + for (LocalStackContainer.Service service : properties.services) { + localStackContainer.withServices(service); + } + localStackContainer = (LocalStackContainer) configureCommonsAndStart(localStackContainer, properties, log); + registerLocalStackEnvironment(localStackContainer, environment, properties); + return localStackContainer; } - @Bean - public DynamicPropertyRegistrar localStackDynamicPropertyRegistrar( - @Qualifier(BEAN_NAME_EMBEDDED_LOCALSTACK) LocalStackContainer localStack, - LocalStackProperties properties) { - return registry -> { - registry.add("embedded.localstack.host", localStack::getHost); - registry.add("embedded.localstack.port", () -> localStack.getMappedPort(properties.getEdgePort())); - registry.add("embedded.localstack.networkAlias", () -> LOCALSTACK_NETWORK_ALIAS); - registry.add("embedded.localstack.internalPort", properties::getEdgePort); - }; + private void registerLocalStackEnvironment(LocalStackContainer localStack, + ConfigurableEnvironment environment, + LocalStackProperties properties) { + String host = localStack.getHost(); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.localstack.host", host); + map.put("embedded.localstack.accessKey", localStack.getAccessKey()); + map.put("embedded.localstack.secretKey", localStack.getSecretKey()); + map.put("embedded.localstack.networkAlias", LOCALSTACK_NETWORK_ALIAS); + map.put("embedded.localstack.internalEdgePort", properties.getEdgePort()); + String prefix = "embedded.localstack."; + Integer mappedPort = localStack.getMappedPort(properties.getEdgePort()); + for (LocalStackContainer.Service service : properties.services) { + map.put(prefix + service, localStack.getEndpointOverride(service)); + map.put(prefix + service + ".port", mappedPort); + } + log.info("Started Localstack. Connection details: {}", map); + + MapPropertySource propertySource = new MapPropertySource("embeddedLocalStackInfo", map); + environment.getPropertySources().addFirst(propertySource); + setSystemProperties(localStack); + } + + private static void setSystemProperties(LocalStackContainer localStack) { + System.setProperty("aws.accessKeyId", localStack.getAccessKey()); + System.setProperty("aws.secretKey", localStack.getAccessKey()); } } diff --git a/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java b/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java index e6ca8e7aa..5cfbc31d3 100644 --- a/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java +++ b/embedded-mailhog/src/main/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfiguration.java @@ -12,12 +12,15 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.containers.wait.strategy.Wait; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -35,32 +38,29 @@ public class EmbeddedMailHogBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "mailhog") - public ToxiproxyContainer.ContainerProxy mailhogSmtpContainerProxy(ToxiproxyContainer toxiproxyContainer, + ToxiproxyContainer.ContainerProxy mailhogSmtpContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_MAILHOG) GenericContainer mailhogContainer, - MailHogProperties properties) { + MailHogProperties properties, + ConfigurableEnvironment environment) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(mailhogContainer, properties.getSmtpPort()); - log.info("Started MailHog SMTP ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); - return proxy; - } - @Bean - @ConditionalOnToxiProxyEnabled(module = "mailhog") - public DynamicPropertyRegistrar mailhogSmtpToxiProxyDynamicPropertyRegistrar( - @Qualifier("mailhogSmtpContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.mailhog.smtp.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.mailhog.smtp.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.mailhog.smtp.toxiproxy.proxyName", proxy::getName); - - log.info("Started MailHog SMTP ToxiProxy connection details embedded.mailhog.smtp.toxiproxy.host={}, " + - "embedded.mailhog.smtp.toxiproxy.port={}, embedded.mailhog.smtp.toxiproxy.proxyName={}", - proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); - }; + Map map = new LinkedHashMap<>(); + map.put("embedded.mailhog.smtp.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.mailhog.smtp.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.mailhog.smtp.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedMailhogSmtpToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started MailHog SMTP ToxiProxy connection details {}", map); + + return proxy; } @ConditionalOnMissingBean(name = BEAN_NAME_EMBEDDED_MAILHOG) @Bean(name = BEAN_NAME_EMBEDDED_MAILHOG, destroyMethod = "stop") - public GenericContainer mailHog(MailHogProperties properties, Optional network) { + public GenericContainer mailHog(ConfigurableEnvironment environment, + MailHogProperties properties, + Optional network) { GenericContainer mailHog = new GenericContainer<>(ContainerUtils.getDockerImageName(properties)) .withExposedPorts(properties.getSmtpPort(), properties.getHttpPort()) .withNetworkAliases(MAILHOG_NETWORK_ALIAS) @@ -69,28 +69,26 @@ public GenericContainer mailHog(MailHogProperties properties, Optional mailHog, MailHogProperties properties) { - return registry -> { - Integer smtpMappedPort = mailHog.getMappedPort(properties.getSmtpPort()); - Integer httpMappedPort = mailHog.getMappedPort(properties.getHttpPort()); - registry.add("embedded.mailhog.host", mailHog::getHost); - registry.add("embedded.mailhog.smtp-port", () -> smtpMappedPort); - registry.add("embedded.mailhog.http-port", () -> httpMappedPort); - registry.add("embedded.mailhog.networkAlias", () -> MAILHOG_NETWORK_ALIAS); - registry.add("embedded.mailhog.internalSmtpPort", properties::getSmtpPort); - registry.add("embedded.mailhog.internalHttpPort", properties::getHttpPort); - - log.info("Started MailHog. Connection details: embedded.mailhog.host={}, " + - "embedded.mailhog.smtp-port={}, embedded.mailhog.http-port={}, " + - "embedded.mailhog.networkAlias={}, embedded.mailhog.internalSmtpPort={}, " + - "embedded.mailhog.internalHttpPort={}", mailHog.getHost(), smtpMappedPort, httpMappedPort, - MAILHOG_NETWORK_ALIAS, properties.getSmtpPort(), properties.getHttpPort()); - - }; + private void registerMailHogEnvironment(GenericContainer mailHog, ConfigurableEnvironment environment, MailHogProperties properties) { + Integer smtpMappedPort = mailHog.getMappedPort(properties.getSmtpPort()); + Integer httpMappedPort = mailHog.getMappedPort(properties.getHttpPort()); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.mailhog.host", mailHog.getHost()); + map.put("embedded.mailhog.smtp-port", smtpMappedPort); + map.put("embedded.mailhog.http-port", httpMappedPort); + map.put("embedded.mailhog.networkAlias", MAILHOG_NETWORK_ALIAS); + map.put("embedded.mailhog.internalSmtpPort", properties.getSmtpPort()); + map.put("embedded.mailhog.internalHttpPort", properties.getHttpPort()); + + log.info("Started MailHog. Connection details: {}", map); + + MapPropertySource propertySource = new MapPropertySource("embeddedMailHogInfo", map); + environment.getPropertySources().addFirst(propertySource); } } diff --git a/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java b/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java index 2ba9bad25..2489fe0e0 100644 --- a/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java +++ b/embedded-mailhog/src/test/java/com/playtika/testcontainer/mailhog/EmbeddedMailHogBootstrapConfigurationTest.java @@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; @@ -27,6 +28,9 @@ class EmbeddedMailHogBootstrapConfigurationTest { private static final String MAILHOG_API_MESSAGES = "/api/v2/messages"; + @Autowired + ConfigurableEnvironment environment; + @Autowired JavaMailSender mailSender; @@ -36,27 +40,15 @@ class EmbeddedMailHogBootstrapConfigurationTest { @Value("${embedded.mailhog.http-port}") String mailhogApiPort; - @Value("${embedded.mailhog.smtp-port}") - String mailhogSmtpPort; - - @Value("${embedded.mailhog.smtp.toxiproxy.host}") - String mailhogSmtpToxiproxyHost; - - @Value("${embedded.mailhog.smtp.toxiproxy.port}") - String mailhogSmtpToxiproxyPort; - - @Value("${embedded.mailhog.smtp.toxiproxy.proxyName}") - String mailhogSmtpToxiproxyProxyName; - @Test void propertiesAreAvailable() { - assertThat(mailhogSmtpPort).isNotEmpty(); - assertThat(mailhogApiPort).isNotEmpty(); - assertThat(mailApiHost).isNotEmpty(); + assertThat(environment.getProperty("embedded.mailhog.smtp-port")).isNotEmpty(); + assertThat(environment.getProperty("embedded.mailhog.http-port")).isNotEmpty(); + assertThat(environment.getProperty("embedded.mailhog.host")).isNotEmpty(); - assertThat(mailhogSmtpToxiproxyHost).isNotEmpty(); - assertThat(mailhogSmtpToxiproxyPort).isNotEmpty(); - assertThat(mailhogSmtpToxiproxyProxyName).isNotEmpty(); + assertThat(environment.getProperty("embedded.mailhog.smtp.toxiproxy.host")).isNotEmpty(); + assertThat(environment.getProperty("embedded.mailhog.smtp.toxiproxy.port")).isNotEmpty(); + assertThat(environment.getProperty("embedded.mailhog.smtp.toxiproxy.proxyName")).isNotEmpty(); } @Test diff --git a/embedded-pulsar/pom.xml b/embedded-pulsar/pom.xml index 8f3cb5a03..2184a688c 100644 --- a/embedded-pulsar/pom.xml +++ b/embedded-pulsar/pom.xml @@ -66,9 +66,5 @@ - - org.springframework - spring-test - diff --git a/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java b/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java index 75e997f73..ff9d21d32 100644 --- a/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java +++ b/embedded-pulsar/src/main/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfiguration.java @@ -4,19 +4,23 @@ import com.playtika.testcontainer.toxiproxy.condition.ConditionalOnToxiProxyEnabled; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.Network; import org.testcontainers.containers.PulsarContainer; import org.testcontainers.containers.ToxiproxyContainer; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; -import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; +import static com.playtika.testcontainer.pulsar.PulsarProperties.EMBEDDED_PULSAR; @Slf4j @Configuration @@ -29,41 +33,54 @@ public class EmbeddedPulsarBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "pulsar") - public ToxiproxyContainer.ContainerProxy pulsarContainerProxy(ToxiproxyContainer toxiproxyContainer, - @Qualifier("embeddedPulsar") PulsarContainer embeddedPulsar, - PulsarProperties properties) { - return toxiproxyContainer.getProxy(embeddedPulsar, properties.getBrokerPort()); - } + ToxiproxyContainer.ContainerProxy pulsarContainerProxy(ToxiproxyContainer toxiproxyContainer, + @Qualifier(EMBEDDED_PULSAR) PulsarContainer embeddedPulsar, + PulsarProperties pulsarProperties, + ConfigurableEnvironment environment) { + ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(embeddedPulsar, pulsarProperties.getBrokerPort()); + + Map map = new LinkedHashMap<>(); + map.put("embedded.pulsar.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.pulsar.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.pulsar.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedPulsarToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Pulsar ToxiProxy connection details {}", map); - @Bean(name = "embeddedPulsar", destroyMethod = "stop") - public PulsarContainer pulsar(PulsarProperties properties, - Optional network) { - PulsarContainer pulsar = new PulsarContainer(ContainerUtils.getDockerImageName(properties)) - .withNetworkAliases("pulsar.testcontainer.docker"); - network.ifPresent(pulsar::withNetwork); - configureCommonsAndStart(pulsar, properties, log); - return pulsar; + return proxy; } - @Bean - public DynamicPropertyRegistrar pulsarDynamicPropertyRegistrar( - @Qualifier("embeddedPulsar") PulsarContainer pulsar, - PulsarProperties properties) { - return registry -> { - registry.add("embedded.pulsar.brokerPort", () -> pulsar.getMappedPort(properties.getBrokerPort())); - registry.add("embedded.pulsar.networkAlias", () -> "pulsar.testcontainer.docker"); - registry.add("embedded.pulsar.internalBrokerPort", properties::getBrokerPort); - }; + @Bean(name = EMBEDDED_PULSAR) + public PulsarContainer embeddedPulsar(PulsarProperties pulsarProperties, + ConfigurableEnvironment environment, + @Deprecated @Value("${embedded.pulsar.imageTag:#{null}}") String deprImageTag, + Optional network) { + if (deprImageTag != null) { + throw new IllegalArgumentException("Property `embedded.pulsar.imageTag` is deprecated. Please replace property `embedded.pulsar.imageTag` with `embedded.pulsar.dockerImageVersion`."); + } + PulsarContainer pulsarContainer = new PulsarContainer(ContainerUtils.getDockerImageName(pulsarProperties)) + .withNetworkAliases(PULSAR_NETWORK_ALIAS); + + network.ifPresent(pulsarContainer::withNetwork); + pulsarContainer = (PulsarContainer) ContainerUtils.configureCommonsAndStart(pulsarContainer, pulsarProperties, log); + registerEmbeddedPulsarEnvironment(environment, pulsarContainer, pulsarProperties); + return pulsarContainer; } - @Bean - @ConditionalOnToxiProxyEnabled(module = "pulsar") - public DynamicPropertyRegistrar pulsarToxiProxyDynamicPropertyRegistrar( - @Qualifier("pulsarContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.pulsar.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.pulsar.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.pulsar.toxiproxy.proxyName", proxy::getName); - }; + private static void registerEmbeddedPulsarEnvironment(final ConfigurableEnvironment environment, + final PulsarContainer pulsarContainer, + PulsarProperties properties) { + String pulsarBrokerUrl = pulsarContainer.getPulsarBrokerUrl(); + String pulsarHttpServiceUrl = pulsarContainer.getHttpServiceUrl(); + + Map pulsarEnv = new LinkedHashMap<>(); + pulsarEnv.put("embedded.pulsar.brokerUrl", pulsarBrokerUrl); + pulsarEnv.put("embedded.pulsar.httpServiceUrl", pulsarHttpServiceUrl); + pulsarEnv.put("embedded.pulsar.networkAlias", PULSAR_NETWORK_ALIAS); + pulsarEnv.put("embedded.pulsar.internalBrokerPort", properties.getBrokerPort()); + + MapPropertySource propertySource = new MapPropertySource("embeddedPulsarInfo", pulsarEnv); + environment.getPropertySources().addFirst(propertySource); } } diff --git a/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java b/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java index 5472016d1..87d1aab89 100644 --- a/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java +++ b/embedded-pulsar/src/test/java/com/playtika/testcontainer/pulsar/EmbeddedPulsarBootstrapConfigurationTest.java @@ -3,8 +3,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.core.env.ConfigurableEnvironment; import org.testcontainers.containers.PulsarContainer; import static org.assertj.core.api.Assertions.assertThat; @@ -14,16 +14,13 @@ class EmbeddedPulsarBootstrapConfigurationTest extends AbstractEmbeddedPulsarTes @Autowired private ConfigurableListableBeanFactory beanFactory; - @Value("${embedded.pulsar.brokerUrl}") - String pulsarBrokerUrl; - - @Value("${embedded.pulsar.httpServiceUrl}") - String pulsarHttpServiceUrl; + @Autowired + private ConfigurableEnvironment environment; @Test void propertiesShouldBeSet() { - assertThat(pulsarBrokerUrl).isNotEmpty(); - assertThat(pulsarHttpServiceUrl).isNotEmpty(); + assertThat(environment.getProperty("embedded.pulsar.brokerUrl")).isNotEmpty(); + assertThat(environment.getProperty("embedded.pulsar.httpServiceUrl")).isNotEmpty(); } @Test diff --git a/embedded-vault/README.adoc b/embedded-vault/README.adoc index d57935f30..4e5c1a520 100644 --- a/embedded-vault/README.adoc +++ b/embedded-vault/README.adoc @@ -41,7 +41,7 @@ ==== Example -To auto-configure `spring-cloud-vault-config` use these properties in your test `application-test.yaml`: +To auto-configure `spring-cloud-vault-config` use these properties in your test `application.yaml`: ./src/test/resources/application.yaml [source,yaml] diff --git a/embedded-vault/pom.xml b/embedded-vault/pom.xml index 608fca267..25a931745 100644 --- a/embedded-vault/pom.xml +++ b/embedded-vault/pom.xml @@ -32,9 +32,5 @@ spring-cloud-starter-vault-config true - - org.springframework - spring-test - diff --git a/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java b/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java index 630de0a95..a64df3160 100644 --- a/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java +++ b/embedded-vault/src/main/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfiguration.java @@ -12,13 +12,16 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -import org.springframework.test.context.DynamicPropertyRegistrar; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.testcontainers.containers.Network; import org.testcontainers.containers.ToxiproxyContainer; import org.testcontainers.vault.VaultContainer; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import static com.playtika.testcontainer.common.utils.ContainerUtils.configureCommonsAndStart; @@ -38,26 +41,29 @@ public class EmbeddedVaultBootstrapConfiguration { @Bean @ConditionalOnToxiProxyEnabled(module = "vault") - public ToxiproxyContainer.ContainerProxy vaultContainerProxy(ToxiproxyContainer toxiproxyContainer, + ToxiproxyContainer.ContainerProxy vaultContainerProxy(ToxiproxyContainer toxiproxyContainer, @Qualifier(BEAN_NAME_EMBEDDED_VAULT) VaultContainer vault, + ConfigurableEnvironment environment, VaultProperties properties) { ToxiproxyContainer.ContainerProxy proxy = toxiproxyContainer.getProxy(vault, properties.getPort()); - log.info("Started Vault ToxiProxy connection details host={}, port={}, proxyName={}", proxy.getContainerIpAddress(), proxy.getProxyPort(), proxy.getName()); - return proxy; - } - @Bean - @ConditionalOnToxiProxyEnabled(module = "vault") - public DynamicPropertyRegistrar vaultToxiProxyDynamicPropertyRegistrar(@Qualifier("vaultContainerProxy") ToxiproxyContainer.ContainerProxy proxy) { - return registry -> { - registry.add("embedded.vault.toxiproxy.host", proxy::getContainerIpAddress); - registry.add("embedded.vault.toxiproxy.port", proxy::getProxyPort); - registry.add("embedded.vault.toxiproxy.proxyName", proxy::getName); - }; + Map map = new LinkedHashMap<>(); + map.put("embedded.vault.toxiproxy.host", proxy.getContainerIpAddress()); + map.put("embedded.vault.toxiproxy.port", proxy.getProxyPort()); + map.put("embedded.vault.toxiproxy.proxyName", proxy.getName()); + + MapPropertySource propertySource = new MapPropertySource("embeddedVaultToxiproxyInfo", map); + environment.getPropertySources().addFirst(propertySource); + log.info("Started Vault ToxiProxy connection details {}", map); + + return proxy; } @Bean(name = BEAN_NAME_EMBEDDED_VAULT, destroyMethod = "stop") - public VaultContainer vault(VaultProperties properties, Optional network) { + public VaultContainer vault(ConfigurableEnvironment environment, + VaultProperties properties, + Optional network) { + VaultContainer vault = new VaultContainer<>(ContainerUtils.getDockerImageName(properties)) .withVaultToken(properties.getToken()) .withExposedPorts(properties.getPort()) @@ -83,22 +89,28 @@ public VaultContainer vault(VaultProperties properties, Optional networ } vault = (VaultContainer) configureCommonsAndStart(vault, properties, log); + registerVaultEnvironment(vault, environment, properties); return vault; } - @Bean - public DynamicPropertyRegistrar vaultDynamicPropertyRegistrar(@Qualifier(BEAN_NAME_EMBEDDED_VAULT) VaultContainer vault, VaultProperties properties) { - return registry -> { - Integer mappedPort = vault.getMappedPort(properties.getPort()); - String host = vault.getHost(); - registry.add("embedded.vault.host", () -> host); - registry.add("embedded.vault.port", () -> mappedPort); - registry.add("embedded.vault.token", properties::getToken); - registry.add("embedded.vault.networkAlias", () -> VAULT_NETWORK_ALIAS); - registry.add("embedded.vault.internalPort", properties::getPort); - }; + private void registerVaultEnvironment(VaultContainer vault, ConfigurableEnvironment environment, VaultProperties properties) { + Integer mappedPort = vault.getMappedPort(properties.getPort()); + String host = vault.getHost(); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("embedded.vault.host", host); + map.put("embedded.vault.port", mappedPort); + map.put("embedded.vault.token", properties.getToken()); + map.put("embedded.vault.networkAlias", VAULT_NETWORK_ALIAS); + map.put("embedded.vault.internalPort", properties.getPort()); + + log.info("Started vault. Connection Details: {}, Connection URI: http://{}:{}", map, host, mappedPort); + + MapPropertySource propertySource = new MapPropertySource("embeddedVaultInfo", map); + environment.getPropertySources().addFirst(propertySource); } + private void enableCasForSubPaths(List subPaths, VaultContainer vault) { for (String subPath : subPaths) { if (!subPath.isEmpty()) { diff --git a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java index 03a683d5b..e3b3e28d3 100644 --- a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java +++ b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultBootstrapConfigurationTest.java @@ -2,10 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.vault.core.VaultOperations; import org.springframework.vault.support.Versioned; @@ -20,27 +20,18 @@ ,classes = EmbeddedVaultBootstrapConfigurationTest.TestConfiguration.class) public class EmbeddedVaultBootstrapConfigurationTest { - @Value("${embedded.vault.host}") - String vaultHost; - - @Value("${embedded.vault.port}") - String vaultPort; - - @Value("${embedded.vault.token}") - String vaultToken; - - @Value("${secret_one}") - String secretOne; + @Autowired + private ConfigurableEnvironment environment; @Autowired private VaultOperations vaultOperations; @Test public void propertiesAreAvailable() { - assertThat(vaultHost).isNotEmpty(); - assertThat(vaultPort).isNotEmpty(); - assertThat(vaultToken).isNotEmpty(); - assertThat(secretOne).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.host")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.port")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.token")).isNotEmpty(); + assertThat(environment.getProperty("secret_one")).isNotEmpty(); } @Test diff --git a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java index 989df402a..bfcfddd3d 100644 --- a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java +++ b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledForSubPathsTest.java @@ -2,10 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.vault.VaultException; import org.springframework.vault.core.VaultOperations; import org.springframework.vault.core.VaultTemplate; @@ -32,20 +32,8 @@ public class EmbeddedVaultWithCasEnabledForSubPathsTest { private static final String SUB_PATH1 = "sub-path1"; private static final String SUB_PATH2 = "sub-path2"; - @Value("${embedded.vault.host}") - String vaultHost; - - @Value("${embedded.vault.port}") - String vaultPort; - - @Value("${embedded.vault.token}") - String vaultToken; - - @Value("${secret_one}") - String secretOne; - - @Value("${embedded.vault.cas-enabled-for-sub-paths}") - String vaultCasEnabledForSubPaths; + @Autowired + private ConfigurableEnvironment environment; @Autowired private VaultOperations vaultOperations; @@ -55,11 +43,11 @@ public class EmbeddedVaultWithCasEnabledForSubPathsTest { @Test public void propertiesAreAvailable() { - assertThat(vaultHost).isNotEmpty(); - assertThat(vaultPort).isNotEmpty(); - assertThat(vaultToken).isNotEmpty(); - assertThat(secretOne).isNotEmpty(); - assertThat(vaultCasEnabledForSubPaths).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.host")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.port")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.token")).isNotEmpty(); + assertThat(environment.getProperty("secret_one")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.cas-enabled-for-sub-paths")).isNotEmpty(); } @Test diff --git a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java index 2c9520bd3..49c0db8e9 100644 --- a/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java +++ b/embedded-vault/src/test/java/com/playtika/testcontainer/vault/EmbeddedVaultWithCasEnabledTest.java @@ -2,10 +2,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.vault.VaultException; import org.springframework.vault.core.VaultOperations; import org.springframework.vault.core.VaultTemplate; @@ -29,20 +29,8 @@ public class EmbeddedVaultWithCasEnabledTest { private static final String CHECK_AND_SET_REQUIRED_ERROR = "check-and-set parameter required for this call"; private static final String SECRET_MOUNT_NAME = "secret"; - @Value("${embedded.vault.host}") - String vaultHost; - - @Value("${embedded.vault.port}") - String vaultPort; - - @Value("${embedded.vault.token}") - String vaultToken; - - @Value("${secret_one}") - String secretOne; - - @Value("${embedded.vault.cas-enabled}") - String vaultCasEnabled; + @Autowired + private ConfigurableEnvironment environment; @Autowired private VaultOperations vaultOperations; @@ -52,11 +40,11 @@ public class EmbeddedVaultWithCasEnabledTest { @Test public void propertiesAreAvailable() { - assertThat(vaultHost).isNotEmpty(); - assertThat(vaultPort).isNotEmpty(); - assertThat(vaultToken).isNotEmpty(); - assertThat(secretOne).isNotEmpty(); - assertThat(vaultCasEnabled).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.host")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.port")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.token")).isNotEmpty(); + assertThat(environment.getProperty("secret_one")).isNotEmpty(); + assertThat(environment.getProperty("embedded.vault.cas-enabled")).isNotEmpty(); } @Test diff --git a/embedded-vault/src/test/resources/application-test.properties b/embedded-vault/src/test/resources/bootstrap.properties similarity index 100% rename from embedded-vault/src/test/resources/application-test.properties rename to embedded-vault/src/test/resources/bootstrap.properties