blob: fe1158652e7d07d07e9d84ed433b4f95f01a697a [file] [log] [blame]
package com.gemstone.gemfire.test.junit.rules;
import static org.hamcrest.core.StringContains.*;
import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsInstanceOf.*;
import static org.junit.Assert.*;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
/**
* Unit tests for ExpectedTimeout JUnit Rule.
*
* @author Kirk Lund
* @since 8.2
*/
@Category(UnitTest.class)
public class ExpectedTimeoutJUnitTest {
@Test
public void passesUnused() {
Result result = runTest(PassesUnused.class);
assertTrue(result.wasSuccessful());
}
@Test
public void failsWithoutExpectedException() {
Result result = runTest(FailsWithoutExpectedException.class);
assertFalse(result.wasSuccessful());
List<Failure> failures = result.getFailures();
assertEquals(1, failures.size());
Failure failure = failures.get(0);
assertThat(failure.getException(), is(instanceOf(AssertionError.class)));
assertThat(failure.getException().getMessage(), containsString("Expected test to throw an instance of " + TimeoutException.class.getName()));
}
@Test
public void failsWithoutExpectedTimeoutException() {
Result result = runTest(FailsWithoutExpectedTimeoutException.class);
assertFalse(result.wasSuccessful());
List<Failure> failures = result.getFailures();
assertEquals(1, failures.size());
Failure failure = failures.get(0);
assertThat(failure.getException(), is(instanceOf(AssertionError.class)));
assertThat(failure.getException().getMessage(), containsString("Expected test to throw (an instance of " + TimeoutException.class.getName() + " and exception with message a string containing \"" + FailsWithoutExpectedTimeoutException.message + "\")"));
}
@Test
public void failsWithExpectedTimeoutButWrongError() {
Result result = runTest(FailsWithExpectedTimeoutButWrongError.class);
assertFalse(result.wasSuccessful());
List<Failure> failures = result.getFailures();
assertEquals(1, failures.size());
Failure failure = failures.get(0);
assertThat(failure.getException(), is(instanceOf(AssertionError.class)));
assertThat(failure.getException().getMessage(), containsString(NullPointerException.class.getName()));
}
@Test
public void passesWithExpectedTimeoutAndTimeoutException() {
Result result = runTest(PassesWithExpectedTimeoutAndTimeoutException.class);
assertTrue(result.wasSuccessful());
}
@Test
public void failsWhenTimeoutIsEarly() {
Result result = runTest(FailsWhenTimeoutIsEarly.class);
assertFalse(result.wasSuccessful());
List<Failure> failures = result.getFailures();
assertEquals(1, failures.size());
Failure failure = failures.get(0);
assertThat(failure.getException(), is(instanceOf(AssertionError.class)));
assertThat(failure.getException().getMessage(), containsString("Expected test to throw (an instance of " + TimeoutException.class.getName() + " and exception with message a string containing \"" + FailsWhenTimeoutIsEarly.message + "\")"));
}
@Test
public void failsWhenTimeoutIsLate() {
Result result = runTest(FailsWhenTimeoutIsLate.class);
assertFalse(result.wasSuccessful());
List<Failure> failures = result.getFailures();
assertEquals(1, failures.size());
Failure failure = failures.get(0);
assertThat(failure.getException(), is(instanceOf(AssertionError.class)));
assertThat(failure.getException().getMessage(), containsString("Expected test to throw (an instance of " + TimeoutException.class.getName() + " and exception with message a string containing \"" + FailsWhenTimeoutIsLate.message + "\")"));
}
private static Result runTest(Class<?> test) {
JUnitCore junitCore = new JUnitCore();
return junitCore.run(Request.aClass(test).getRunner());
}
public static class AbstractExpectedTimeoutTest {
@Rule
public ExpectedTimeout timeout = ExpectedTimeout.none();
}
public static class PassesUnused extends AbstractExpectedTimeoutTest {
@Test
public void passesUnused() throws Exception {
}
}
public static class FailsWithoutExpectedException extends AbstractExpectedTimeoutTest {
@Test
public void failsWithoutExpectedException() throws Exception {
timeout.expect(TimeoutException.class);
}
}
public static class FailsWithoutExpectedTimeoutException extends AbstractExpectedTimeoutTest {
public static final String message = "this is a message for FailsWithoutExpectedTimeoutException";
@Test
public void failsWithoutExpectedTimeoutAndTimeoutException() throws Exception {
timeout.expect(TimeoutException.class);
timeout.expectMessage(message);
timeout.expectMinimumDuration(10);
timeout.expectMaximumDuration(1000);
timeout.expectTimeUnit(TimeUnit.MILLISECONDS);
Thread.sleep(100);
}
}
public static class FailsWithExpectedTimeoutButWrongError extends AbstractExpectedTimeoutTest {
public static final String message = "this is a message for FailsWithExpectedTimeoutButWrongError";
@Test
public void failsWithExpectedTimeoutButWrongError() throws Exception {
timeout.expect(TimeoutException.class);
timeout.expectMessage(message);
timeout.expectMinimumDuration(10);
timeout.expectMaximumDuration(1000);
timeout.expectTimeUnit(TimeUnit.MILLISECONDS);
Thread.sleep(100);
throw new NullPointerException();
}
}
public static class PassesWithExpectedTimeoutAndTimeoutException extends AbstractExpectedTimeoutTest {
public static final String message = "this is a message for PassesWithExpectedTimeoutAndTimeoutException";
public static final Class<TimeoutException> exceptionClass = TimeoutException.class;
@Test
public void passesWithExpectedTimeoutAndTimeoutException() throws Exception {
timeout.expect(exceptionClass);
timeout.expectMessage(message);
timeout.expectMinimumDuration(10);
timeout.expectMaximumDuration(1000);
timeout.expectTimeUnit(TimeUnit.MILLISECONDS);
Thread.sleep(100);
throw new TimeoutException(message);
}
}
public static class FailsWhenTimeoutIsEarly extends AbstractExpectedTimeoutTest {
public static final String message = "this is a message for FailsWhenTimeoutIsEarly";
@Test
public void failsWhenTimeoutIsEarly() throws Exception {
timeout.expect(TimeoutException.class);
timeout.expectMessage(message);
timeout.expectMinimumDuration(1000);
timeout.expectMaximumDuration(2000);
timeout.expectTimeUnit(TimeUnit.MILLISECONDS);
Thread.sleep(10);
}
}
public static class FailsWhenTimeoutIsLate extends AbstractExpectedTimeoutTest {
public static final String message = "this is a message for FailsWhenTimeoutIsLate";
@Test
public void failsWhenTimeoutIsLate() throws Exception {
timeout.expect(TimeoutException.class);
timeout.expectMessage(message);
timeout.expectMinimumDuration(10);
timeout.expectMaximumDuration(20);
timeout.expectTimeUnit(TimeUnit.MILLISECONDS);
Thread.sleep(100);
}
}
}