keycloak-aplcache
Changes
testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/WaitUtils.java 1(+1 -0)
testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java 1(+0 -1)
testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/AbstractNodejsExamplePage.java 34(+34 -0)
testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/NodejsExamplePage.java 60(+60 -0)
Details
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/WaitUtils.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/WaitUtils.java
index 17a8485..29a08ca 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/WaitUtils.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/WaitUtils.java
@@ -71,6 +71,7 @@ public final class WaitUtils {
}
public static void pause(long millis) {
+ log.info("Wait: " + millis + "ms");
try {
Thread.sleep(millis);
} catch (InterruptedException ex) {
diff --git a/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java
index 1f47c1e..b5bddde 100644
--- a/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java
+++ b/testsuite/integration-arquillian/tests/other/console/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java
@@ -199,7 +199,6 @@ public class SecurityDefensesTest extends AbstractRealmTest {
wait *= 1000;
- log.info("Wait: " + wait);
pause(wait);
if (finalLogin) {
diff --git a/testsuite/integration-arquillian/tests/other/nodejs_adapter/pom.xml b/testsuite/integration-arquillian/tests/other/nodejs_adapter/pom.xml
new file mode 100644
index 0000000..3acadaf
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/nodejs_adapter/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.keycloak.testsuite</groupId>
+ <artifactId>integration-arquillian-tests-other</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>integration-arquillian-tests-nodejs-adapter</artifactId>
+
+ <name>Node.js adapter tests</name>
+
+ <properties>
+ <testsuite.adapter.nodejs.example.url>http://localhost:3000/</testsuite.adapter.nodejs.example.url>
+ <auth.server.port.offset>0</auth.server.port.offset>
+ <auth.server.http.port>8080</auth.server.http.port>
+ <auth.server.https.port>8443</auth.server.https.port>
+ <auth.server.management.port>9990</auth.server.management.port>
+ <auth.server.management.port.jmx>9999</auth.server.management.port.jmx>
+ </properties>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <systemProperties>
+ <testsuite.adapter.nodejs.example.url>${testsuite.adapter.nodejs.example.url}</testsuite.adapter.nodejs.example.url>
+ </systemProperties>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+</project>
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/AbstractNodejsExamplePage.java b/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/AbstractNodejsExamplePage.java
new file mode 100644
index 0000000..9dde9d4
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/AbstractNodejsExamplePage.java
@@ -0,0 +1,34 @@
+/*
+ * 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.adapter.nodejs.page;
+
+import org.keycloak.testsuite.page.AbstractPage;
+
+import javax.ws.rs.core.UriBuilder;
+
+/**
+ * @author Vaclav Muzikar <vmuzikar@redhat.com>
+ */
+public abstract class AbstractNodejsExamplePage extends AbstractPage {
+ private static final String EXAMPLE_URL_PROPERY_NAME = "testsuite.adapter.nodejs.example.url";
+
+ @Override
+ public UriBuilder createUriBuilder() {
+ return UriBuilder.fromUri(System.getProperty(EXAMPLE_URL_PROPERY_NAME));
+ }
+}
diff --git a/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/NodejsExamplePage.java b/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/NodejsExamplePage.java
new file mode 100644
index 0000000..0c223f4
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/main/java/org/keycloak/testsuite/adapter/nodejs/page/NodejsExamplePage.java
@@ -0,0 +1,60 @@
+/*
+ * 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.adapter.nodejs.page;
+
+import org.keycloak.testsuite.util.URLUtils;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+import javax.ws.rs.core.UriBuilder;
+
+/**
+ * @author Vaclav Muzikar <vmuzikar@redhat.com>
+ */
+public class NodejsExamplePage extends AbstractNodejsExamplePage {
+ @FindBy(xpath = "//div[@class='nav']//a[text()='Login']")
+ private WebElement loginButton;
+
+ @FindBy(xpath = "//div[@class='nav']//a[text()='Logout']")
+ private WebElement logoutButton;
+
+ @FindBy(id = "output")
+ private WebElement outputBox;
+
+ public void clickLogin() {
+ loginButton.click();
+ }
+
+ public void clickLogout() {
+ logoutButton.click();
+ }
+
+ public String getOutput() {
+ return outputBox.getText();
+ }
+
+ public boolean isOnLoginSecuredPage() {
+ UriBuilder uriBuilder = createUriBuilder().path("login");
+ return URLUtils.currentUrlEqual(driver, uriBuilder.build().toASCIIString());
+ }
+
+ @Override
+ public boolean isCurrent() {
+ return URLUtils.currentUrlStartWith(driver, toString());
+ }
+}
diff --git a/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/test/java/org/keycloak/testsuite/adapter/nodejs/NodejsAdapterTest.java b/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/test/java/org/keycloak/testsuite/adapter/nodejs/NodejsAdapterTest.java
new file mode 100644
index 0000000..1a1fa14
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/nodejs_adapter/src/test/java/org/keycloak/testsuite/adapter/nodejs/NodejsAdapterTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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.adapter.nodejs;
+
+import org.jboss.arquillian.graphene.page.Page;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.keycloak.representations.idm.RealmRepresentation;
+import org.keycloak.testsuite.AbstractAuthTest;
+import org.keycloak.testsuite.adapter.nodejs.page.NodejsExamplePage;
+
+import java.io.File;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+import static org.keycloak.testsuite.util.IOUtil.loadRealm;
+import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlEquals;
+import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWithLoginUrlOf;
+import static org.keycloak.testsuite.util.WaitUtils.pause;
+
+/**
+ * This test class expects following:
+ * <ul>
+ * <li>The {@value #EXAMPLE_REALM_PROPERTY_NAME} System Property to be set and pointing to a realm configuration file
+ * of the example app from keycloak-nodejs-connect project</li>
+ * <li>The stated example app to be running</li>
+ * </ul>
+ *
+ * @author Vaclav Muzikar <vmuzikar@redhat.com>
+ */
+public class NodejsAdapterTest extends AbstractAuthTest {
+ private static final String EXAMPLE_REALM_PROPERTY_NAME = "testsuite.adapter.nodejs.example.realm";
+ private static RealmRepresentation exampleRealm;
+
+ private static final String USER = "user";
+ private static final String PASSWORD = "password";
+
+ @Page
+ private NodejsExamplePage nodejsExamplePage;
+
+ @BeforeClass
+ public static void beforeNodejsAdapterTestClass() {
+ String exampleRealmPath = System.getProperty(EXAMPLE_REALM_PROPERTY_NAME);
+ if (exampleRealmPath == null) {
+ throw new IllegalStateException(EXAMPLE_REALM_PROPERTY_NAME + " property must be set");
+ }
+
+ exampleRealm = loadRealm(new File(exampleRealmPath));
+ }
+
+ @Before
+ public void beforeNodejsAdapterTest() {
+ nodejsExamplePage.navigateTo();
+ driver.manage().deleteAllCookies();
+ }
+
+ @Override
+ public void setDefaultPageUriParameters() {
+ super.setDefaultPageUriParameters();
+ testRealmPage.setAuthRealm(exampleRealm.getRealm());
+ }
+
+ @Override
+ public void addTestRealms(List<RealmRepresentation> testRealms) {
+ testRealms.add(exampleRealm);
+ }
+
+ @Test
+ public void simpleLoginTest() {
+ nodejsExamplePage.navigateTo();
+ assertCurrentUrlEquals(nodejsExamplePage);
+
+ nodejsExamplePage.clickLogin();
+ assertCurrentUrlStartsWithLoginUrlOf(testRealmLoginPage);
+ testRealmLoginPage.form().login(USER, PASSWORD);
+
+ assertTrue("Should be redirected back to the secured page after the login", nodejsExamplePage.isOnLoginSecuredPage());
+ String output = nodejsExamplePage.getOutput();
+ assertFalse("Output should not be empty", output.isEmpty());
+
+ nodejsExamplePage.clickLogin();
+ assertTrue("Should be already logged in", nodejsExamplePage.isOnLoginSecuredPage());
+ assertEquals("Authentication responses should be the same", output, nodejsExamplePage.getOutput());
+
+ nodejsExamplePage.clickLogout();
+ assertCurrentUrlEquals(nodejsExamplePage);
+
+ nodejsExamplePage.clickLogin();
+ assertCurrentUrlStartsWithLoginUrlOf(testRealmLoginPage);
+ }
+
+ @Test
+ public void timeoutsTest() {
+ // in seconds
+ final int ssoTimeout = 15;
+ final int tokenTimeout = 10;
+
+ // change the realm's timeouts
+ RealmRepresentation realmUpdate = new RealmRepresentation();
+ realmUpdate.setSsoSessionIdleTimeout(ssoTimeout);
+ realmUpdate.setAccessTokenLifespan(tokenTimeout);
+ adminClient.realm(exampleRealm.getRealm()).update(realmUpdate);
+
+
+
+ // test access token lifespan
+ nodejsExamplePage.clickLogin();
+ testRealmLoginPage.form().login(USER, PASSWORD);
+ assertTrue("Should be logged in", nodejsExamplePage.isOnLoginSecuredPage());
+ String output = nodejsExamplePage.getOutput();
+
+ pause(tokenTimeout * 1000);
+
+ nodejsExamplePage.clickLogin();
+ assertTrue("Should be still logged in", nodejsExamplePage.isOnLoginSecuredPage());
+ assertNotEquals("Authentication responses should be different", output, nodejsExamplePage.getOutput()); // token should be refreshed
+
+
+
+ // test SSO timeout
+ pause(ssoTimeout * 1000);
+ nodejsExamplePage.clickLogin();
+ assertCurrentUrlStartsWithLoginUrlOf(testRealmLoginPage); // there should be an attempt for token refresh
+ // but SSO session should be already expired
+ }
+
+ // KEYCLOAK-3284
+ @Test
+ @Ignore // to be enabled when KEYCLOAK-3284 is fixed
+ public void sessionTest() {
+ nodejsExamplePage.clickLogin();
+ testRealmLoginPage.form().login(USER, PASSWORD);
+ assertTrue("Should be logged in", nodejsExamplePage.isOnLoginSecuredPage());
+
+ testRealmAccountPage.navigateTo();
+ assertCurrentUrlEquals(testRealmAccountPage); // should be already logged in
+
+ testRealmAccountPage.logOut();
+ assertCurrentUrlStartsWithLoginUrlOf(testRealmLoginPage);
+
+ nodejsExamplePage.navigateTo();
+ nodejsExamplePage.clickLogin();
+ assertCurrentUrlStartsWithLoginUrlOf(testRealmLoginPage); // should be logged out
+ }
+}
diff --git a/testsuite/integration-arquillian/tests/other/pom.xml b/testsuite/integration-arquillian/tests/other/pom.xml
index 0ce2a25..be2cab0 100644
--- a/testsuite/integration-arquillian/tests/other/pom.xml
+++ b/testsuite/integration-arquillian/tests/other/pom.xml
@@ -142,6 +142,12 @@
<module>jpa-performance</module>
</modules>
</profile>
+ <profile>
+ <id>nodejs-adapter-tests</id>
+ <modules>
+ <module>nodejs_adapter</module>
+ </modules>
+ </profile>
</profiles>
</project>