package org.drugis.common.threading.activity;
import static org.drugis.common.JUnitUtil.assertAllAndOnly;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.not;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.drugis.common.threading.FailureException;
import org.drugis.common.threading.TaskListener;
import org.drugis.common.threading.event.PhaseFinishedEvent;
import org.drugis.common.threading.event.PhaseStartedEvent;
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 ActivityTaskTest {
@Test
public void testObeysModel() {
MockTask start = new MockTask();
start.start();
MockTask end = new MockTask();
List<MockTask> fork = new ArrayList<MockTask>();
fork.add(new MockTask());
fork.add(new MockTask());
List<MockTask> join = new ArrayList<MockTask>();
join.add(new MockTask());
join.add(new MockTask());
List<Transition> transitions = new ArrayList<Transition>();
transitions.add(new ForkTransition(start, fork));
transitions.add(new JoinTransition(join, end));
transitions.add(new DirectTransition(fork.get(0), join.get(1)));
transitions.add(new DirectTransition(fork.get(1), join.get(0)));
ActivityModel model = new ActivityModel(start, end, transitions);
ActivityTask task = new ActivityTask(model);
assertFalse(task.isStarted());
assertAllAndOnly(Collections.emptySet(), task.getNextTasks());
task.start();
assertTrue(task.isStarted());
assertAllAndOnly(Collections.singleton(start), task.getNextTasks());
start.finish();
assertAllAndOnly(fork, task.getNextTasks());
fork.get(0).start();
fork.get(1).start();
fork.get(0).finish();
fork.get(1).finish();
assertAllAndOnly(join, task.getNextTasks());
join.get(0).start();
join.get(1).start();
join.get(0).finish();
join.get(1).finish();
assertAllAndOnly(Collections.singleton(end), task.getNextTasks());
end.start();
end.finish();
assertTrue(task.isFinished());
assertAllAndOnly(Collections.emptySet(), task.getNextTasks());
}
@Test
public void testNotifiesStartFinish() {
MockTask start = new MockTask();
MockTask end = new MockTask();
Transition trans = new DirectTransition(start, end);
ActivityModel model = new ActivityModel(start, end, Collections.singleton(trans));
ActivityTask task = new ActivityTask(model);
TaskListener listener = createStrictMock(TaskListener.class);
listener.taskEvent(new TaskStartedEvent(task));
listener.taskEvent(not(eq(new TaskFinishedEvent(task))));
expectLastCall().anyTimes();
listener.taskEvent(new TaskFinishedEvent(task));
replay(listener);
task.addTaskListener(listener);
task.start();
start.start();
start.finish();
end.start();
end.finish();
verify(listener);
}
@Test
public void testNotifiesPhases() {
MockTask start = new MockTask();
MockTask end = new MockTask();
Transition trans = new DirectTransition(start, end);
ActivityModel model = new ActivityModel(start, end, Collections.singleton(trans));
ActivityTask task = new ActivityTask(model);
task.start();
TaskListener listener = createStrictMock(TaskListener.class);
listener.taskEvent(new PhaseStartedEvent(task, start));
listener.taskEvent(new PhaseFinishedEvent(task, start));
replay(listener);
task.addTaskListener(listener);
start.start();
start.finish();
verify(listener);
}
@Test
public void testTaskFailed() {
MockTask start = new MockTask();
MockTask end = new MockTask();
Transition trans = new DirectTransition(start, end);
ActivityModel model = new ActivityModel(start, end, Collections.singleton(trans));
ActivityTask task = new ActivityTask(model);
task.start();
TaskListener listener = createStrictMock(TaskListener.class);
FailureException ex = new FailureException("err");
listener.taskEvent(new TaskFailedEvent(task, ex));
replay(listener);
task.addTaskListener(listener);
start.fail(ex);
verify(listener);
}
}