diff --git a/bom/application/pom.xml b/bom/application/pom.xml
index 682969eaedc60..3cb6c7d7d54b7 100644
--- a/bom/application/pom.xml
+++ b/bom/application/pom.xml
@@ -688,6 +688,11 @@
quarkus-test-oidc-server
${project.version}
+
+ io.quarkus
+ quarkus-test-keycloak-server
+ ${project.version}
+
io.quarkus
quarkus-oidc-deployment
diff --git a/integration-tests/oidc/pom.xml b/integration-tests/oidc/pom.xml
index 128e44baf488e..576f8004189b7 100644
--- a/integration-tests/oidc/pom.xml
+++ b/integration-tests/oidc/pom.xml
@@ -37,6 +37,11 @@
+
+ io.quarkus
+ quarkus-test-keycloak-server
+ test
+
io.quarkus
quarkus-junit5
diff --git a/integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/BearerTokenAuthorizationTest.java b/integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/BearerTokenAuthorizationTest.java
index b5a88e6f7584d..af69812984c1a 100644
--- a/integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/BearerTokenAuthorizationTest.java
+++ b/integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/BearerTokenAuthorizationTest.java
@@ -1,7 +1,7 @@
package io.quarkus.it.keycloak;
-import static io.quarkus.it.keycloak.KeycloakRealmResourceManager.getAccessToken;
-import static io.quarkus.it.keycloak.KeycloakRealmResourceManager.getRefreshToken;
+import static io.quarkus.test.keycloak.server.KeycloakTestResourceLifecycleManager.getAccessToken;
+import static io.quarkus.test.keycloak.server.KeycloakTestResourceLifecycleManager.getRefreshToken;
import static org.awaitility.Awaitility.await;
import static org.hamcrest.Matchers.equalTo;
@@ -16,13 +16,14 @@
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.keycloak.server.KeycloakTestResourceLifecycleManager;
import io.restassured.RestAssured;
/**
* @author Pedro Igor
*/
@QuarkusTest
-@QuarkusTestResource(KeycloakRealmResourceManager.class)
+@QuarkusTestResource(KeycloakTestResourceLifecycleManager.class)
public class BearerTokenAuthorizationTest {
@Test
diff --git a/test-framework/keycloak-server/pom.xml b/test-framework/keycloak-server/pom.xml
new file mode 100644
index 0000000000000..ccc211795dc24
--- /dev/null
+++ b/test-framework/keycloak-server/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+
+ io.quarkus
+ quarkus-test-framework
+ 999-SNAPSHOT
+
+
+ quarkus-test-keycloak-server
+ Quarkus - Test Framework - Keycloak Server support
+
+
+ org.keycloak
+ keycloak-adapter-core
+
+
+ org.keycloak
+ keycloak-core
+
+
+ org.testcontainers
+ testcontainers
+
+
+ io.rest-assured
+ rest-assured
+
+
+ io.rest-assured
+ xml-path
+
+
+
+
+ io.quarkus
+ quarkus-test-common
+
+
+ org.testcontainers
+ testcontainers
+
+
+
+
diff --git a/integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/KeycloakRealmResourceManager.java b/test-framework/keycloak-server/src/main/java/io/quarkus/test/keycloak/server/KeycloakTestResourceLifecycleManager.java
similarity index 84%
rename from integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/KeycloakRealmResourceManager.java
rename to test-framework/keycloak-server/src/main/java/io/quarkus/test/keycloak/server/KeycloakTestResourceLifecycleManager.java
index 4ab07adb2bf32..91fa01eab9c66 100644
--- a/integration-tests/oidc/src/test/java/io/quarkus/it/keycloak/KeycloakRealmResourceManager.java
+++ b/test-framework/keycloak-server/src/main/java/io/quarkus/test/keycloak/server/KeycloakTestResourceLifecycleManager.java
@@ -1,9 +1,9 @@
-package io.quarkus.it.keycloak;
+package io.quarkus.test.keycloak.server;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -15,21 +15,31 @@
import org.keycloak.representations.idm.RolesRepresentation;
import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.util.JsonSerialization;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
import io.restassured.RestAssured;
-public class KeycloakRealmResourceManager implements QuarkusTestResourceLifecycleManager {
+public class KeycloakTestResourceLifecycleManager implements QuarkusTestResourceLifecycleManager {
- private static final String KEYCLOAK_SERVER_URL = System.getProperty("keycloak.ssl.url", "https://localhost:8543/auth");
- private static final String KEYCLOAK_REALM = "quarkus";
+ private GenericContainer keycloak;
- static {
- RestAssured.useRelaxedHTTPSValidation();
- }
+ private static String KEYCLOAK_SERVER_URL;
+ private static final String KEYCLOAK_REALM = "quarkus";
@Override
public Map start() {
+ keycloak = new GenericContainer("quay.io/keycloak/keycloak:12.0.4")
+ .withExposedPorts(8080)
+ .withEnv("DB_VENDOR", "H2")
+ .withEnv("KEYCLOAK_USER", "admin")
+ .withEnv("KEYCLOAK_PASSWORD", "admin")
+ .waitingFor(Wait.forHttp("/auth"));
+
+ keycloak.start();
+
+ KEYCLOAK_SERVER_URL = "http://localhost:" + keycloak.getMappedPort(8080) + "/auth";
RealmRepresentation realm = createRealm(KEYCLOAK_REALM);
@@ -50,7 +60,11 @@ public Map start() {
} catch (IOException e) {
throw new RuntimeException(e);
}
- return Collections.emptyMap();
+
+ Map conf = new HashMap<>();
+ conf.put("quarkus.oidc.auth-server-url", KEYCLOAK_SERVER_URL + "/realms/" + KEYCLOAK_REALM);
+
+ return conf;
}
private static String getAdminAccessToken() {
@@ -127,6 +141,8 @@ public void stop() {
.auth().oauth2(getAdminAccessToken())
.when()
.delete(KEYCLOAK_SERVER_URL + "/admin/realms/" + KEYCLOAK_REALM).then().statusCode(204);
+
+ keycloak.stop();
}
public static String getAccessToken(String userName) {
diff --git a/test-framework/pom.xml b/test-framework/pom.xml
index b245af38aa1c4..db2f816d0a165 100644
--- a/test-framework/pom.xml
+++ b/test-framework/pom.xml
@@ -37,6 +37,7 @@
ldap
security
oidc-server
+ keycloak-server
jacoco