diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8813c63802..79dcaad5393 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -594,6 +594,15 @@ jobs: name: Integration test setup uses: ./.github/actions/integration-test-setup + - name: Run new base tests + run: | + KC_TEST_DATABASE=${{ matrix.db }} KC_TEST_DATABASE_REUSE=true TESTCONTAINERS_REUSE_ENABLE=true ./mvnw test -f tests/pom.xml -Dtest=DatabaseTestSuite + + - name: Database container port + run: | + DATABASE_PORT=$(docker ps -l --format '{{ .ID }}' | xargs docker port | cut -d ':' -f 2) + echo "DATABASE_PORT=$DATABASE_PORT" >> $GITHUB_ENV + - name: Run base tests run: | TESTS=`testsuite/integration-arquillian/tests/base/testsuites/suite.sh database` @@ -602,7 +611,9 @@ jobs: -Pauth-server-quarkus -Pdb-${{ matrix.db }} \ "-Dwebdriver.chrome.driver=$CHROMEWEBDRIVER/chromedriver" \ -Dtest=$TESTS \ - -Ddocker.keepRunning \ + -Ddocker.database.skip=true \ + -Ddocker.database.port=$DATABASE_PORT \ + -Ddocker.container.testdb.ip=localhost \ -pl testsuite/integration-arquillian/tests/base 2>&1 | misc/log/trimmer.sh - name: Run cluster JDBC_PING2 UDP smoke test @@ -614,7 +625,8 @@ jobs: -Dsession.cache.owners=2 \ -Dauth.server.quarkus.cluster.stack=jdbc-ping-udp \ -Ddocker.database.skip=true \ - -Dauth.server.db.host=localhost \ + -Ddocker.database.port=$DATABASE_PORT \ + -Ddocker.container.testdb.ip=localhost \ -pl testsuite/integration-arquillian/tests/base \ 2>&1 | misc/log/trimmer.sh @@ -627,7 +639,8 @@ jobs: -Dsession.cache.owners=2 \ -Dauth.server.quarkus.cluster.stack=jdbc-ping \ -Ddocker.database.skip=true \ - -Dauth.server.db.host=localhost \ + -Ddocker.database.port=$DATABASE_PORT \ + -Ddocker.container.testdb.ip=localhost \ -pl testsuite/integration-arquillian/tests/base \ 2>&1 | misc/log/trimmer.sh diff --git a/docs/guides/server/db.adoc b/docs/guides/server/db.adoc index 0a863d814a8..67b35311f44 100644 --- a/docs/guides/server/db.adoc +++ b/docs/guides/server/db.adoc @@ -20,7 +20,7 @@ The server has built-in support for different databases. You can query the avail |Database | Option value | Tested Version |MariaDB Server | `mariadb` | ${properties["mariadb.version"]} -|Microsoft SQL Server | `mssql` | ${properties["mssql.version"]?replace("-latest","")} +|Microsoft SQL Server | `mssql` | ${properties["mssql.version"]} |MySQL | `mysql` | ${properties["mysql.version"]} |Oracle Database | `oracle` | ${properties["oracledb.version"]} |PostgreSQL | `postgres` | ${properties["postgresql.version"]} diff --git a/pom.xml b/pom.xml index 8b9333aeae3..3f9182bb28f 100644 --- a/pom.xml +++ b/pom.xml @@ -159,17 +159,22 @@ 8.0 + mysql:${mysql.version} 8.3.0 16 + postgres:${postgresql.version} 16.1 2.3.1 42.7.4 10.11 + mariadb:${mariadb.version} 3.4.1 - 2022-latest + 2022 + mcr.microsoft.com/mssql/server:${mssql.version}-latest 12.8.1.jre11 - 19.3 + 23.5 + gvenzl/oracle-free:${oracledb.version}-slim-faststart 23.5.0.24.07 diff --git a/quarkus/tests/integration/pom.xml b/quarkus/tests/integration/pom.xml index b7d547ed0f3..30f6053222d 100644 --- a/quarkus/tests/integration/pom.xml +++ b/quarkus/tests/integration/pom.xml @@ -178,11 +178,11 @@ true - postgres:${postgresql.version} - mariadb:${mariadb.version} - mysql:${mysql.version} + ${postgresql.container} + ${mariadb.container} + ${mysql.container} quay.io/infinispan/server:${infinispan.version} - mcr.microsoft.com/mssql/server:${mssql.version} + ${mssql.container} diff --git a/test-framework/README.md b/test-framework/README.md index 14fa5fc601c..cd60e675847 100644 --- a/test-framework/README.md +++ b/test-framework/README.md @@ -348,6 +348,12 @@ Valid values: | mysql | MySQL test container | | postgres | PostgreSQL test container | +Configuration: + +| Value | Description | +|-----------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `kc.test.database.reuse` / `KC_TEST_DATABASE_REUSE` | Set to true to enable reuse of database. Requires [enabling reuse for Testcontainers](https://java.testcontainers.org/features/reuse/) (`TESTCONTAINERS_REUSE_ENABLE=true`) | + ### Browser Option: `kc.test.broser` / `KC_TEST_BROWSER` diff --git a/test-framework/core/pom.xml b/test-framework/core/pom.xml index 37aa9a86ec3..02469beb226 100755 --- a/test-framework/core/pom.xml +++ b/test-framework/core/pom.xml @@ -51,4 +51,14 @@ 11.13 + + + + + src/main/resources + true + + + + diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/annotations/InjectTestDatabase.java b/test-framework/core/src/main/java/org/keycloak/test/framework/annotations/InjectTestDatabase.java index c380f1b6bf5..4aeb246622a 100644 --- a/test-framework/core/src/main/java/org/keycloak/test/framework/annotations/InjectTestDatabase.java +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/annotations/InjectTestDatabase.java @@ -1,6 +1,5 @@ package org.keycloak.test.framework.annotations; -import org.keycloak.test.framework.database.DatabaseConfig; import org.keycloak.test.framework.injection.LifeCycle; import java.lang.annotation.ElementType; @@ -12,8 +11,6 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface InjectTestDatabase { - Class config() default DatabaseConfig.class; - LifeCycle lifecycle() default LifeCycle.GLOBAL; } diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/config/Config.java b/test-framework/core/src/main/java/org/keycloak/test/framework/config/Config.java index 67b1d6a0670..99713cfa659 100644 --- a/test-framework/core/src/main/java/org/keycloak/test/framework/config/Config.java +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/config/Config.java @@ -17,6 +17,10 @@ public class Config { return config.getOptionalValue("kc.test." + valueTypeAlias.getAlias(valueType), String.class).orElse(null); } + public static T get(String name, T defaultValue, Class clazz) { + return config.getOptionalValue(name, clazz).orElse(defaultValue); + } + public static String getAdminClientId() { return "temp-admin"; } diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/database/AbstractContainerTestDatabase.java b/test-framework/core/src/main/java/org/keycloak/test/framework/database/AbstractContainerTestDatabase.java index a949043de81..5e7e76505f2 100644 --- a/test-framework/core/src/main/java/org/keycloak/test/framework/database/AbstractContainerTestDatabase.java +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/database/AbstractContainerTestDatabase.java @@ -1,58 +1,90 @@ package org.keycloak.test.framework.database; import org.jboss.logging.Logger; -import org.slf4j.LoggerFactory; +import org.keycloak.test.framework.config.Config; import org.testcontainers.containers.JdbcDatabaseContainer; -import org.testcontainers.containers.output.Slf4jLogConsumer; import java.io.IOException; import java.time.Duration; +import java.util.List; import java.util.Map; public abstract class AbstractContainerTestDatabase implements TestDatabase { - private static final Logger LOGGER = Logger.getLogger(AbstractContainerTestDatabase.class); + protected boolean reuse; - private JdbcDatabaseContainer container; + protected JdbcDatabaseContainer container; + + public AbstractContainerTestDatabase() { + reuse = Config.get("kc.test.database.reuse", false, Boolean.class); + } - @SuppressWarnings("resource") public void start() { container = createContainer(); - container.withStartupTimeout(Duration.ofMinutes(30)) - .withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger(AbstractContainerTestDatabase.class))) - .start(); + container = container.withStartupTimeout(Duration.ofMinutes(10)) + .withLogConsumer(new JBossLogConsumer(getLogger())) + .withReuse(reuse); + withDatabaseAndUser(getDatabase(), getUsername(), getPassword()); + container.start(); + try { - String postStartCommand = getPostStartCommand(); + List postStartCommand = getPostStartCommand(); if (postStartCommand != null) { - LOGGER.tracev("Running post start command: {0}", postStartCommand); - String result = container.execInContainer("bash", "-c", postStartCommand).getStdout(); - LOGGER.tracev(result); + getLogger().tracev("Running post start command: {0}", String.join(" ", postStartCommand)); + String result = container.execInContainer(postStartCommand.toArray(new String[0])).getStdout(); + getLogger().tracev(result); } } catch (IOException | InterruptedException e) { throw new RuntimeException(e); } } + public void withDatabaseAndUser(String database, String username, String password) { + container.withDatabaseName(database); + container.withUsername(username); + container.withPassword(password); + } + public void stop() { - container.stop(); + if (!reuse) { + container.stop(); + } } @Override public Map serverConfig() { return Map.of( - "db", getKeycloakDatabaseName(), - "db-url", container.getJdbcUrl(), - "db-username", container.getUsername(), - "db-password", container.getPassword() + "db", getDatabaseVendor(), + "db-url", getJdbcUrl(), + "db-username", getUsername(), + "db-password", getPassword() ); } public abstract JdbcDatabaseContainer createContainer(); - public String getPostStartCommand() { + public List getPostStartCommand() { return null; } - public abstract String getKeycloakDatabaseName(); + public String getDatabase() { + return "keycloak"; + } + + public String getUsername() { + return "keycloak"; + } + + public String getPassword() { + return "keycloak"; + } + + public String getJdbcUrl() { + return container.getJdbcUrl(); + } + + public abstract String getDatabaseVendor(); + + public abstract Logger getLogger(); } diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/database/DatabaseConfig.java b/test-framework/core/src/main/java/org/keycloak/test/framework/database/DatabaseConfig.java deleted file mode 100644 index cbcc353a689..00000000000 --- a/test-framework/core/src/main/java/org/keycloak/test/framework/database/DatabaseConfig.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.keycloak.test.framework.database; - -import java.util.HashMap; -import java.util.Map; - -public class DatabaseConfig { - - private String vendor; - private String containerImage; - private String url; - private String username; - private String password; - - private String postStartCommand; - - private Map env = new HashMap<>(); - - public String getVendor() { - return vendor; - } - - public DatabaseConfig vendor(String vendor) { - this.vendor = vendor; - return this; - } - - public String getContainerImage() { - return containerImage; - } - - public DatabaseConfig containerImage(String containerImage) { - this.containerImage = containerImage; - return this; - } - - public String getUrl() { - return url; - } - - public DatabaseConfig url(String url) { - this.url = url; - return this; - } - - public String getUsername() { - return username; - } - - public DatabaseConfig username(String username) { - this.username = username; - return this; - } - - public String getPassword() { - return password; - } - - public DatabaseConfig password(String password) { - this.password = password; - return this; - } - - public String getPostStartCommand() { - return postStartCommand; - } - - public DatabaseConfig postStartCommand(String postStartCommand) { - this.postStartCommand = postStartCommand; - return this; - } - - public Map getEnv() { - return env; - } - - public DatabaseConfig env(Map env) { - this.env = env; - return this; - } - - public Map toConfig() { - Map config = new HashMap<>(); - if (vendor != null) { - config.put("db", vendor); - } - if (url != null) { - config.put("db-url", url); - } - if (username != null) { - config.put("db-username", username); - } - if (password != null) { - config.put("db-password", password); - } - return config; - } - -} diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/database/DatabaseProperties.java b/test-framework/core/src/main/java/org/keycloak/test/framework/database/DatabaseProperties.java new file mode 100644 index 00000000000..1e2b710f67a --- /dev/null +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/database/DatabaseProperties.java @@ -0,0 +1,24 @@ +package org.keycloak.test.framework.database; + +import java.io.IOException; +import java.util.Properties; + +public class DatabaseProperties { + + private static final Properties PROPERTIES = loadProperties(); + + public static String getContainerImageName(String database) { + return PROPERTIES.getProperty(database + ".container"); + } + + private static Properties loadProperties() { + Properties properties = new Properties(); + try { + properties.load(DatabaseProperties.class.getResourceAsStream("database.properties")); + } catch (IOException e) { + throw new RuntimeException(e); + } + return properties; + } + +} diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/database/JBossLogConsumer.java b/test-framework/core/src/main/java/org/keycloak/test/framework/database/JBossLogConsumer.java new file mode 100644 index 00000000000..9ed8be3bbf9 --- /dev/null +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/database/JBossLogConsumer.java @@ -0,0 +1,29 @@ +package org.keycloak.test.framework.database; + +import org.jboss.logging.Logger; +import org.testcontainers.containers.output.OutputFrame; + +import java.util.function.Consumer; + +public class JBossLogConsumer implements Consumer { + + private final Logger logger; + + public JBossLogConsumer(Logger logger) { + this.logger = logger; + } + + @Override + public void accept(OutputFrame outputFrame) { + OutputFrame.OutputType type = outputFrame.getType(); + switch (type) { + case STDOUT: + logger.debug(outputFrame.getUtf8StringWithoutLineEnding()); + break; + case STDERR: + logger.error(outputFrame.getUtf8StringWithoutLineEnding()); + break; + } + } + +} diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/database/TestDatabase.java b/test-framework/core/src/main/java/org/keycloak/test/framework/database/TestDatabase.java index 7af4a79763d..cf019360ed7 100644 --- a/test-framework/core/src/main/java/org/keycloak/test/framework/database/TestDatabase.java +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/database/TestDatabase.java @@ -1,5 +1,7 @@ package org.keycloak.test.framework.database; +import io.quarkus.maven.dependency.Dependency; + import java.util.Map; public interface TestDatabase { @@ -10,4 +12,8 @@ public interface TestDatabase { Map serverConfig(); + default Dependency jdbcDriver() { + return null; + } + } diff --git a/test-framework/core/src/main/java/org/keycloak/test/framework/server/AbstractKeycloakTestServerSupplier.java b/test-framework/core/src/main/java/org/keycloak/test/framework/server/AbstractKeycloakTestServerSupplier.java index 0bd17623a77..413a0896712 100644 --- a/test-framework/core/src/main/java/org/keycloak/test/framework/server/AbstractKeycloakTestServerSupplier.java +++ b/test-framework/core/src/main/java/org/keycloak/test/framework/server/AbstractKeycloakTestServerSupplier.java @@ -1,8 +1,8 @@ package org.keycloak.test.framework.server; +import io.quarkus.maven.dependency.Dependency; import org.keycloak.test.framework.annotations.KeycloakIntegrationTest; import org.keycloak.test.framework.config.Config; -import org.keycloak.test.framework.database.AbstractContainerTestDatabase; import org.keycloak.test.framework.database.TestDatabase; import org.keycloak.test.framework.events.SysLogServer; import org.keycloak.test.framework.injection.InstanceContext; @@ -11,8 +11,10 @@ import org.keycloak.test.framework.injection.RequestedInstance; import org.keycloak.test.framework.injection.Supplier; import org.keycloak.test.framework.injection.SupplierHelpers; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; public abstract class AbstractKeycloakTestServerSupplier implements Supplier { @@ -52,13 +54,20 @@ public abstract class AbstractKeycloakTestServerSupplier implements Supplier rawOptions.add("--" + key + "=" + value)); + Set dependencies = new HashSet<>(serverConfig.dependencies()); + if (requiresDatabase()) { TestDatabase testDatabase = instanceContext.getDependency(TestDatabase.class); testDatabase.serverConfig().forEach((key, value) -> rawOptions.add("--" + key + "=" + value)); + + Dependency jdbcDriver = testDatabase.jdbcDriver(); + if (jdbcDriver != null) { + dependencies.add(jdbcDriver); + } } KeycloakTestServer server = getServer(); - server.start(rawOptions, serverConfig.dependencies()); + server.start(rawOptions, dependencies); return server; } diff --git a/test-framework/core/src/main/resources/org/keycloak/test/framework/database/database.properties b/test-framework/core/src/main/resources/org/keycloak/test/framework/database/database.properties new file mode 100644 index 00000000000..d2438e69e9c --- /dev/null +++ b/test-framework/core/src/main/resources/org/keycloak/test/framework/database/database.properties @@ -0,0 +1,5 @@ +mysql.container=${mysql.container} +postgres.container=${postgresql.container} +mariadb.container=${mariadb.container} +mssql.container=${mssql.container} +oracle.container=${oracledb.container} \ No newline at end of file diff --git a/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBDatabaseSupplier.java b/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBDatabaseSupplier.java index 3c19972d485..2b9af866460 100644 --- a/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBDatabaseSupplier.java +++ b/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBDatabaseSupplier.java @@ -4,7 +4,7 @@ public class MariaDBDatabaseSupplier extends AbstractDatabaseSupplier { @Override public String getAlias() { - return "mariadb"; + return MariaDBTestDatabase.NAME; } @Override diff --git a/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBTestDatabase.java b/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBTestDatabase.java index ad4fa75fb7e..865d8e4a3a1 100644 --- a/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBTestDatabase.java +++ b/test-framework/db-mariadb/src/main/java/org/keycloak/test/framework/database/MariaDBTestDatabase.java @@ -1,19 +1,27 @@ package org.keycloak.test.framework.database; +import org.jboss.logging.Logger; import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.MariaDBContainer; class MariaDBTestDatabase extends AbstractContainerTestDatabase { - private static final String IMAGE_NAME = "mariadb:latest"; + private static final Logger LOGGER = Logger.getLogger(MariaDBTestDatabase.class); + + public static final String NAME = "mariadb"; @Override public JdbcDatabaseContainer createContainer() { - return new MariaDBContainer<>(IMAGE_NAME); + return new MariaDBContainer<>(DatabaseProperties.getContainerImageName(NAME)); } @Override - public String getKeycloakDatabaseName() { - return "mariadb"; + public String getDatabaseVendor() { + return NAME; + } + + @Override + public Logger getLogger() { + return LOGGER; } } diff --git a/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerDatabaseSupplier.java b/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerDatabaseSupplier.java index 58d06475825..9bae6b4ee36 100644 --- a/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerDatabaseSupplier.java +++ b/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerDatabaseSupplier.java @@ -4,7 +4,7 @@ public class MSSQLServerDatabaseSupplier extends AbstractDatabaseSupplier { @Override public String getAlias() { - return "mssql"; + return MSSQLServerTestDatabase.NAME; } @Override diff --git a/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerTestDatabase.java b/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerTestDatabase.java index e5d10456bb9..4764035e1bf 100644 --- a/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerTestDatabase.java +++ b/test-framework/db-mssql/src/main/java/org/keycloak/test/framework/database/MSSQLServerTestDatabase.java @@ -1,19 +1,50 @@ package org.keycloak.test.framework.database; +import org.jboss.logging.Logger; import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.MSSQLServerContainer; +import java.util.List; + class MSSQLServerTestDatabase extends AbstractContainerTestDatabase { - private static final String IMAGE_NAME = "mcr.microsoft.com/mssql/server:latest"; + private static final Logger LOGGER = Logger.getLogger(MSSQLServerTestDatabase.class); + public static final String NAME = "mssql"; + + @SuppressWarnings("resource") @Override public JdbcDatabaseContainer createContainer() { - return new MSSQLServerContainer<>(IMAGE_NAME); + return new MSSQLServerContainer<>(DatabaseProperties.getContainerImageName(NAME)).withPassword(getPassword()).withEnv("MSSQL_PID", "Express").acceptLicense(); } @Override - public String getKeycloakDatabaseName() { - return "mssql"; + public void withDatabaseAndUser(String database, String username, String password) { + // MSSQLServerContainer does not support withUsername and withDatabase + } + + @Override + public String getDatabaseVendor() { + return NAME; + } + + @Override + public String getUsername() { + return "sa"; + } + + @Override + public String getPassword() { + return "vEry$tron9Pwd"; + } + + @Override + public List getPostStartCommand() { + return List.of("/opt/mssql-tools18/bin/sqlcmd", "-U", "sa", "-P", getPassword(), "-No", "-Q", "CREATE DATABASE " + getDatabase()); + } + + @Override + public Logger getLogger() { + return LOGGER; } } diff --git a/test-framework/db-mysql/src/main/java/org/keycloak/test/framework/database/MySQLTestDatabase.java b/test-framework/db-mysql/src/main/java/org/keycloak/test/framework/database/MySQLTestDatabase.java index ce064de3570..4d71d548f68 100644 --- a/test-framework/db-mysql/src/main/java/org/keycloak/test/framework/database/MySQLTestDatabase.java +++ b/test-framework/db-mysql/src/main/java/org/keycloak/test/framework/database/MySQLTestDatabase.java @@ -1,19 +1,27 @@ package org.keycloak.test.framework.database; +import org.jboss.logging.Logger; import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.MySQLContainer; class MySQLTestDatabase extends AbstractContainerTestDatabase { - private static final String IMAGE_NAME = "mysql:latest"; + private static final Logger LOGGER = Logger.getLogger(MySQLTestDatabase.class); + + public static final String NAME = "mysql"; @Override public JdbcDatabaseContainer createContainer() { - return new MySQLContainer<>(IMAGE_NAME); + return new MySQLContainer<>(DatabaseProperties.getContainerImageName(NAME)); } @Override - public String getKeycloakDatabaseName() { - return "mysql"; + public String getDatabaseVendor() { + return NAME; + } + + @Override + public Logger getLogger() { + return LOGGER; } } diff --git a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/Oracle19DatabaseSupplier.java b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/Oracle19DatabaseSupplier.java deleted file mode 100644 index 649897893bf..00000000000 --- a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/Oracle19DatabaseSupplier.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.keycloak.test.framework.database; - -public class Oracle19DatabaseSupplier extends AbstractDatabaseSupplier { - - @Override - public String getAlias() { - return "oracle19"; - } - - @Override - TestDatabase getTestDatabase() { - return new Oracle19TestDatabase(); - } - - -} diff --git a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/Oracle19TestDatabase.java b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/Oracle19TestDatabase.java deleted file mode 100644 index e5fba062c39..00000000000 --- a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/Oracle19TestDatabase.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.keycloak.test.framework.database; - -import org.testcontainers.containers.JdbcDatabaseContainer; -import org.testcontainers.oracle.OracleContainer; -import org.testcontainers.utility.DockerImageName; - -import java.util.Map; - -class Oracle19TestDatabase extends AbstractContainerTestDatabase { - - private static final DockerImageName IMAGE_NAME = DockerImageName.parse("docker.io/miquelsi/oracle-19c:19.3").asCompatibleSubstituteFor("gvenzl/oracle-free"); - - @SuppressWarnings("resource") - @Override - public JdbcDatabaseContainer createContainer() { - return new OracleContainer(IMAGE_NAME) - .withEnv(Map.of("ORACLE_SID", "keycloak", "ORACLE_PWD", "sa")); - } - - @Override - public String getPostStartCommand() { - return "(echo 'alter session set \"_ORACLE_SCRIPT\"=true;' && " + - "echo 'GRANT CONNECT,RESOURCE,DBA,GRANT ANY PRIVILEGE,UNLIMITED TABLESPACE TO test;')" + - " | sqlplus -L SYS/sa" + "@localhost/keycloak AS SYSDBA"; - } - - @Override - public String getKeycloakDatabaseName() { - return "oracle"; - } -} diff --git a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleDatabaseSupplier.java b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleDatabaseSupplier.java index 226fd013a72..498818be45c 100644 --- a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleDatabaseSupplier.java +++ b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleDatabaseSupplier.java @@ -4,7 +4,7 @@ public class OracleDatabaseSupplier extends AbstractDatabaseSupplier { @Override public String getAlias() { - return "oracle"; + return OracleTestDatabase.NAME; } @Override diff --git a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestDatabase.java b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestDatabase.java index 0c542799cca..1b06b7feca0 100644 --- a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestDatabase.java +++ b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestDatabase.java @@ -1,20 +1,33 @@ package org.keycloak.test.framework.database; +import io.quarkus.maven.dependency.Dependency; +import org.jboss.logging.Logger; import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.oracle.OracleContainer; class OracleTestDatabase extends AbstractContainerTestDatabase { - private static final String IMAGE_NAME = "gvenzl/oracle-free:slim-faststart"; + private static final Logger LOGGER = Logger.getLogger(OracleTestDatabase.class); + + public static final String NAME = "oracle"; - @SuppressWarnings("resource") @Override public JdbcDatabaseContainer createContainer() { - return new OracleContainer(IMAGE_NAME); + return new OracleContainer(DatabaseProperties.getContainerImageName(NAME)); } @Override - public String getKeycloakDatabaseName() { - return "oracle"; + public String getDatabaseVendor() { + return NAME; + } + + @Override + public Dependency jdbcDriver() { + return Dependency.of("com.oracle.database.jdbc", "ojdbc11"); + } + + @Override + public Logger getLogger() { + return LOGGER; } } diff --git a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestFrameworkExtension.java b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestFrameworkExtension.java index 249016c7bae..e51f8ca3f08 100644 --- a/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestFrameworkExtension.java +++ b/test-framework/db-oracle/src/main/java/org/keycloak/test/framework/database/OracleTestFrameworkExtension.java @@ -9,6 +9,6 @@ public class OracleTestFrameworkExtension implements TestFrameworkExtension { @Override public List> suppliers() { - return List.of(new OracleDatabaseSupplier(), new Oracle19DatabaseSupplier()); + return List.of(new OracleDatabaseSupplier()); } } diff --git a/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresDatabaseSupplier.java b/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresDatabaseSupplier.java index 375cebec0be..0b2fd4fe82f 100644 --- a/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresDatabaseSupplier.java +++ b/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresDatabaseSupplier.java @@ -4,7 +4,7 @@ public class PostgresDatabaseSupplier extends AbstractDatabaseSupplier { @Override public String getAlias() { - return "postgres"; + return PostgresTestDatabase.NAME; } @Override diff --git a/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresTestDatabase.java b/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresTestDatabase.java index 51ca46bfc0a..be1473a24b5 100644 --- a/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresTestDatabase.java +++ b/test-framework/db-postgres/src/main/java/org/keycloak/test/framework/database/PostgresTestDatabase.java @@ -1,19 +1,27 @@ package org.keycloak.test.framework.database; +import org.jboss.logging.Logger; import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.PostgreSQLContainer; class PostgresTestDatabase extends AbstractContainerTestDatabase { - private static final String IMAGE_NAME = "postgres:latest"; + private static final Logger LOGGER = Logger.getLogger(PostgresTestDatabase.class); + + public static final String NAME = "postgres"; @Override public JdbcDatabaseContainer createContainer() { - return new PostgreSQLContainer<>(IMAGE_NAME); + return new PostgreSQLContainer<>(DatabaseProperties.getContainerImageName(NAME)); } @Override - public String getKeycloakDatabaseName() { - return "postgres"; + public String getDatabaseVendor() { + return NAME; + } + + @Override + public Logger getLogger() { + return LOGGER; } } diff --git a/test-framework/examples/tests/src/test/resources/container-license-acceptance.txt b/test-framework/examples/tests/src/test/resources/container-license-acceptance.txt deleted file mode 100644 index f17e683dee8..00000000000 --- a/test-framework/examples/tests/src/test/resources/container-license-acceptance.txt +++ /dev/null @@ -1 +0,0 @@ -mcr.microsoft.com/mssql/server:latest \ No newline at end of file diff --git a/tests/base/pom.xml b/tests/base/pom.xml index 893737e18cd..34b15bb6594 100755 --- a/tests/base/pom.xml +++ b/tests/base/pom.xml @@ -72,6 +72,11 @@ org.keycloak.test keycloak-test-framework-db-postgres + + org.junit.platform + junit-platform-suite + test + org.jboss.logmanager jboss-logmanager diff --git a/tests/base/src/test/java/org/keycloak/test/suites/DatabaseTestSuite.java b/tests/base/src/test/java/org/keycloak/test/suites/DatabaseTestSuite.java new file mode 100644 index 00000000000..3d7b1b72f66 --- /dev/null +++ b/tests/base/src/test/java/org/keycloak/test/suites/DatabaseTestSuite.java @@ -0,0 +1,10 @@ +package org.keycloak.test.suites; + +import org.junit.platform.suite.api.SelectClasses; +import org.junit.platform.suite.api.Suite; +import org.keycloak.test.tmp.PlaceHolderTest; + +@Suite +@SelectClasses({ PlaceHolderTest.class }) +public class DatabaseTestSuite { +} diff --git a/tests/base/src/test/java/org/keycloak/test/showcase/PlaceHolderTest.java b/tests/base/src/test/java/org/keycloak/test/tmp/PlaceHolderTest.java similarity index 92% rename from tests/base/src/test/java/org/keycloak/test/showcase/PlaceHolderTest.java rename to tests/base/src/test/java/org/keycloak/test/tmp/PlaceHolderTest.java index 4e83dbce28c..e39114939d8 100644 --- a/tests/base/src/test/java/org/keycloak/test/showcase/PlaceHolderTest.java +++ b/tests/base/src/test/java/org/keycloak/test/tmp/PlaceHolderTest.java @@ -1,4 +1,4 @@ -package org.keycloak.test.showcase; +package org.keycloak.test.tmp; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/tests/base/src/test/resources/container-license-acceptance.txt b/tests/base/src/test/resources/container-license-acceptance.txt deleted file mode 100644 index f17e683dee8..00000000000 --- a/tests/base/src/test/resources/container-license-acceptance.txt +++ /dev/null @@ -1 +0,0 @@ -mcr.microsoft.com/mssql/server:latest \ No newline at end of file diff --git a/tests/base/src/test/resources/logging.properties b/tests/base/src/test/resources/logging.properties index 12b80741e1b..10a3a8b7b94 100644 --- a/tests/base/src/test/resources/logging.properties +++ b/tests/base/src/test/resources/logging.properties @@ -12,4 +12,4 @@ handler.CONSOLE.formatter=PATTERN # The log format pattern for both logs formatter.PATTERN=org.jboss.logmanager.formatters.PatternFormatter formatter.PATTERN.properties=pattern -formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p %t [%c] %m%n \ No newline at end of file +formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p %t [%c] %m%n diff --git a/testsuite/integration-arquillian/pom.xml b/testsuite/integration-arquillian/pom.xml index 9e2ecf8ce96..371fd693d3c 100644 --- a/testsuite/integration-arquillian/pom.xml +++ b/testsuite/integration-arquillian/pom.xml @@ -401,7 +401,7 @@ keycloak keycloak keycloak - jdbc:mysql://${auth.server.db.host}/${keycloak.connectionsJpa.database}?allowPublicKeyRetrieval=true + jdbc:mysql://${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database}?allowPublicKeyRetrieval=true @@ -409,7 +409,7 @@ com.mysql mysql-connector-j ${mysql-jdbc.version} - mysql:${mysql.version} + ${mysql.container} 3306 false mysqld @@ -424,14 +424,14 @@ keycloak keycloak keycloak - jdbc:postgresql://${auth.server.db.host}/${keycloak.connectionsJpa.database} + jdbc:postgresql://${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database} org.postgresql postgresql ${postgresql-jdbc.version} - postgres:${postgresql.version} + ${postgresql.container} 5432 false postgres @@ -464,14 +464,14 @@ keycloak keycloak keycloak - jdbc:mariadb://${auth.server.db.host}/${keycloak.connectionsJpa.database} + jdbc:mariadb://${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database} org.mariadb.jdbc mariadb-java-client ${mariadb-jdbc.version} - docker.io/mariadb:${mariadb.version} + ${mariadb.container} 3306 false @@ -482,7 +482,7 @@ db-mssql - mcr.microsoft.com/mssql/server:${mssql.version} + ${mssql.container} 1433 false /opt/mssql-tools18/bin/sqlcmd -e -U sa -P ${keycloak.connectionsJpa.password} -No -d master -Q CREATE\ DATABASE\ ${keycloak.connectionsJpa.database} @@ -505,20 +505,20 @@ db-oracle - docker.io/miquelsi/oracle-19c:${oracledb.version} + ${oracledb.container} 1521 1073741824 false /bin/sh -c exec\ $ORACLE_BASE/$RUN_FILE - (?si)DATABASE IS READY TO USE + DATABASE IS READY TO USE oracle oracle.jdbc.OracleDriver - XE + keycloak keycloak keycloak - jdbc:oracle:thin:@${auth.server.db.host}:${docker.database.port}:${keycloak.connectionsJpa.database} + jdbc:oracle:thin:@//${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database} - bash -c while\ !\ sqlplus\ -L\ SYS/sa@localhost/XE\ AS\ SYSDBA\ <<<\ $'alter\ session\ set\ \"_ORACLE_SCRIPT\"=true;\n\ CREATE\ USER\ ${keycloak.connectionsJpa.user}\ IDENTIFIED\ BY\ ${keycloak.connectionsJpa.password};\n\ GRANT\ CONNECT,\ RESOURCE,\ DBA,\ GRANT\ ANY\ PRIVILEGE,\ UNLIMITED\ TABLESPACE\ TO\ ${keycloak.connectionsJpa.user};\n';\ do\ sleep\ 5;\ done + diff --git a/testsuite/integration-arquillian/tests/base/pom.xml b/testsuite/integration-arquillian/tests/base/pom.xml index c9718d04aa2..b88b38ee6d5 100644 --- a/testsuite/integration-arquillian/tests/base/pom.xml +++ b/testsuite/integration-arquillian/tests/base/pom.xml @@ -409,8 +409,11 @@ ${keycloak.connectionsJpa.password} - ${keycloak.connectionsJpa.database} - sa + + ${keycloak.connectionsJpa.database} + ${keycloak.connectionsJpa.password} + ${keycloak.connectionsJpa.user} + ${keycloak.connectionsJpa.password} ${docker.database.cmd}