package hudson.plugins.emailext; import hudson.matrix.Axis; import hudson.matrix.AxisList; import hudson.matrix.MatrixBuild; import hudson.matrix.MatrixProject; import hudson.matrix.MatrixRun; import hudson.model.labels.LabelAtom; import hudson.plugins.emailext.plugins.EmailTrigger; import hudson.plugins.emailext.plugins.RecipientProvider; import hudson.plugins.emailext.plugins.trigger.AlwaysTrigger; import hudson.plugins.emailext.plugins.trigger.PreBuildTrigger; import hudson.slaves.DumbSlave; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.mock_javamail.Mailbox; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.matchers.JUnitMatchers.hasItems; public class ExtendedEmailPublisherMatrixTest { private ExtendedEmailPublisher publisher; private MatrixProject project; private List<DumbSlave> slaves; @Rule public JenkinsRule j = new JenkinsRule() { @Override public void before() throws Throwable { super.before(); publisher = new ExtendedEmailPublisher(); publisher.defaultSubject = "%DEFAULT_SUBJECT"; publisher.defaultContent = "%DEFAULT_CONTENT"; publisher.attachBuildLog = false; project = j.jenkins.createProject(MatrixProject.class, "Foo"); project.getPublishersList().add( publisher ); slaves = new ArrayList<DumbSlave>(); slaves.add(createOnlineSlave(new LabelAtom("success-slave1"))); slaves.add(createOnlineSlave(new LabelAtom("success-slave2"))); slaves.add(createOnlineSlave(new LabelAtom("success-slave3"))); } @Override public void after() throws Exception { super.after(); slaves.clear(); Mailbox.clearAll(); } }; @Test public void testPreBuildMatrixBuildSendParentOnly() throws Exception { publisher.setMatrixTriggerMode(MatrixTriggerMode.ONLY_PARENT); List<RecipientProvider> recProviders = Collections.emptyList(); PreBuildTrigger trigger = new PreBuildTrigger(recProviders, "$DEFAULT_RECIPIENTS", "$DEFAULT_REPLYTO", "$DEFAULT_SUBJECT", "$DEFAULT_CONTENT", "", 0, "project"); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); MatrixBuild build = project.scheduleBuild2(0).get(); j.assertBuildStatusSuccess(build); assertThat( "Email should have been triggered, so we should see it in the logs.", build.getLog( 100 ), hasItems( "Email was triggered for: " + PreBuildTrigger.TRIGGER_NAME ) ); assertEquals( 1, Mailbox.get( "solganik@gmail.com" ).size() ); } @Test public void testPreBuildMatrixBuildSendSlavesOnly() throws Exception{ addSlaveToProject(0,1,2); List<RecipientProvider> recProviders = Collections.emptyList(); publisher.setMatrixTriggerMode(MatrixTriggerMode.ONLY_CONFIGURATIONS); PreBuildTrigger trigger = new PreBuildTrigger(recProviders, "$DEFAULT_RECIPIENTS", "$DEFAULT_REPLYTO", "$DEFAULT_SUBJECT", "$DEFAULT_CONTENT", "", 0, "project"); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); MatrixBuild build = project.scheduleBuild2(0).get(); j.assertBuildStatusSuccess(build); assertEquals( 3, Mailbox.get( "solganik@gmail.com" ).size() ); } @Test public void testPreBuildMatrixBuildSendSlavesAndParent() throws Exception { addSlaveToProject(0,1); List<RecipientProvider> recProviders = Collections.emptyList(); publisher.setMatrixTriggerMode(MatrixTriggerMode.BOTH); PreBuildTrigger trigger = new PreBuildTrigger(recProviders, "$DEFAULT_RECIPIENTS", "$DEFAULT_REPLYTO", "$DEFAULT_SUBJECT", "$DEFAULT_CONTENT", "", 0, "project"); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); MatrixBuild build = project.scheduleBuild2(0).get(); j.assertBuildStatusSuccess(build); assertEquals( 3, Mailbox.get( "solganik@gmail.com" ).size() ); } @Test public void testAttachBuildLogForAllAxes() throws Exception { publisher.setMatrixTriggerMode(MatrixTriggerMode.ONLY_PARENT); publisher.attachBuildLog = true; addSlaveToProject(0,1,2); List<RecipientProvider> recProviders = Collections.emptyList(); AlwaysTrigger trigger = new AlwaysTrigger(recProviders, "$DEFAULT_RECIPIENTS", "$DEFAULT_REPLYTO", "$DEFAULT_SUBJECT", "$DEFAULT_CONTENT", "", 0, "project"); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); MatrixBuild build = project.scheduleBuild2(0).get(); j.assertBuildStatusSuccess(build); assertThat( "Email should have been triggered, so we should see it in the logs.", build.getLog( 100 ), hasItems( "Email was triggered for: " + AlwaysTrigger.TRIGGER_NAME ) ); assertEquals( 1, Mailbox.get( "solganik@gmail.com" ).size() ); Message msg = Mailbox.get("solganik@gmail.com").get(0); assertTrue("Message should be multipart", msg instanceof MimeMessage); assertTrue("Content should be a MimeMultipart", msg.getContent() instanceof MimeMultipart); MimeMultipart part = (MimeMultipart)msg.getContent(); assertEquals("Should have four body items (message + attachment)", 4, part.getCount()); int i = 1; for(MatrixRun r : build.getExactRuns()) { String fileName = "build" + "-" + r.getParent().getCombination().toString('-', '-') + ".log"; BodyPart attach = part.getBodyPart(i); assertTrue("There should be a log named \"" + fileName + "\" attached", fileName.equalsIgnoreCase(attach.getFileName())); i++; } } private void addEmailType( EmailTrigger trigger ) { trigger.setEmail( new EmailType() {{ setRecipientList( "solganik@gmail.com" ); setSubject( "Yet another Hudson email" ); setBody( "Boom goes the dynamite." ); }} ); } private void addSlaveToProject(int ... slaveInxes ) throws IOException { AxisList list = new AxisList(); List<String> values = new LinkedList<String>(); for (int slaveInx : slaveInxes) { values.add(slaves.get(slaveInx).getLabelString()); } list.add(new Axis("label",values)); project.setAxes(list); } }