package com.sequenceiq.cloudbreak.service.cluster.flow;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean;
import com.google.common.io.CharStreams;
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetup;
import com.icegreen.greenmail.util.ServerSetupTest;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.service.user.UserDetailsService;
import com.sequenceiq.cloudbreak.service.user.UserFilterField;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
@RunWith(MockitoJUnitRunner.class)
public class EmailSenderHostServiceTypeTest {
private static final String NAME_OF_THE_CLUSTER = "name-of-the-cluster";
private GreenMail greenMail;
@Mock
private UserDetailsService userDetailsService;
@InjectMocks
private EmailSenderService emailSenderService = new EmailSenderService();
private CbUser cbUser;
@Mock
private EmailMimeMessagePreparator emailMimeMessagePreparator;
@Before
public void before() throws IOException, TemplateException {
greenMail = new GreenMail(new ServerSetup(3465, null, ServerSetup.PROTOCOL_SMTP));
greenMail.setUser("demouser", "demopwd");
greenMail.start();
cbUser = new CbUser("sdf", "testuser", "testaccount", new ArrayList<>(), "familyname", "givenName", new Date());
ReflectionTestUtils.setField(emailSenderService, "msgFrom", "no-reply@sequenceiq.com");
ReflectionTestUtils.setField(emailSenderService, "freemarkerConfiguration", freemarkerConfiguration());
ReflectionTestUtils.setField(emailSenderService, "successClusterMailTemplatePath", "templates/cluster-installer-mail-success.ftl");
ReflectionTestUtils.setField(emailSenderService, "failedClusterMailTemplatePath", "templates/cluster-installer-mail-fail.ftl");
JavaMailSender mailSender = new JavaMailSenderImpl();
((JavaMailSenderImpl) mailSender).setHost("localhost");
((JavaMailSenderImpl) mailSender).setPort(3465);
((JavaMailSenderImpl) mailSender).setUsername("demouser2");
((JavaMailSenderImpl) mailSender).setPassword("demopwd2");
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", false);
props.put("mail.smtp.starttls.enable", false);
props.put("mail.debug", false);
((JavaMailSenderImpl) mailSender).setJavaMailProperties(props);
ReflectionTestUtils.setField(emailSenderService, "mailSender", mailSender);
EmailMimeMessagePreparator mmp = new EmailMimeMessagePreparator();
ReflectionTestUtils.setField(mmp, "msgFrom", "marci@test.com");
ReflectionTestUtils.setField(emailSenderService, "emailMimeMessagePreparator", mmp);
when(userDetailsService.getDetails(anyString(), any(UserFilterField.class)))
.thenReturn(cbUser);
}
@After
public void tearDown() {
greenMail.stop();
}
@Test
public void testSendTerminationSuccessEmail() throws IOException, MessagingException {
// GIVEN
String subject = "Your cluster has been terminated";
// WHEN
emailSenderService.sendTerminationSuccessEmail("xxx", "xxx", "123.123.123.123", NAME_OF_THE_CLUSTER);
// THEN
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
Assert.assertEquals(1, messages.length);
Assert.assertEquals(subject, messages[0].getSubject());
Assert.assertThat(String.valueOf(messages[0].getContent()), Matchers.containsString("successfully terminated"));
}
@Test
public void testSendTerminationFailureEmail() throws IOException, MessagingException {
// GIVEN
String subject = "Cluster termination failed";
//WHEN
emailSenderService.sendTerminationFailureEmail("xxx", "xxx", "123.123.123.123", NAME_OF_THE_CLUSTER);
//THEN
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
Assert.assertEquals(1, messages.length);
Assert.assertEquals(subject, messages[0].getSubject());
Assert.assertThat(String.valueOf(messages[0].getContent()), Matchers.containsString("Failed to terminate your cluster"));
}
@Test
public void testSendProvisioningFailureEmail() throws IOException, MessagingException {
//GIVEN
String subject = "Cluster install failed";
//WHEN
emailSenderService.sendProvisioningFailureEmail("xxx", "xxx", NAME_OF_THE_CLUSTER);
//THEN
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
Assert.assertEquals(1, messages.length);
Assert.assertEquals(subject, messages[0].getSubject());
Assert.assertThat(String.valueOf(messages[0].getContent()), Matchers.containsString("Something went terribly wrong"));
}
@Ignore
@Test
public void testSendProvisioningSuccessEmailSMTPS() throws IOException, MessagingException {
//To run this test, please download the greenmail.jks from the following link:
// https://github.com/greenmail-mail-test/greenmail/blob/master/greenmail-core/src/main/resources/greenmail.jks
// and put into the /cert/trusted directory, and set the mail.transport.protocol variable to smtps.
greenMail = new GreenMail(ServerSetupTest.SMTPS);
greenMail.start();
//GIVEN
String content = getFileContent("mail/cluster-installer-mail-success").replaceAll("\\n", "");
String subject = String.format("%s cluster installation", NAME_OF_THE_CLUSTER);
//WHEN
emailSenderService.sendProvisioningSuccessEmail("test@example.com", "xxx", "123.123.123.123", NAME_OF_THE_CLUSTER);
//THEN
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
Assert.assertEquals(1, messages.length);
Assert.assertEquals(subject, messages[0].getSubject());
Assert.assertTrue(String.valueOf(messages[0].getContent()).replaceAll("\\n", "").replaceAll("\\r", "").contains(content));
}
@Test
public void testSendProvisioningSuccessEmailSmtp() throws IOException, MessagingException {
//GIVEN
String subject = "Your cluster is ready";
emailSenderService.sendProvisioningSuccessEmail("xxx@alma.com", "xxx", "123.123.123.123", NAME_OF_THE_CLUSTER);
//THEN
greenMail.waitForIncomingEmail(5000, 1);
Message[] messages = greenMail.getReceivedMessages();
Assert.assertEquals(1, messages.length);
Assert.assertEquals("Your cluster '" + NAME_OF_THE_CLUSTER + "' is ready", messages[0].getSubject());
Assert.assertThat(String.valueOf(messages[0].getContent()), Matchers.containsString("Your cluster '" + NAME_OF_THE_CLUSTER + "' is ready"));
}
Configuration freemarkerConfiguration() throws IOException, TemplateException {
FreeMarkerConfigurationFactoryBean factoryBean = new FreeMarkerConfigurationFactoryBean();
factoryBean.setPreferFileSystemAccess(false);
factoryBean.setTemplateLoaderPath("classpath:/");
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
private String getFileContent(String path) throws IOException {
return CharStreams.toString(new InputStreamReader(new ClassPathResource(path).getInputStream()));
}
}