/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package project.latex.balloon.writer.camera; import project.latex.balloon.writer.camera.EmailCameraDataWriter; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import org.junit.Before; import org.junit.Test; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.springframework.mail.MailSendException; import org.springframework.mail.javamail.JavaMailSender; import project.latex.balloon.writer.DataWriteFailedException; /** * * @author dgorst */ public class EmailCameraDataWriterTest { private EmailCameraDataWriter dataWriter; private JavaMailSender mockMailSender; private String fromAddress; private String toAddress; private File testImageFile; @Before public void setUp() { mockMailSender = mock(JavaMailSender.class); when(mockMailSender.createMimeMessage()).thenReturn(new MimeMessage((Session) null)); fromAddress = "balloon@test.com"; toAddress = "test@test.com"; testImageFile = new File("testImage.png"); dataWriter = new EmailCameraDataWriter(); dataWriter.setMailSender(mockMailSender); dataWriter.setFromAddress(fromAddress); dataWriter.setToAddress(toAddress); dataWriter.setMaxNumberOfEmailAttempts(5); dataWriter.setDelayBetweenEmailAttemptsMs(1); } @Test public void testSendMail() throws MessagingException { dataWriter.sendMail(testImageFile); verify(mockMailSender).send(any(MimeMessage.class)); } @Test public void testSendMailRetriesOperationIfSenderThrowsException() throws MessagingException { // The first time we try and send, the mail sender should throw an exception. The second time, it should pass doThrow(new MailSendException("Test exception")).doNothing().when(mockMailSender).send(any(MimeMessage.class)); dataWriter.sendMail(testImageFile); verify(mockMailSender, times(2)).send(any(MimeMessage.class)); } @Test public void testSendMailGivesUpAfterExhaustingRetryAttempts() throws MessagingException { // Mail sender should throw each time it is called doThrow(new MailSendException("Test exception")).when(mockMailSender).send(any(MimeMessage.class)); dataWriter.sendMail(testImageFile); verify(mockMailSender, times(5)).send(any(MimeMessage.class)); } @Test public void testWriteImageFiles() throws DataWriteFailedException, InterruptedException, MessagingException { List<File> imageFiles = new ArrayList<>(); imageFiles.add(testImageFile); final CountDownLatch sendMailLatch = new CountDownLatch(1); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { sendMailLatch.countDown(); return null; } }).when(mockMailSender).send(any(MimeMessage.class)); dataWriter.writeImageFiles(imageFiles); sendMailLatch.await(2, TimeUnit.SECONDS); verify(mockMailSender).send(any(MimeMessage.class)); } }