package com.crawljax.condition.browserwaiter;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.crawljax.browser.EmbeddedBrowser;
/**
* This test case tests the WaitCondition class. Issue #30 was covered by this test case.
*/
@RunWith(MockitoJUnitRunner.class)
public class WaitConditionTest {
private static final int WAIT_TIMEOUT = 0;
private static final int WAIT_SUCCESS = 1;
private static final int WAIT_TIME_NONE = 0;
private static final int WAIT_TIME_LONG = 2000;
@Mock
private EmbeddedBrowser browser;
@Before
public void before() {
when(browser.getCurrentUrl()).thenReturn("tmp");
}
@Test
public void testWaitConditionNoIndexOutOfBounceAfterTwoTries() {
WaitCondition wc =
new WaitCondition("tmp", WAIT_TIME_LONG, new TimeoutExpectedCondition());
Assert.assertEquals("Wait timed out", WAIT_TIMEOUT, wc.testAndWait(browser));
}
@Test
public void testWaitConditionSuccessZeroSpecified() {
WaitCondition wc =
new WaitCondition("tmp", WAIT_TIME_LONG, new ArrayList<ExpectedCondition>());
Assert.assertEquals("Wait success", WAIT_SUCCESS, wc.testAndWait(browser));
}
@Test
public void testWaitConditionSuccessZeroSpecifiedZeroTimeout() {
WaitCondition wc =
new WaitCondition("tmp", WAIT_TIME_LONG, new ArrayList<ExpectedCondition>());
Assert.assertEquals("Wait success", WAIT_SUCCESS, wc.testAndWait(browser));
}
@Test
public void testWaitConditionNoIndexOutOfBounceAfterFirstTry() {
WaitCondition wc = new WaitCondition("tmp", WAIT_TIME_LONG, new ExpectedCondition() {
@Override
public boolean isSatisfied(EmbeddedBrowser browser) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
e.printStackTrace();
}
return true;
}
});
Assert.assertEquals("Wait timed out", WAIT_TIMEOUT, wc.testAndWait(browser));
}
@Test
public void testWaitConditionNotRunBecauseUrl() {
WaitCondition wc =
new WaitCondition("tmp/foo", WAIT_TIME_LONG, new TimeoutExpectedCondition());
Assert.assertEquals("Wait not run because browser url missmatch", -1,
wc.testAndWait(browser));
}
@Test
public void testWaitConditionSuccessfulRun() {
WaitCondition wc = new WaitCondition("tmp", WAIT_TIME_LONG, new ExpectedCondition() {
@Override
public boolean isSatisfied(EmbeddedBrowser browser) {
return true;
}
});
Assert.assertEquals("Wait succeded", WAIT_SUCCESS, wc.testAndWait(browser));
}
@Test
public void testWaitConditionTimeoutRun() {
WaitCondition wc = new WaitCondition("tmp", WAIT_TIME_NONE, new ExpectedCondition() {
@Override
public boolean isSatisfied(EmbeddedBrowser browser) {
return true;
}
});
Assert.assertEquals("Wait succeded", WAIT_TIMEOUT, wc.testAndWait(browser));
}
/**
* Internal mock-class to represent a long-time WaitCondition exceeding the timeout limit.
*
* @author slenselink@google.com (Stefan Lenselink)
*/
private static class TimeoutExpectedCondition implements ExpectedCondition {
private int count = 0;
@Override
public boolean isSatisfied(EmbeddedBrowser browser) {
count++;
try {
// Sleep for 1.5 sec so the first time the limit is not reached, the second time it
// will and true will be returned.
Thread.sleep(1500);
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
e.printStackTrace();
}
return count > 1;
}
}
}