Skip to content

Commit 885eec5

Browse files
committed
[KEYCLOAK-8348] - Containerize database tests
1 parent 2770950 commit 885eec5

6 files changed

Lines changed: 150 additions & 4 deletions

File tree

misc/DatabaseTesting.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,24 @@ Run tests:
5151

5252
Stop MySQl:
5353

54-
docker rm -f mariadb
54+
docker rm -f mariadb
5555

56+
Using built-in profiles to run database tests using docker containers
57+
-------
58+
59+
The project provides specific profiles to run database tests using containers. The supported databases and their respective profiles are:
60+
61+
* `db-mysql`
62+
* `db-postgres`
63+
* `db-mariadb`
64+
65+
As an example, to run tests using a MySQL docker container:
66+
67+
mvn -f testsuite/integration-arquillian clean verify -Pdb-mysql,jpa
68+
69+
If you want to run tests using a pre-configured Keycloak distribution (instead of Undertow):
70+
71+
mvn -f testsuite/integration-arquillian clean verify -Pdb-mysql,jpa,auth-server-wildfly
72+
73+
Note that you must always activate the `jpa` profile.
74+

model/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.jboss.logging.Logger;
2323
import org.keycloak.Config;
2424
import org.keycloak.ServerStartupError;
25+
import org.keycloak.common.util.StringPropertyReplacer;
2526
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
2627
import org.keycloak.connections.jpa.util.JpaUtils;
2728
import org.keycloak.models.KeycloakSession;
@@ -375,7 +376,7 @@ public Connection getConnection() {
375376
return dataSource.getConnection();
376377
} else {
377378
Class.forName(config.get("driver"));
378-
return DriverManager.getConnection(config.get("url"), config.get("user"), config.get("password"));
379+
return DriverManager.getConnection(StringPropertyReplacer.replaceProperties(config.get("url"), System.getProperties()), config.get("user"), config.get("password"));
379380
}
380381
} catch (Exception e) {
381382
throw new RuntimeException("Failed to connect to database", e);

pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113
<osgi.version>4.2.0</osgi.version>
114114
<pax.web.version>7.1.0</pax.web.version>
115115
<postgresql.version>9.3-1100-jdbc41</postgresql.version>
116-
<mariadb.version>1.3.7</mariadb.version>
116+
<mariadb.version>2.2.4</mariadb.version>
117117
<servlet.api.30.version>1.0.2.Final</servlet.api.30.version>
118118
<servlet.api.40.version>1.0.0.Final</servlet.api.40.version>
119119
<twitter4j.version>4.0.4</twitter4j.version>
@@ -141,6 +141,7 @@
141141
<wildfly.plugin.version>1.1.0.Final</wildfly.plugin.version>
142142
<nexus.staging.plugin.version>1.6.5</nexus.staging.plugin.version>
143143
<frontend.plugin.version>1.5</frontend.plugin.version>
144+
<docker.maven.plugin.version>0.28.0</docker.maven.plugin.version>
144145

145146
<!-- Surefire Settings -->
146147
<surefire.memory.settings>-Xms512m -Xmx2048m -XX:MetaspaceSize=96m -XX:MaxMetaspaceSize=256m</surefire.memory.settings>

testsuite/integration-arquillian/pom.xml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@
7272
<migration.70.version>1.9.8.Final</migration.70.version>
7373
<migration.71.version>2.5.5.Final</migration.71.version>
7474
<migration.72.version>3.4.3.Final</migration.72.version>
75+
76+
<!-- By default, skip docker-maven-plugin when running base tests-->
77+
<docker.database.skip>true</docker.database.skip>
7578
</properties>
7679

7780
<dependencyManagement>
@@ -320,6 +323,54 @@
320323
</pluginManagement>
321324
</build>
322325
</profile>
326+
<profile>
327+
<id>db-mysql</id>
328+
<properties>
329+
<keycloak.connectionsJpa.driver>com.mysql.jdbc.Driver</keycloak.connectionsJpa.driver>
330+
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
331+
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
332+
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
333+
<keycloak.connectionsJpa.url>jdbc:mysql://${auth.server.db.host}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
334+
<jdbc.mvn.groupId>mysql</jdbc.mvn.groupId>
335+
<jdbc.mvn.artifactId>mysql-connector-java</jdbc.mvn.artifactId>
336+
<jdbc.mvn.version>${mysql.version}</jdbc.mvn.version>
337+
<docker.database.image>mysql:5.7.25</docker.database.image>
338+
<docker.database.port>3306</docker.database.port>
339+
<docker.database.skip>false</docker.database.skip>
340+
</properties>
341+
</profile>
342+
<profile>
343+
<id>db-postgres</id>
344+
<properties>
345+
<keycloak.connectionsJpa.driver>org.postgresql.Driver</keycloak.connectionsJpa.driver>
346+
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
347+
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
348+
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
349+
<keycloak.connectionsJpa.url>jdbc:postgresql://${auth.server.db.host}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
350+
<jdbc.mvn.groupId>org.postgresql</jdbc.mvn.groupId>
351+
<jdbc.mvn.artifactId>postgresql</jdbc.mvn.artifactId>
352+
<jdbc.mvn.version>${postgresql.version}</jdbc.mvn.version>
353+
<docker.database.image>postgres:9.6.11</docker.database.image>
354+
<docker.database.port>5432</docker.database.port>
355+
<docker.database.skip>false</docker.database.skip>
356+
</properties>
357+
</profile>
358+
<profile>
359+
<id>db-mariadb</id>
360+
<properties>
361+
<keycloak.connectionsJpa.driver>org.mariadb.jdbc.Driver</keycloak.connectionsJpa.driver>
362+
<keycloak.connectionsJpa.database>keycloak</keycloak.connectionsJpa.database>
363+
<keycloak.connectionsJpa.user>keycloak</keycloak.connectionsJpa.user>
364+
<keycloak.connectionsJpa.password>keycloak</keycloak.connectionsJpa.password>
365+
<keycloak.connectionsJpa.url>jdbc:mariadb://${auth.server.db.host}/${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.url>
366+
<jdbc.mvn.groupId>org.mariadb.jdbc</jdbc.mvn.groupId>
367+
<jdbc.mvn.artifactId>mariadb-java-client</jdbc.mvn.artifactId>
368+
<jdbc.mvn.version>${mariadb.version}</jdbc.mvn.version>
369+
<docker.database.image>mariadb:10.2.21</docker.database.image>
370+
<docker.database.port>3306</docker.database.port>
371+
<docker.database.skip>false</docker.database.skip>
372+
</properties>
373+
</profile>
323374
</profiles>
324375

325376
</project>

testsuite/integration-arquillian/tests/base/pom.xml

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,16 @@
193193
</excludes>
194194
<systemPropertyVariables>
195195
<com.mchange.v2.c3p0.VMID>testsuiteVmId</com.mchange.v2.c3p0.VMID>
196+
<auth.server.db.host>${docker.container.testdb.ip}</auth.server.db.host>
197+
<keycloak.connectionsJpa.driver>${keycloak.connectionsJpa.driver}</keycloak.connectionsJpa.driver>
198+
<keycloak.connectionsJpa.url>${keycloak.connectionsJpa.url}</keycloak.connectionsJpa.url>
199+
<keycloak.connectionsJpa.database>${keycloak.connectionsJpa.database}</keycloak.connectionsJpa.database>
200+
<keycloak.connectionsJpa.user>${keycloak.connectionsJpa.user}</keycloak.connectionsJpa.user>
201+
<keycloak.connectionsJpa.password>${keycloak.connectionsJpa.password}</keycloak.connectionsJpa.password>
196202
</systemPropertyVariables>
197203
</configuration>
198204
</plugin>
199-
205+
200206
<plugin>
201207
<artifactId>maven-resources-plugin</artifactId>
202208
<executions>
@@ -304,6 +310,64 @@
304310
</execution>
305311
</executions>
306312
</plugin>
313+
<plugin>
314+
<groupId>io.fabric8</groupId>
315+
<artifactId>docker-maven-plugin</artifactId>
316+
<version>${docker.maven.plugin.version}</version>
317+
<configuration>
318+
<skip>${docker.database.skip}</skip>
319+
</configuration>
320+
<executions>
321+
<execution>
322+
<id>start-db-container</id>
323+
<phase>process-test-classes</phase>
324+
<goals>
325+
<goal>start</goal>
326+
</goals>
327+
<configuration>
328+
<showLogs>true</showLogs>
329+
<images>
330+
<image>
331+
<alias>testdb</alias>
332+
<name>${docker.database.image}</name>
333+
<run>
334+
<ports>
335+
<port>${docker.database.port}</port>
336+
</ports>
337+
<env>
338+
<!-- MYSQL and MariaDB -->
339+
<MYSQL_DATABASE>${keycloak.connectionsJpa.database}</MYSQL_DATABASE>
340+
<MYSQL_USER>${keycloak.connectionsJpa.user}</MYSQL_USER>
341+
<MYSQL_PASSWORD>${keycloak.connectionsJpa.password}</MYSQL_PASSWORD>
342+
<MYSQL_RANDOM_ROOT_PASSWORD>true</MYSQL_RANDOM_ROOT_PASSWORD>
343+
344+
<!-- PostgreSQL -->
345+
<POSTGRES_DB>${keycloak.connectionsJpa.database}</POSTGRES_DB>
346+
<POSTGRES_USER>${keycloak.connectionsJpa.user}</POSTGRES_USER>
347+
<POSTGRES_PASSWORD>${keycloak.connectionsJpa.password}</POSTGRES_PASSWORD>
348+
</env>
349+
<wait>
350+
<tcp>
351+
<ports>
352+
<port>${docker.database.port}</port>
353+
</ports>
354+
</tcp>
355+
<time>120000</time>
356+
</wait>
357+
</run>
358+
</image>
359+
</images>
360+
</configuration>
361+
</execution>
362+
<execution>
363+
<id>stop-db-container</id>
364+
<phase>test</phase>
365+
<goals>
366+
<goal>stop</goal>
367+
</goals>
368+
</execution>
369+
</executions>
370+
</plugin>
307371

308372
</plugins>
309373

testsuite/integration-arquillian/tests/base/src/test/resources/arquillian.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
${kie.maven.settings}
128128
-Dauth.server.truststore=${auth.server.truststore}
129129
-Dauth.server.truststore.password=${auth.server.truststore.password}
130+
-Dauth.server.db.host=${auth.server.db.host}
130131
</property>
131132
<property name="javaVmArguments">
132133
${auth.server.jboss.jvm.debug.args}
@@ -154,6 +155,7 @@
154155
${auth.server.profile}
155156
-Dauth.server.truststore=${auth.server.truststore}
156157
-Dauth.server.truststore.password=${auth.server.truststore.password}
158+
-Dauth.server.db.host=${auth.server.db.host}
157159
</property>
158160
<property name="javaVmArguments">
159161
${auth.server.memory.settings}
@@ -179,6 +181,7 @@
179181
${auth.server.profile}
180182
-Dauth.server.truststore=${auth.server.truststore}
181183
-Dauth.server.truststore.password=${auth.server.truststore.password}
184+
-Dauth.server.db.host=${auth.server.db.host}
182185
</property>
183186
<property name="javaVmArguments">
184187
${auth.server.memory.settings}
@@ -258,6 +261,7 @@
258261
${auth.server.profile}
259262
-Dauth.server.truststore=${auth.server.truststore}
260263
-Dauth.server.truststore.password=${auth.server.truststore.password}
264+
-Dauth.server.db.host=${auth.server.db.host}
261265
</property>
262266
<property name="javaVmArguments">
263267
${auth.server.memory.settings}
@@ -287,6 +291,7 @@
287291
${auth.server.profile}
288292
-Dauth.server.truststore=${auth.server.truststore}
289293
-Dauth.server.truststore.password=${auth.server.truststore.password}
294+
-Dauth.server.db.host=${auth.server.db.host}
290295
</property>
291296
<property name="javaVmArguments">
292297
${auth.server.memory.settings}
@@ -423,6 +428,7 @@
423428
-Dauth.server.truststore.password=${auth.server.truststore.password}
424429
-Dkeycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled=${keycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled}
425430
-Dkeycloak.connectionsInfinispan.hotrodProtocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
431+
-Dauth.server.db.host=${auth.server.db.host}
426432
</property>
427433
<property name="javaVmArguments">
428434
${auth.server.memory.settings}
@@ -452,6 +458,7 @@
452458
-Dauth.server.truststore.password=${auth.server.truststore.password}
453459
-Dkeycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled=${keycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled}
454460
-Dkeycloak.connectionsInfinispan.hotrodProtocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
461+
-Dauth.server.db.host=${auth.server.db.host}
455462
</property>
456463
<property name="javaVmArguments">
457464
${auth.server.memory.settings}
@@ -482,6 +489,7 @@
482489
-Dauth.server.truststore.password=${auth.server.truststore.password}
483490
-Dkeycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled=${keycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled}
484491
-Dkeycloak.connectionsInfinispan.hotrodProtocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
492+
-Dauth.server.db.host=${auth.server.db.host}
485493
</property>
486494
<property name="javaVmArguments">
487495
${auth.server.memory.settings}
@@ -511,6 +519,7 @@
511519
-Dauth.server.truststore.password=${auth.server.truststore.password}
512520
-Dkeycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled=${keycloak.connectionsInfinispan.default.remoteStoreSecurityEnabled}
513521
-Dkeycloak.connectionsInfinispan.hotrodProtocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
522+
-Dauth.server.db.host=${auth.server.db.host}
514523
</property>
515524
<property name="javaVmArguments">
516525
${auth.server.memory.settings}
@@ -551,6 +560,7 @@
551560
${auth.server.memory.settings}
552561
-Dauth.server.truststore=${auth.server.truststore}
553562
-Dauth.server.truststore.password=${auth.server.truststore.password}
563+
-Dauth.server.db.host=${auth.server.db.host}
554564
</property>
555565
<property name="managementPort">${auth.server.management.port}</property>
556566
<property name="startupTimeoutInSeconds">${auth.server.jboss.startup.timeout}</property>

0 commit comments

Comments
 (0)