package mireka.transmission.queue;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.util.Date;
import mireka.smtp.EnhancedStatus;
import mireka.transmission.LocalMailSystemException;
import mireka.transmission.Mail;
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MailProcessingTaskTest {
@Mock
private ScheduleFileDirQueue mockedQueue;
@Mock
private FileDirStore mockedStore;
@Mock
private MailProcessorFactory mockedMailProcessorFactory;
@Mock
private MailProcessor mockedMailProcessor;
private MailProcessingTask task;
private MailName mailName = new MailName(new Date().getTime(), 0);
@Before
public void initialize() {
task =
new MailProcessingTask(mockedQueue, mockedStore,
mockedMailProcessorFactory, mailName);
when(mockedMailProcessorFactory.create(any(Mail.class))).thenReturn(
mockedMailProcessor);
}
@Test
public void testRunSuccessful() throws QueueStorageException {
task.run();
verify(mockedStore).delete(mailName);
}
@Test
public void testRunLocalTransientFailure() throws LocalMailSystemException {
doThrow(new QueueStorageException(EnhancedStatus.MAIL_SYSTEM_FULL))
.when(mockedMailProcessor).run();
task.run();
verify(mockedQueue).rescheduleFailedTask(task);
verify(mockedStore, Mockito.never()).delete(mailName);
}
@Test
public void testRunLocalTransientFailureForTooLong()
throws LocalMailSystemException {
doThrow(new QueueStorageException(EnhancedStatus.MAIL_SYSTEM_FULL))
.when(mockedMailProcessor).run();
task.run(); // first attempt
long twoDaysLater = new DateTime().plusDays(2).getMillis();
DateTimeUtils.setCurrentMillisFixed(twoDaysLater);
task.run(); // second attempt, now it is too late for another attempt
DateTimeUtils.setCurrentMillisSystem();
verify(mockedQueue, times(1)).rescheduleFailedTask(task);
verify(mockedStore).moveToErrorDir(mailName);
}
@Test
public void testRunLocalPermanentFailure() throws LocalMailSystemException {
doThrow(
new QueueStorageException(
EnhancedStatus.PERMANENT_INTERNAL_ERROR)).when(
mockedMailProcessor).run();
task.run();
verify(mockedStore).moveToErrorDir(mailName);
verify(mockedQueue, never()).rescheduleFailedTask(task);
}
}