mirror of
https://github.com/keycloak/keycloak.git
synced 2026-01-10 15:32:05 -03:30
Add database testsuite matrix to new testsuite (#34775)
Closes #34692 Signed-off-by: stianst <stianst@gmail.com>
This commit is contained in:
parent
653cd9f0a3
commit
b82ec62eb7
19
.github/workflows/ci.yml
vendored
19
.github/workflows/ci.yml
vendored
@ -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
|
||||
|
||||
|
||||
@ -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"]}
|
||||
|
||||
9
pom.xml
9
pom.xml
@ -159,17 +159,22 @@
|
||||
|
||||
<!-- Databases - also published to db.adoc as "Tested Version" -->
|
||||
<mysql.version>8.0</mysql.version>
|
||||
<mysql.container>mysql:${mysql.version}</mysql.container>
|
||||
<mysql-jdbc.version>8.3.0</mysql-jdbc.version>
|
||||
<postgresql.version>16</postgresql.version>
|
||||
<postgresql.container>postgres:${postgresql.version}</postgresql.container>
|
||||
<aurora-postgresql.version>16.1</aurora-postgresql.version>
|
||||
<aws-jdbc-wrapper.version>2.3.1</aws-jdbc-wrapper.version>
|
||||
<postgresql-jdbc.version>42.7.4</postgresql-jdbc.version>
|
||||
<mariadb.version>10.11</mariadb.version>
|
||||
<mariadb.container>mariadb:${mariadb.version}</mariadb.container>
|
||||
<mariadb-jdbc.version>3.4.1</mariadb-jdbc.version>
|
||||
<mssql.version>2022-latest</mssql.version>
|
||||
<mssql.version>2022</mssql.version>
|
||||
<mssql.container>mcr.microsoft.com/mssql/server:${mssql.version}-latest</mssql.container>
|
||||
<!-- this is the mssql driver version also used in the Quarkus BOM -->
|
||||
<mssql-jdbc.version>12.8.1.jre11</mssql-jdbc.version>
|
||||
<oracledb.version>19.3</oracledb.version>
|
||||
<oracledb.version>23.5</oracledb.version>
|
||||
<oracledb.container>gvenzl/oracle-free:${oracledb.version}-slim-faststart</oracledb.container>
|
||||
<!-- this is the oracle driver version also used in the Quarkus BOM -->
|
||||
<oracle-jdbc.version>23.5.0.24.07</oracle-jdbc.version>
|
||||
|
||||
|
||||
@ -178,11 +178,11 @@
|
||||
<systemPropertyVariables>
|
||||
<kc.test.storage.database>true</kc.test.storage.database>
|
||||
<!--DB Container -->
|
||||
<kc.db.postgresql.container.image>postgres:${postgresql.version}</kc.db.postgresql.container.image>
|
||||
<kc.db.mariadb.container.image>mariadb:${mariadb.version}</kc.db.mariadb.container.image>
|
||||
<kc.db.mysql.container.image>mysql:${mysql.version}</kc.db.mysql.container.image>
|
||||
<kc.db.postgresql.container.image>${postgresql.container}</kc.db.postgresql.container.image>
|
||||
<kc.db.mariadb.container.image>${mariadb.container}</kc.db.mariadb.container.image>
|
||||
<kc.db.mysql.container.image>${mysql.container}</kc.db.mysql.container.image>
|
||||
<kc.infinispan.container.image>quay.io/infinispan/server:${infinispan.version}</kc.infinispan.container.image>
|
||||
<kc.db.mssql.container.image>mcr.microsoft.com/mssql/server:${mssql.version}</kc.db.mssql.container.image>
|
||||
<kc.db.mssql.container.image>${mssql.container}</kc.db.mssql.container.image>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
@ -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`
|
||||
|
||||
@ -51,4 +51,14 @@
|
||||
<version>11.13</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -17,6 +17,10 @@ public class Config {
|
||||
return config.getOptionalValue("kc.test." + valueTypeAlias.getAlias(valueType), String.class).orElse(null);
|
||||
}
|
||||
|
||||
public static <T> T get(String name, T defaultValue, Class<T> clazz) {
|
||||
return config.getOptionalValue(name, clazz).orElse(defaultValue);
|
||||
}
|
||||
|
||||
public static String getAdminClientId() {
|
||||
return "temp-admin";
|
||||
}
|
||||
|
||||
@ -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<String> 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<String, String> 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<String> 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();
|
||||
|
||||
}
|
||||
|
||||
@ -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<String, String> 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<String, String> getEnv() {
|
||||
return env;
|
||||
}
|
||||
|
||||
public DatabaseConfig env(Map<String, String> env) {
|
||||
this.env = env;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Map<String, String> toConfig() {
|
||||
Map<String, String> 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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<OutputFrame> {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<String, String> serverConfig();
|
||||
|
||||
default Dependency jdbcDriver() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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<KeycloakTestServer, KeycloakIntegrationTest> {
|
||||
|
||||
@ -52,13 +54,20 @@ public abstract class AbstractKeycloakTestServerSupplier implements Supplier<Key
|
||||
|
||||
serverConfig.options().forEach((key, value) -> rawOptions.add("--" + key + "=" + value));
|
||||
|
||||
Set<Dependency> 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;
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
mysql.container=${mysql.container}
|
||||
postgres.container=${postgresql.container}
|
||||
mariadb.container=${mariadb.container}
|
||||
mssql.container=${mssql.container}
|
||||
oracle.container=${oracledb.container}
|
||||
@ -4,7 +4,7 @@ public class MariaDBDatabaseSupplier extends AbstractDatabaseSupplier {
|
||||
|
||||
@Override
|
||||
public String getAlias() {
|
||||
return "mariadb";
|
||||
return MariaDBTestDatabase.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ public class MSSQLServerDatabaseSupplier extends AbstractDatabaseSupplier {
|
||||
|
||||
@Override
|
||||
public String getAlias() {
|
||||
return "mssql";
|
||||
return MSSQLServerTestDatabase.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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<String> getPostStartCommand() {
|
||||
return List.of("/opt/mssql-tools18/bin/sqlcmd", "-U", "sa", "-P", getPassword(), "-No", "-Q", "CREATE DATABASE " + getDatabase());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Logger getLogger() {
|
||||
return LOGGER;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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";
|
||||
}
|
||||
}
|
||||
@ -4,7 +4,7 @@ public class OracleDatabaseSupplier extends AbstractDatabaseSupplier {
|
||||
|
||||
@Override
|
||||
public String getAlias() {
|
||||
return "oracle";
|
||||
return OracleTestDatabase.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,6 +9,6 @@ public class OracleTestFrameworkExtension implements TestFrameworkExtension {
|
||||
|
||||
@Override
|
||||
public List<Supplier<?, ?>> suppliers() {
|
||||
return List.of(new OracleDatabaseSupplier(), new Oracle19DatabaseSupplier());
|
||||
return List.of(new OracleDatabaseSupplier());
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ public class PostgresDatabaseSupplier extends AbstractDatabaseSupplier {
|
||||
|
||||
@Override
|
||||
public String getAlias() {
|
||||
return "postgres";
|
||||
return PostgresTestDatabase.NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +0,0 @@
|
||||
mcr.microsoft.com/mssql/server:latest
|
||||
@ -72,6 +72,11 @@
|
||||
<groupId>org.keycloak.test</groupId>
|
||||
<artifactId>keycloak-test-framework-db-postgres</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-suite</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.logmanager</groupId>
|
||||
<artifactId>jboss-logmanager</artifactId>
|
||||
|
||||
@ -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 {
|
||||
}
|
||||
@ -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;
|
||||
@ -1 +0,0 @@
|
||||
mcr.microsoft.com/mssql/server:latest
|
||||
@ -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
|
||||
formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p %t [%c] %m%n
|
||||
|
||||
@ -401,7 +401,7 @@
|
||||
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
|
||||
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
|
||||
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
|
||||
<keycloak.connectionsJpa.url>jdbc:mysql://${auth.server.db.host}/${keycloak.connectionsJpa.database}?allowPublicKeyRetrieval=true</keycloak.connectionsJpa.url>
|
||||
<keycloak.connectionsJpa.url>jdbc:mysql://${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database}?allowPublicKeyRetrieval=true</keycloak.connectionsJpa.url>
|
||||
|
||||
<!-- JDBC properties point to "default" JDBC driver for the particular DB -->
|
||||
<!-- For EAP testing, it is recommended to override those with system properties pointing to GAV of more appropriate JDBC driver -->
|
||||
@ -409,7 +409,7 @@
|
||||
<jdbc.mvn.groupId>com.mysql</jdbc.mvn.groupId>
|
||||
<jdbc.mvn.artifactId>mysql-connector-j</jdbc.mvn.artifactId>
|
||||
<jdbc.mvn.version>${mysql-jdbc.version}</jdbc.mvn.version>
|
||||
<docker.database.image>mysql:${mysql.version}</docker.database.image>
|
||||
<docker.database.image>${mysql.container}</docker.database.image>
|
||||
<docker.database.port>3306</docker.database.port>
|
||||
<docker.database.skip>false</docker.database.skip>
|
||||
<docker.database.cmd>mysqld</docker.database.cmd>
|
||||
@ -424,14 +424,14 @@
|
||||
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
|
||||
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
|
||||
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
|
||||
<keycloak.connectionsJpa.url>jdbc:postgresql://${auth.server.db.host}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
|
||||
<keycloak.connectionsJpa.url>jdbc:postgresql://${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
|
||||
<!-- JDBC properties point to "default" JDBC driver for the particular DB -->
|
||||
<!-- For EAP testing, it is recommended to override those with system properties pointing to GAV of more appropriate JDBC driver -->
|
||||
<!-- for the particular EAP version -->
|
||||
<jdbc.mvn.groupId>org.postgresql</jdbc.mvn.groupId>
|
||||
<jdbc.mvn.artifactId>postgresql</jdbc.mvn.artifactId>
|
||||
<jdbc.mvn.version>${postgresql-jdbc.version}</jdbc.mvn.version>
|
||||
<docker.database.image>postgres:${postgresql.version}</docker.database.image>
|
||||
<docker.database.image>${postgresql.container}</docker.database.image>
|
||||
<docker.database.port>5432</docker.database.port>
|
||||
<docker.database.skip>false</docker.database.skip>
|
||||
<docker.database.cmd>postgres</docker.database.cmd>
|
||||
@ -464,14 +464,14 @@
|
||||
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
|
||||
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
|
||||
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
|
||||
<keycloak.connectionsJpa.url>jdbc:mariadb://${auth.server.db.host}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
|
||||
<keycloak.connectionsJpa.url>jdbc:mariadb://${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
|
||||
<!-- JDBC properties point to "default" JDBC driver for the particular DB -->
|
||||
<!-- For EAP testing, it is recommended to override those with system properties pointing to GAV of more appropriate JDBC driver -->
|
||||
<!-- for the particular EAP version -->
|
||||
<jdbc.mvn.groupId>org.mariadb.jdbc</jdbc.mvn.groupId>
|
||||
<jdbc.mvn.artifactId>mariadb-java-client</jdbc.mvn.artifactId>
|
||||
<jdbc.mvn.version>${mariadb-jdbc.version}</jdbc.mvn.version>
|
||||
<docker.database.image>docker.io/mariadb:${mariadb.version}</docker.database.image>
|
||||
<docker.database.image>${mariadb.container}</docker.database.image>
|
||||
<docker.database.port>3306</docker.database.port>
|
||||
<docker.database.skip>false</docker.database.skip>
|
||||
<!-- Need to explicitly enable utf8 as it is not the default settings in the mariadb docker image -->
|
||||
@ -482,7 +482,7 @@
|
||||
<profile>
|
||||
<id>db-mssql</id>
|
||||
<properties>
|
||||
<docker.database.image>mcr.microsoft.com/mssql/server:${mssql.version}</docker.database.image>
|
||||
<docker.database.image>${mssql.container}</docker.database.image>
|
||||
<docker.database.port>1433</docker.database.port>
|
||||
<docker.database.skip>false</docker.database.skip>
|
||||
<docker.database.postStart>/opt/mssql-tools18/bin/sqlcmd -e -U sa -P ${keycloak.connectionsJpa.password} -No -d master -Q CREATE\ DATABASE\ ${keycloak.connectionsJpa.database}</docker.database.postStart>
|
||||
@ -505,20 +505,20 @@
|
||||
<profile>
|
||||
<id>db-oracle</id>
|
||||
<properties>
|
||||
<docker.database.image>docker.io/miquelsi/oracle-19c:${oracledb.version}</docker.database.image>
|
||||
<docker.database.image>${oracledb.container}</docker.database.image>
|
||||
<docker.database.port>1521</docker.database.port>
|
||||
<docker.database.shmsize>1073741824</docker.database.shmsize>
|
||||
<docker.database.skip>false</docker.database.skip>
|
||||
<docker.database.cmd>/bin/sh -c exec\ $ORACLE_BASE/$RUN_FILE</docker.database.cmd>
|
||||
<docker.database.wait-for-log-regex>(?si)DATABASE IS READY TO USE</docker.database.wait-for-log-regex>
|
||||
<docker.database.wait-for-log-regex>DATABASE IS READY TO USE</docker.database.wait-for-log-regex>
|
||||
<keycloak.storage.connections.vendor>oracle</keycloak.storage.connections.vendor>
|
||||
<keycloak.connectionsJpa.driver>oracle.jdbc.OracleDriver</keycloak.connectionsJpa.driver>
|
||||
<keycloak.connectionsJpa.database>XE</keycloak.connectionsJpa.database>
|
||||
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
|
||||
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
|
||||
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
|
||||
<keycloak.connectionsJpa.url>jdbc:oracle:thin:@${auth.server.db.host}:${docker.database.port}:${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
|
||||
<keycloak.connectionsJpa.url>jdbc:oracle:thin:@//${auth.server.db.host}:${docker.database.port}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
|
||||
|
||||
<docker.database.postStart>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</docker.database.postStart>
|
||||
<docker.database.postStart/>
|
||||
<!-- JDBC properties point to "default" JDBC driver for the particular DB -->
|
||||
<!-- For EAP testing, it is recommended to override those with system properties pointing to GAV of more appropriate JDBC driver -->
|
||||
<!-- for the particular EAP version -->
|
||||
|
||||
@ -409,8 +409,11 @@
|
||||
<MSSQL_SA_PASSWORD>${keycloak.connectionsJpa.password}</MSSQL_SA_PASSWORD>
|
||||
|
||||
<!-- Oracle -->
|
||||
<ORACLE_SID>${keycloak.connectionsJpa.database}</ORACLE_SID>
|
||||
<ORACLE_PWD>sa</ORACLE_PWD>
|
||||
<!-- <ORACLE_SID>${keycloak.connectionsJpa.database}</ORACLE_SID>-->
|
||||
<ORACLE_DATABASE>${keycloak.connectionsJpa.database}</ORACLE_DATABASE>
|
||||
<ORACLE_PASSWORD>${keycloak.connectionsJpa.password}</ORACLE_PASSWORD>
|
||||
<APP_USER>${keycloak.connectionsJpa.user}</APP_USER>
|
||||
<APP_USER_PASSWORD>${keycloak.connectionsJpa.password}</APP_USER_PASSWORD>
|
||||
</env>
|
||||
<cmd>${docker.database.cmd}</cmd>
|
||||
<wait>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user