Add database testsuite matrix to new testsuite (#34775)

Closes #34692

Signed-off-by: stianst <stianst@gmail.com>
This commit is contained in:
Stian Thorgersen 2024-11-11 07:04:30 +01:00 committed by GitHub
parent 653cd9f0a3
commit b82ec62eb7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
35 changed files with 302 additions and 223 deletions

View File

@ -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

View File

@ -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"]}

View File

@ -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>

View File

@ -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>

View File

@ -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`

View File

@ -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>

View File

@ -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;
}

View File

@ -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";
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -0,0 +1,5 @@
mysql.container=${mysql.container}
postgres.container=${postgresql.container}
mariadb.container=${mariadb.container}
mssql.container=${mssql.container}
oracle.container=${oracledb.container}

View File

@ -4,7 +4,7 @@ public class MariaDBDatabaseSupplier extends AbstractDatabaseSupplier {
@Override
public String getAlias() {
return "mariadb";
return MariaDBTestDatabase.NAME;
}
@Override

View File

@ -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;
}
}

View File

@ -4,7 +4,7 @@ public class MSSQLServerDatabaseSupplier extends AbstractDatabaseSupplier {
@Override
public String getAlias() {
return "mssql";
return MSSQLServerTestDatabase.NAME;
}
@Override

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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";
}
}

View File

@ -4,7 +4,7 @@ public class OracleDatabaseSupplier extends AbstractDatabaseSupplier {
@Override
public String getAlias() {
return "oracle";
return OracleTestDatabase.NAME;
}
@Override

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -4,7 +4,7 @@ public class PostgresDatabaseSupplier extends AbstractDatabaseSupplier {
@Override
public String getAlias() {
return "postgres";
return PostgresTestDatabase.NAME;
}
@Override

View File

@ -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;
}
}

View File

@ -1 +0,0 @@
mcr.microsoft.com/mssql/server:latest

View File

@ -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>

View File

@ -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 {
}

View File

@ -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;

View File

@ -1 +0,0 @@
mcr.microsoft.com/mssql/server:latest

View File

@ -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

View File

@ -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\ &lt;&lt;&lt;\ $'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 -->

View File

@ -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>