KEYCLOAK-11069 auth-server-remote tests

This commit is contained in:
vramik
2019-09-02 16:22:45 +02:00
committed by Pavel Drozd
parent 2fb507e170
commit b1697a5e71
20 changed files with 149 additions and 92 deletions

View File

@@ -54,14 +54,6 @@
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.core</groupId>
<artifactId>wildfly-controller</artifactId>

View File

@@ -0,0 +1,82 @@
/*
* Copyright 2019 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.
*/
package org.keycloak.testsuite.arquillian.containers;
import java.util.List;
import org.jboss.arquillian.container.impl.client.container.ContainerDeployController;
import org.jboss.arquillian.container.spi.Container;
import org.jboss.arquillian.container.spi.ContainerRegistry;
import org.jboss.arquillian.container.spi.client.deployment.Deployment;
import org.jboss.arquillian.container.spi.client.deployment.DeploymentScenario;
import org.jboss.arquillian.container.spi.event.DeployDeployment;
import org.jboss.arquillian.container.spi.event.DeployManagedDeployments;
import org.jboss.arquillian.container.spi.event.DeploymentEvent;
import org.jboss.arquillian.core.api.Event;
import org.jboss.arquillian.core.api.Injector;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
/**
* Overrides a condition that container cannot be in manual mode, and deploys the deployment
* if the container is started
*/
public class KeycloakContainerDeployController extends ContainerDeployController {
@Inject
private Instance<ContainerRegistry> containerRegistry;
@Inject
private Instance<DeploymentScenario> deploymentScenario;
@Inject
private Instance<Injector> injector;
@Override
public void deployManaged(DeployManagedDeployments event) throws Exception {
forEachManagedDeployment(new ContainerDeployController.Operation<Container, Deployment>() {
@Inject
private Event<DeploymentEvent> event;
@Override
public void perform(Container container, Deployment deployment) throws Exception {
if (container.getState().equals(Container.State.STARTED)) {
event.fire(new DeployDeployment(container, deployment));
}
}
});
}
private void forEachManagedDeployment(ContainerDeployController.Operation<Container, Deployment> operation) throws Exception {
DeploymentScenario scenario = this.deploymentScenario.get();
if (scenario == null) {
return;
}
forEachDeployment(scenario.managedDeploymentsInDeployOrder(), operation);
}
private void forEachDeployment(List<Deployment> deployments, ContainerDeployController.Operation<Container, Deployment> operation)
throws Exception {
injector.get().inject(operation);
ContainerRegistry containerRegistry = this.containerRegistry.get();
if (containerRegistry == null) {
return;
}
for (Deployment deployment : deployments) {
Container container = containerRegistry.getContainer(deployment.getDescription().getTarget());
operation.perform(container, deployment);
}
}
}

View File

@@ -18,15 +18,9 @@ package org.keycloak.testsuite.arquillian.containers;
import org.apache.commons.io.FileUtils;
import org.jboss.arquillian.config.descriptor.api.ContainerDef;
import org.jboss.arquillian.container.impl.client.container.ContainerDeployController;
import org.jboss.arquillian.container.spi.Container;
import org.jboss.arquillian.container.spi.ContainerRegistry;
import org.jboss.arquillian.container.spi.client.deployment.Deployment;
import org.jboss.arquillian.container.spi.client.deployment.DeploymentScenario;
import org.jboss.arquillian.container.spi.event.ContainerMultiControlEvent;
import org.jboss.arquillian.container.spi.event.DeployDeployment;
import org.jboss.arquillian.container.spi.event.DeployManagedDeployments;
import org.jboss.arquillian.container.spi.event.DeploymentEvent;
import org.jboss.arquillian.container.spi.event.StartClassContainers;
import org.jboss.arquillian.container.spi.event.StartSuiteContainers;
import org.jboss.arquillian.container.spi.event.StopClassContainers;
@@ -35,7 +29,6 @@ import org.jboss.arquillian.container.spi.event.StopSuiteContainers;
import org.jboss.arquillian.container.spi.event.UnDeployManagedDeployments;
import org.jboss.arquillian.container.test.impl.client.ContainerEventController;
import org.jboss.arquillian.core.api.Event;
import org.jboss.arquillian.core.api.Injector;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
@@ -49,7 +42,6 @@ import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.keycloak.common.Profile;
import org.keycloak.helpers.DropAllServlet;
import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
import org.keycloak.testsuite.arquillian.ContainerInfo;
import org.keycloak.testsuite.arquillian.annotation.RestartContainer;
import org.wildfly.extras.creaper.commands.deployments.Deploy;
@@ -67,9 +59,9 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
import org.keycloak.testsuite.util.ContainerAssume;
/**
* Changes behaviour of original ContainerEventController to stop manual containers
@@ -87,6 +79,8 @@ public class KeycloakContainerEventsController extends ContainerEventController
@Inject
private Event<ContainerMultiControlEvent> container;
@Inject
private Instance<ContainerRegistry> containerRegistry;
@Override
public void execute(@Observes AfterSuite event) {
@@ -109,6 +103,10 @@ public class KeycloakContainerEventsController extends ContainerEventController
@Override
public void execute(BeforeClass event) {
if (event.getTestClass().isAnnotationPresent(RestartContainer.class)) {
// stop executing the test - remote container cannot be restarted
ContainerAssume.assumeNotAuthServerRemote();
RestartContainer restartContainer = event.getTestClass().getAnnotation(RestartContainer.class);
beforeOriginalContainerStop(restartContainer);
@@ -342,52 +340,4 @@ public class KeycloakContainerEventsController extends ContainerEventController
}
}
}
/*
* Coppied from org.jboss.arquillian.container.impl.client.container.ContainerDeployController
*
* Overrides a condition that container cannot be in manual mode, and deploys the deployment
* if the container is started
*/
@Inject
private Instance<Injector> injector;
@Inject
private Instance<DeploymentScenario> deploymentScenario;
@Inject
private Instance<ContainerRegistry> containerRegistry;
public void deployManaged(@Observes DeployManagedDeployments event) throws Exception {
forEachManagedDeployment(new ContainerDeployController.Operation<Container, Deployment>() {
@Inject
private Event<DeploymentEvent> event;
@Override
public void perform(Container container, Deployment deployment) throws Exception {
if (container.getState().equals(Container.State.STARTED)) {
event.fire(new DeployDeployment(container, deployment));
}
}
});
}
private void forEachManagedDeployment(ContainerDeployController.Operation<Container, Deployment> operation) throws Exception {
DeploymentScenario scenario = this.deploymentScenario.get();
if (scenario == null) {
return;
}
forEachDeployment(scenario.managedDeploymentsInDeployOrder(), operation);
}
private void forEachDeployment(List<Deployment> deployments, ContainerDeployController.Operation<Container, Deployment> operation)
throws Exception {
injector.get().inject(operation);
ContainerRegistry containerRegistry = this.containerRegistry.get();
if (containerRegistry == null) {
return;
}
for (Deployment deployment : deployments) {
Container container = containerRegistry.getContainer(deployment.getDescription().getTarget());
operation.perform(container, deployment);
}
}
}

View File

@@ -36,7 +36,6 @@ import org.jboss.arquillian.container.test.impl.enricher.resource.URIResourcePro
import org.jboss.arquillian.container.test.impl.enricher.resource.URLResourceProvider;
import org.jboss.arquillian.container.test.impl.execution.ClientBeforeAfterLifecycleEventExecuter;
import org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter;
import org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter;
import org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter;
import org.jboss.arquillian.container.test.spi.client.deployment.AuxiliaryArchiveAppender;
import org.jboss.arquillian.container.test.spi.client.protocol.Protocol;
@@ -72,6 +71,9 @@ public class KeycloakContainerTestExtension implements LoadableExtension {
// Overriden ContainerEventController
builder.observer(KeycloakContainerEventsController.class);
// overriden ContainerDeployController
builder.observer(KeycloakContainerDeployController.class);
}
private void registerOriginal(ExtensionBuilder builder) {

View File

@@ -17,7 +17,6 @@
package org.keycloak.testsuite.arquillian.containers;
import org.jboss.arquillian.container.impl.client.ContainerDeploymentContextHandler;
import org.jboss.arquillian.container.impl.client.container.ContainerDeployController;
import org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController;
import org.jboss.arquillian.container.impl.client.container.DeploymentExceptionHandler;
import org.jboss.arquillian.container.impl.client.deployment.ArchiveDeploymentExporter;
@@ -48,7 +47,6 @@ public class MultipleContainersExtension implements LoadableExtension {
builder.observer(RegistryCreator.class)
.observer(ContainerDeploymentContextHandler.class)
.observer(ContainerLifecycleController.class)
.observer(ContainerDeployController.class)
.observer(ArchiveDeploymentExporter.class)
.observer(DeploymentExceptionHandler.class);
}

View File

@@ -35,6 +35,11 @@ public class ContainerAssume {
}
public static void assumeNotAuthServerRemote() {
Assume.assumeFalse("Doesn't work on auth-server-remote",
AuthServerTestEnricher.AUTH_SERVER_CONTAINER.equals("auth-server-remote"));
}
public static void assumeClusteredContainer() {
Assume.assumeTrue(
String.format("Ignoring test since %s is set to false",

View File

@@ -69,6 +69,7 @@ import org.keycloak.testsuite.pages.LoginPage;
import org.keycloak.testsuite.pages.LoginUpdateProfilePage;
import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
import org.keycloak.testsuite.util.OAuthClient;
import org.keycloak.testsuite.util.ContainerAssume;
import org.keycloak.testsuite.util.WaitUtils;
import org.keycloak.util.BasicAuthHelper;
@@ -510,6 +511,8 @@ public class BrokerLinkAndTokenExchangeTest extends AbstractServletsAdapterTest
@Test
@UncaughtServerErrorExpected
public void testExportImport() throws Exception {
ContainerAssume.assumeNotAuthServerRemote();
testExternalExchange();
testingClient.testing().exportImport().setProvider(SingleFileExportProviderFactory.PROVIDER_ID);
String targetFilePath = testingClient.testing().exportImport().getExportImportTestDirectory() + File.separator + "singleFile-full.json";

View File

@@ -56,6 +56,9 @@ public class AddUserTest extends AbstractKeycloakTest {
public static void enabled() {
// don't run with auth-server-undertow for now
ContainerAssume.assumeNotAuthServerUndertow();
// container auth-server-remote cannot be restarted
ContainerAssume.assumeNotAuthServerRemote();
}
@Test

View File

@@ -46,6 +46,7 @@ public class RulesPolicyManagementTest extends AbstractPolicyManagementTest {
public static void verifyEnvironment() {
ContainerAssume.assumeNotAuthServerUndertow();
ProfileAssume.assumeFeatureEnabled(Profile.Feature.AUTHZ_DROOLS_POLICY);
ContainerAssume.assumeNotAuthServerRemote();
}
@Test

View File

@@ -64,6 +64,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.keycloak.testsuite.util.ContainerAssume;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -158,6 +159,9 @@ public class UserStorageFailureTest extends AbstractTestRealmKeycloakTest {
*/
@Test
public void testKeycloak5350() throws Exception {
ContainerAssume.assumeNotAuthServerRemote();
oauth.scope(OAuth2Constants.OFFLINE_ACCESS);
oauth.clientId("offline-client");
oauth.redirectUri(OAuthClient.AUTH_SERVER_ROOT + "/offline-client");

View File

@@ -35,6 +35,9 @@ import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.keycloak.testsuite.arquillian.DeploymentTargetModifier.AUTH_SERVER_CURRENT;
@@ -284,7 +287,8 @@ public class ConcurrentTransactionsTest extends AbstractTestRealmKeycloakTest {
um.removeUser(realm, realmUser2);
}
assert (currentSession.realms().removeRealm(realm.getId()));
Assert.assertTrue(currentSession.realms().removeRealm(realm.getId()));
Assert.assertThat(currentSession.realms().getRealm(realm.getId()), is(nullValue()));
}
@Override

View File

@@ -7,6 +7,7 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.keycloak.OAuth2Constants;
@@ -34,6 +35,7 @@ import org.keycloak.testsuite.admin.ApiUtil;
import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
import org.keycloak.testsuite.arquillian.annotation.RestartContainer;
import org.keycloak.testsuite.updaters.ClientAttributeUpdater;
import org.keycloak.testsuite.util.ContainerAssume;
import org.keycloak.testsuite.util.OAuthClient;
import org.keycloak.testsuite.util.UserBuilder;
import org.keycloak.util.JsonSerialization;
@@ -84,6 +86,11 @@ public class OpenShiftTokenReviewEndpointTest extends AbstractTestRealmKeycloakT
testRealm.getUsers().add(UserBuilder.create().username("groups-user").password("password").addGroups("/topGroup", "/topGroup/level2group").build());
}
@BeforeClass
public static void enabled() {
ContainerAssume.assumeNotAuthServerRemote();
}
@Before
public void enablePassthroughAuthenticator() {
assumeFeatureEnabled(OPENSHIFT_INTEGRATION);

View File

@@ -62,6 +62,7 @@ import org.keycloak.testsuite.pages.ConsentPage;
import org.keycloak.testsuite.pages.ErrorPage;
import org.keycloak.testsuite.pages.LoginPage;
import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
import org.keycloak.testsuite.util.ContainerAssume;
import org.keycloak.testsuite.util.OAuthClient;
/**
@@ -144,11 +145,15 @@ public final class OpenshiftClientStorageTest extends AbstractTestRealmKeycloakT
@AfterClass
public static void onAfterClass() {
OPENSHIFT_API_SERVER.stop();
if (OPENSHIFT_API_SERVER != null) {
OPENSHIFT_API_SERVER.stop();
}
}
@Before
public void onBefore() {
ContainerAssume.assumeNotAuthServerRemote();
assumeFeatureEnabled(OPENSHIFT_INTEGRATION);
ComponentRepresentation provider = new ComponentRepresentation();

View File

@@ -29,6 +29,7 @@ import org.keycloak.policy.PasswordPolicyManagerProvider;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.testsuite.AbstractKeycloakTest;
import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
import org.keycloak.testsuite.util.ContainerAssume;
import org.keycloak.testsuite.util.RealmBuilder;
import java.util.List;
@@ -147,6 +148,8 @@ public class PasswordPolicyTest extends AbstractKeycloakTest {
@Test
public void testBlacklistPasswordPolicyWithTestBlacklist() throws Exception {
ContainerAssume.assumeNotAuthServerRemote();
testingClient.server("passwordPolicy").run(session -> {
RealmModel realmModel = session.getContext().getRealm();

View File

@@ -4,9 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.BeforeClass;
import org.junit.Test;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.client.registration.Auth;
@@ -24,11 +22,11 @@ import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.testsuite.AbstractKeycloakTest;
import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
import org.keycloak.testsuite.util.AdminClientUtil;
import org.keycloak.testsuite.util.ContainerAssume;
import org.keycloak.testsuite.util.OAuthClient;
import org.wildfly.extras.creaper.core.online.OnlineManagementClient;
import org.wildfly.extras.creaper.core.online.operations.admin.Administration;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
@@ -57,6 +55,11 @@ public class FixedHostnameTest extends AbstractKeycloakTest {
testRealms.add(customHostname);
}
@BeforeClass
public static void enabled() {
ContainerAssume.assumeNotAuthServerRemote();
}
@Test
public void fixedHostname() throws Exception {
authServerUrl = oauth.AUTH_SERVER_ROOT;

View File

@@ -24,6 +24,7 @@ import org.junit.After;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
@@ -32,6 +33,7 @@ import org.keycloak.testsuite.AbstractKeycloakTest;
import org.keycloak.testsuite.arquillian.annotation.RestartContainer;
import org.keycloak.testsuite.auth.page.WelcomePage;
import org.keycloak.testsuite.auth.page.login.OIDCLogin;
import org.keycloak.testsuite.util.ContainerAssume;
import org.keycloak.testsuite.util.DroneUtils;
import org.keycloak.testsuite.util.PhantomJSBrowser;
import org.openqa.selenium.WebDriver;
@@ -70,6 +72,11 @@ public class WelcomePageTest extends AbstractKeycloakTest {
// no operation
}
@BeforeClass
public static void enabled() {
ContainerAssume.assumeNotAuthServerRemote();
}
/*
* Leave out client initialization and creation of a user account. We
* don't need those.

View File

@@ -81,6 +81,7 @@ import static org.keycloak.authentication.authenticators.x509.X509AuthenticatorC
import static org.keycloak.authentication.authenticators.x509.X509AuthenticatorConfigModel.MappingSourceType.SUBJECTDN;
import static org.keycloak.authentication.authenticators.x509.X509AuthenticatorConfigModel.MappingSourceType.SUBJECTDN_CN;
import static org.keycloak.authentication.authenticators.x509.X509AuthenticatorConfigModel.MappingSourceType.SUBJECTDN_EMAIL;
import org.keycloak.testsuite.util.ContainerAssume;
/**
* @author <a href="mailto:brat000012001@gmail.com">Peter Nalyvayko</a>
@@ -142,6 +143,7 @@ public abstract class AbstractX509AuthenticationTest extends AbstractTestRealmKe
@Before
public void validateConfiguration() {
Assume.assumeTrue(AUTH_SERVER_SSL_REQUIRED);
ContainerAssume.assumeNotAuthServerRemote();
}

View File

@@ -572,8 +572,8 @@
</configuration>
</container>
</group>
<container qualifier="auth-server-remote" mode="suite" >
<container qualifier="auth-server-remote" mode="manual" >
<configuration>
<property name="enabled">${auth.server.remote}</property>
<property name="adapterImplClass">org.jboss.as.arquillian.container.remote.RemoteDeployableContainer</property>
@@ -584,9 +584,9 @@
<property name="password">admin</property>
</configuration>
</container>
<!-- PREVIOUS VERSION OF KEYCLOAK FOR MIGRATION TESTS -->
<container qualifier="auth-server-jboss-migration" mode="manual" >
<configuration>
<property name="enabled">${auth.server.jboss.migration}</property>

View File

@@ -1547,12 +1547,6 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>undertow-embedded</artifactId>
<version>${undertow-embedded.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>

View File

@@ -180,14 +180,6 @@
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>