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 extends DatabaseConfig> 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}