Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/test/java/tests/waitings/BaseConditionalWaitTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
class BaseConditionalWaitTest {
static final long waitForTimeoutCondition = 10;
static final long waitForTimeoutPolling = 150;
static final long accuracy = 3;
static final double accuracy = 0.5;
static final Collection<Class<? extends Throwable>> ignoredExceptions = Collections.singleton(IllegalStateException.class);
ThreadLocal<Timer> timer = ThreadLocal.withInitial(Timer::new);
protected Provider<IApplication> application = AqualityServices.getServiceProvider().getProvider(IApplication.class);
Expand Down
61 changes: 33 additions & 28 deletions src/test/java/tests/waitings/WaitForObjectTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
Expand Down Expand Up @@ -37,15 +38,16 @@ public Object[][] failWaitForAction() {
}

@Test(dataProvider = "failWaitForAction")
public void testShouldThrowTimeoutExceptionIfConditionIsNotMetAndTimeoutIsOver(Callable failedAction, long timeout) throws Exception {
public void testShouldThrowTimeoutExceptionIfConditionIsNotMetAndTimeoutIsOver(Callable failedAction, long timeout, double pollingInterval) throws Exception {
timer.get().start();
try {
failedAction.call();
Assert.fail("TimeoutException should be thrown but not");
} catch (TimeoutException e) {
double duration = timer.get().stop();
long interval = 2 * timeout + accuracy;
double interval = timeout + pollingInterval / 1000 + accuracy;
assertTrue(duration >= timeout && duration < interval,
String.format("Duration '%s' should be between '%s' and '%s' (timeout and (2*timeout + accuracy)) when condition is not satisfied. ",
String.format("Duration '%s' should be between '%s' and '%s' (timeout and (timeout + pollingInterval + accuracy)) when condition is not satisfied.",
duration, timeout, interval));
}
}
Expand All @@ -56,13 +58,14 @@ public Object[][] successWaitForAction() {
}

@Test(dataProvider = "successWaitForAction")
public void testShouldReturnAnObjectIfConditionIsMetAndTimeoutIsNotOver(Callable<String> successAction, long timeout) throws Exception {
public void testShouldReturnAnObjectIfConditionIsMetAndTimeoutIsNotOver(Callable<String> successAction, long timeout, double pollingInterval) throws Exception {
timer.get().start();
String result = successAction.call();
double duration = timer.get().stop();
assertTrue(duration <= timeout,
String.format("Duration '%s' should be less than accuracyTimeout '%s'",
duration, timeout));
double accuracyPollingInterval = pollingInterval / 1000 + accuracy;
assertTrue(duration < accuracyPollingInterval,
String.format("Duration '%s' should be less than accuracy polling interval '%s'",
duration, accuracyPollingInterval));
assertEquals(result, RESULT_STRING, "Method should return correct object");
}

Expand All @@ -74,15 +77,17 @@ public Object[][] throwWaitForAction() {
}

@Test(dataProvider = "throwWaitForAction")
public void testShouldThrowException(Callable<String> throwAction, long timeout) throws Exception {
public void testShouldThrowException(Callable<String> throwAction, long timeout, double pollingInterval) throws Exception {
try {
timer.get().start();
throwAction.call();
Assert.fail("IllegalArgumentException should be thrown but not");
} catch (IllegalArgumentException e) {
double duration = timer.get().stop();
assertTrue(duration <= timeout,
String.format("Duration '%s' should be less than accuracyTimeout '%s'",
duration, timeout));
double accuracyPollingInterval = pollingInterval / 1000 + accuracy;
assertTrue(duration < accuracyPollingInterval,
String.format("Duration '%s' should be less than accuracy polling interval '%s'",
duration, accuracyPollingInterval));
assertEquals(e.getMessage(), "I am exception", "It should be custom exception");
}
}
Expand All @@ -91,39 +96,39 @@ public void testShouldThrowException(Callable<String> throwAction, long timeout)
public void testShouldIgnoreExceptionForWaitingWithoutCustomParameters() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithExceptions = () -> conditionalWait.waitFor((driver) -> throwNewException(atomicBoolean).getAsBoolean(), ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithExceptions, timeoutConfiguration.getCondition());
checkWaitForMethodForPassedCondition(actionWithExceptions, timeoutConfiguration.getPollingInterval());
}

@Test
public void testShouldIgnoreExceptionForWaitingWithDefaultTimeout() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithMessageAndExceptions = () -> conditionalWait.waitFor((driver) -> throwNewException(atomicBoolean).getAsBoolean(), "Condition should be true", ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithMessageAndExceptions, timeoutConfiguration.getCondition());
checkWaitForMethodForPassedCondition(actionWithMessageAndExceptions, timeoutConfiguration.getPollingInterval());
}

@Test
public void testShouldIgnoreExceptionWaitingWithCustomTimeoutAndExceptions() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithAllParameters = () -> conditionalWait.waitFor((driver) -> throwNewException(atomicBoolean).getAsBoolean(), waitForTimeoutCondition, waitForTimeoutPolling, ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithAllParameters, waitForTimeoutCondition);
checkWaitForMethodForPassedCondition(actionWithAllParameters, waitForTimeoutPolling);
}

@Test
public void testShouldIgnoreExceptionWaitingWithCustomTimeout() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithAllParameters = () -> conditionalWait.waitFor((driver) -> throwNewException(atomicBoolean).getAsBoolean(), waitForTimeoutCondition, waitForTimeoutPolling, "Condition should be true", ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithAllParameters, waitForTimeoutCondition);
checkWaitForMethodForPassedCondition(actionWithAllParameters, waitForTimeoutPolling);
}

private void checkWaitForMethodForPassedCondition(BooleanSupplier waitAction, long timeout) {
long accuracyTimeout = timeout + accuracy;
private void checkWaitForMethodForPassedCondition(BooleanSupplier waitAction, double pollingInterval) {
timer.get().start();
boolean result = waitAction.getAsBoolean();
double duration = timer.get().stop();
double doubleAccuracyPollingInterval = 2 * pollingInterval / 1000 + accuracy;
assertTrue(result, "waitFor should return true when condition is satisfied.");
assertTrue(duration <= accuracyTimeout,
String.format("Duration '%s' should be less than accuracyTimeout '%s'",
duration, accuracyTimeout));
assertTrue(duration < doubleAccuracyPollingInterval,
String.format("Duration '%s' should be less than double accuracy polling interval '%s'",
duration, doubleAccuracyPollingInterval));
}

private Object[][] getDataProvider(ExpectedCondition<Object> action) {
Expand All @@ -136,14 +141,14 @@ private Object[][] getDataProvider(ExpectedCondition<Object> action) {
Callable actionWithCustomTimeoutsAndExceptions = () -> conditionalWait.waitFor(action, waitForTimeoutCondition, waitForTimeoutPolling, Collections.emptyList());
Callable actionWithAllParameters = () -> conditionalWait.waitFor(action, waitForTimeoutCondition, waitForTimeoutPolling, "Condition should be true", Collections.emptyList());
return new Object[][]{
{onlyAction, timeoutConfiguration.getCondition()},
{actionWithMessage, timeoutConfiguration.getCondition()},
{actionWithExceptions, timeoutConfiguration.getCondition()},
{actionWithMessageAndExceptions, timeoutConfiguration.getCondition()},
{actionWithCustomTimeouts, waitForTimeoutCondition},
{actionWithCustomTimeoutsAndMessage, waitForTimeoutCondition},
{actionWithCustomTimeoutsAndExceptions, waitForTimeoutCondition},
{actionWithAllParameters, waitForTimeoutCondition},
{onlyAction, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithMessage, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithExceptions, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithMessageAndExceptions, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithCustomTimeouts, waitForTimeoutCondition, waitForTimeoutPolling},
{actionWithCustomTimeoutsAndMessage, waitForTimeoutCondition, waitForTimeoutPolling},
{actionWithCustomTimeoutsAndExceptions, waitForTimeoutCondition, waitForTimeoutPolling},
{actionWithAllParameters, waitForTimeoutCondition, waitForTimeoutPolling}
};
}
}
58 changes: 31 additions & 27 deletions src/test/java/tests/waitings/WaitForTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ public Object[][] falseWaitForAction() {
}

@Test(dataProvider = "falseWaitForAction")
public void testFalseShouldBeReturnedIfConditionIsNotMetAndTimeoutIsOver(BooleanSupplier waitAction, long timeout) {
Date startTime = new Date();
public void testFalseShouldBeReturnedIfConditionIsNotMetAndTimeoutIsOver(BooleanSupplier waitAction, long timeout, double pollingInterval) {
timer.get().start();
boolean result = waitAction.getAsBoolean();
long duration = (new Date().getTime() - startTime.getTime()) / 1000;
long interval = 2 * timeout + accuracy;
double duration = timer.get().stop();
double accuracyPollingInterval = timeout + pollingInterval / 1000 + accuracy;
assertFalse(result, "waitFor should return false when condition is not satisfied.");
assertTrue(duration >= timeout && duration < interval,
String.format("Duration '%s' should be between '%s' and '%s' (timeout and (2*timeout + accuracy)) when condition is not satisfied. ",
duration, timeout, interval));
assertTrue(duration >= timeout && duration < accuracyPollingInterval,
String.format("Duration '%s' should be between '%s' and '%s' (timeout and (timeout + pollingInterval + accuracy)) when condition is not satisfied.",
duration, timeout, accuracyPollingInterval));
}

@DataProvider(name = "trueWaitForAction", parallel = true)
Expand All @@ -36,47 +36,51 @@ public Object[][] trueWaitForAction() {
}

@Test(dataProvider = "trueWaitForAction")
public void testTrueShouldBeReturnedIfConditionIsMetAndTimeoutIsNotOver(BooleanSupplier waitAction, long timeout) {
checkWaitForMethodForPassedCondition(waitAction, timeout);
public void testTrueShouldBeReturnedIfConditionIsMetAndTimeoutIsNotOver(BooleanSupplier waitAction, long timeout, double pollingInterval) {
double checkedTimeout = pollingInterval / 1000 + accuracy;
checkWaitForMethodForPassedCondition(waitAction, checkedTimeout);
}

@Test
public void testShouldIgnoreExceptionForWaitingWithoutCustomParameters() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithExceptions = () -> conditionalWait.waitFor(throwNewException(atomicBoolean), ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithExceptions, timeoutConfiguration.getCondition());
double checkedTimeout = (double) timeoutConfiguration.getPollingInterval() * 2 / 1000 + accuracy;
checkWaitForMethodForPassedCondition(actionWithExceptions, checkedTimeout);
}

@Test
public void testShouldIgnoreExceptionForWaitingWithDefaultTimeout() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithMessageAndExceptions = () -> conditionalWait.waitFor(throwNewException(atomicBoolean), "Condition should be true", ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithMessageAndExceptions, timeoutConfiguration.getCondition());
double checkedTimeout = (double) timeoutConfiguration.getPollingInterval() * 2 / 1000 + accuracy;
checkWaitForMethodForPassedCondition(actionWithMessageAndExceptions, checkedTimeout);
}

@Test
public void testShouldIgnoreExceptionWaitingWithCustomTimeoutAndException() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithAllParameters = () -> conditionalWait.waitFor(throwNewException(atomicBoolean), waitForTimeoutCondition, waitForTimeoutPolling, ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithAllParameters, waitForTimeoutCondition);
double checkedTimeout = (double) waitForTimeoutPolling * 2 / 1000 + accuracy;
checkWaitForMethodForPassedCondition(actionWithAllParameters, checkedTimeout);
}

@Test
public void testShouldIgnoreExceptionWaitingWithCustomTimeout() {
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
BooleanSupplier actionWithAllParameters = () -> conditionalWait.waitFor(throwNewException(atomicBoolean), waitForTimeoutCondition, waitForTimeoutPolling, "Condition should be true", ignoredExceptions);
checkWaitForMethodForPassedCondition(actionWithAllParameters, waitForTimeoutCondition);
double checkedTimeout = (double) waitForTimeoutPolling * 2 / 1000 + accuracy;
checkWaitForMethodForPassedCondition(actionWithAllParameters, checkedTimeout);
}

private void checkWaitForMethodForPassedCondition(BooleanSupplier waitAction, long timeout) {
long accuracyTimeout = timeout + accuracy;
private void checkWaitForMethodForPassedCondition(BooleanSupplier waitAction, double checkedTimeout) {
timer.get().start();
boolean result = waitAction.getAsBoolean();
double duration = timer.get().stop();
assertTrue(result, "waitFor should return true when condition is satisfied.");
assertTrue(duration <= timeout,
String.format("Duration '%s' should be less than accuracyTimeout '%s'",
duration, accuracyTimeout));
assertTrue(duration < checkedTimeout,
String.format("Duration '%s' should be less than timeout '%s'",
duration, checkedTimeout));
}

@DataProvider(name = "throwExceptionAction", parallel = true)
Expand All @@ -88,7 +92,7 @@ public Object[][] throwExceptionAction() {
}

@Test(dataProvider = "throwExceptionAction", expectedExceptions = StaleElementReferenceException.class)
public void testShouldThrowException(BooleanSupplier waitAction, long timeout) {
public void testShouldThrowException(BooleanSupplier waitAction, long timeout, double pollingInterval) {
waitAction.getAsBoolean();
}

Expand All @@ -107,14 +111,14 @@ private Object[][] getDataProvider(BooleanSupplier action) {
BooleanSupplier actionWithCustomTimeoutsAndExceptions = () -> conditionalWait.waitFor(action, waitForTimeoutCondition, waitForTimeoutPolling, Collections.emptyList());
BooleanSupplier actionWithAllParameters = () -> conditionalWait.waitFor(action, waitForTimeoutCondition, waitForTimeoutPolling, "Condition should be true", Collections.emptyList());
return new Object[][]{
{onlyAction, timeoutConfiguration.getCondition()},
{actionWithMessage, timeoutConfiguration.getCondition()},
{actionWithExceptions, timeoutConfiguration.getCondition()},
{actionWithMessageAndExceptions, timeoutConfiguration.getCondition()},
{actionWithCustomTimeouts, waitForTimeoutCondition},
{actionWithCustomTimeoutsAndMessage, waitForTimeoutCondition},
{actionWithCustomTimeoutsAndExceptions, waitForTimeoutCondition},
{actionWithAllParameters, waitForTimeoutCondition},
{onlyAction, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithMessage, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithExceptions, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithMessageAndExceptions, timeoutConfiguration.getCondition(), timeoutConfiguration.getPollingInterval()},
{actionWithCustomTimeouts, waitForTimeoutCondition, waitForTimeoutPolling},
{actionWithCustomTimeoutsAndMessage, waitForTimeoutCondition, waitForTimeoutPolling},
{actionWithCustomTimeoutsAndExceptions, waitForTimeoutCondition, waitForTimeoutPolling},
{actionWithAllParameters, waitForTimeoutCondition, waitForTimeoutPolling},
};
}
}
Loading