[Test framework] Add custom provider dependencies into a Keycloak server (#34621)

* Add custom provider dependencies into a Keycloak server.

Signed-off-by: Lukas Hanusovsky <lhanusov@redhat.com>
Co-authored-by: Simon Vacek <svacek@redhat.com>

* Update test-framework/examples/pom.xml

Signed-off-by: Stian Thorgersen <stian@redhat.com>

---------

Signed-off-by: Lukas Hanusovsky <lhanusov@redhat.com>
Signed-off-by: Stian Thorgersen <stian@redhat.com>
Co-authored-by: Simon Vacek <svacek@redhat.com>
Co-authored-by: Stian Thorgersen <stian@redhat.com>
This commit is contained in:
Lukas Hanusovsky 2024-11-06 08:39:28 +01:00 committed by GitHub
parent ce454bda47
commit a8d9a5553f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 323 additions and 84 deletions

View file

@ -969,7 +969,7 @@ jobs:
uses: ./.github/actions/integration-test-setup
- name: Run tests
run: ./mvnw test -f test-framework/pom.xml
run: ./mvnw package -f test-framework/pom.xml
base-new-integration-tests:
name: Base IT (new)

View file

@ -57,16 +57,12 @@ public final class Maven {
ArtifactDescriptorResult projectDescriptor = repositorySystem.readArtifactDescriptor(
ctx.getRepositorySystemSession(),
new ArtifactDescriptorRequest()
.setArtifact(new DefaultArtifact(project.getGroupId(), project.getArtifactId(), "pom", project.getVersion()))
.setArtifact(new DefaultArtifact(project.getGroupId(), project.getArtifactId(), "pom", project.getVersion()))
.setRepositories(remoteRepositories));
List<Dependency> dependencies = new ArrayList<>(projectDescriptor.getDependencies());
dependencies.addAll(projectDescriptor.getManagedDependencies());
Artifact artifact = resolveArtifact(groupId, artifactId, dependencies);
if (artifact == null) {
resolveArtifact(groupId, artifactId, projectDescriptor.getManagedDependencies());
}
if (artifact == null) {
artifact = resolveArtifactRecursively(ctx, projectDescriptor, groupId, artifactId);
}

View file

@ -58,7 +58,7 @@ public abstract class AbstractKeycloakTestServerSupplier implements Supplier<Key
}
KeycloakTestServer server = getServer();
server.start(rawOptions);
server.start(rawOptions, serverConfig.dependencies());
return server;
}

View file

@ -1,8 +1,10 @@
package org.keycloak.test.framework.server;
import io.quarkus.maven.dependency.Dependency;
import org.keycloak.it.utils.RawKeycloakDistribution;
import java.util.List;
import java.util.Set;
public class DistributionKeycloakTestServer implements KeycloakTestServer {
@ -16,8 +18,13 @@ public class DistributionKeycloakTestServer implements KeycloakTestServer {
private RawKeycloakDistribution keycloak;
@Override
public void start(List<String> rawOptions) {
public void start(List<String> rawOptions, Set<Dependency> dependencies) {
keycloak = new RawKeycloakDistribution(DEBUG, MANUAL_STOP, ENABLE_TLS, RE_CREATE, REMOVE_BUILD_OPTIONS_AFTER_BUILD, REQUEST_PORT);
for (Dependency dependency : dependencies) {
keycloak.copyProvider(dependency.getGroupId(), dependency.getArtifactId());
}
keycloak.run(rawOptions).assertStartedDevMode();
}

View file

@ -1,9 +1,11 @@
package org.keycloak.test.framework.server;
import io.quarkus.maven.dependency.Dependency;
import org.keycloak.Keycloak;
import org.keycloak.common.Version;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeoutException;
public class EmbeddedKeycloakTestServer implements KeycloakTestServer {
@ -11,10 +13,14 @@ public class EmbeddedKeycloakTestServer implements KeycloakTestServer {
private Keycloak keycloak;
@Override
public void start(List<String> rawOptions) {
keycloak = Keycloak.builder()
.setVersion(Version.VERSION)
.start(rawOptions);
public void start(List<String> rawOptions, Set<Dependency> dependencies) {
Keycloak.Builder builder = Keycloak.builder().setVersion(Version.VERSION);
for(Dependency dependency : dependencies) {
builder.addDependency(dependency.getGroupId(), dependency.getArtifactId(), "");
}
keycloak = builder.start(rawOptions);
}
@Override

View file

@ -1,10 +1,13 @@
package org.keycloak.test.framework.server;
import io.quarkus.maven.dependency.Dependency;
import java.util.List;
import java.util.Set;
public interface KeycloakTestServer {
void start(List<String> rawOptions);
void start(List<String> rawOptions, Set<Dependency> dependencies);
void stop();

View file

@ -1,5 +1,7 @@
package org.keycloak.test.framework.server;
import io.quarkus.maven.dependency.Dependency;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
@ -16,4 +18,8 @@ public interface KeycloakTestServerConfig {
default boolean enableSysLog() { return false; }
default Set<Dependency> dependencies() {
return Collections.emptySet();
}
}

View file

@ -1,16 +1,19 @@
package org.keycloak.test.framework.server;
import io.quarkus.maven.dependency.Dependency;
import org.jboss.logging.Logger;
import java.util.List;
import java.util.Set;
public class RemoteKeycloakTestServer implements KeycloakTestServer {
private static final Logger LOGGER = Logger.getLogger(RemoteKeycloakTestServer.class);
@Override
public void start(List<String> rawOptions) {
public void start(List<String> rawOptions, Set<Dependency> dependencies) {
LOGGER.infov("Requested server config: {0}", String.join(" ", rawOptions));
LOGGER.infov("Requested dependencies: {0}", String.join(" ", dependencies.toString()));
}
@Override

View file

@ -27,77 +27,13 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-test-framework-examples</artifactId>
<name>Keycloak Test Framework Examples</name>
<packaging>jar</packaging>
<name>Keycloak Test Framework Examples Parent</name>
<packaging>pom</packaging>
<description>Example tests to demonstrate the new testing framework</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-bom</artifactId>
<version>${project.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-mariadb</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-mssql</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-mysql</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-oracle</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-postgres</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-ui</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.logmanager</groupId>
<artifactId>jboss-logmanager</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<java.util.concurrent.ForkJoinPool.common.threadFactory>io.quarkus.bootstrap.forkjoin.QuarkusForkJoinWorkerThreadFactory</java.util.concurrent.ForkJoinPool.common.threadFactory>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
<modules>
<module>providers</module>
<module>tests</module>
</modules>
</project>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>keycloak-test-framework-examples</artifactId>
<groupId>org.keycloak.test</groupId>
<version>999.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-test-framework-example-providers</artifactId>
<name>Keycloak Test Framework Example Providers</name>
<packaging>jar</packaging>
<description>Example providers used for test framework example tests</description>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi-private</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,39 @@
package org.keycloak.providers.example;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.keycloak.models.KeycloakSession;
import org.keycloak.services.resource.RealmResourceProvider;
/**
*
* @author <a href="mailto:svacek@redhat.com">Simon Vacek</a>
*/
public class MyCustomRealmResourceProvider implements RealmResourceProvider {
private final KeycloakSession session;
public MyCustomRealmResourceProvider(KeycloakSession session) {
this.session = session;
}
@Override
public Object getResource() {
return this;
}
@Override
public void close() {
}
@GET
@Path("hello")
@Produces(MediaType.TEXT_PLAIN)
public Response hello() {
return Response.ok("Hello World!").type(MediaType.TEXT_PLAIN).build();
}
}

View file

@ -0,0 +1,40 @@
package org.keycloak.providers.example;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.services.resource.RealmResourceProvider;
import org.keycloak.services.resource.RealmResourceProviderFactory;
/**
*
* @author <a href="mailto:svacek@redhat.com">Simon Vacek</a>
*/
public class MyCustomRealmResourceProviderFactory implements RealmResourceProviderFactory {
public static final String ID = "custom-provider";
@Override
public String getId() {
return ID;
}
@Override
public RealmResourceProvider create(KeycloakSession session) {
return new MyCustomRealmResourceProvider(session);
}
@Override
public void init(org.keycloak.Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public void close() {
}
}

View file

@ -0,0 +1 @@
org.keycloak.providers.example.MyCustomRealmResourceProviderFactory

View file

@ -0,0 +1,109 @@
<?xml version="1.0"?>
<!--
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
~ and other contributors as indicated by the @author tags.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-test-framework-examples</artifactId>
<groupId>org.keycloak.test</groupId>
<version>999.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-test-framework-example-tests</artifactId>
<name>Keycloak Test Framework Example Tests</name>
<packaging>jar</packaging>
<description>Example tests to demonstrate the new testing framework</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-bom</artifactId>
<version>${project.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-mariadb</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-mssql</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-mysql</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-oracle</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-db-postgres</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-ui</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak.test</groupId>
<artifactId>keycloak-test-framework-example-providers</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.logmanager</groupId>
<artifactId>jboss-logmanager</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<java.util.concurrent.ForkJoinPool.common.threadFactory>io.quarkus.bootstrap.forkjoin.QuarkusForkJoinWorkerThreadFactory</java.util.concurrent.ForkJoinPool.common.threadFactory>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,52 @@
package org.keycloak.test.examples;
import io.quarkus.maven.dependency.Dependency;
import io.quarkus.maven.dependency.DependencyBuilder;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.HttpClientBuilder;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.keycloak.test.framework.annotations.InjectRealm;
import org.keycloak.test.framework.annotations.KeycloakIntegrationTest;
import org.keycloak.test.framework.realm.ManagedRealm;
import org.keycloak.test.framework.server.KeycloakTestServerConfig;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Set;
/**
*
* @author <a href="mailto:svacek@redhat.com">Simon Vacek</a>
*/
@KeycloakIntegrationTest(config = MyCustomProviderTest.ServerConfig.class)
public class MyCustomProviderTest {
@InjectRealm
ManagedRealm realm;
@Test
public void httpGetTest() {
String url = realm.getBaseUrl();
HttpUriRequest request = new HttpGet(url + "/custom-provider/hello");
try {
HttpResponse response = HttpClientBuilder.create().build().execute(request);
Assertions.assertEquals(200, response.getStatusLine().getStatusCode());
String content = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8);
Assertions.assertEquals("Hello World!", content);
} catch (IOException ignored) {}
}
public static class ServerConfig implements KeycloakTestServerConfig {
public Set<Dependency> dependencies() {
return Set.of(new DependencyBuilder().setGroupId("org.keycloak.test").setArtifactId("keycloak-test-framework-example-providers").build());
}
}
}