package org.drugis.common.threading;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.drugis.common.threading.event.TaskAbortedEvent;
import org.drugis.common.threading.event.TaskFailedEvent;
import org.drugis.common.threading.event.TaskFinishedEvent;
import org.drugis.common.threading.event.TaskStartedEvent;
import org.junit.Test;
public class SimpleSuspendableTaskTest {
abstract class FakeSuspendable implements Suspendable {
public boolean isSuspended() { return false; }
public boolean suspend() { return true; }
public boolean wakeUp() { return true; }
public boolean abort() { return true; }
public boolean isAborted() { return false; }
}
private AbortedException d_abort = new AbortedException();
private FailureException d_fail = new FailureException("FAIL");
class SuccessfulTask extends FakeSuspendable {
public void run() {
}
}
class AbortedTask extends FakeSuspendable {
public void run() {
throw d_abort;
}
@Override
public boolean isAborted() {
return true;
}
}
class FailedTask extends FakeSuspendable {
public void run() {
throw d_fail;
}
}
@Test
public void testInitialValues() {
Task task = new SimpleSuspendableTask(new SuccessfulTask());
assertFalse(task.isStarted());
assertFalse(task.isFinished());
assertFalse(task.isAborted());
assertFalse(task.isFailed());
assertNull(task.getFailureCause());
}
@Test
public void testSuccessfulTask() {
SimpleTask task = new SimpleSuspendableTask(new SuccessfulTask());
TaskListener mockListener = createStrictMock(TaskListener.class);
mockListener.taskEvent(new TaskStartedEvent(task));
mockListener.taskEvent(new TaskFinishedEvent(task));
replay(mockListener);
task.addTaskListener(mockListener);
task.run();
verify(mockListener);
assertTrue(task.isStarted());
assertTrue(task.isFinished());
assertFalse(task.isAborted());
assertFalse(task.isFailed());
assertNull(task.getFailureCause());
}
@Test
public void testAbortedTask() {
SimpleTask task = new SimpleSuspendableTask(new AbortedTask());
TaskListener mockListener = createStrictMock(TaskListener.class);
mockListener.taskEvent(new TaskStartedEvent(task));
mockListener.taskEvent(new TaskAbortedEvent(task));
replay(mockListener);
task.addTaskListener(mockListener);
task.run();
verify(mockListener);
assertTrue(task.isStarted());
assertFalse(task.isFinished());
assertTrue(task.isAborted());
assertFalse(task.isFailed());
assertNull(task.getFailureCause());
}
@Test
public void testFailedTask() {
SimpleTask task = new SimpleSuspendableTask(new FailedTask());
TaskListener mockListener = createStrictMock(TaskListener.class);
mockListener.taskEvent(new TaskStartedEvent(task));
mockListener.taskEvent(new TaskFailedEvent(task, d_fail));
replay(mockListener);
task.addTaskListener(mockListener);
task.run();
verify(mockListener);
assertTrue(task.isStarted());
assertFalse(task.isFinished());
assertFalse(task.isAborted());
assertTrue(task.isFailed());
assertEquals(d_fail, task.getFailureCause());
}
@Test
public void suspendSuspendsNested() {
Suspendable mockSuspendable = createStrictMock(Suspendable.class);
expect(mockSuspendable.isSuspended()).andReturn(false);
expect(mockSuspendable.suspend()).andReturn(true);
expect(mockSuspendable.isSuspended()).andReturn(true);
replay(mockSuspendable);
SimpleTask task = new SimpleSuspendableTask(mockSuspendable);
assertFalse(task.isSuspended());
task.suspend();
assertTrue(task.isSuspended());
verify(mockSuspendable);
}
@Test
public void wakeUpWakesNested() {
Suspendable mockSuspendable = createStrictMock(Suspendable.class);
expect(mockSuspendable.wakeUp()).andReturn(true);
replay(mockSuspendable);
SimpleTask task = new SimpleSuspendableTask(mockSuspendable);
task.wakeUp();
verify(mockSuspendable);
}
@Test
public void wakeUpAbortsNested() {
Suspendable mockSuspendable = createStrictMock(Suspendable.class);
expect(mockSuspendable.abort()).andReturn(true);
replay(mockSuspendable);
SimpleTask task = new SimpleSuspendableTask(mockSuspendable);
task.abort();
verify(mockSuspendable);
}
}