package org.drugis.common.threading;
import static org.drugis.common.JUnitUtil.assertNotEquals;
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.assertTrue;
import org.drugis.common.threading.event.TaskFinishedEvent;
import org.drugis.common.threading.event.TaskProgressEvent;
import org.drugis.common.threading.event.TaskStartedEvent;
import org.junit.Test;
public class IterativeTaskTest {
@Test
public void testRunIteratesComputation() {
IterativeComputation comp = new ShortComputation(10);
IterativeTask iterativeTask = new IterativeTask(comp);
iterativeTask.run();
assertEquals(comp.getTotalIterations(), comp.getIteration());
}
@Test
public void testInitializationAndFinishCalled() {
IterativeComputation comp = createStrictMock(IterativeComputation.class);
comp.initialize();
expect(comp.getIteration()).andReturn(0);
expect(comp.getTotalIterations()).andReturn(0);
comp.finish();
replay(comp);
IterativeTask iterativeTask = new IterativeTask(comp);
iterativeTask.run();
verify(comp);
}
@Test
public void testSuspend() {
IterativeComputation comp = new LongComputation(20);
IterativeTask iterativeTask = new IterativeTask(comp);
SuspendableThreadWrapper thread = new SuspendableThreadWrapper(iterativeTask);
thread.start();
sleep(10);
iterativeTask.suspend();
sleep(20);
assertTrue(iterativeTask.isSuspended());
int i = comp.getIteration();
sleep(30);
assertEquals(i, comp.getIteration());
iterativeTask.wakeUp();
sleep(20);
assertNotEquals(i, comp.getIteration());
thread.terminate();
}
@Test
public void testAbort() {
IterativeComputation comp = new LongComputation(20);
IterativeTask iterativeTask = new IterativeTask(comp);
SuspendableThreadWrapper thread = new SuspendableThreadWrapper(iterativeTask);
thread.start();
sleep(10);
iterativeTask.abort();
sleep(20);
assertTrue(iterativeTask.isAborted());
}
@Test
public void testNotifyProgress() {
IterativeComputation comp = new ShortComputation(10);
IterativeTask task = new IterativeTask(comp);
task.setReportingInterval(3);
TaskListener listener = createStrictMock(TaskListener.class);
listener.taskEvent(new TaskStartedEvent(task));
listener.taskEvent(new TaskProgressEvent(task, 0, 10));
listener.taskEvent(new TaskProgressEvent(task, 3, 10));
listener.taskEvent(new TaskProgressEvent(task, 6, 10));
listener.taskEvent(new TaskProgressEvent(task, 9, 10));
listener.taskEvent(new TaskProgressEvent(task, 10, 10));
listener.taskEvent(new TaskFinishedEvent(task));
replay(listener);
task.addTaskListener(listener);
task.run();
verify(listener);
}
@Test
public void testNotifyProgress2() {
IterativeComputation comp = new ShortComputation(9);
IterativeTask task = new IterativeTask(comp);
task.setReportingInterval(3);
TaskListener listener = createStrictMock(TaskListener.class);
listener.taskEvent(new TaskStartedEvent(task));
listener.taskEvent(new TaskProgressEvent(task, 0, 9));
listener.taskEvent(new TaskProgressEvent(task, 3, 9));
listener.taskEvent(new TaskProgressEvent(task, 6, 9));
listener.taskEvent(new TaskProgressEvent(task, 9, 9));
listener.taskEvent(new TaskFinishedEvent(task));
replay(listener);
task.addTaskListener(listener);
task.run();
verify(listener);
}
private void sleep(int t) {
try {
Thread.sleep(t);
} catch (InterruptedException e) {
}
}
}