diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractClusterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractClusterTest.java index 29ba46234e..fc523b7c62 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractClusterTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractClusterTest.java @@ -3,12 +3,15 @@ package org.keycloak.testsuite.cluster; import java.util.ArrayList; import java.util.List; import org.jboss.arquillian.container.test.api.ContainerController; +import org.jboss.arquillian.graphene.page.Page; import org.jboss.arquillian.test.api.ArquillianResource; import static org.junit.Assert.assertTrue; import org.keycloak.admin.client.Keycloak; import org.keycloak.models.Constants; +import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.testsuite.AbstractKeycloakTest; import org.keycloak.testsuite.arquillian.ContainerInfo; +import org.keycloak.testsuite.auth.page.AuthRealm; import static org.keycloak.testsuite.auth.page.AuthRealm.ADMIN; import static org.keycloak.testsuite.auth.page.AuthRealm.MASTER; @@ -38,11 +41,11 @@ public abstract class AbstractClusterTest extends AbstractKeycloakTest { backendAdminClients.add(createAdminClientFor(backendNode)); } } - + protected Keycloak createAdminClientFor(ContainerInfo backendNode) { log.info("Initializing admin client for " + backendNode.getContextRoot() + "/auth"); return Keycloak.getInstance(backendNode.getContextRoot() + "/auth", - MASTER, ADMIN, ADMIN, Constants.ADMIN_CLI_CLIENT_ID); + MASTER, ADMIN, ADMIN, Constants.ADMIN_CLI_CLIENT_ID); } protected ContainerInfo backendNode(int i) { @@ -62,4 +65,11 @@ public abstract class AbstractClusterTest extends AbstractKeycloakTest { controller.kill(backendNode(i).getQualifier()); } + protected void listRealms(int i) { + log.info(String.format("Node %s: AccessTokenString: %s", i + 1, backendAdminClients.get(i).tokenManager().getAccessTokenString())); + for (RealmRepresentation r : backendAdminClients.get(i).realms().findAll()) { + log.info(String.format("Node %s: Realm: %s, Id: %s", i + 1, r.getRealm(), r.getId())); + } + } + } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractTwoNodeClusterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractTwoNodeClusterTest.java new file mode 100644 index 0000000000..d88e616bbe --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/AbstractTwoNodeClusterTest.java @@ -0,0 +1,57 @@ +package org.keycloak.testsuite.cluster; + +import org.junit.Before; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.testsuite.arquillian.ContainerInfo; +import static org.keycloak.testsuite.util.WaitUtils.pause; + +/** + * + * @author tkyjovsk + */ +public abstract class AbstractTwoNodeClusterTest extends AbstractClusterTest { + + @Before + public void beforeTwoNodeClusterTest() { + startBackendNodes(2); + pause(3000); + } + + protected ContainerInfo backend1Info() { + return backendNode(0); + } + + protected ContainerInfo backend2Info() { + return backendNode(1); + } + + protected Keycloak backend1AdminClient() { + return backendAdminClients.get(0); + } + + protected Keycloak backend2AdminClient() { + return backendAdminClients.get(1); + } + + protected void startBackend1() { + startBackendNode(0); + } + + protected void startBackend2() { + startBackendNode(1); + } + + protected void failback() { + startBackend1(); + startBackend2(); + } + + protected void killBackend1() { + killBackendNode(0); + } + + protected void killBackend2() { + killBackendNode(1); + } + +} diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/TwoNodeClusterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/EntityInvalidationClusterTest.java similarity index 58% rename from testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/TwoNodeClusterTest.java rename to testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/EntityInvalidationClusterTest.java index 2732fdd1bc..2175ed3697 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/TwoNodeClusterTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/EntityInvalidationClusterTest.java @@ -3,41 +3,31 @@ package org.keycloak.testsuite.cluster; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import org.junit.Before; import org.junit.Test; -import org.keycloak.admin.client.Keycloak; import org.keycloak.representations.idm.RealmRepresentation; -import org.keycloak.testsuite.arquillian.ContainerInfo; import static org.keycloak.testsuite.auth.page.AuthRealm.TEST; -import static org.keycloak.testsuite.util.WaitUtils.pause; /** * * @author tkyjovsk */ -public class TwoNodeClusterTest extends AbstractClusterTest { +public class EntityInvalidationClusterTest extends AbstractTwoNodeClusterTest { @Override public void addTestRealms(List testRealms) { } - @Before - public void beforeTwoNodeClusterTest() { - startBackendNodes(2); - pause(3000); + @Test + public void realmCRUDWithoutFailover() { + realmCRUD(TEST + "_wofo", false); } @Test - public void testRealmCRUDWithoutFailover() { - testRealm(TEST + "_wofo", false); + public void realmCRUDWithFailover() { + realmCRUD(TEST + "_wfo", true); } - @Test - public void testRealmCRUDWithFailover() { - testRealm(TEST + "_wfo", true); - } - - public void testRealm(String realm, boolean containerFailover) { + public void realmCRUD(String realm, boolean containerFailover) { RealmRepresentation testRealm = new RealmRepresentation(); testRealm.setRealm(realm); testRealm.setEnabled(true); @@ -49,7 +39,7 @@ public class TwoNodeClusterTest extends AbstractClusterTest { RealmRepresentation testRealmOnBackend1 = backend1AdminClient().realms().realm(realm).toRepresentation(); assertEquals(testRealmOnBackend1.getRealm(), testRealm.getRealm()); if (containerFailover) { - stopBackend1(); + killBackend1(); } // check if created on node2 @@ -58,14 +48,13 @@ public class TwoNodeClusterTest extends AbstractClusterTest { assertEquals(testRealmOnBackend1.getRealm(), testRealmOnBackend2.getRealm()); failback(); - pause(1000); // UPDATE on node2 String realmUpdated = realm + "_updated"; testRealmOnBackend2.setRealm(realmUpdated); backend2AdminClient().realms().realm(realm).update(testRealmOnBackend2); if (containerFailover) { - stopBackend2(); + killBackend2(); } // check if updated on node1 testRealmOnBackend1 = backend1AdminClient().realms().realm(realmUpdated).toRepresentation(); @@ -77,7 +66,7 @@ public class TwoNodeClusterTest extends AbstractClusterTest { // DELETE on node1 backend1AdminClient().realms().realm(realmUpdated).remove(); if (containerFailover) { - stopBackend1(); + killBackend1(); } // check if deleted on node2 boolean testRealmOnBackend2Exists = false; @@ -91,48 +80,30 @@ public class TwoNodeClusterTest extends AbstractClusterTest { assertFalse(testRealmOnBackend2Exists); } - protected void listRealms(int i) { - log.info(String.format("Node %s: AccessTokenString: %s", i + 1, backendAdminClients.get(i).tokenManager().getAccessTokenString())); - for (RealmRepresentation r : backendAdminClients.get(i).realms().findAll()) { - log.info(String.format("Node %s: Realm: %s, Id: %s", i + 1, r.getRealm(), r.getId())); - } - } + @Test + public void createRealmViaFrontend() { + String realm = TEST + "_fe"; - protected ContainerInfo backend1Info() { - return backendNode(0); - } + RealmRepresentation testRealm = new RealmRepresentation(); + testRealm.setRealm(realm); + testRealm.setEnabled(true); - protected ContainerInfo backend2Info() { - return backendNode(1); - } + // CREATE on frontend + adminClient.realms().create(testRealm); - protected Keycloak backend1AdminClient() { - return backendAdminClients.get(0); - } + // check if created on frontend + RealmRepresentation testRealmOnFrontend = adminClient.realms().realm(realm).toRepresentation(); + assertEquals(testRealmOnFrontend.getRealm(), testRealm.getRealm()); - protected Keycloak backend2AdminClient() { - return backendAdminClients.get(1); - } + // check if created on node1 + RealmRepresentation testRealmOnBackend1 = backend1AdminClient().realms().realm(realm).toRepresentation(); + assertEquals(testRealmOnBackend1.getId(), testRealmOnFrontend.getId()); + assertEquals(testRealmOnBackend1.getRealm(), testRealmOnFrontend.getRealm()); - protected void startBackend1() { - startBackendNode(0); + // check if created on node2 + RealmRepresentation testRealmOnBackend2 = backend2AdminClient().realms().realm(realm).toRepresentation(); + assertEquals(testRealmOnBackend2.getId(), testRealmOnFrontend.getId()); + assertEquals(testRealmOnBackend2.getRealm(), testRealmOnFrontend.getRealm()); } - - protected void startBackend2() { - startBackendNode(1); - } - - protected void failback() { - startBackend1(); - startBackend2(); - } - - protected void stopBackend1() { - killBackendNode(0); - } - - protected void stopBackend2() { - killBackendNode(1); - } - + } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/SessionFailoverClusterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/SessionFailoverClusterTest.java new file mode 100644 index 0000000000..591e2e829e --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cluster/SessionFailoverClusterTest.java @@ -0,0 +1,95 @@ +package org.keycloak.testsuite.cluster; + +import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Ignore; +import org.junit.Test; +import org.keycloak.representations.idm.RealmRepresentation; +import static org.keycloak.testsuite.auth.page.AuthRealm.ADMIN; +import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlDoesntStartWith; +import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWith; +import static org.keycloak.testsuite.util.WaitUtils.pause; +import org.openqa.selenium.Cookie; + +/** + * + * @author tkyjovsk + */ +public class SessionFailoverClusterTest extends AbstractTwoNodeClusterTest { + + public static final String KEYCLOAK_SESSION_COOKIE = "KEYCLOAK_SESSION"; + public static final String KEYCLOAK_IDENTITY_COOKIE = "KEYCLOAK_IDENTITY"; + + @Override + public void addTestRealms(List testRealms) { + } + + @Test + @Ignore("work in progress") // only works with owners="2" at the moment + public void sessionFailover() { + + // LOGOUT + accountPage.navigateTo(); + driver.navigate().refresh(); + pause(3000); + loginPage.form().login(ADMIN, ADMIN); + assertCurrentUrlStartsWith(accountPage); + + Cookie sessionCookie = driver.manage().getCookieNamed(KEYCLOAK_SESSION_COOKIE); + assertNotNull(sessionCookie); + + killBackend1(); + + // check if session survived backend failure + + driver.navigate().refresh(); + pause(3000); + + assertCurrentUrlStartsWith(accountPage); + Cookie sessionCookieAfterFailover = driver.manage().getCookieNamed(KEYCLOAK_SESSION_COOKIE); + assertNotNull(sessionCookieAfterFailover); + assertEquals(sessionCookieAfterFailover.getValue(), sessionCookie.getValue()); + + failback(); + + // check if session survived backend failback + driver.navigate().refresh(); + pause(3000); + assertCurrentUrlStartsWith(accountPage); + Cookie sessionCookieAfterFailback = driver.manage().getCookieNamed(KEYCLOAK_SESSION_COOKIE); + assertNotNull(sessionCookieAfterFailback); + assertEquals(sessionCookieAfterFailover.getValue(), sessionCookie.getValue()); + + // LOGOUT + accountPage.navigateTo(); + accountPage.signOut(); + + assertCurrentUrlDoesntStartWith(accountPage); + masterRealmPage.navigateTo(); + sessionCookie = driver.manage().getCookieNamed(KEYCLOAK_SESSION_COOKIE); + assertNull(sessionCookie); + + killBackend1(); + + // check if session survived backend failure + driver.navigate().refresh(); + pause(3000); + assertCurrentUrlDoesntStartWith(accountPage); + masterRealmPage.navigateTo(); + sessionCookieAfterFailover = driver.manage().getCookieNamed(KEYCLOAK_SESSION_COOKIE); + assertNull(sessionCookieAfterFailover); + + failback(); + + // check if session survived backend failback + driver.navigate().refresh(); + pause(3000); + assertCurrentUrlDoesntStartWith(accountPage); + masterRealmPage.navigateTo(); + sessionCookieAfterFailback = driver.manage().getCookieNamed(KEYCLOAK_SESSION_COOKIE); + assertNull(sessionCookieAfterFailback); + } + +}