8000 fix: simplifying quarkus integration test annotations by shawkins · Pull Request #48977 · keycloak/keycloak · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Optional;
import java.util.Properties;
import java.util.concurrent.ForkJoinPool;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

import jakarta.enterprise.context.ApplicationScoped;
Expand Down Expand Up @@ -58,6 +59,8 @@
@ApplicationScoped
public class KeycloakMain implements QuarkusApplication {

public static final String KC_SERVER_PRINT_RUNNING = "kc.server.print_running";
public static final String RUNNING_MESSAGE = "The server is running";
private static AbstractNonServerCommand COMMAND;
private static Consumer<Throwable> ERROR_HANDLER;

Expand Down Expand Up @@ -163,8 +166,8 @@ public static void start(Picocli picocli, AbstractNonServerCommand command, Exec
*/
@Override
public int run(String... args) throws Exception {
QuarkusKeycloakApplication application = Arc.container().instance(QuarkusKeycloakApplication.class).get();
if (COMMAND != null) {
QuarkusKeycloakApplication application = Arc.container().instance(QuarkusKeycloakApplication.class).get();
QuarkusKeycloakSessionFactory sessionFactory = Arc.container().instance(QuarkusKeycloakSessionFactory.class).get();
COMMAND.onStart(application, sessionFactory);
}
Expand All @@ -173,6 +176,15 @@ public int run(String... args) throws Exception {
// we should be managing this behavior more dynamically depending on the tests requirements (short/long lived)
Quarkus.asyncExit(ApplicationLifecycleManager.getExitCode());
} else {
if (Boolean.getBoolean(KC_SERVER_PRINT_RUNNING)) {
BiConsumer<Void, Throwable> started = (v, t) -> {
if (t == null) {
System.out.println("\n" + RUNNING_MESSAGE);
}
};
application.getBootstrapFuture().ifPresentOrElse(future -> future.whenComplete(started),
() -> started.accept(null, null));
}
Quarkus.waitForExit();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.keycloak.quarkus.runtime.integration.jaxrs;

import java.util.Optional;
import java.util.concurrent.CompletableFuture;

import jakarta.enterprise.event.Observes;
Expand Down Expand Up @@ -59,6 +60,8 @@ public class QuarkusKeycloakApplication extends KeycloakApplication {
private static final String KEYCLOAK_ADMIN_PASSWORD_ENV_VAR = "KEYCLOAK_ADMIN_PASSWORD";

private static final Logger logger = Logger.getLogger(QuarkusKeycloakApplication.class);

private CompletableFuture<Void> bootstrapFuture;

@Override
protected String getDataDir() {
Expand All @@ -77,12 +80,16 @@ void onStartupEvent(@Observes StartupEvent event) {
startup();
} else {
ManagedExecutor executor = Arc.container().instance(ManagedExecutor.class).get();
CompletableFuture.runAsync(this::startup, executor).exceptionally(cause -> {
bootstrapFuture = CompletableFuture.runAsync(this::startup, executor).exceptionally(cause -> {
KeycloakMain.asyncExit(1, cause);
return null;
});
}
}

public Optional<CompletableFuture<Void>> getBootstrapFuture() {
return Optional.ofNullable(bootstrapFuture);
}

void onShutdownEvent(@Observes ShutdownEvent event) {
shutdown();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import org.keycloak.it.TestProvider;
import org.keycloak.it.junit5.extension.BeforeStartDistribution;
import org.keycloak.it.junit5.extension.CLIResult;
import org.keycloak.it.junit5.extension.KeycloakRunner;
import org.keycloak.it.junit5.extension.RawDistOnly;
import org.keycloak.it.utils.KeycloakDistribution;
import org.keycloak.it.utils.RawKeycloakDistribution;
import org.keycloak.quarkus.runtime.cli.command.StartDev;

Expand All @@ -32,25 +32,24 @@ abstract class AbstractPathDistTest {
@BeforeStartDistribution(AddCustomScriptsProvider.class)
@RawDistOnly(reason = "Testing installation path handling")
@Test
void testApplicationBuildAndStart(KeycloakDistribution dist) throws IOException {
RawKeycloakDistribution rawDist = dist.unwrap(RawKeycloakDistribution.class);
void testApplicationBuildAndStart(KeycloakRunner runner) throws IOException {
RawKeycloakDistribution rawDist = runner.getDistribution(RawKeycloakDistribution.class);
Path distPath = rawDist.getDistPath();
Path newPath = distPath.getParent().resolve(getSubPath()).resolve(distPath.getFileName());
rawDist.setDistPath(newPath);
try {
CLIResult result = dist.run(StartDev.NAME);
CLIResult result = runner.run(StartDev.NAME);
result.assertStartedDevMode();
assertThat(result.g 10BC8 etOutput(), containsString("Updating the configuration and installing your custom providers, if any. Please wait."));
} finally {
rawDist.setDistPath(distPath);
}
}

public static final class AddCustomScriptsProvider implements Consumer<KeycloakDistribution> {
public static final class AddCustomScriptsProvider implements Consumer<RawKeycloakDistribution> {
@Override
public void accept(KeycloakDistribution distribution) {
RawKeycloakDistribution rawDist = distribution.unwrap(RawKeycloakDistribution.class);
rawDist.copyProvider(new ScriptProviderForTest());
public void accept(RawKeycloakDistribution distribution) {
distribution.copyProvider(new ScriptProviderForTest());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@

import org.keycloak.it.junit5.extension.CLIResult;
import org.keycloak.it.junit5.extension.DistributionTest;
import org.keycloak.it.junit5.extension.KeycloakRunner;
import org.keycloak.it.junit5.extension.RawDistOnly;
import org.keycloak.it.junit5.extension.StopServer.Mode;
import org.keycloak.it.junit5.extension.WithEnvVars;
import org.keycloak.it.utils.KeycloakDistribution;
import org.keycloak.it.utils.RawKeycloakDistribution;

import io.quarkus.test.junit.main.Launch;
Expand Down Expand Up @@ -87,14 +88,15 @@ void failServiceAccountEnvNotSet(LaunchResult result) {

@Test
@WithEnvVars({"MY_SECRET", "admin123"})
void createAndUseSericeAccountAdmin(KeycloakDistribution dist) throws Exception {
RawKeycloakDistribution rawDist = dist.unwrap(RawKeycloakDistribution.class);
CLIResult result = rawDist.run("bootstrap-admin", "service", "--db=dev-file", "--client-id=admin", "--client-secret:env=MY_SECRET");
void createAndUseSericeAccountAdmin(KeycloakRunner runner) throws Exception {
RawKeycloakDistribution rawDist = runner.getDistribution(RawKeycloakDistribution.class);
CLIResult result = runner.run("bootstrap-admin", "service", "--db=dev-file", "--client-id=admin", "--client-secret:env=MY_SECRET");

assertTrue(result.getErrorOutput().isEmpty(), result.getErrorOutput());

rawDist.setManualStop(true);
rawDist.run("start-dev");
runner.setStopServer(Mode.MANUAL);
result = runner.run("start-dev");
result.assertStartedDevMode();

CLIResult adminResult = rawDist.kcadm("get", "clients", "--server", "http://localhost:8080", "--realm", "master", "--client", "admin", "--secret", "admin123");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@

import org.keycloak.it.junit5.extension.CLIResult;
import org.keycloak.it.junit5.extension.DistributionTest;
import org.keycloak.it.junit5.extension.DryRun;
import org.keycloak.it.junit5.extension.KeycloakRunner;
import org.keycloak.it.junit5.extension.RawDistOnly;
import org.keycloak.it.junit5.extension.StopServer;
import org.keycloak.it.junit5.extension.StopServer.Mode;
import org.keycloak.it.junit5.extension.WithEnvVars;
import org.keycloak.it.utils.KeycloakDistribution;
import org.keycloak.it.utils.RawKeycloakDistribution;

import io.quarkus.test.junit.main.Launch;
Expand All @@ -36,21 +37,20 @@

import static org.junit.jupiter.api.Assertions.assertTrue;

@WithEnvVars({"KC_CACHE", "local"}) // avoid flakey port conflicts
@DistributionTest
@RawDistOnly(reason = "Containers are immutable")
@TestMethodOrder(OrderAnnotation.class)
@Tag(DistributionTest.WIN)
public class BuildAndStartDistTest {

@DryRun
@StopServer(Mode.BEFORE_QUARKUS)
@Test
void testBuildAndStart(KeycloakDistribution dist) {
RawKeycloakDistribution rawDist = dist.unwrap(RawKeycloakDistribution.class);
void testBuildAndStart(KeycloakRunner runner) {
RawKeycloakDistribution rawDist = runner.getDistribution(RawKeycloakDistribution.class);
// start using based on the build options set via CLI
CLIResult cliResult = rawDist.run("build", "--db=dev-file");
CLIResult cliResult = runner.run("build", "--db=dev-file");
cliResult.assertBuild();
cliResult = rawDist.run("start", "--http-enabled=true", "--hostname-strict=false", OPTIMIZED_BUILD_OPTION_LONG);
cliResult = runner.run("start", "--http-enabled=true", "--hostname-strict=false", OPTIMIZED_BUILD_OPTION_LONG);
cliResult.assertNoBuild();
assertTrue(cliResult.getErrorOutput().isBlank());

Expand All @@ -59,51 +59,51 @@ void testBuildAndStart(KeycloakDistribution dist) {
rawDist.setProperty("hostname-strict", "false");
rawDist.setProperty("http-relative-path", "/auth");
rawDist.setProperty("db", "dev-file");
cliResult = rawDist.run("build");
cliResult = runner.run("build");
cliResult.assertBuild();
cliResult = rawDist.run("start", OPTIMIZED_BUILD_OPTION_LONG);
cliResult = runner.run("start", OPTIMIZED_BUILD_OPTION_LONG);
cliResult.assertNoBuild();
assertTrue(cliResult.getErrorOutput().isBlank(), cliResult.getErrorOutput());
// running start without optimized flag should not cause a build
cliResult = rawDist.run("start");
cliResult = runner.run("start");
cliResult.assertNoBuild();
assertTrue(cliResult.getErrorOutput().isBlank());

// remove the build option from conf file to force a build during start
rawDist.removeProperty("http-relative-path");
cliResult = rawDist.run("start");
cliResult = runner.run("start");
cliResult.assertBuild();
assertTrue(cliResult.getErrorOutput().isBlank());
}

@Test
@WithEnvVars({"KEYCLOAK_ADMIN", "oldadmin123", "KEYCLOAK_ADMIN_PASSWORD", "oldadmin123"})
@Launch({"start-dev"})
void testCreateLegacyAdmin(KeycloakDistribution dist, LaunchResult result) {
assertAdminCreation(dist, result, "oldadmin123", "oldadmin123", "oldadmin123");
void testCreateLegacyAdmin(KeycloakRunner runner, LaunchResult result) {
assertAdminCreation(runner, result, "oldadmin123", "oldadmin123", "oldadmin123");
}

@Test
@WithEnvVars({"KC_BOOTSTRAP_ADMIN_USERNAME", "admin123", "KC_BOOTSTRAP_ADMIN_PASSWORD", "admin123"})
@Launch({"start-dev"})
void testCreateAdmin(KeycloakDistribution dist, LaunchResult result) {
assertAdminCreation(dist, result, "admin123", "admin123", "admin123");
void testCreateAdmin(KeycloakRunner runner, LaunchResult result) {
assertAdminCreation(runner, result, "admin123", "admin123", "admin123");
}

@Test
@WithEnvVars({"KC_BOOTSTRAP_ADMIN_USERNAME", "admin123", "KC_BOOTSTRAP_ADMIN_PASSWORD", "admin123"})
@Launch({"start-dev"})
void testCreateDifferentAdmin(KeycloakDistribution dist, LaunchResult result) {
assertAdminCreation(dist, result, "admin123", "new-admin", "new-admin");
void testCreateDifferentAdmin(KeycloakRunner runner, LaunchResult result) {
assertAdminCreation(runner, result, "admin123", "new-admin", "new-admin");
}

private void assertAdminCreation(KeycloakDistribution dist, LaunchResult result, String initialUsername, String nextUsername, String password) {
private void assertAdminCreation(KeycloakRunner runner, LaunchResult result, String initialUsername, String nextUsername, String password) {
assertTrue(result.getOutput().contains("Created temporary admin user with username " + initialUsername),
() -> "The Output:\n" + result.getOutput() + "doesn't contains the expected string.");

dist.setEnvVar("KC_BOOTSTRAP_ADMIN_USERNAME", nextUsername);
dist.setEnvVar("KC_BOOTSTRAP_ADMIN_PASSWORD", password);
CLIResult cliResult = dist.run("start-dev", "--log-level=org.keycloak.services:debug");
runner.setEnvVar("KC_BOOTSTRAP_ADMIN_USERNAME", nextUsername);
runner.setEnvVar("KC_BOOTSTRAP_ADMIN_PASSWORD", password);
CLIResult cliResult = runner.run("start-dev", "--log-level=org.keycloak.services:debug");

cliResult.assertNoMessage("Added temporary admin user '");
cliResult.assertStartedDevMode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@
import org.keycloak.config.database.Database;
import org.keycloak.it.junit5.extension.CLIResult;
import org.keycloak.it.junit5.extension.DistributionTest;
import org.keycloak.it.junit5.extension.KeycloakRunner;
import org.keycloak.it.junit5.extension.RawDistOnly;
import org.keycloak.it.junit5.extension.WithEnvVars;
import org.keycloak.it.utils.KeycloakDistribution;
import org.keycloak.it.utils.RawKeycloakDistribution;

import io.quarkus.test.junit.main.Launch;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -84,20 +86,21 @@ void testFailInvalidOptionInEnv(CLIResult cliResult) {

@Test
@RawDistOnly(reason = "Raw is enough and we avoid issues with including custom conf file in the container")
public void testFailInvalidOptionInConf(KeycloakDistribution distribution) {
CLIResult cliResult = distribution.run(CONFIG_FILE_LONG_NAME + "=" + Paths.get("src/test/resources/BuildCommandDistTest/keycloak.conf").toAbsolutePath().normalize(), "build");
public void testFailInvalidOptionInConf(KeycloakRunner runner) {
CLIResult cliResult = runner.run(CONFIG_FILE_LONG_NAME + "=" + Paths.get("src/test/resources/BuildCommandDistTest/keycloak.conf").toAbsolutePath().normalize(), "build");
cliResult.assertError("Invalid value for option 'kc.db' in keycloak.conf: foo. Expected values are: dev-file, dev-mem, mariadb, mssql, mysql, oracle, postgres");
}

@Test
@RawDistOnly(reason = "Containers are immutable")
void testDoNotRecordRuntimeOptionsDuringBuild(KeycloakDistribution distribution) {
distribution.setProperty("db-url", "invalid");
CLIResult cliResult = distribution.run("build");
void testDoNotRecordRuntimeOptionsDuringBuild(KeycloakRunner runner) {
RawKeycloakDistribution rawDist = runner.getDistribution(RawKeycloakDistribution.class);
rawDist.setProperty("db-url", "invalid");
CLIResult cliResult = runner.run("build");
cliResult.assertBuild();
distribution.removeProperty("db-url");
rawDist.removeProperty("db-url");

CLIResult result = distribution.run("start", "--hostname=mykeycloak", "--cache=local", "--http-enabled=true", OPTIMIZED_BUILD_OPTION_LONG);
CLIResult result = runner.run("start", "--hostname=mykeycloak", "--cache=local", "--http-enabled=true", OPTIMIZED_BUILD_OPTION_LONG);
result.assertStarted();
}

Expand Down
Loading
Loading
0