package hudson.plugins.twitter;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Result;
import hudson.plugins.twitter.TwitterPublisher.DescriptorImpl;
import hudson.tasks.Builder;
import java.io.IOException;
import org.jvnet.hudson.test.FailureBuilder;
import org.jvnet.hudson.test.HudsonTestCase;
public class ShouldTweetTest extends HudsonTestCase {
public void testWhenDescriptorTrueAndInstanceNull() throws Exception {
DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class);
descriptor.onlyOnFailureOrRecovery = true;
TwitterPublisher pub = new TwitterPublisher(null, null, null, null);
assertLimitedTweets(pub);
}
public void testWhenDescriptorTrueAndInstanceFalse() throws Exception {
DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class);
descriptor.onlyOnFailureOrRecovery = true;
TwitterPublisher pub = new TwitterPublisher(null, null, "false", null);
assertAlwaysTweet(pub);
}
public void testWhenDescriptorTrueAndInstanceTrue() throws Exception {
DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class);
descriptor.onlyOnFailureOrRecovery = true;
TwitterPublisher pub = new TwitterPublisher(null, null, "true", null);
assertLimitedTweets(pub);
}
public void testWhenDescriptorFalseAndInstanceNull() throws Exception {
DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class);
descriptor.onlyOnFailureOrRecovery = false;
TwitterPublisher pub = new TwitterPublisher(null, null, null, null);
assertAlwaysTweet(pub);
}
public void testWhenDescriptorFalseAndInstanceFalse() throws Exception {
DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class);
descriptor.onlyOnFailureOrRecovery = false;
TwitterPublisher pub = new TwitterPublisher(null, null, "false", null);
assertAlwaysTweet(pub);
}
public void testWhenDescriptorFalseAndInstanceTrue() throws Exception {
DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class);
descriptor.onlyOnFailureOrRecovery = false;
TwitterPublisher pub = new TwitterPublisher(null, null, "true", null);
assertLimitedTweets(pub);
}
private void assertAlwaysTweet(TwitterPublisher pub) throws Exception {
FreeStyleBuild successfulBuildAfterNothing = createSuccessfulBuild();
assertTrue(pub.shouldTweet(successfulBuildAfterNothing));
FreeStyleBuild successfulBuildAfterSuccess = createSuccessfulBuildAfterSuccess();
assertTrue(pub.shouldTweet(successfulBuildAfterSuccess));
FreeStyleBuild successfulBuildAfterFailure = createSuccessfulBuildAfterFailure();
assertTrue(pub.shouldTweet(successfulBuildAfterFailure));
FreeStyleBuild failedBuild = createFailedBuild();
assertTrue(pub.shouldTweet(failedBuild));
FreeStyleBuild unstableBuild = createUnstableBuild();
assertTrue(pub.shouldTweet(unstableBuild));
FreeStyleBuild abortedBuild = createAbortedBuild();
assertTrue(pub.shouldTweet(abortedBuild));
}
private FreeStyleBuild createSuccessfulBuild() throws Exception {
FreeStyleProject prj = createFreeStyleProject();
return prj.scheduleBuild2(0).get();
}
private FreeStyleBuild createSuccessfulBuildAfterFailure() throws Exception {
FreeStyleProject prj = createFreeStyleProject();
prj.getBuildersList().add(new FailureBuilder());
prj.scheduleBuild2(0).get();
prj.getBuildersList().clear();
return prj.scheduleBuild2(0).get();
}
private FreeStyleBuild createSuccessfulBuildAfterSuccess() throws Exception {
FreeStyleProject prj = createFreeStyleProject();
prj.scheduleBuild2(0).get();
return prj.scheduleBuild2(0).get();
}
private void assertLimitedTweets(TwitterPublisher pub) throws Exception {
FreeStyleBuild successfulBuildAfterNothing = createSuccessfulBuild();
assertFalse(pub.shouldTweet(successfulBuildAfterNothing));
FreeStyleBuild successfulBuildAfterSuccess = createSuccessfulBuildAfterSuccess();
assertFalse(pub.shouldTweet(successfulBuildAfterSuccess));
FreeStyleBuild successfulBuildAfterFailure = createSuccessfulBuildAfterFailure();
assertTrue(pub.shouldTweet(successfulBuildAfterFailure));
FreeStyleBuild failedBuild = createFailedBuild();
assertTrue(pub.shouldTweet(failedBuild));
FreeStyleBuild unstableBuild = createUnstableBuild();
assertTrue(pub.shouldTweet(unstableBuild));
FreeStyleBuild abortedBuild = createAbortedBuild();
assertFalse(pub.shouldTweet(abortedBuild));
}
private FreeStyleBuild createFailedBuild() throws Exception {
return createBuild(new FailureBuilder());
}
private FreeStyleBuild createBuild(Builder b) throws Exception {
FreeStyleProject prj = createFreeStyleProject();
prj.getBuildersList().add(b);
return prj.scheduleBuild2(0).get();
}
private FreeStyleBuild createUnstableBuild() throws Exception {
return createBuild(new UnstableBuilder());
}
private FreeStyleBuild createAbortedBuild() throws Exception {
return createBuild(new AbortedBuilder());
}
public static class UnstableBuilder extends Builder {
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
throws InterruptedException, IOException {
build.setResult(Result.UNSTABLE);
return false;
}
}
public static class AbortedBuilder extends Builder {
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
throws InterruptedException, IOException {
build.setResult(Result.ABORTED);
return false;
}
}
}