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