package azkaban.executor.mail;
import azkaban.executor.ExecutableFlow;
import azkaban.executor.ExecutionOptions;
import azkaban.executor.Status;
import azkaban.flow.Flow;
import azkaban.flow.Node;
import azkaban.project.Project;
import azkaban.utils.EmailMessage;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import org.apache.commons.io.IOUtils;
import org.joda.time.DateTimeUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.TimeZone;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class DefaultMailCreatorTest {
// 2016/07/17 11:54:11 EEST
public static final long START_TIME_MILLIS = 1468745651608L;
// 2016/07/17 11:54:16 EEST (START_TIME_MILLIS + 5 seconds)
public static final long END_TIME_MILLIS = START_TIME_MILLIS + 5_000L;
// 2016/07/17 11:54:21 EEST (START_TIME_MILLIS + 10 seconds)
public static final long FIXED_CURRENT_TIME_MILLIS = START_TIME_MILLIS + 10_000L;
private DefaultMailCreator mailCreator;
private ExecutableFlow executableFlow;
private Flow flow;
private Project project;
private ExecutionOptions options;
private EmailMessage message;
private String azkabanName;
private String scheme;
private String clientHostname;
private String clientPortNumber;
private TimeZone defaultTz;
@Before
public void setUp() throws Exception {
defaultTz = TimeZone.getDefault();
assertNotNull(defaultTz);
// EEST
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Helsinki"));
DateTimeUtils.setCurrentMillisFixed(FIXED_CURRENT_TIME_MILLIS);
mailCreator = new DefaultMailCreator();
flow = new Flow("mail-creator-test");
project = new Project(1, "test-project");
options = new ExecutionOptions();
message = new EmailMessage();
azkabanName = "unit-tests";
scheme = "http";
clientHostname = "localhost";
clientPortNumber = "8081";
Node failedNode = new Node("test-job");
failedNode.setType("noop");
flow.addNode(failedNode);
executableFlow = new ExecutableFlow(project, flow);
executableFlow.setExecutionOptions(options);
executableFlow.setStartTime(START_TIME_MILLIS);
options.setFailureEmails(ImmutableList.of("test@example.com"));
options.setSuccessEmails(ImmutableList.of("test@example.com"));
}
@After
public void tearDown() throws Exception {
if (defaultTz != null) {
TimeZone.setDefault(defaultTz);
}
DateTimeUtils.setCurrentMillisSystem();
}
private void setJobStatus(Status status) {
executableFlow.getExecutableNodes().get(0).setStatus(status);
}
@Test
public void createErrorEmail() throws Exception {
setJobStatus(Status.FAILED);
executableFlow.setEndTime(END_TIME_MILLIS);
executableFlow.setStatus(Status.FAILED);
assertTrue(mailCreator.createErrorEmail(
executableFlow, message, azkabanName, scheme, clientHostname, clientPortNumber));
assertEquals("Flow 'mail-creator-test' has failed on unit-tests", message.getSubject());
assertEquals(read("errorEmail.html"), message.getBody());
}
@Test
public void createFirstErrorMessage() throws Exception {
setJobStatus(Status.FAILED);
executableFlow.setStatus(Status.FAILED_FINISHING);
assertTrue(mailCreator.createFirstErrorMessage(
executableFlow, message, azkabanName, scheme, clientHostname, clientPortNumber));
assertEquals("Flow 'mail-creator-test' has encountered a failure on unit-tests", message.getSubject());
assertEquals(read("firstErrorMessage.html"), message.getBody());
}
@Test
public void createSuccessEmail() throws Exception {
setJobStatus(Status.SUCCEEDED);
executableFlow.setEndTime(END_TIME_MILLIS);
executableFlow.setStatus(Status.SUCCEEDED);
assertTrue(mailCreator.createSuccessEmail(
executableFlow, message, azkabanName, scheme, clientHostname, clientPortNumber));
assertEquals("Flow 'mail-creator-test' has succeeded on unit-tests", message.getSubject());
assertEquals(read("successEmail.html"), message.getBody());
}
private String read(String file) throws Exception {
InputStream is = DefaultMailCreatorTest.class.getResourceAsStream(file);
return IOUtils.toString(is, Charsets.UTF_8).trim();
}
}