From d1cd43bc68fc4cd0580c82bcef45d8f98e793208 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 19 May 2025 19:25:25 -0700 Subject: [PATCH] Move JDBC Docker Compose support into spring-boot-jdbc --- .../main/resources/META-INF/spring.factories | 7 - .../spring-boot-jdbc/build.gradle | 7 + ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- ...nectionDetailsFactoryIntegrationTests.java | 2 +- .../compose/clickhouse-bitnami-compose.yaml | 9 + .../docker/compose/clickhouse-compose.yaml | 9 + .../compose/mariadb-bitnami-compose.yaml | 10 + .../jdbc/docker/compose/mariadb-compose.yaml | 11 ++ .../docker/compose/mssqlserver-compose.yaml | 9 + ...qlserver-with-jdbc-parameters-compose.yaml | 11 ++ .../docker/compose/mysql-bitnami-compose.yaml | 10 + .../jdbc/docker/compose/mysql-compose.yaml | 10 + .../jdbc/docker/compose/oracle-compose.yaml | 15 ++ .../jdbc/docker/compose/otlp-compose.yaml | 6 + .../postgres-application-name-compose.yaml | 12 ++ .../compose/postgres-bitnami-compose.yaml | 9 + .../jdbc/docker/compose/postgres-compose.yaml | 9 + ...s-with-trust-host-auth-method-compose.yaml | 9 + .../docker/compose/ClickHouseEnvironment.java | 62 ++++++ ...DockerComposeConnectionDetailsFactory.java | 3 +- .../jdbc/docker/compose}/JdbcUrlBuilder.java | 11 +- .../docker/compose/MariaDbEnvironment.java | 84 +++++++++ ...DockerComposeConnectionDetailsFactory.java | 3 +- .../jdbc/docker/compose/MySqlEnvironment.java | 73 ++++++++ ...DockerComposeConnectionDetailsFactory.java | 3 +- .../jdbc/docker/compose/OracleContainer.java | 47 +++++ .../docker/compose/OracleEnvironment.java | 68 +++++++ ...DockerComposeConnectionDetailsFactory.java | 2 +- ...DockerComposeConnectionDetailsFactory.java | 2 +- ...DockerComposeConnectionDetailsFactory.java | 2 +- .../docker/compose/PostgresEnvironment.java | 92 +++++++++ ...DockerComposeConnectionDetailsFactory.java | 3 +- .../docker/compose/SqlServerEnvironment.java | 54 ++++++ ...DockerComposeConnectionDetailsFactory.java | 3 +- .../jdbc/docker/compose}/package-info.java | 5 +- .../main/resources/META-INF/spring.factories | 7 + .../compose/ClickHouseEnvironmentTests.java | 84 +++++++++ .../docker/compose}/JdbcUrlBuilderTests.java | 2 +- .../compose/MariaDbEnvironmentTests.java | 176 ++++++++++++++++++ .../docker/compose/MySqlEnvironmentTests.java | 104 +++++++++++ .../compose/OracleEnvironmentTests.java | 115 ++++++++++++ .../compose/PostgresEnvironmentTests.java | 156 ++++++++++++++++ ...nDetailsFactoryConnectionDetailsTests.java | 2 +- .../compose/SqlServerEnvironmentTests.java | 65 +++++++ 49 files changed, 1357 insertions(+), 38 deletions(-) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/clickhouse => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (97%) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mariadb => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (96%) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mysql => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (96%) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (97%) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (97%) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (98%) rename spring-boot-project/{spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/sqlserver => spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose}/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java (97%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-bitnami-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-bitnami-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-with-jdbc-parameters-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-bitnami-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/oracle-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/otlp-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-application-name-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-bitnami-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-with-trust-host-auth-method-compose.yaml create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironment.java rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/clickhouse => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java (94%) rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/JdbcUrlBuilder.java (90%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironment.java rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mariadb => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/MariaDbJdbcDockerComposeConnectionDetailsFactory.java (94%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironment.java rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mysql => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/MySqlJdbcDockerComposeConnectionDetailsFactory.java (94%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleContainer.java create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironment.java rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java (94%) rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/OracleJdbcDockerComposeConnectionDetailsFactory.java (97%) rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/OracleXeJdbcDockerComposeConnectionDetailsFactory.java (94%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironment.java rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/PostgresJdbcDockerComposeConnectionDetailsFactory.java (95%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironment.java rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/sqlserver => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/SqlServerJdbcDockerComposeConnectionDetailsFactory.java (95%) rename spring-boot-project/{spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc => spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose}/package-info.java (77%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironmentTests.java rename spring-boot-project/{spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/jdbc => spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose}/JdbcUrlBuilderTests.java (97%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironmentTests.java create mode 100644 spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironmentTests.java create mode 100644 spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironmentTests.java create mode 100644 spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironmentTests.java rename spring-boot-project/{spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres => spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose}/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java (98%) create mode 100644 spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironmentTests.java diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-docker-compose-all/src/main/resources/META-INF/spring.factories index 200c81b99d..0708f7155f 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-docker-compose-all/src/main/resources/META-INF/spring.factories @@ -1,29 +1,22 @@ # Connection Details Factories org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ -org.springframework.boot.docker.compose.service.connection.clickhouse.ClickHouseJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.clickhouse.ClickHouseR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.flyway.JdbcAdaptingFlywayConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.hazelcast.HazelcastDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.ldap.LLdapDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.ldap.OpenLdapDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.liquibase.JdbcAdaptingLiquibaseConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.mariadb.MariaDbJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.mariadb.MariaDbR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.mongo.MongoDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.mysql.MySqlJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.mysql.MySqlR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.neo4j.Neo4jDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.oracle.OracleFreeJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.oracle.OracleFreeR2dbcDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.oracle.OracleXeJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.oracle.OracleXeR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.otlp.OpenTelemetryLoggingDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.otlp.OpenTelemetryMetricsDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.otlp.OpenTelemetryTracingDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.postgres.PostgresJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.postgres.PostgresR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.pulsar.PulsarDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.redis.RedisDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.docker.compose.service.connection.sqlserver.SqlServerJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.sqlserver.SqlServerR2dbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.docker.compose.service.connection.zipkin.ZipkinDockerComposeConnectionDetailsFactory diff --git a/spring-boot-project/spring-boot-jdbc/build.gradle b/spring-boot-project/spring-boot-jdbc/build.gradle index cdfdd9001d..858d58131b 100644 --- a/spring-boot-project/spring-boot-jdbc/build.gradle +++ b/spring-boot-project/spring-boot-jdbc/build.gradle @@ -20,6 +20,7 @@ dependencies { optional(project(":spring-boot-project:spring-boot-actuator-autoconfigure")) optional(project(":spring-boot-project:spring-boot-autoconfigure")) + optional(project(":spring-boot-project:spring-boot-docker-compose")) optional(project(":spring-boot-project:spring-boot-testcontainers")) optional("com.h2database:h2") optional("com.mchange:c3p0") @@ -37,9 +38,15 @@ dependencies { dockerTestImplementation(project(":spring-boot-project:spring-boot-test")) dockerTestImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support-docker")) + dockerTestImplementation(testFixtures(project(":spring-boot-project:spring-boot-docker-compose"))) dockerTestImplementation("org.testcontainers:junit-jupiter") dockerTestImplementation("org.testcontainers:postgresql") + dockerTestRuntimeOnly("com.clickhouse:clickhouse-jdbc") + dockerTestRuntimeOnly("com.microsoft.sqlserver:mssql-jdbc") + dockerTestRuntimeOnly("org.lz4:lz4-java:1.8.0") + dockerTestRuntimeOnly("org.postgresql:postgresql") + testImplementation(project(":spring-boot-project:spring-boot-test")) testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) testImplementation(testFixtures(project(":spring-boot-project:spring-boot-autoconfigure"))) diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/clickhouse/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 97% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/clickhouse/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 1ca1c2a884..6d9d06d922 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/clickhouse/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/ClickHouseJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.clickhouse; +package org.springframework.boot.jdbc.docker.compose; import java.sql.Driver; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mariadb/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 96% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mariadb/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index fbb4f52272..f3914610bc 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mariadb/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/MariaDbJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.mariadb; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mysql/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 96% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mysql/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 5054e40c7c..66f54fcf20 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/mysql/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/MySqlJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.mysql; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 97% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 8d3272b19b..cb3e0e5c4b 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/OracleFreeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.oracle; +package org.springframework.boot.jdbc.docker.compose; import java.sql.Driver; import java.time.Duration; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 97% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index a4dc617b3b..76599d1ba5 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/OracleXeJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.oracle; +package org.springframework.boot.jdbc.docker.compose; import java.sql.Driver; import java.time.Duration; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 98% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 7d307608cd..d6fae32ee9 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.postgres; +package org.springframework.boot.jdbc.docker.compose; import java.sql.Driver; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/sqlserver/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java similarity index 97% rename from spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/sqlserver/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java rename to spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java index 2ebe4c3425..0ab54e5eef 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/sqlserver/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/java/org/springframework/boot/jdbc/docker/compose/SqlServerJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.sqlserver; +package org.springframework.boot.jdbc.docker.compose; import java.sql.Driver; diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-bitnami-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-bitnami-compose.yaml new file mode 100644 index 0000000000..2d56633e7c --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-bitnami-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '8123' + environment: + - 'CLICKHOUSE_USER=myuser' + - 'CLICKHOUSE_PASSWORD=secret' + - 'CLICKHOUSE_DB=mydatabase' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-compose.yaml new file mode 100644 index 0000000000..2d56633e7c --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/clickhouse-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '8123' + environment: + - 'CLICKHOUSE_USER=myuser' + - 'CLICKHOUSE_PASSWORD=secret' + - 'CLICKHOUSE_DB=mydatabase' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-bitnami-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-bitnami-compose.yaml new file mode 100644 index 0000000000..64406055b9 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-bitnami-compose.yaml @@ -0,0 +1,10 @@ +services: + database: + image: '{imageName}' + ports: + - '3306' + environment: + - 'MARIADB_ROOT_PASSWORD=verysecret' + - 'MARIADB_USER=myuser' + - 'MARIADB_PASSWORD=secret' + - 'MARIADB_DATABASE=mydatabase' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-compose.yaml new file mode 100644 index 0000000000..c63fd81224 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mariadb-compose.yaml @@ -0,0 +1,11 @@ +services: + database: + image: '{imageName}' + ports: + - '3306' + environment: + - 'MARIADB_ROOT_PASSWORD=verysecret' + - 'MARIADB_USER=myuser' + - 'MARIADB_PASSWORD=secret' + - 'MARIADB_DATABASE=mydatabase' + diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-compose.yaml new file mode 100644 index 0000000000..672b27ad78 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '1433' + environment: + - 'MSSQL_PID=express' + - 'MSSQL_SA_PASSWORD=verYs3cret' + - 'ACCEPT_EULA=yes' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-with-jdbc-parameters-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-with-jdbc-parameters-compose.yaml new file mode 100644 index 0000000000..76dd4998ae --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mssqlserver-with-jdbc-parameters-compose.yaml @@ -0,0 +1,11 @@ +services: + database: + image: '{imageName}' + ports: + - '1433' + environment: + - 'MSSQL_PID=express' + - 'MSSQL_SA_PASSWORD=verYs3cret' + - 'ACCEPT_EULA=yes' + labels: + org.springframework.boot.jdbc.parameters: sendStringParametersAsUnicode=false \ No newline at end of file diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-bitnami-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-bitnami-compose.yaml new file mode 100644 index 0000000000..b0340ed3ed --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-bitnami-compose.yaml @@ -0,0 +1,10 @@ +services: + database: + image: '{imageName}' + ports: + - '3306' + environment: + - 'MYSQL_ROOT_PASSWORD=verysecret' + - 'MYSQL_USER=myuser' + - 'MYSQL_PASSWORD=secret' + - 'MYSQL_DATABASE=mydatabase' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-compose.yaml new file mode 100644 index 0000000000..b0340ed3ed --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/mysql-compose.yaml @@ -0,0 +1,10 @@ +services: + database: + image: '{imageName}' + ports: + - '3306' + environment: + - 'MYSQL_ROOT_PASSWORD=verysecret' + - 'MYSQL_USER=myuser' + - 'MYSQL_PASSWORD=secret' + - 'MYSQL_DATABASE=mydatabase' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/oracle-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/oracle-compose.yaml new file mode 100644 index 0000000000..1cfa3ca87a --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/oracle-compose.yaml @@ -0,0 +1,15 @@ +services: + database: + image: '{imageName}' + ports: + - '1521' + environment: + - 'APP_USER=app_user' + - 'APP_USER_PASSWORD=app_user_secret' + - 'ORACLE_PASSWORD=secret' + healthcheck: + test: ["CMD-SHELL", "healthcheck.sh"] + interval: 10s + timeout: 5s + retries: 10 + diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/otlp-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/otlp-compose.yaml new file mode 100644 index 0000000000..86e0547541 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/otlp-compose.yaml @@ -0,0 +1,6 @@ +services: + otlp: + image: '{imageName}' + ports: + - '4317' + - '4318' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-application-name-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-application-name-compose.yaml new file mode 100644 index 0000000000..2b77213441 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-application-name-compose.yaml @@ -0,0 +1,12 @@ +services: + database: + image: '{imageName}' + ports: + - '5432' + environment: + - 'POSTGRES_USER=myuser' + - 'POSTGRES_DB=mydatabase' + - 'POSTGRES_PASSWORD=secret' + labels: + org.springframework.boot.jdbc.parameters: 'ApplicationName=spring+boot' + org.springframework.boot.r2dbc.parameters: 'applicationName=spring boot' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-bitnami-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-bitnami-compose.yaml new file mode 100644 index 0000000000..97eca6b3c8 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-bitnami-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '5432' + environment: + - 'POSTGRESQL_USERNAME=myuser' + - 'POSTGRESQL_DATABASE=mydatabase' + - 'POSTGRESQL_PASSWORD=secret' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-compose.yaml new file mode 100644 index 0000000000..cb721c823b --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '5432' + environment: + - 'POSTGRES_USER=myuser' + - 'POSTGRES_DB=mydatabase' + - 'POSTGRES_PASSWORD=secret' diff --git a/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-with-trust-host-auth-method-compose.yaml b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-with-trust-host-auth-method-compose.yaml new file mode 100644 index 0000000000..7a9607dcdc --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/dockerTest/resources/org/springframework/boot/jdbc/docker/compose/postgres-with-trust-host-auth-method-compose.yaml @@ -0,0 +1,9 @@ +services: + database: + image: '{imageName}' + ports: + - '5432' + environment: + - 'POSTGRES_USER=myuser' + - 'POSTGRES_DB=mydatabase' + - 'POSTGRES_HOST_AUTH_METHOD=trust' diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironment.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironment.java new file mode 100644 index 0000000000..9246b0da9b --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironment.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * ClickHouse environment details. + * + * @author Stephane Nicoll + */ +class ClickHouseEnvironment { + + private final String username; + + private final String password; + + private final String database; + + ClickHouseEnvironment(Map env) { + this.username = env.getOrDefault("CLICKHOUSE_USER", "default"); + this.password = extractPassword(env); + this.database = env.getOrDefault("CLICKHOUSE_DB", "default"); + } + + private String extractPassword(Map env) { + boolean allowEmpty = env.containsKey("ALLOW_EMPTY_PASSWORD"); + String password = env.get("CLICKHOUSE_PASSWORD"); + Assert.state(StringUtils.hasLength(password) || allowEmpty, "No ClickHouse password found"); + return (password != null) ? password : ""; + } + + String getUsername() { + return this.username; + } + + String getPassword() { + return this.password; + } + + String getDatabase() { + return this.database; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/clickhouse/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java similarity index 94% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/clickhouse/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java index 8815311020..2161477a4d 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/clickhouse/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/ClickHouseJdbcDockerComposeConnectionDetailsFactory.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.clickhouse; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; -import org.springframework.boot.docker.compose.service.connection.jdbc.JdbcUrlBuilder; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; /** diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc/JdbcUrlBuilder.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/JdbcUrlBuilder.java similarity index 90% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc/JdbcUrlBuilder.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/JdbcUrlBuilder.java index 078ace52e9..f19e650f6e 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc/JdbcUrlBuilder.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/JdbcUrlBuilder.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.jdbc; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.util.Assert; @@ -26,9 +26,8 @@ import org.springframework.util.StringUtils; * @author Moritz Halbritter * @author Andy Wilkinson * @author Phillip Webb - * @since 3.1.0 */ -public class JdbcUrlBuilder { +class JdbcUrlBuilder { private static final String PARAMETERS_LABEL = "org.springframework.boot.jdbc.parameters"; @@ -41,7 +40,7 @@ public class JdbcUrlBuilder { * @param driverProtocol the driver protocol * @param containerPort the source container port */ - public JdbcUrlBuilder(String driverProtocol, int containerPort) { + JdbcUrlBuilder(String driverProtocol, int containerPort) { Assert.notNull(driverProtocol, "'driverProtocol' must not be null"); this.driverProtocol = driverProtocol; this.containerPort = containerPort; @@ -52,7 +51,7 @@ public class JdbcUrlBuilder { * @param service the running service * @return a new JDBC URL */ - public String build(RunningService service) { + String build(RunningService service) { return build(service, null); } @@ -62,7 +61,7 @@ public class JdbcUrlBuilder { * @param database the database to connect to * @return a new JDBC URL */ - public String build(RunningService service, String database) { + String build(RunningService service, String database) { return urlFor(service, database); } diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironment.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironment.java new file mode 100644 index 0000000000..e20b3a5d73 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironment.java @@ -0,0 +1,84 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * MariaDB environment details. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Scott Frederick + */ +class MariaDbEnvironment { + + private final String username; + + private final String password; + + private final String database; + + MariaDbEnvironment(Map env) { + this.username = extractUsername(env); + this.password = extractPassword(env); + this.database = extractDatabase(env); + } + + private String extractUsername(Map env) { + String user = env.get("MARIADB_USER"); + return (user != null) ? user : env.getOrDefault("MYSQL_USER", "root"); + } + + private String extractPassword(Map env) { + Assert.state(!env.containsKey("MARIADB_RANDOM_ROOT_PASSWORD"), "MARIADB_RANDOM_ROOT_PASSWORD is not supported"); + Assert.state(!env.containsKey("MYSQL_RANDOM_ROOT_PASSWORD"), "MYSQL_RANDOM_ROOT_PASSWORD is not supported"); + Assert.state(!env.containsKey("MARIADB_ROOT_PASSWORD_HASH"), "MARIADB_ROOT_PASSWORD_HASH is not supported"); + boolean allowEmpty = env.containsKey("MARIADB_ALLOW_EMPTY_PASSWORD") + || env.containsKey("MYSQL_ALLOW_EMPTY_PASSWORD") || env.containsKey("ALLOW_EMPTY_PASSWORD"); + String password = env.get("MARIADB_PASSWORD"); + password = (password != null) ? password : env.get("MYSQL_PASSWORD"); + password = (password != null) ? password : env.get("MARIADB_ROOT_PASSWORD"); + password = (password != null) ? password : env.get("MYSQL_ROOT_PASSWORD"); + Assert.state(StringUtils.hasLength(password) || allowEmpty, "No MariaDB password found"); + return (password != null) ? password : ""; + } + + private String extractDatabase(Map env) { + String database = env.get("MARIADB_DATABASE"); + database = (database != null) ? database : env.get("MYSQL_DATABASE"); + Assert.state(database != null, "No MARIADB_DATABASE defined"); + return database; + } + + String getUsername() { + return this.username; + } + + String getPassword() { + return this.password; + } + + String getDatabase() { + return this.database; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mariadb/MariaDbJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbJdbcDockerComposeConnectionDetailsFactory.java similarity index 94% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mariadb/MariaDbJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbJdbcDockerComposeConnectionDetailsFactory.java index b424b05e0d..5a26800bb3 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mariadb/MariaDbJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MariaDbJdbcDockerComposeConnectionDetailsFactory.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.mariadb; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; -import org.springframework.boot.docker.compose.service.connection.jdbc.JdbcUrlBuilder; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; /** diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironment.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironment.java new file mode 100644 index 0000000000..947da544af --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironment.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * MySQL environment details. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Scott Frederick + */ +class MySqlEnvironment { + + private final String username; + + private final String password; + + private final String database; + + MySqlEnvironment(Map env) { + this.username = env.getOrDefault("MYSQL_USER", "root"); + this.password = extractPassword(env); + this.database = extractDatabase(env); + } + + private String extractPassword(Map env) { + Assert.state(!env.containsKey("MYSQL_RANDOM_ROOT_PASSWORD"), "MYSQL_RANDOM_ROOT_PASSWORD is not supported"); + boolean allowEmpty = env.containsKey("MYSQL_ALLOW_EMPTY_PASSWORD") || env.containsKey("ALLOW_EMPTY_PASSWORD"); + String password = env.get("MYSQL_PASSWORD"); + password = (password != null) ? password : env.get("MYSQL_ROOT_PASSWORD"); + Assert.state(StringUtils.hasLength(password) || allowEmpty, "No MySQL password found"); + return (password != null) ? password : ""; + } + + private String extractDatabase(Map env) { + String database = env.get("MYSQL_DATABASE"); + Assert.state(database != null, "No MYSQL_DATABASE defined"); + return database; + } + + String getUsername() { + return this.username; + } + + String getPassword() { + return this.password; + } + + String getDatabase() { + return this.database; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mysql/MySqlJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlJdbcDockerComposeConnectionDetailsFactory.java similarity index 94% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mysql/MySqlJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlJdbcDockerComposeConnectionDetailsFactory.java index f5652d6511..f0c78739ca 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/mysql/MySqlJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/MySqlJdbcDockerComposeConnectionDetailsFactory.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.mysql; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; -import org.springframework.boot.docker.compose.service.connection.jdbc.JdbcUrlBuilder; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; /** diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleContainer.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleContainer.java new file mode 100644 index 0000000000..4d9a8c4bc0 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleContainer.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +/** + * Enumeration of supported Oracle containers. + * + * @author Andy Wilkinson + */ +enum OracleContainer { + + FREE("gvenzl/oracle-free", "freepdb1"), + + XE("gvenzl/oracle-xe", "xepdb1"); + + private final String imageName; + + private final String defaultDatabase; + + OracleContainer(String imageName, String defaultDatabase) { + this.imageName = imageName; + this.defaultDatabase = defaultDatabase; + } + + String getImageName() { + return this.imageName; + } + + String getDefaultDatabase() { + return this.defaultDatabase; + } + +} diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironment.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironment.java new file mode 100644 index 0000000000..a2a7ee1a30 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironment.java @@ -0,0 +1,68 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Oracle Database environment details. + * + * @author Andy Wilkinson + */ +class OracleEnvironment { + + private final String username; + + private final String password; + + private final String database; + + OracleEnvironment(Map env, String defaultDatabase) { + this.username = env.getOrDefault("APP_USER", "system"); + this.password = extractPassword(env); + this.database = env.getOrDefault("ORACLE_DATABASE", defaultDatabase); + } + + private String extractPassword(Map env) { + if (env.containsKey("APP_USER")) { + String password = env.get("APP_USER_PASSWORD"); + Assert.state(StringUtils.hasLength(password), "No Oracle app password found"); + return password; + } + Assert.state(!env.containsKey("ORACLE_RANDOM_PASSWORD"), + "ORACLE_RANDOM_PASSWORD is not supported without APP_USER and APP_USER_PASSWORD"); + String password = env.get("ORACLE_PASSWORD"); + Assert.state(StringUtils.hasLength(password), "No Oracle password found"); + return password; + } + + String getUsername() { + return this.username; + } + + String getPassword() { + return this.password; + } + + String getDatabase() { + return this.database; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java similarity index 94% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java index f9511dd7de..1031eb60c0 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleFreeJdbcDockerComposeConnectionDetailsFactory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.oracle; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleJdbcDockerComposeConnectionDetailsFactory.java similarity index 97% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleJdbcDockerComposeConnectionDetailsFactory.java index bca2e789fb..ce55e86ff1 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleJdbcDockerComposeConnectionDetailsFactory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.oracle; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleXeJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleXeJdbcDockerComposeConnectionDetailsFactory.java similarity index 94% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleXeJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleXeJdbcDockerComposeConnectionDetailsFactory.java index ce4ead668e..d61f016b00 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/oracle/OracleXeJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/OracleXeJdbcDockerComposeConnectionDetailsFactory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.oracle; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironment.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironment.java new file mode 100644 index 0000000000..679833786a --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironment.java @@ -0,0 +1,92 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Postgres environment details. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Scott Frederick + * @author Sidmar Theodoro + * @author He Zean + */ +class PostgresEnvironment { + + private static final String[] USERNAME_KEYS = new String[] { "POSTGRES_USER", "POSTGRESQL_USER", + "POSTGRESQL_USERNAME" }; + + private static final String DEFAULT_USERNAME = "postgres"; + + private static final String[] DATABASE_KEYS = new String[] { "POSTGRES_DB", "POSTGRESQL_DB", + "POSTGRESQL_DATABASE" }; + + private final String username; + + private final String password; + + private final String database; + + PostgresEnvironment(Map env) { + this.username = extract(env, USERNAME_KEYS, DEFAULT_USERNAME); + this.password = extractPassword(env); + this.database = extract(env, DATABASE_KEYS, this.username); + } + + private String extract(Map env, String[] keys, String defaultValue) { + for (String key : keys) { + if (env.containsKey(key)) { + return env.get(key); + } + } + return defaultValue; + } + + private String extractPassword(Map env) { + if (isUsingTrustHostAuthMethod(env)) { + return null; + } + String password = env.getOrDefault("POSTGRES_PASSWORD", env.get("POSTGRESQL_PASSWORD")); + boolean allowEmpty = env.containsKey("ALLOW_EMPTY_PASSWORD"); + Assert.state(allowEmpty || StringUtils.hasLength(password), "No PostgreSQL password found"); + return (password != null) ? password : ""; + } + + private boolean isUsingTrustHostAuthMethod(Map env) { + String hostAuthMethod = env.get("POSTGRES_HOST_AUTH_METHOD"); + return "trust".equals(hostAuthMethod); + } + + String getUsername() { + return this.username; + } + + String getPassword() { + return this.password; + } + + String getDatabase() { + return this.database; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactory.java similarity index 95% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactory.java index d5fdbce0db..9a720e442b 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.postgres; +package org.springframework.boot.jdbc.docker.compose; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -22,7 +22,6 @@ import java.nio.charset.StandardCharsets; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; -import org.springframework.boot.docker.compose.service.connection.jdbc.JdbcUrlBuilder; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; diff --git a/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironment.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironment.java new file mode 100644 index 0000000000..42f4d74443 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironment.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * MS SQL Server environment details. + * + * @author Andy Wilkinson + */ +class SqlServerEnvironment { + + private final String username = "SA"; + + private final String password; + + SqlServerEnvironment(Map env) { + this.password = extractPassword(env); + } + + private String extractPassword(Map env) { + String password = env.get("MSSQL_SA_PASSWORD"); + password = (password != null) ? password : env.get("SA_PASSWORD"); + Assert.state(StringUtils.hasLength(password), "No MSSQL password found"); + return password; + } + + String getUsername() { + return this.username; + } + + String getPassword() { + return this.password; + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/sqlserver/SqlServerJdbcDockerComposeConnectionDetailsFactory.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerJdbcDockerComposeConnectionDetailsFactory.java similarity index 95% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/sqlserver/SqlServerJdbcDockerComposeConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerJdbcDockerComposeConnectionDetailsFactory.java index 50fa160dd6..eadf7d7840 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/sqlserver/SqlServerJdbcDockerComposeConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/SqlServerJdbcDockerComposeConnectionDetailsFactory.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.sqlserver; +package org.springframework.boot.jdbc.docker.compose; import org.springframework.boot.docker.compose.core.RunningService; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; -import org.springframework.boot.docker.compose.service.connection.jdbc.JdbcUrlBuilder; import org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; /** diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc/package-info.java b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/package-info.java similarity index 77% rename from spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc/package-info.java rename to spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/package-info.java index a242f9ad42..217ae52f44 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/main/java/org/springframework/boot/docker/compose/service/connection/jdbc/package-info.java +++ b/spring-boot-project/spring-boot-jdbc/src/main/java/org/springframework/boot/jdbc/docker/compose/package-info.java @@ -15,7 +15,6 @@ */ /** - * Utilities to help when creating - * {@link org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails}. + * Support for Docker Compose JDBC service connections. */ -package org.springframework.boot.docker.compose.service.connection.jdbc; +package org.springframework.boot.jdbc.docker.compose; diff --git a/spring-boot-project/spring-boot-jdbc/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-jdbc/src/main/resources/META-INF/spring.factories index 8aa4cb6b38..6e60a1e18d 100644 --- a/spring-boot-project/spring-boot-jdbc/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-jdbc/src/main/resources/META-INF/spring.factories @@ -5,6 +5,13 @@ org.springframework.boot.jdbc.autoconfigure.HikariDriverConfigurationFailureAnal # Connection Details Factories org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ +org.springframework.boot.jdbc.docker.compose.ClickHouseJdbcDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.jdbc.docker.compose.MariaDbJdbcDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.jdbc.docker.compose.MySqlJdbcDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.jdbc.docker.compose.OracleFreeJdbcDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.jdbc.docker.compose.OracleXeJdbcDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.jdbc.docker.compose.PostgresJdbcDockerComposeConnectionDetailsFactory,\ +org.springframework.boot.jdbc.docker.compose.SqlServerJdbcDockerComposeConnectionDetailsFactory,\ org.springframework.boot.jdbc.testcontainers.JdbcContainerConnectionDetailsFactory # Database Initializer Detectors diff --git a/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironmentTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironmentTests.java new file mode 100644 index 0000000000..ccdc3d851f --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/ClickHouseEnvironmentTests.java @@ -0,0 +1,84 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link ClickHouseEnvironment}. + * + * @author Stephane Nicoll + */ +class ClickHouseEnvironmentTests { + + @Test + void createWhenNoPasswordThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new ClickHouseEnvironment(Collections.emptyMap())) + .withMessage("No ClickHouse password found"); + } + + @Test + void getPasswordWhenHasPassword() { + ClickHouseEnvironment environment = new ClickHouseEnvironment(Map.of("CLICKHOUSE_PASSWORD", "secret")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasNoPasswordAndAllowEmptyPassword() { + ClickHouseEnvironment environment = new ClickHouseEnvironment(Map.of("ALLOW_EMPTY_PASSWORD", "true")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getPasswordWhenHasNoPasswordAndAllowEmptyPasswordIsYes() { + ClickHouseEnvironment environment = new ClickHouseEnvironment(Map.of("ALLOW_EMPTY_PASSWORD", "yes")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getUsernameWhenNoUser() { + ClickHouseEnvironment environment = new ClickHouseEnvironment(Map.of("CLICKHOUSE_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("default"); + } + + @Test + void getUsernameWhenHasUser() { + ClickHouseEnvironment environment = new ClickHouseEnvironment( + Map.of("CLICKHOUSE_USER", "me", "CLICKHOUSE_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("me"); + } + + @Test + void getDatabaseWhenNoDatabase() { + ClickHouseEnvironment environment = new ClickHouseEnvironment(Map.of("CLICKHOUSE_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("default"); + } + + @Test + void getDatabaseWhenHasDatabase() { + ClickHouseEnvironment environment = new ClickHouseEnvironment( + Map.of("CLICKHOUSE_DB", "db", "CLICKHOUSE_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/jdbc/JdbcUrlBuilderTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/JdbcUrlBuilderTests.java similarity index 97% rename from spring-boot-project/spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/jdbc/JdbcUrlBuilderTests.java rename to spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/JdbcUrlBuilderTests.java index f2cc0cc09c..f1823ade39 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/jdbc/JdbcUrlBuilderTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/JdbcUrlBuilderTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.jdbc; +package org.springframework.boot.jdbc.docker.compose; import java.util.Collections; import java.util.Map; diff --git a/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironmentTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironmentTests.java new file mode 100644 index 0000000000..40334bef00 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MariaDbEnvironmentTests.java @@ -0,0 +1,176 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link MariaDbEnvironment}. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Jinseong Hwang + * @author Scott Frederick + */ +class MariaDbEnvironmentTests { + + @Test + void createWhenHasMariadbRandomRootPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new MariaDbEnvironment(Map.of("MARIADB_RANDOM_ROOT_PASSWORD", "true"))) + .withMessage("MARIADB_RANDOM_ROOT_PASSWORD is not supported"); + } + + @Test + void createWhenHasMysqlRandomRootPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new MariaDbEnvironment(Map.of("MYSQL_RANDOM_ROOT_PASSWORD", "true"))) + .withMessage("MYSQL_RANDOM_ROOT_PASSWORD is not supported"); + } + + @Test + void createWhenHasMariadbRootPasswordHashThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new MariaDbEnvironment(Map.of("MARIADB_ROOT_PASSWORD_HASH", "0FF"))) + .withMessage("MARIADB_ROOT_PASSWORD_HASH is not supported"); + } + + @Test + void createWhenHasNoPasswordThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new MariaDbEnvironment(Collections.emptyMap())) + .withMessage("No MariaDB password found"); + } + + @Test + void createWhenHasNoDatabaseThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new MariaDbEnvironment(Map.of("MARIADB_PASSWORD", "secret"))) + .withMessage("No MARIADB_DATABASE defined"); + } + + @Test + void getUsernameWhenHasMariadbUser() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_USER", "myself", "MARIADB_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getUsername()).isEqualTo("myself"); + } + + @Test + void getUsernameWhenHasMysqlUser() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MYSQL_USER", "myself", "MARIADB_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getUsername()).isEqualTo("myself"); + } + + @Test + void getUsernameWhenHasMariadbUserAndMysqlUser() { + MariaDbEnvironment environment = new MariaDbEnvironment(Map.of("MARIADB_USER", "myself", "MYSQL_USER", "me", + "MARIADB_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getUsername()).isEqualTo("myself"); + } + + @Test + void getUsernameWhenHasNoMariadbUserOrMysqlUser() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getUsername()).isEqualTo("root"); + } + + @Test + void getPasswordWhenHasMariadbPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasMysqlPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MYSQL_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasMysqlRootPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MYSQL_ROOT_PASSWORD", "secret", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasMariadbPasswordAndMysqlPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_PASSWORD", "secret", "MYSQL_PASSWORD", "donttell", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasMariadbPasswordAndMysqlRootPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_PASSWORD", "secret", "MYSQL_ROOT_PASSWORD", "donttell", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasNoPasswordAndAllowEmptyPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("ALLOW_EMPTY_PASSWORD", "true", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getPasswordWhenHasNoPasswordAndMariadbAllowEmptyPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_ALLOW_EMPTY_PASSWORD", "true", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getPasswordWhenHasNoPasswordAndMysqlAllowEmptyPassword() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MYSQL_ALLOW_EMPTY_PASSWORD", "true", "MARIADB_DATABASE", "db")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getDatabaseWhenHasMariadbDatabase() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_ALLOW_EMPTY_PASSWORD", "true", "MARIADB_DATABASE", "db")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + + @Test + void getDatabaseWhenHasMysqlDatabase() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_ALLOW_EMPTY_PASSWORD", "true", "MYSQL_DATABASE", "db")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + + @Test + void getDatabaseWhenHasMariadbAndMysqlDatabase() { + MariaDbEnvironment environment = new MariaDbEnvironment( + Map.of("MARIADB_ALLOW_EMPTY_PASSWORD", "true", "MARIADB_DATABASE", "db", "MYSQL_DATABASE", "otherdb")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + +} diff --git a/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironmentTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironmentTests.java new file mode 100644 index 0000000000..86ae2fe236 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/MySqlEnvironmentTests.java @@ -0,0 +1,104 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link MySqlEnvironment}. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Jinseong Hwang + * @author Scott Frederick + */ +class MySqlEnvironmentTests { + + @Test + void createWhenHasMysqlRandomRootPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new MySqlEnvironment(Map.of("MYSQL_RANDOM_ROOT_PASSWORD", "true"))) + .withMessage("MYSQL_RANDOM_ROOT_PASSWORD is not supported"); + } + + @Test + void createWhenHasNoPasswordThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new MySqlEnvironment(Collections.emptyMap())) + .withMessage("No MySQL password found"); + } + + @Test + void createWhenHasNoDatabaseThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new MySqlEnvironment(Map.of("MYSQL_PASSWORD", "secret"))) + .withMessage("No MYSQL_DATABASE defined"); + } + + @Test + void getUsernameWhenHasMysqlUser() { + MySqlEnvironment environment = new MySqlEnvironment( + Map.of("MYSQL_USER", "myself", "MYSQL_PASSWORD", "secret", "MYSQL_DATABASE", "db")); + assertThat(environment.getUsername()).isEqualTo("myself"); + } + + @Test + void getUsernameWhenHasNoMysqlUser() { + MySqlEnvironment environment = new MySqlEnvironment(Map.of("MYSQL_PASSWORD", "secret", "MYSQL_DATABASE", "db")); + assertThat(environment.getUsername()).isEqualTo("root"); + } + + @Test + void getPasswordWhenHasMysqlPassword() { + MySqlEnvironment environment = new MySqlEnvironment(Map.of("MYSQL_PASSWORD", "secret", "MYSQL_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasMysqlRootPassword() { + MySqlEnvironment environment = new MySqlEnvironment( + Map.of("MYSQL_ROOT_PASSWORD", "secret", "MYSQL_DATABASE", "db")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasNoPasswordAndMysqlAllowEmptyPassword() { + MySqlEnvironment environment = new MySqlEnvironment( + Map.of("MYSQL_ALLOW_EMPTY_PASSWORD", "true", "MYSQL_DATABASE", "db")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getPasswordWhenHasNoPasswordAndAllowEmptyPassword() { + MySqlEnvironment environment = new MySqlEnvironment( + Map.of("ALLOW_EMPTY_PASSWORD", "true", "MYSQL_DATABASE", "db")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getDatabaseWhenHasMysqlDatabase() { + MySqlEnvironment environment = new MySqlEnvironment( + Map.of("MYSQL_ALLOW_EMPTY_PASSWORD", "true", "MYSQL_DATABASE", "db")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + +} diff --git a/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironmentTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironmentTests.java new file mode 100644 index 0000000000..90f6ce24bd --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/OracleEnvironmentTests.java @@ -0,0 +1,115 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.assertj.core.api.Assertions.assertThatNoException; + +/** + * Tests for {@link OracleEnvironment}. + * + * @author Andy Wilkinson + */ +class OracleEnvironmentTests { + + @Test + void getUsernameWhenHasAppUser() { + OracleEnvironment environment = new OracleEnvironment( + Map.of("APP_USER", "alice", "APP_USER_PASSWORD", "secret"), "defaultDb"); + assertThat(environment.getUsername()).isEqualTo("alice"); + } + + @Test + void getUsernameWhenHasNoAppUser() { + OracleEnvironment environment = new OracleEnvironment(Map.of("ORACLE_PASSWORD", "secret"), "defaultDb"); + assertThat(environment.getUsername()).isEqualTo("system"); + } + + @Test + void getPasswordWhenHasAppPassword() { + OracleEnvironment environment = new OracleEnvironment( + Map.of("APP_USER", "alice", "APP_USER_PASSWORD", "secret"), "defaultDb"); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasOraclePassword() { + OracleEnvironment environment = new OracleEnvironment(Map.of("ORACLE_PASSWORD", "secret"), "defaultDb"); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void createWhenRandomPasswordAndAppPasswordDoesNotThrow() { + assertThatNoException().isThrownBy(() -> new OracleEnvironment( + Map.of("APP_USER", "alice", "APP_USER_PASSWORD", "secret", "ORACLE_RANDOM_PASSWORD", "true"), + "defaultDb")); + } + + @Test + void createWhenRandomPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new OracleEnvironment(Map.of("ORACLE_RANDOM_PASSWORD", "true"), "defaultDb")) + .withMessage("ORACLE_RANDOM_PASSWORD is not supported without APP_USER and APP_USER_PASSWORD"); + } + + @Test + void createWhenAppUserAndNoAppPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new OracleEnvironment(Map.of("APP_USER", "alice"), "defaultDb")) + .withMessage("No Oracle app password found"); + } + + @Test + void createWhenAppUserAndEmptyAppPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new OracleEnvironment(Map.of("APP_USER", "alice", "APP_USER_PASSWORD", ""), "defaultDb")) + .withMessage("No Oracle app password found"); + } + + @Test + void createWhenHasNoPasswordThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new OracleEnvironment(Collections.emptyMap(), "defaultDb")) + .withMessage("No Oracle password found"); + } + + @Test + void createWhenHasEmptyPasswordThrowsException() { + assertThatIllegalStateException() + .isThrownBy(() -> new OracleEnvironment(Map.of("ORACLE_PASSWORD", ""), "defaultDb")) + .withMessage("No Oracle password found"); + } + + @Test + void getDatabaseWhenHasNoOracleDatabase() { + OracleEnvironment environment = new OracleEnvironment(Map.of("ORACLE_PASSWORD", "secret"), "defaultDb"); + assertThat(environment.getDatabase()).isEqualTo("defaultDb"); + } + + @Test + void getDatabaseWhenHasOracleDatabase() { + OracleEnvironment environment = new OracleEnvironment( + Map.of("ORACLE_PASSWORD", "secret", "ORACLE_DATABASE", "db"), "defaultDb"); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + +} diff --git a/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironmentTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironmentTests.java new file mode 100644 index 0000000000..61043ba410 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresEnvironmentTests.java @@ -0,0 +1,156 @@ +/* + * Copyright 2012-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link PostgresEnvironment}. + * + * @author Moritz Halbritter + * @author Andy Wilkinson + * @author Phillip Webb + * @author Scott Frederick + * @author Sidmar Theodoro + * @author He Zean + */ +class PostgresEnvironmentTests { + + @Test + void createWhenNoPostgresPasswordThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new PostgresEnvironment(Collections.emptyMap())) + .withMessage("No PostgreSQL password found"); + } + + @Test + void getUsernameWhenNoPostgresUser() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("postgres"); + } + + @Test + void getUsernameWhenNoPostgresqlUser() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("postgres"); + } + + @Test + void getUsernameWhenHasPostgresUser() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRES_USER", "me", "POSTGRES_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("me"); + } + + @Test + void getUsernameWhenHasPostgresqlUser() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_USER", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("me"); + } + + @Test + void getUsernameWhenHasPostgresqlUsername() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_USERNAME", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("me"); + } + + @Test + void getPasswordWhenHasPostgresPassword() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_PASSWORD", "secret")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasPostgresqlPassword() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasTrustHostAuthMethod() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_HOST_AUTH_METHOD", "trust")); + assertThat(environment.getPassword()).isNull(); + } + + @Test + void getPasswordWhenHasNoPasswordAndAllowEmptyPassword() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("ALLOW_EMPTY_PASSWORD", "yes")); + assertThat(environment.getPassword()).isEmpty(); + } + + @Test + void getDatabaseWhenNoPostgresDbOrPostgresUser() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("postgres"); + } + + @Test + void getDatabaseWhenNoPostgresqlDbOrPostgresUser() { + PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("postgres"); + } + + @Test + void getDatabaseWhenNoPostgresDbAndPostgresUser() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRES_USER", "me", "POSTGRES_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("me"); + } + + @Test + void getDatabaseWhenNoPostgresqlDbAndPostgresUser() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_USER", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("me"); + } + + @Test + void getDatabaseWhenNoPostgresqlDatabaseAndPostgresqlUsername() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_USERNAME", "me", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("me"); + } + + @Test + void getDatabaseWhenHasPostgresDb() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRES_DB", "db", "POSTGRES_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + + @Test + void getDatabaseWhenHasPostgresqlDb() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_DB", "db", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + + @Test + void getDatabaseWhenHasPostgresqlDatabase() { + PostgresEnvironment environment = new PostgresEnvironment( + Map.of("POSTGRESQL_DATABASE", "db", "POSTGRESQL_PASSWORD", "secret")); + assertThat(environment.getDatabase()).isEqualTo("db"); + } + +} diff --git a/spring-boot-project/spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java similarity index 98% rename from spring-boot-project/spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java rename to spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java index 4fe1fc5815..60bed5c9a8 100644 --- a/spring-boot-project/spring-boot-docker-compose-all/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/PostgresJdbcDockerComposeConnectionDetailsFactoryConnectionDetailsTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.docker.compose.service.connection.postgres; +package org.springframework.boot.jdbc.docker.compose; import java.util.LinkedHashMap; import java.util.Map; diff --git a/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironmentTests.java b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironmentTests.java new file mode 100644 index 0000000000..1f28fa5433 --- /dev/null +++ b/spring-boot-project/spring-boot-jdbc/src/test/java/org/springframework/boot/jdbc/docker/compose/SqlServerEnvironmentTests.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.jdbc.docker.compose; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link SqlServerEnvironment}. + * + * @author Andy Wilkinson + */ +class SqlServerEnvironmentTests { + + @Test + void createWhenHasNoPasswordThrowsException() { + assertThatIllegalStateException().isThrownBy(() -> new SqlServerEnvironment(Collections.emptyMap())) + .withMessage("No MSSQL password found"); + } + + @Test + void getUsernameWhenHasNoMsSqlUser() { + SqlServerEnvironment environment = new SqlServerEnvironment(Map.of("MSSQL_SA_PASSWORD", "secret")); + assertThat(environment.getUsername()).isEqualTo("SA"); + } + + @Test + void getPasswordWhenHasMsSqlSaPassword() { + SqlServerEnvironment environment = new SqlServerEnvironment(Map.of("MSSQL_SA_PASSWORD", "secret")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasSaPassword() { + SqlServerEnvironment environment = new SqlServerEnvironment(Map.of("SA_PASSWORD", "secret")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + + @Test + void getPasswordWhenHasMsSqlSaPasswordAndSaPasswordPrefersMsSqlSaPassword() { + SqlServerEnvironment environment = new SqlServerEnvironment( + Map.of("MSSQL_SA_PASSWORD", "secret", "SA_PASSWORD", "not used")); + assertThat(environment.getPassword()).isEqualTo("secret"); + } + +}