keycloak-aplcache

Fix + refactor SecurityDefensesTest (cherry picked from

12/8/2015 10:56:17 AM

Details

diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/realm/BruteForceDetection.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/realm/BruteForceDetection.java
index 75e54b2..e772a5d 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/realm/BruteForceDetection.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/console/page/realm/BruteForceDetection.java
@@ -73,7 +73,7 @@ public class BruteForceDetection extends SecurityDefenses {
         }
 
         public void setWaitIncrementSelect(TimeSelectValues value) {
-            waitIncrementSelect.selectByVisibleText(value.getName());
+            waitIncrementSelect.selectByValue(value.getName());
         }
 
         public void setQuickLoginCheckInput(String value) {
@@ -85,7 +85,7 @@ public class BruteForceDetection extends SecurityDefenses {
         }
 
         public void setMinQuickLoginWaitSelect(TimeSelectValues value) {
-            minQuickLoginWaitSelect.selectByVisibleText(value.getName());
+            minQuickLoginWaitSelect.selectByValue(value.getName());
         }
 
         public void setMaxWaitInput(String value) {
@@ -93,7 +93,7 @@ public class BruteForceDetection extends SecurityDefenses {
         }
 
         public void setMaxWaitSelect(TimeSelectValues value) {
-            maxWaitSelect.selectByVisibleText(value.getName());
+            maxWaitSelect.selectByValue(value.getName());
         }
 
         public void setFailureResetTimeInput(String value) {
@@ -101,7 +101,7 @@ public class BruteForceDetection extends SecurityDefenses {
         }
 
         public void setFailureResetTimeSelect(TimeSelectValues value) {
-            failureResetTimeSelect.selectByVisibleText(value.getName());
+            failureResetTimeSelect.selectByValue(value.getName());
         }
     }
 
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java
index e5b8e74..fcbe8ff 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/console/realm/SecurityDefensesTest.java
@@ -19,28 +19,31 @@ package org.keycloak.testsuite.console.realm;
 
 import org.jboss.arquillian.graphene.page.Page;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.keycloak.testsuite.auth.page.account.Account;
 import org.keycloak.testsuite.console.page.realm.BruteForceDetection;
 import org.keycloak.testsuite.console.page.users.UserAttributes;
 import org.keycloak.testsuite.console.page.users.Users;
-import org.openqa.selenium.By;
-
-import java.util.Date;
-
-import static org.jboss.arquillian.graphene.Graphene.waitGui;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
 import static org.keycloak.representations.idm.CredentialRepresentation.PASSWORD;
 import static org.keycloak.testsuite.admin.Users.setPasswordFor;
 import static org.keycloak.testsuite.auth.page.AuthRealm.TEST;
 import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWith;
+import static org.keycloak.testsuite.util.WaitUtils.*;
+import static org.junit.Assert.*;
 
 /**
  * @author Filip Kiss
  * @author mhajas
+ * @author Vaclav Muzikar <vmuzikar@redhat.com>
  */
-@Ignore
 public class SecurityDefensesTest extends AbstractRealmTest {
+    
+    public static final String INVALID_PWD_MSG = "Invalid username or password.";
+    public static final String ACC_DISABLED_MSG = "Account is temporarily disabled, contact admin or try again later.";
+    public static final short ATTEMPTS_BAD_PWD = 2;
+    public static final short ATTEMPTS_GOOD_PWD = 1;
 
     @Page
     private BruteForceDetection bruteForceDetectionPage;
@@ -54,6 +57,9 @@ public class SecurityDefensesTest extends AbstractRealmTest {
     @Page
     private UserAttributes userAttributesPage;
 
+    @FindBy(className = "kc-feedback-text")
+    private WebElement feedbackTextElement;
+
     @Override
     public void setDefaultPageUriParameters() {
         super.setDefaultPageUriParameters();
@@ -66,157 +72,72 @@ public class SecurityDefensesTest extends AbstractRealmTest {
     }
 
     @Test
-    public void maxLoginFailuresTest() {
-        int secondsToWait = 3;
+    public void maxLoginFailuresTest() throws InterruptedException {
+        final short secondsToWait = 3;
+        final short maxLoginFailures = 2;
 
         bruteForceDetectionPage.form().setProtectionEnabled(true);
-        bruteForceDetectionPage.form().setMaxLoginFailures("1");
+        bruteForceDetectionPage.form().setMaxLoginFailures(String.valueOf(maxLoginFailures));
         bruteForceDetectionPage.form().setWaitIncrementSelect(BruteForceDetection.TimeSelectValues.SECONDS);
         bruteForceDetectionPage.form().setWaitIncrementInput(String.valueOf(secondsToWait));
+        bruteForceDetectionPage.form().setQuickLoginCheckInput("1");
         bruteForceDetectionPage.form().save();
         assertAlertSuccess();
 
-        testRealmAccountPage.navigateTo();
-
-        setPasswordFor(testUser, PASSWORD + "-mismatch");
-
-        testRealmLoginPage.form().login(testUser);
-        waitForFeedbackText("Invalid username or password.");
-        Date endTime = new Date(new Date().getTime() + secondsToWait * 1000);
-
-        testRealmLoginPage.form().login(testUser);
-        waitGui().until().element(By.className("instruction"))
-                .text().contains("Account is temporarily disabled, contact admin or try again later.");
-        endTime = new Date(endTime.getTime() + secondsToWait * 1000);
-        testRealmAccountPage.navigateTo();
-        testRealmLoginPage.form().login(testUser);
-        endTime = new Date(endTime.getTime() + secondsToWait * 1000);
-
-        while (new Date().compareTo(endTime) < 0) {
-            try {
-                Thread.sleep(50);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-
-        setPasswordFor(testUser, PASSWORD);
-        testRealmLoginPage.form().login(testUser);
-        assertCurrentUrlStartsWith(testRealmAccountPage);
+        tryToLogin(secondsToWait * (ATTEMPTS_BAD_PWD + ATTEMPTS_GOOD_PWD) / maxLoginFailures);
     }
 
     @Test
-    public void quickLoginCheck() {
-        int secondsToWait = 3;
+    public void quickLoginCheck() throws InterruptedException {
+        final short secondsToWait = 3;
 
         bruteForceDetectionPage.form().setProtectionEnabled(true);
         bruteForceDetectionPage.form().setMaxLoginFailures("100");
-        bruteForceDetectionPage.form().setQuickLoginCheckInput("1500");
+        bruteForceDetectionPage.form().setQuickLoginCheckInput("10000");
         bruteForceDetectionPage.form().setMinQuickLoginWaitSelect(BruteForceDetection.TimeSelectValues.SECONDS);
         bruteForceDetectionPage.form().setMinQuickLoginWaitInput(String.valueOf(secondsToWait));
         bruteForceDetectionPage.form().save();
         assertAlertSuccess();
 
-        testRealmAccountPage.navigateTo();
-
-        setPasswordFor(testUser, PASSWORD + "-mismatch");
-
-        testRealmLoginPage.form().login(testUser);
-        testRealmLoginPage.form().login(testUser);
-        Date endTime = new Date(new Date().getTime() + secondsToWait * 1000);
-        testRealmLoginPage.form().login(testUser);
-        waitGui().until().element(By.className("instruction"))
-                .text().contains("Account is temporarily disabled, contact admin or try again later.");
-        endTime = new Date(endTime.getTime() + secondsToWait * 1000);
-
-        testRealmAccountPage.navigateTo();
-        testRealmLoginPage.form().login(testUser);
-        endTime = new Date(endTime.getTime() + secondsToWait * 1000);
-
-        while (new Date().compareTo(endTime) < 0) {
-            try {
-                Thread.sleep(50);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-
-        setPasswordFor(testUser, PASSWORD);
-        testRealmLoginPage.form().login(testUser);
-        assertCurrentUrlStartsWith(testRealmAccountPage);
+        tryToLogin(secondsToWait);
     }
 
     @Test
-    public void maxWaitLoginFailures() {
-        int secondsToWait = 5;
+    public void maxWaitLoginFailures() throws InterruptedException {
+        final short secondsToWait = 5;
 
         bruteForceDetectionPage.form().setProtectionEnabled(true);
         bruteForceDetectionPage.form().setMaxLoginFailures("1");
+        bruteForceDetectionPage.form().setWaitIncrementSelect(BruteForceDetection.TimeSelectValues.SECONDS);
+        bruteForceDetectionPage.form().setWaitIncrementInput("10");
         bruteForceDetectionPage.form().setMaxWaitSelect(BruteForceDetection.TimeSelectValues.SECONDS);
         bruteForceDetectionPage.form().setMaxWaitInput(String.valueOf(secondsToWait));
         bruteForceDetectionPage.form().save();
 
-        testRealmAccountPage.navigateTo();
-
-        setPasswordFor(testUser, PASSWORD + "-mismatch");
-
-        testRealmLoginPage.form().login(testUser);
-        Date endTime = new Date(new Date().getTime() + secondsToWait * 1000);
-        waitForFeedbackText("Invalid username or password.");
-
-        testRealmLoginPage.form().login(testUser);
-        endTime = new Date(endTime.getTime() + secondsToWait * 1000);
-        waitGui().until().element(By.className("instruction"))
-                .text().contains("Account is temporarily disabled, contact admin or try again later.");
-        testRealmAccountPage.navigateTo();
-        testRealmLoginPage.form().login(testUser);
-        endTime = new Date(endTime.getTime() + secondsToWait * 1000);
-        waitForFeedbackText("Account is temporarily disabled, contact admin or try again later.");
-
-        while (new Date().compareTo(endTime) < 0) {
-            try {
-                Thread.sleep(50);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-
-        setPasswordFor(testUser, PASSWORD);
-        testRealmLoginPage.form().login(testUser);
-        assertCurrentUrlStartsWith(testRealmAccountPage);
+        tryToLogin(secondsToWait);
     }
 
     @Test
-    public void failureResetTime() {
-        int secondsToWait = 3;
+    public void failureResetTime() throws InterruptedException {
+        final short failureResetTime = 3;
+        final short waitIncrement = 3;
 
         bruteForceDetectionPage.form().setProtectionEnabled(true);
-        bruteForceDetectionPage.form().setMaxLoginFailures("2");
+        bruteForceDetectionPage.form().setMaxLoginFailures("1");
+        bruteForceDetectionPage.form().setWaitIncrementSelect(BruteForceDetection.TimeSelectValues.SECONDS);
+        bruteForceDetectionPage.form().setWaitIncrementInput(String.valueOf(waitIncrement));
         bruteForceDetectionPage.form().setFailureResetTimeSelect(BruteForceDetection.TimeSelectValues.SECONDS);
-        bruteForceDetectionPage.form().setFailureResetTimeInput(String.valueOf(secondsToWait));
+        bruteForceDetectionPage.form().setFailureResetTimeInput(String.valueOf(failureResetTime));
         bruteForceDetectionPage.form().save();
         assertAlertSuccess();
 
-        testRealmAccountPage.navigateTo();
-
-        setPasswordFor(testUser, PASSWORD + "-mismatch");
+        tryToLogin(failureResetTime, false);
 
         testRealmLoginPage.form().login(testUser);
-        waitForFeedbackText("Invalid username or password.");
-        Date endTime = new Date(new Date().getTime() + secondsToWait * 1000);
-
-        while (new Date().compareTo(endTime) < 0) {
-            try {
-                Thread.sleep(50);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
+        assertFeedbackText(ACC_DISABLED_MSG);
 
-        testRealmLoginPage.form().login(testUser);
-        waitForFeedbackText("Invalid username or password.");
+        Thread.sleep(waitIncrement * 1000);
 
-        setPasswordFor(testUser, PASSWORD);
         testRealmLoginPage.form().login(testUser);
         assertCurrentUrlStartsWith(testRealmAccountPage);
     }
@@ -240,6 +161,7 @@ public class SecurityDefensesTest extends AbstractRealmTest {
 
         usersPage.table().searchUsers(testUser.getUsername());
         usersPage.table().editUser(testUser.getUsername());
+        assertFalse(userAttributesPage.form().isEnabled());
         userAttributesPage.form().unlockUser();
 
         testRealmAccountPage.navigateTo();
@@ -250,8 +172,39 @@ public class SecurityDefensesTest extends AbstractRealmTest {
         assertCurrentUrlStartsWith(testRealmAccountPage);
     }
 
-    private void waitForFeedbackText(String text) {
-        waitGui().until().element(By.className("kc-feedback-text"))
-                .text().contains(text);
+    private void assertFeedbackText(String text) {
+        waitGuiForElement(feedbackTextElement);
+        assertEquals(text, feedbackTextElement.getText());
+    }
+
+    private void tryToLogin(int wait) throws InterruptedException {
+        tryToLogin(wait, true);
+    }
+
+    private void tryToLogin(int wait, boolean finalLogin) throws InterruptedException {
+        testRealmAccountPage.navigateTo();
+
+        setPasswordFor(testUser, PASSWORD + "-mismatch");
+
+        for (int i = 0; i < ATTEMPTS_BAD_PWD; i++) {
+            testRealmLoginPage.form().login(testUser);
+            assertFeedbackText(INVALID_PWD_MSG);
+        }
+
+        setPasswordFor(testUser, PASSWORD);
+        for (int i = 0; i < ATTEMPTS_GOOD_PWD; i++) {
+            testRealmLoginPage.form().login(testUser);
+            assertFeedbackText(ACC_DISABLED_MSG);
+        }
+
+        wait *= 1000;
+
+        log.debug("Wait: " + wait);
+        Thread.sleep(wait);
+
+        if (finalLogin) {
+            testRealmLoginPage.form().login(testUser);
+            assertCurrentUrlStartsWith(testRealmAccountPage);
+        }
     }
 }