package com.widowcrawler.core.dispatch;
import com.widowcrawler.core.dispatch.Dispatcher;
import com.widowcrawler.core.worker.ExitWorkerProvider;
import com.widowcrawler.core.worker.Worker;
import com.widowcrawler.core.worker.WorkerProvider;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Before;
import org.junit.Test;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import javax.inject.Provider;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author Scott Mansfield
*/
@SuppressWarnings("unchecked")
public class DispatcherTest {
private Dispatcher dispatcher;
private WorkerProvider workerProviderMock;
private ThreadPoolExecutor executorServiceMock;
@Before
public void before() throws Exception {
this.dispatcher = new Dispatcher();
workerProviderMock = createMock(WorkerProvider.class);
FieldUtils.writeField(this.dispatcher, "workerProvider", workerProviderMock, true);
executorServiceMock = createMock(ThreadPoolExecutor.class);
FieldUtils.writeField(this.dispatcher, "executor", executorServiceMock, true);
}
@Test
public void dispatch_workExists_workDispatched() throws Exception {
// Arrange
Worker workerMock = createMock(Worker.class);
expect(workerProviderMock.get()).andReturn(workerMock);
BlockingQueue<Runnable> queueMock = createMock(BlockingQueue.class);
queueMock.put(anyObject(Runnable.class));
expectLastCall().once();
expect(executorServiceMock.getQueue()).andReturn(queueMock).once();
replay(workerMock, workerProviderMock, executorServiceMock, queueMock);
// Act
boolean retval = this.dispatcher.dispatch();
// Assert
verify(workerMock, workerProviderMock, executorServiceMock, queueMock);
assertTrue(retval);
}
@Test
public void dispatch_exitWorkerProvided_dispatchExitsWithFalse() throws Exception {
// Arrange
expect(workerProviderMock.get()).andReturn(ExitWorkerProvider.EXIT_SIGNAL);
replay(workerProviderMock, executorServiceMock);
// Act
boolean retval = dispatcher.dispatch();
// Assert
verify(workerProviderMock, executorServiceMock);
assertFalse(retval);
}
}