KEYCLOAK-1678 added SessionFailoverClusterTest
This commit is contained in:
parent
620ca86d45
commit
ef77e2a246
4 changed files with 194 additions and 61 deletions
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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<RealmRepresentation> 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);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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<RealmRepresentation> 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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue