package com.sonyericsson.hudson.plugins.gerrit.trigger.spec; import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer; import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerParameters; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.FilePath; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Topic; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginChangeAbandonedEvent; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginChangeRestoredEvent; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginCommentAddedEvent; import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginRefUpdatedEvent; import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.MockGerritHudsonTriggerConfig; import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup; import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Account; import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeAbandoned; import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeRestored; import com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded; import com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated; import com.sonymobile.tools.gerrit.gerritevents.dto.events.RefUpdated; import hudson.EnvVars; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.ParametersAction; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Builder; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; /** * Tests various aspects of {@link GerritTriggerParameters.ParameterMode}. * * @author Robert Sandell <rsandell@cloudbees.com>. */ public class ParameterModeJenkinsTest { /** * An instance of Jenkins Rule. */ // CS IGNORE VisibilityModifier FOR NEXT 2 LINES. REASON: JenkinsRule. @Rule public JenkinsRule j = new JenkinsRule(); private FreeStyleProject job; private GerritTrigger trigger; /** * Shared setup for all tests. * * @throws IOException if so. */ @Before public void setup() throws IOException { MockGerritHudsonTriggerConfig config = Setup.createConfig(); GerritServer server = new MockGerritServer("gerrit version 2.11.4"); server.setConfig(config); PluginImpl plugin = PluginImpl.getInstance(); assertNotNull(plugin); plugin.setServers(Arrays.asList(server)); job = j.createFreeStyleProject(); job.getBuildersList().add(new ParametersBuilder()); trigger = Setup.createDefaultTrigger(job); trigger.setGerritProjects(Collections.singletonList(new GerritProject(CompareType.ANT, "**", Collections.singletonList(new Branch(CompareType.ANT, "**")), Collections.<Topic>emptyList(), Collections.<FilePath>emptyList(), Collections.<FilePath>emptyList(), false))); trigger.setEscapeQuotes(false); } /** * Mock Gerrit server with a version. */ public static class MockGerritServer extends GerritServer { private String version; /** * Create Gerrit Server with Version. * @param gerritVersion mock version for Gerrit. */ public MockGerritServer(String gerritVersion) { super(PluginImpl.DEFAULT_SERVER_NAME); version = gerritVersion; } @Override public String getGerritVersion() { return version; } /** * Create server instance. */ public MockGerritServer() { super(PluginImpl.DEFAULT_SERVER_NAME); } } /** * Tests the default {@link GerritTriggerParameters.ParameterMode#PLAIN} * when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testNameAndEmailParameterModeDefault() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.PLAIN, trigger.getNameAndEmailParameterMode()); Account ac = new Account("Bobby", "rsandell@cloudbees.com"); PluginImpl.getHandler_().triggerEvent(Setup.createPatchsetCreatedWithAccounts(ac, ac, ac)); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); List<GerritTriggerParameters> params = Arrays.asList( GerritTriggerParameters.GERRIT_CHANGE_OWNER, GerritTriggerParameters.GERRIT_EVENT_ACCOUNT); String expected = ac.getNameAndEmail(); for (GerritTriggerParameters param : params) { j.assertLogContains(param.name() + "=" + expected, build); } } /** * Tests the default {@link GerritTriggerParameters.ParameterMode#PLAIN} * when the build is triggered by a {@link ChangeAbandoned} event. * * @throws Exception if so */ @Test public void testNameAndEmailParameterModeDefaultChangeAbandoned() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.PLAIN, trigger.getNameAndEmailParameterMode()); trigger.getTriggerOnEvents().add(new PluginChangeAbandonedEvent()); Account ac = new Account("Bobby", "rsandell@cloudbees.com"); ChangeAbandoned changeAbandoned = Setup.createChangeAbandoned(); changeAbandoned.setAccount(ac); changeAbandoned.getChange().setOwner(ac); changeAbandoned.setAbandoner(ac); PluginImpl.getHandler_().triggerEvent(changeAbandoned); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); List<GerritTriggerParameters> params = Arrays.asList( GerritTriggerParameters.GERRIT_CHANGE_OWNER, GerritTriggerParameters.GERRIT_EVENT_ACCOUNT, GerritTriggerParameters.GERRIT_CHANGE_ABANDONER); String expected = ac.getNameAndEmail(); for (GerritTriggerParameters param : params) { j.assertLogContains(param.name() + "=" + expected, build); } } /** * Tests the default {@link GerritTriggerParameters.ParameterMode#PLAIN} * when the build is triggered by a {@link ChangeRestored} event. * * @throws Exception if so */ @Test public void testNameAndEmailParameterModeDefaultChangeRestored() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.PLAIN, trigger.getNameAndEmailParameterMode()); trigger.getTriggerOnEvents().add(new PluginChangeRestoredEvent()); Account ac = new Account("Bobby", "rsandell@cloudbees.com"); ChangeRestored change = Setup.createChangeRestored(); change.setAccount(ac); change.getChange().setOwner(ac); change.setRestorer(ac); PluginImpl.getHandler_().triggerEvent(change); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); List<GerritTriggerParameters> params = Arrays.asList( GerritTriggerParameters.GERRIT_CHANGE_OWNER, GerritTriggerParameters.GERRIT_EVENT_ACCOUNT, GerritTriggerParameters.GERRIT_CHANGE_RESTORER); String expected = ac.getNameAndEmail(); for (GerritTriggerParameters param : params) { j.assertLogContains(param.name() + "=" + expected, build); } } /** * Tests the default {@link GerritTriggerParameters.ParameterMode#PLAIN} * when the build is triggered by a {@link RefUpdated} event. * * @throws Exception if so */ @Test public void testNameAndEmailParameterModeDefaultRefUpdated() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.PLAIN, trigger.getNameAndEmailParameterMode()); trigger.getTriggerOnEvents().add(new PluginRefUpdatedEvent()); Account ac = new Account("Bobby", "rsandell@cloudbees.com"); RefUpdated change = Setup.createRefUpdated(PluginImpl.DEFAULT_SERVER_NAME, "olle", "abc123"); change.setAccount(ac); PluginImpl.getHandler_().triggerEvent(change); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); List<GerritTriggerParameters> params = Arrays.asList(GerritTriggerParameters.GERRIT_EVENT_ACCOUNT); //TODO According to the doc GerritTriggerParameters.GERRIT_SUBMITTER should be set as well but its not? String expected = ac.getNameAndEmail(); for (GerritTriggerParameters param : params) { j.assertLogContains(param.name() + "=" + expected, build); } } /** * Tests the {@link GerritTriggerParameters.ParameterMode#BASE64} setting * for {@link GerritTrigger#nameAndEmailParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testNameAndEmailParameterModeBase64() throws Exception { trigger.setNameAndEmailParameterMode(GerritTriggerParameters.ParameterMode.BASE64); Account ac = new Account("Bobby", "rsandell@cloudbees.com"); PluginImpl.getHandler_().triggerEvent(Setup.createPatchsetCreatedWithAccounts(ac, ac, ac)); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); List<GerritTriggerParameters> params = Arrays.asList( GerritTriggerParameters.GERRIT_CHANGE_OWNER, GerritTriggerParameters.GERRIT_EVENT_ACCOUNT); String expected = GerritTriggerParameters.ParameterMode.encodeBase64(ac.getNameAndEmail()); for (GerritTriggerParameters param : params) { j.assertLogContains(param.name() + "=" + expected, build); } } /** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#nameAndEmailParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testNameAndEmailParameterModeNone() throws Exception { trigger.setNameAndEmailParameterMode(GerritTriggerParameters.ParameterMode.NONE); Account ac = new Account("Bobby", "rsandell@cloudbees.com"); PluginImpl.getHandler_().triggerEvent(Setup.createPatchsetCreatedWithAccounts(ac, ac, ac)); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); List<GerritTriggerParameters> params = Arrays.asList( GerritTriggerParameters.GERRIT_CHANGE_OWNER, GerritTriggerParameters.GERRIT_EVENT_ACCOUNT); String expected = ac.getNameAndEmail(); for (GerritTriggerParameters param : params) { j.assertLogNotContains(param.name() + "=", build); } j.assertLogNotContains(expected, build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#BASE64} (default) setting * for {@link GerritTrigger#commitMessageParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testCommitMessageParameterModeDefault() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.BASE64, trigger.getCommitMessageParameterMode()); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setCommitMessage(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogContains(GerritTriggerParameters.GERRIT_CHANGE_COMMIT_MESSAGE.name() + "=" + GerritTriggerParameters.ParameterMode.encodeBase64(expected), build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#PLAIN} setting * for {@link GerritTrigger#commitMessageParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testCommitMessageParameterModePlain() throws Exception { trigger.setCommitMessageParameterMode(GerritTriggerParameters.ParameterMode.PLAIN); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setCommitMessage(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogContains(GerritTriggerParameters.GERRIT_CHANGE_COMMIT_MESSAGE.name() + "=" + expected, build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#commitMessageParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testCommitMessageParameterModeNone() throws Exception { trigger.setCommitMessageParameterMode(GerritTriggerParameters.ParameterMode.NONE); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setCommitMessage(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogNotContains(GerritTriggerParameters.GERRIT_CHANGE_COMMIT_MESSAGE.name(), build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#BASE64} (default) setting * for {@link GerritTrigger#commentTextParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded} event. * * @throws Exception if so */ @Test public void testCommentTextParameterModeDefault() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.BASE64, trigger.getCommentTextParameterMode()); trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogContains(GerritTriggerParameters.GERRIT_EVENT_COMMENT_TEXT.name() + "=" + GerritTriggerParameters.ParameterMode.encodeBase64(expected), build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#PLAIN} setting * for {@link GerritTrigger#commentTextParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded} event. * * @throws Exception if so */ @Test public void testCommentTextParameterModePlain() throws Exception { trigger.setCommentTextParameterMode(GerritTriggerParameters.ParameterMode.PLAIN); trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogContains(GerritTriggerParameters.GERRIT_EVENT_COMMENT_TEXT.name() + "=" + expected, build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#commentTextParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded} event. * * @throws Exception if so */ @Test public void testCommentTextParameterModeNone() throws Exception { trigger.setCommentTextParameterMode(GerritTriggerParameters.ParameterMode.NONE); trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogNotContains(GerritTriggerParameters.GERRIT_EVENT_COMMENT_TEXT.name(), build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#changeSubjectParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testChangeSubjectParameterModeNone() throws Exception { trigger.setChangeSubjectParameterMode(GerritTriggerParameters.ParameterMode.NONE); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setSubject(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogNotContains(GerritTriggerParameters.GERRIT_CHANGE_SUBJECT.name(), build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#PLAIN} (default) setting * for {@link GerritTrigger#changeSubjectParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testChangeSubjectParameterModeDefault() throws Exception { assertSame(GerritTriggerParameters.ParameterMode.PLAIN, trigger.getChangeSubjectParameterMode()); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setSubject(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogContains(GerritTriggerParameters.GERRIT_CHANGE_SUBJECT.name() + "=" + expected, build); } /** * Tests the {@link GerritTriggerParameters.ParameterMode#BASE64} setting * for {@link GerritTrigger#changeSubjectParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testChangeSubjectParameterModeBase64() throws Exception { trigger.setChangeSubjectParameterMode(GerritTriggerParameters.ParameterMode.BASE64); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setSubject(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogContains(GerritTriggerParameters.GERRIT_CHANGE_SUBJECT.name() + "=" + GerritTriggerParameters.ParameterMode.encodeBase64(expected), build); } /** * Test builder that prints out all env vars to the build log. */ public static class ParametersBuilder extends Builder { @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { EnvVars vars = new EnvVars(); ParametersAction parametersAction = build.getAction(ParametersAction.class); if (parametersAction != null) { parametersAction.buildEnvVars(build, vars); } else { listener.error("Build was scheduled without parameters!"); return false; } for (Map.Entry<String, String> entry : vars.entrySet()) { listener.getLogger().println(entry.getKey() + "=" + entry.getValue()); } return true; } /** * TestDescriptor. */ @TestExtension public static class DescriptorImpl extends BuildStepDescriptor<Builder> { @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public String getDisplayName() { return "Print Env vars"; } } } }