package ch.ethz.origo; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createMock; import static org.easymock.classextension.EasyMock.replay; import static org.easymock.classextension.EasyMock.reset; import static org.easymock.classextension.EasyMock.verify; import hudson.model.AbstractBuild; import hudson.model.FreeStyleProject; import hudson.tasks.Builder; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.concurrent.ExecutionException; import org.apache.xmlrpc.XmlRpcException; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.FailureBuilder; import org.jvnet.hudson.test.UnstableBuilder; public class OrigoIssuePublisherTest extends HudsonTestCase { private static final String API_URL = "API_URL"; private static final String PROJECT_NAME = "PROJECT_NAME"; private static final String USER_KEY = "USER_KEY"; private static final String ISSUE_SUBJECT = "ISSUE_SUBJECT"; private static final String ISSUE_TAG = "ISSUE_TAG"; private static final boolean ISSUE_PRIVATE = false; private static final String SESSION = "SESSION"; private static final Integer PROJECT_ID = 13; private static final String HUDSON_URL = "HUDSON_URL"; private static final Integer ISSUE_ID = 43; private OrigoApiClient ORIGO_API_CLIENT_MOCK = createMock("ORIGO_API_CLIENT_MOCK", OrigoApiClient.class); private Object[] MOCKS = new Object[] { ORIGO_API_CLIENT_MOCK }; public void testNewFailure() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); expectNewIssue(1); replay(MOCKS); publisher.perform(createOneBuild(new FailureBuilder()), null, null); verify(MOCKS); } public void testSuccessThenFailure() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); expectNewIssue(2); replay(MOCKS); publisher.perform(createTwoBuilds(null, new FailureBuilder()), null, null); verify(MOCKS); } public void testNewSuccessful() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); replay(MOCKS); publisher.perform(createOneBuild(null), null, null); verify(MOCKS); } public void testSuccessThenSuccess() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); replay(MOCKS); publisher.perform(createTwoBuilds(null, null), null, null); verify(MOCKS); } public void testFailureThenFailure() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); replay(MOCKS); publisher.perform(createTwoBuilds(new FailureBuilder(), new FailureBuilder()), null, null); verify(MOCKS); } public void testFailureThenSuccess() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); expectCloseIssue(); replay(MOCKS); publisher.perform(createTwoBuilds(new FailureBuilder(), null), null, null); verify(MOCKS); } public void testNewUnstable() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); expectNewIssue(1); replay(MOCKS); publisher.perform(createOneBuild(new UnstableBuilder()), null, null); verify(MOCKS); } public void testSuccessThenUnstable() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); expectNewIssue(2); replay(MOCKS); publisher.perform(createTwoBuilds(null, new UnstableBuilder()), null, null); verify(MOCKS); } public void testUnstableThenUnstable() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); replay(MOCKS); publisher.perform(createTwoBuilds(new UnstableBuilder(), new UnstableBuilder()), null, null); verify(MOCKS); } public void testUnstableThenFailure() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); replay(MOCKS); publisher.perform(createTwoBuilds(new UnstableBuilder(), new FailureBuilder()), null, null); verify(MOCKS); } public void testFailureThenUnstable() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); replay(MOCKS); publisher.perform(createTwoBuilds(new FailureBuilder(), new UnstableBuilder()), null, null); verify(MOCKS); } public void testUnstableThenSuccess() throws Exception { OrigoIssuePublisher publisher = setupPublisher(); reset(MOCKS); expectCloseIssue(); replay(MOCKS); publisher.perform(createTwoBuilds(new UnstableBuilder(), null), null, null); verify(MOCKS); } private AbstractBuild<?, ?> createTwoBuilds(Builder first, Builder second) throws IOException, InterruptedException, ExecutionException { FreeStyleProject project = createFreeStyleProject(); if (first != null) { project.getBuildersList().add(first); } project.scheduleBuild2(0).get(); project.getBuildersList().clear(); if (second != null) { project.getBuildersList().add(second); } return project.scheduleBuild2(0).get(); } private AbstractBuild<?, ?> createOneBuild(Builder first) throws IOException, InterruptedException, ExecutionException { FreeStyleProject project = createFreeStyleProject(); if (first != null) { project.getBuildersList().add(first); } return project.scheduleBuild2(0).get(); } private String buildDescription(int i) { return "Build failed see: " + createLink(i); } private void expectNewIssue(int build) throws XmlRpcException { expect(ORIGO_API_CLIENT_MOCK.login(USER_KEY, OrigoIssuePublisher.APPLICATION_KEY)).andReturn(SESSION); expect(ORIGO_API_CLIENT_MOCK.retrieveProjectId(SESSION, PROJECT_NAME)).andReturn(PROJECT_ID); ORIGO_API_CLIENT_MOCK.addIssue(SESSION, PROJECT_ID, ISSUE_SUBJECT, buildDescription(build), "status::open," + ISSUE_TAG, ISSUE_PRIVATE); } private void expectCloseIssue() throws XmlRpcException { expect(ORIGO_API_CLIENT_MOCK.login(USER_KEY, OrigoIssuePublisher.APPLICATION_KEY)).andReturn(SESSION); expect(ORIGO_API_CLIENT_MOCK.retrieveProjectId(SESSION, PROJECT_NAME)).andReturn(PROJECT_ID); HashMap<String, String> searchArgs = new HashMap<String, String>(); searchArgs.put("status", "open"); searchArgs.put("tags", ISSUE_TAG); expect(ORIGO_API_CLIENT_MOCK.searchIssue(SESSION, PROJECT_ID, searchArgs)).andReturn( new Object[] { Collections.singletonMap("issue_id", ISSUE_ID) }); ORIGO_API_CLIENT_MOCK.extendedCommentIssue(SESSION, PROJECT_ID, ISSUE_ID, "Build fixed see: " + createLink(2), "status::closed," + ISSUE_TAG); } private String createLink(int i) { return HUDSON_URL + "job/test0/" + i + "/"; } private OrigoIssuePublisher setupPublisher() { OrigoIssuePublisher publisher = new OrigoIssuePublisher(API_URL, PROJECT_NAME, USER_KEY, ISSUE_SUBJECT, ISSUE_TAG, ISSUE_PRIVATE, ORIGO_API_CLIENT_MOCK); publisher.getDescriptor().setHudsonUrl(HUDSON_URL); return publisher; } }