keycloak-uncached

Merge pull request #2684 from mstruk/assert-events-refactor KEYCLOAK-2755

4/20/2016 2:36:57 PM

Changes

testsuite/integration-arquillian/servers/auth-server/services/event-queue/src/main/java/org/keycloak/testsuite/events/AssertEventsServletFilter.java 71(+0 -71)

testsuite/integration-arquillian/servers/auth-server/services/event-queue/src/main/java/org/keycloak/testsuite/events/EventsServer.java 96(+0 -96)

Details

diff --git a/testsuite/integration-arquillian/servers/auth-server/jboss/build.xml b/testsuite/integration-arquillian/servers/auth-server/jboss/build.xml
index b34fc7d..1e4ab78 100644
--- a/testsuite/integration-arquillian/servers/auth-server/jboss/build.xml
+++ b/testsuite/integration-arquillian/servers/auth-server/jboss/build.xml
@@ -29,7 +29,7 @@
 
             // inject provider
             providers = root.withArray("providers");
-            providers.add("module:org.keycloak.testsuite.integration-arquillian-event-queue");
+            providers.add("module:org.keycloak.testsuite.integration-arquillian-testsuite-providers");
 
             // save file
             JsonSerialization.prettyMapper.writeValue(file, root);
diff --git a/testsuite/integration-arquillian/servers/auth-server/jboss/pom.xml b/testsuite/integration-arquillian/servers/auth-server/jboss/pom.xml
index 097e239..66cce9c 100644
--- a/testsuite/integration-arquillian/servers/auth-server/jboss/pom.xml
+++ b/testsuite/integration-arquillian/servers/auth-server/jboss/pom.xml
@@ -101,7 +101,7 @@
                                 </configuration>
                             </execution>
                             <execution>
-                                <id>copy-event-queue-provider</id>
+                                <id>copy-testsuite-providers</id>
                                 <phase>generate-resources</phase>
                                 <goals>
                                     <goal>copy</goal>
@@ -110,17 +110,17 @@
                                     <artifactItems>
                                         <artifactItem>
                                             <groupId>org.keycloak.testsuite</groupId>
-                                            <artifactId>integration-arquillian-event-queue</artifactId>
+                                            <artifactId>integration-arquillian-testsuite-providers</artifactId>
                                             <version>${project.version}</version>
                                             <type>jar</type>
                                             <overWrite>false</overWrite>
-                                            <outputDirectory>${auth.server.home}/modules/org/keycloak/testsuite/integration-arquillian-event-queue/main</outputDirectory>
+                                            <outputDirectory>${auth.server.home}/modules/org/keycloak/testsuite/integration-arquillian-testsuite-providers/main</outputDirectory>
                                         </artifactItem>
                                     </artifactItems>
                                 </configuration>
                             </execution>
                             <execution>
-                                <id>install-event-queue-module</id>
+                                <id>install-testsuite-providers-module</id>
                                 <phase>generate-resources</phase>
                                 <goals>
                                     <goal>unpack</goal>
@@ -129,7 +129,7 @@
                                     <artifactItems>
                                         <artifactItem>
                                             <groupId>org.keycloak.testsuite</groupId>
-                                            <artifactId>integration-arquillian-event-queue</artifactId>
+                                            <artifactId>integration-arquillian-testsuite-providers</artifactId>
                                             <version>${project.version}</version>
                                             <type>jar</type>
                                             <outputDirectory>${auth.server.home}/modules</outputDirectory>
diff --git a/testsuite/integration-arquillian/servers/auth-server/services/pom.xml b/testsuite/integration-arquillian/servers/auth-server/services/pom.xml
index 2d96ac0..b875ec5 100644
--- a/testsuite/integration-arquillian/servers/auth-server/services/pom.xml
+++ b/testsuite/integration-arquillian/servers/auth-server/services/pom.xml
@@ -30,7 +30,7 @@
     <name>Auth Server Services</name>
 
     <modules>
-        <module>event-queue</module>
+        <module>testsuite-providers</module>
     </modules>
 
 </project>
diff --git a/testsuite/integration-arquillian/tests/base/pom.xml b/testsuite/integration-arquillian/tests/base/pom.xml
index 21aea19..ee6ad1b 100644
--- a/testsuite/integration-arquillian/tests/base/pom.xml
+++ b/testsuite/integration-arquillian/tests/base/pom.xml
@@ -59,7 +59,7 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak.testsuite</groupId>
-            <artifactId>integration-arquillian-event-queue</artifactId>
+            <artifactId>integration-arquillian-testsuite-providers</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/KeycloakTestingClient.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/KeycloakTestingClient.java
new file mode 100755
index 0000000..cbc639e
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/KeycloakTestingClient.java
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+package org.keycloak.testsuite.client;
+
+import org.jboss.resteasy.client.jaxrs.ResteasyClient;
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
+import org.keycloak.testsuite.client.resources.TestingResource;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class KeycloakTestingClient {
+    private final ResteasyWebTarget target;
+    private final ResteasyClient client;
+
+    KeycloakTestingClient(String serverUrl, ResteasyClient resteasyClient) {
+        client = resteasyClient != null ? resteasyClient : new ResteasyClientBuilder().connectionPoolSize(10).build();
+        target = client.target(serverUrl);
+    }
+
+    public static KeycloakTestingClient getInstance(String serverUrl) {
+        return new KeycloakTestingClient(serverUrl, null);
+    }
+
+    public TestingResource testing() {
+        return target.proxy(TestingResource.class);
+    }
+
+    public void close() {
+        client.close();
+    }
+}
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java
new file mode 100644
index 0000000..1e98253
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+package org.keycloak.testsuite.client.resources;
+
+import org.keycloak.representations.idm.EventRepresentation;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+
+@Path("/realms/master/testing")
+@Consumes(MediaType.APPLICATION_JSON)
+public interface TestingResource {
+
+    @GET
+    @Path("/time-offset")
+    @Produces(MediaType.APPLICATION_JSON)
+    Map<String, String> getTimeOffset() ;
+
+    @PUT
+    @Path("/time-offset")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    Map<String, String> setTimeOffset(Map<String, String> time);
+
+    @POST
+    @Path("/poll-event-queue")
+    @Produces(MediaType.APPLICATION_JSON)
+    EventRepresentation pollEvent();
+
+    @POST
+    @Path("/clear-event-queue")
+    @Produces(MediaType.APPLICATION_JSON)
+    Response clearQueue();
+
+    @POST
+    @Path("/remove-user-session")
+    @Produces(MediaType.APPLICATION_JSON)
+    Response removeUserSession(@QueryParam("realm") final String name, @QueryParam("session") final String sessionId);
+
+    @POST
+    @Path("/remove-expired")
+    @Produces(MediaType.APPLICATION_JSON)
+    Response removeExpired(@QueryParam("realm") final String name);
+}
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java
index 3fd7712..b72a178 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AbstractKeycloakTest.java
@@ -18,19 +18,16 @@ package org.keycloak.testsuite;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.commons.io.IOUtils;
 import org.keycloak.common.util.KeycloakUriBuilder;
 import org.keycloak.testsuite.arquillian.TestContext;
 
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import javax.ws.rs.NotFoundException;
 import org.jboss.arquillian.container.test.api.RunAsClient;
@@ -56,9 +53,9 @@ import org.keycloak.testsuite.admin.ApiUtil;
 import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
 import org.keycloak.testsuite.arquillian.SuiteContext;
 import org.keycloak.testsuite.auth.page.WelcomePage;
+import org.keycloak.testsuite.client.KeycloakTestingClient;
 import org.keycloak.testsuite.util.DeleteMeOAuthClient;
 import org.keycloak.testsuite.util.OAuthClient;
-import org.keycloak.util.JsonSerialization;
 import org.openqa.selenium.WebDriver;
 import org.keycloak.testsuite.auth.page.AuthServer;
 import org.keycloak.testsuite.auth.page.AuthServerContextRoot;
@@ -94,6 +91,8 @@ public abstract class AbstractKeycloakTest {
 
     protected Keycloak adminClient;
 
+    protected KeycloakTestingClient testingClient;
+
     @ArquillianResource
     protected OAuthClient oauthClient;
 
@@ -134,7 +133,8 @@ public abstract class AbstractKeycloakTest {
                 MASTER, ADMIN, ADMIN, Constants.ADMIN_CLI_CLIENT_ID);
         deleteMeOAuthClient = new DeleteMeOAuthClient(AuthServerTestEnricher.getAuthServerContextRoot() + "/auth");
 
-        
+        testingClient = KeycloakTestingClient.getInstance(AuthServerTestEnricher.getAuthServerContextRoot() + "/auth");
+
         adminUser = createAdminUserRepresentation();
 
         setDefaultPageUriParameters();
@@ -302,7 +302,7 @@ public abstract class AbstractKeycloakTest {
         userResource.update(userRepresentation);
     }
 
-    public void setTimeOffset(int offset) {invokeTimeOffset(offset);
+    public void setTimeOffset(int offset) {
         String response = invokeTimeOffset(offset);
         resetTimeOffset = offset != 0;
         log.debugv("Set time offset, response {0}", response);
@@ -315,26 +315,8 @@ public abstract class AbstractKeycloakTest {
     }
 
     private String invokeTimeOffset(int offset) {
-        try {
-            String data = JsonSerialization.writeValueAsString(Collections.singletonMap("offset", String.valueOf(offset)));
-            URI uri = KeycloakUriBuilder.fromUri(suiteContext.getAuthServerInfo().getContextRoot().toURI()).path("/auth/realms/master/time-offset").build();
-            HttpURLConnection connection = (HttpURLConnection) uri.toURL().openConnection();
-            connection.setDoOutput(true);
-            connection.setRequestMethod("PUT");
-            connection.setRequestProperty("Content-Type", "application/json");
-            connection.setRequestProperty("Content-Length", String.valueOf(data.length()));
-
-            OutputStream os = connection.getOutputStream();
-            os.write(data.getBytes());
-            os.close();
-
-            InputStream is = connection.getInputStream();
-            String response = IOUtils.toString(is);
-            is.close();
-            return response;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+        Map result = testingClient.testing().setTimeOffset(Collections.singletonMap("offset", String.valueOf(offset)));
+        return String.valueOf(result);
     }
 
     private void loadConstantsProperties() throws ConfigurationException {
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AssertEvents.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AssertEvents.java
index 6a4a554..01a448a 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AssertEvents.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/AssertEvents.java
@@ -17,11 +17,6 @@
 
 package org.keycloak.testsuite;
 
-import org.apache.commons.io.IOUtils;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
@@ -38,10 +33,10 @@ import org.keycloak.representations.idm.EventRepresentation;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.representations.idm.UserRepresentation;
 import org.keycloak.representations.idm.UserSessionRepresentation;
-import org.keycloak.util.JsonSerialization;
+import org.keycloak.testsuite.client.resources.TestingResource;
 import org.keycloak.util.TokenUtil;
 
-import java.io.IOException;
+import javax.ws.rs.core.Response;
 import java.security.PublicKey;
 import java.util.HashMap;
 import java.util.List;
@@ -58,9 +53,9 @@ public class AssertEvents {
     public static final String DEFAULT_USERNAME = "test-user@localhost";
 
     String defaultRedirectUri = "http://localhost:8180/auth/realms/master/app/auth";
-    String defaultEventsQueueUri = "http://localhost:8092";
 
     private RealmResource realmResource;
+    private TestingResource testingResource;
     private RealmRepresentation realmRep;
     private AbstractKeycloakTest context;
     private PublicKey realmPublicKey;
@@ -73,13 +68,11 @@ public class AssertEvents {
         String pubKeyString = realmRep.getPublicKey();
         realmPublicKey = PemUtils.decodePublicKey(pubKeyString);
 
-        defaultEventsQueueUri = getAuthServerEventsQueueUri();
-    }
-
-    String getAuthServerEventsQueueUri() {
-        int httpPort = Integer.parseInt(System.getProperty("auth.server.event.http.port", "8089"));
-        int portOffset = Integer.parseInt(System.getProperty("auth.server.port.offset", "0"));
-        return "http://localhost:" + (httpPort + portOffset);
+        UserRepresentation defaultUser = getUser(DEFAULT_USERNAME);
+        if (defaultUser == null) {
+            throw new RuntimeException("Default user does not exist: " + DEFAULT_USERNAME + ". Make sure to add it to your test realm.");
+        }
+        testingResource = context.testingClient.testing();
     }
 
     public EventRepresentation poll() {
@@ -90,22 +83,11 @@ public class AssertEvents {
     }
 
     public void clear() {
-        CloseableHttpClient httpclient = HttpClients.createDefault();
+        Response res = testingResource.clearQueue();
         try {
-            HttpPost post = new HttpPost(defaultEventsQueueUri + "/clear-event-queue");
-            CloseableHttpResponse response = httpclient.execute(post);
-            if (response.getStatusLine().getStatusCode() != 200) {
-                throw new RuntimeException("Failed to clear events from " + post.getURI() + ": " + response.getStatusLine().toString());
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        finally {
-            try {
-                httpclient.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
+            Assert.assertEquals("clear-event-queue success", res.getStatus(), 200);
+        } finally {
+            res.close();
         }
     }
 
@@ -380,24 +362,6 @@ public class AssertEvents {
     }
 
     private EventRepresentation fetchNextEvent() {
-        CloseableHttpClient httpclient = HttpClients.createDefault();
-        try {
-            HttpPost post = new HttpPost(defaultEventsQueueUri + "/event-queue");
-            CloseableHttpResponse response = httpclient.execute(post);
-            if (response.getStatusLine().getStatusCode() != 200) {
-                throw new RuntimeException("Failed to retrieve event from " + post.getURI() + ": " + response.getStatusLine().toString() + " / " + IOUtils.toString(response.getEntity().getContent()));
-            }
-
-            return JsonSerialization.readValue(response.getEntity().getContent(), EventRepresentation.class);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        finally {
-            try {
-                httpclient.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
+        return testingResource.pollEvent();
     }
 }