package hudson.plugins.emailext; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Result; import hudson.plugins.emailext.plugins.EmailTrigger; import hudson.plugins.emailext.plugins.trigger.FailureTrigger; import hudson.plugins.emailext.plugins.trigger.FixedTrigger; import hudson.plugins.emailext.plugins.trigger.PreBuildTrigger; import hudson.plugins.emailext.plugins.trigger.StillFailingTrigger; import hudson.plugins.emailext.plugins.trigger.SuccessTrigger; import net.sf.json.JSONObject; import org.jvnet.hudson.test.FailureBuilder; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.mock_javamail.Mailbox; import java.util.List; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.junit.matchers.JUnitMatchers.*; public class ExtendedEmailPublisherTest extends HudsonTestCase { private ExtendedEmailPublisher publisher; private FreeStyleProject project; public void setUp() throws Exception { super.setUp(); publisher = new ExtendedEmailPublisher(); publisher.defaultSubject = "%DEFAULT_SUBJECT"; publisher.defaultContent = "%DEFAULT_CONTENT"; project = createFreeStyleProject(); project.getPublishersList().add( publisher ); } public void tearDown() throws Exception { super.tearDown(); Mailbox.clearAll(); } public void testSplitCommaSeparatedString() { String test = "asdf.fasdfd@fadsf.cadfad, asdfd, adsfadfaife, qwf.235f.adfd.#@adfe.cadfe"; String[] tests = test.split( ExtendedEmailPublisher.COMMA_SEPARATED_SPLIT_REGEXP ); assertEquals( 4, tests.length ); } public void testShouldNotSendEmailWhenNoTriggerEnabled() throws Exception { FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatusSuccess( build ); List<String> log = build.getLog( 100 ); assertThat( "No emails should have been trigger during pre-build or post-build.", log, hasItems( "No emails were triggered.", "No emails were triggered." ) ); } public void testPreBuildTriggerShouldAlwaysSendEmail() throws Exception { PreBuildTrigger trigger = new PreBuildTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); 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( "ashlux@gmail.com" ).size() ); } public void testSuccessTriggerShouldSendEmailWhenBuildSucceeds() throws Exception { SuccessTrigger successTrigger = new SuccessTrigger(); addEmailType( successTrigger ); publisher.getConfiguredTriggers().add( successTrigger ); FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatusSuccess( build ); assertThat( "Email should have been triggered, so we should see it in the logs.", build.getLog( 100 ), hasItems( "Email was triggered for: Success" ) ); assertEquals( 1, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testSuccessTriggerShouldNotSendEmailWhenBuildFails() throws Exception { project.getBuildersList().add( new FailureBuilder() ); SuccessTrigger trigger = new SuccessTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build ); assertThat( "Email should not have been triggered, so we shouldn't see it in the logs.", build.getLog( 100 ), not( hasItems( "Email was triggered for: " + SuccessTrigger.TRIGGER_NAME ) ) ); assertEquals( 0, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testFixedTriggerShouldNotSendEmailWhenBuildFirstFails() throws Exception { project.getBuildersList().add( new FailureBuilder() ); FixedTrigger trigger = new FixedTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build ); assertThat( "Email should not have been triggered, so we shouldn't see it in the logs.", build.getLog( 100 ), not( hasItems( "Email was triggered for: " + SuccessTrigger.TRIGGER_NAME ) ) ); assertEquals( "No email should have been sent out since the build failed only once.", 0, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testFixedTriggerShouldSendEmailWhenBuildIsFixed() throws Exception { project.getBuildersList().add( new FailureBuilder() ); FixedTrigger trigger = new FixedTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); FreeStyleBuild build1 = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build1 ); project.getBuildersList().clear(); FreeStyleBuild build2 = project.scheduleBuild2( 0 ).get(); assertBuildStatusSuccess( build2 ); assertThat( "Email should have been triggered, so we should see it in the logs.", build2.getLog( 100 ), hasItems( "Email was triggered for: " + FixedTrigger.TRIGGER_NAME ) ); assertEquals( 1, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testStillFailingTriggerShouldNotSendEmailWhenBuildSucceeds() throws Exception { StillFailingTrigger trigger = new StillFailingTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatusSuccess( build ); assertThat( "Email should not have been triggered, so we should not see it in the logs.", build.getLog( 100 ), not( hasItems( "Email was triggered for: " + StillFailingTrigger.TRIGGER_NAME ) ) ); assertEquals( 0, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testStillFailingTriggerShouldNotSendEmailWhenBuildFirstFails() throws Exception { project.getBuildersList().add( new FailureBuilder() ); StillFailingTrigger trigger = new StillFailingTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); // only fail once FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build ); assertThat( "Email should not have been triggered, so we should not see it in the logs.", build.getLog( 100 ), not( hasItems( "Email was triggered for: " + StillFailingTrigger.TRIGGER_NAME ) ) ); assertEquals( 0, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testStillFailingTriggerShouldNotSendEmailWhenBuildIsFixed() throws Exception { project.getBuildersList().add( new FailureBuilder() ); StillFailingTrigger trigger = new StillFailingTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); // only fail once FreeStyleBuild build1 = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build1 ); // then succeed project.getBuildersList().clear(); FreeStyleBuild build2 = project.scheduleBuild2( 0 ).get(); assertBuildStatusSuccess( build2 ); assertThat( "Email should not have been triggered, so we should not see it in the logs.", build2.getLog( 100 ), not( hasItems( "Email was triggered for: " + StillFailingTrigger.TRIGGER_NAME ) ) ); assertEquals( 0, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testStillFailingTriggerShouldSendEmailWhenBuildContinuesToFail() throws Exception { project.getBuildersList().add( new FailureBuilder() ); StillFailingTrigger trigger = new StillFailingTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); // first failure FreeStyleBuild build1 = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build1 ); // second failure FreeStyleBuild build2 = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build2 ); assertThat( "Email should have been triggered, so we should see it in the logs.", build2.getLog( 100 ), hasItems( "Email was triggered for: " + StillFailingTrigger.TRIGGER_NAME ) ); assertEquals( "We should only have one email since the first failure doesn't count as 'still failing'.", 1, Mailbox.get( "ashlux@gmail.com" ).size() ); } public void testShouldSendEmailUsingUtf8ByDefault() throws Exception { project.getBuildersList().add( new FailureBuilder() ); FailureTrigger trigger = new FailureTrigger(); addEmailType( trigger ); publisher.getConfiguredTriggers().add( trigger ); FreeStyleBuild build = project.scheduleBuild2( 0 ).get(); assertBuildStatus( Result.FAILURE, build ); Mailbox mailbox = Mailbox.get( "ashlux@gmail.com" ); assertEquals( "We should an email since the build failed.", 1, mailbox.size() ); assertThat( "UTF-8 charset should be used.", mailbox.get( 0 ).getContentType(), containsString( "charset=utf-8" ) ); } public void testNewInstance_shouldGetBasicInformation() throws Exception { JSONObject form = new JSONObject(); form.put( "project_content_type", "default" ); form.put( "recipientlist_recipients", "ashlux@gmail.com" ); form.put( "project_default_subject", "Make millions in Nigeria" ); form.put( "project_default_content", "Give me a $1000 check and I'll mail you back $5000!!!" ); publisher = (ExtendedEmailPublisher) ExtendedEmailPublisher.DESCRIPTOR.newInstance( null, form ); assertEquals( "default", publisher.contentType ); assertEquals( "ashlux@gmail.com", publisher.recipientList ); assertEquals( "Make millions in Nigeria", publisher.defaultSubject ); assertEquals( "Give me a $1000 check and I'll mail you back $5000!!!", publisher.defaultContent ); } private void addEmailType( EmailTrigger trigger ) { trigger.setEmail( new EmailType() {{ setRecipientList( "ashlux@gmail.com" ); setSubject( "Yet another Hudson email" ); setBody( "Boom goes the dynamite." ); }} ); } }