From eb0867503ddef51bf8e2e1963544c8cf4373962f Mon Sep 17 00:00:00 2001 From: Owen Wood Date: Wed, 2 Dec 2015 16:19:56 +1000 Subject: [PATCH 1/6] JENKINS-31843 - Merge build parameter values when "Build is parameterized". Give precedence to values supplied from "Build is parameterized" (overrides) --- .../sonyericsson/rebuild/RebuildAction.java | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/sonyericsson/rebuild/RebuildAction.java b/src/main/java/com/sonyericsson/rebuild/RebuildAction.java index 605f3a24..d86195c5 100644 --- a/src/main/java/com/sonyericsson/rebuild/RebuildAction.java +++ b/src/main/java/com/sonyericsson/rebuild/RebuildAction.java @@ -24,6 +24,7 @@ */ package com.sonyericsson.rebuild; +import com.google.common.collect.*; import hudson.Extension; import hudson.model.Action; @@ -32,6 +33,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.Comparator; import hudson.matrix.MatrixRun; import hudson.model.BooleanParameterValue; @@ -57,9 +60,6 @@ import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; -import com.sonyericsson.rebuild.RebuildParameterPage; -import com.sonyericsson.rebuild.RebuildParameterProvider; - /** * Rebuild RootAction implementation class. This class will basically reschedule * the build with existing parameters. @@ -297,7 +297,13 @@ public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws Servl } } - List actions = constructRebuildCause(build, new ParametersAction(values)); + Set mergedValues = ImmutableSortedSet.copyOf(new Comparator() { + @Override + public int compare(ParameterValue o1, ParameterValue o2) { + return o1.getName().compareTo(o2.getName()); + } + }, Iterables.concat(values, paramAction.getParameters())); + List actions = constructRebuildCause(build, new ParametersAction(Lists.newArrayList(mergedValues))); Hudson.getInstance().getQueue().schedule((Queue.Task) build.getParent(), 0, actions); rsp.sendRedirect("../../"); @@ -361,21 +367,21 @@ public boolean isRebuildAvailable() { && project.hasPermission(Item.BUILD) && project.isBuildable() && project instanceof Queue.Task - && !isMatrixRun() + && !isMatrixRun() && !isRebuildDisbaled(); } private boolean isRebuildDisbaled() { - RebuildSettings settings = (RebuildSettings)getProject().getProperty(RebuildSettings.class); - + RebuildSettings settings = (RebuildSettings) getProject().getProperty(RebuildSettings.class); + if (settings != null && settings.getRebuildDisabled()) { - return true; - } - return false; - } + return true; + } + return false; + } - /** + /** * Method for getting the ParameterValue instance from ParameterDefinition * or ParamterAction. * @@ -387,7 +393,7 @@ private boolean isRebuildDisbaled() { * @return ParameterValue instance of subclass of ParameterValue */ public ParameterValue getParameterValue(ParametersDefinitionProperty paramDefProp, - String parameterName, ParametersAction paramAction, StaplerRequest req, JSONObject jo) { + String parameterName, ParametersAction paramAction, StaplerRequest req, JSONObject jo) { ParameterDefinition paramDef; // this is normal case when user try to rebuild a parameterized job. if (paramDefProp != null) { @@ -397,7 +403,7 @@ public ParameterValue getParameterValue(ParametersDefinitionProperty paramDefPro // If the parameter comes from the copy artifact plugin, then use the single argument createValue if (jo.toString().contains("BuildSelector") || jo.toString().contains("WorkspaceSelector")) { SimpleParameterDefinition parameterDefinition = - (SimpleParameterDefinition)paramDefProp.getParameterDefinition(parameterName); + (SimpleParameterDefinition) paramDefProp.getParameterDefinition(parameterName); return parameterDefinition.createValue(jo.getString("value")); } return paramDef.createValue(req, jo); @@ -446,10 +452,11 @@ private ParameterValue cloneParameter(ParameterValue oldValue, String newValue) } throw new IllegalArgumentException("Unrecognized parameter type: " + oldValue.getClass()); } + /** * Method for constructing Rebuild cause. * - * @param up AbsstractBuild + * @param up AbsstractBuild * @param paramAction ParametersAction. * @return actions List */ @@ -467,7 +474,7 @@ private List constructRebuildCause(Run up, ParametersAction paramAction) * @return page for the parameter value, or null if no suitable option found. */ public RebuildParameterPage getRebuildParameterPage(ParameterValue value) { - for (RebuildParameterProvider provider: RebuildParameterProvider.all()) { + for (RebuildParameterProvider provider : RebuildParameterProvider.all()) { RebuildParameterPage page = provider.getRebuildPage(value); if (page != null) { return page; @@ -480,7 +487,7 @@ public RebuildParameterPage getRebuildParameterPage(ParameterValue value) { return new RebuildParameterPage( getClass(), String.format("%s.jelly", value.getClass().getSimpleName()) - ); + ); } // Else we return that we haven't found anything. From cc9b1da16e1cc5d9f3317fb9755d3e436372d99c Mon Sep 17 00:00:00 2001 From: Owen Wood Date: Wed, 2 Dec 2015 16:54:39 +1000 Subject: [PATCH 2/6] JENKINS-31843 - Removed unrelated formatting changes --- .../sonyericsson/rebuild/RebuildAction.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/sonyericsson/rebuild/RebuildAction.java b/src/main/java/com/sonyericsson/rebuild/RebuildAction.java index d86195c5..d743b6f0 100644 --- a/src/main/java/com/sonyericsson/rebuild/RebuildAction.java +++ b/src/main/java/com/sonyericsson/rebuild/RebuildAction.java @@ -373,15 +373,15 @@ public boolean isRebuildAvailable() { } private boolean isRebuildDisbaled() { - RebuildSettings settings = (RebuildSettings) getProject().getProperty(RebuildSettings.class); + RebuildSettings settings = (RebuildSettings)getProject().getProperty(RebuildSettings.class); if (settings != null && settings.getRebuildDisabled()) { - return true; - } - return false; - } + return true; + } + return false; + } - /** + /** * Method for getting the ParameterValue instance from ParameterDefinition * or ParamterAction. * @@ -393,7 +393,7 @@ private boolean isRebuildDisbaled() { * @return ParameterValue instance of subclass of ParameterValue */ public ParameterValue getParameterValue(ParametersDefinitionProperty paramDefProp, - String parameterName, ParametersAction paramAction, StaplerRequest req, JSONObject jo) { + String parameterName, ParametersAction paramAction, StaplerRequest req, JSONObject jo) { ParameterDefinition paramDef; // this is normal case when user try to rebuild a parameterized job. if (paramDefProp != null) { @@ -403,7 +403,7 @@ public ParameterValue getParameterValue(ParametersDefinitionProperty paramDefPro // If the parameter comes from the copy artifact plugin, then use the single argument createValue if (jo.toString().contains("BuildSelector") || jo.toString().contains("WorkspaceSelector")) { SimpleParameterDefinition parameterDefinition = - (SimpleParameterDefinition) paramDefProp.getParameterDefinition(parameterName); + (SimpleParameterDefinition)paramDefProp.getParameterDefinition(parameterName); return parameterDefinition.createValue(jo.getString("value")); } return paramDef.createValue(req, jo); @@ -452,11 +452,10 @@ private ParameterValue cloneParameter(ParameterValue oldValue, String newValue) } throw new IllegalArgumentException("Unrecognized parameter type: " + oldValue.getClass()); } - /** * Method for constructing Rebuild cause. * - * @param up AbsstractBuild + * @param up AbsstractBuild * @param paramAction ParametersAction. * @return actions List */ @@ -474,7 +473,7 @@ private List constructRebuildCause(Run up, ParametersAction paramAction) * @return page for the parameter value, or null if no suitable option found. */ public RebuildParameterPage getRebuildParameterPage(ParameterValue value) { - for (RebuildParameterProvider provider : RebuildParameterProvider.all()) { + for (RebuildParameterProvider provider: RebuildParameterProvider.all()) { RebuildParameterPage page = provider.getRebuildPage(value); if (page != null) { return page; @@ -487,7 +486,7 @@ public RebuildParameterPage getRebuildParameterPage(ParameterValue value) { return new RebuildParameterPage( getClass(), String.format("%s.jelly", value.getClass().getSimpleName()) - ); + ); } // Else we return that we haven't found anything. From af88dd9dcb44ed66d3067436bf9c3bb0c948c718 Mon Sep 17 00:00:00 2001 From: Owen Wood Date: Mon, 7 Dec 2015 16:33:58 +1000 Subject: [PATCH 3/6] JENKINS-31843 - Added tests --- .../rebuild/RebuildValidatorTest.java | 109 ++++++++++++++++++ ...ectionContainingStringParameterValues.java | 47 ++++++++ ...ectionContainingStringParameterValues.java | 30 +++++ .../matchers/StringParameterValueMatcher.java | 30 +++++ 4 files changed, 216 insertions(+) create mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java create mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java create mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java diff --git a/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java b/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java index 58d51dbe..416c05c9 100644 --- a/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java +++ b/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java @@ -50,6 +50,11 @@ import java.util.List; import java.util.concurrent.ExecutionException; +import static com.sonyericsson.rebuild.matchers.IsCollectionContainingStringParameterValues.hasStringParamValues; +import static com.sonyericsson.rebuild.matchers.IsNotCollectionContainingStringParameterValues.hasNoStringParamValues; +import static com.sonyericsson.rebuild.matchers.StringParameterValueMatcher.equalToStringParamValue; +import static org.junit.Assert.assertThat; + /** * For testing the extension point. * @@ -393,6 +398,110 @@ public void testRebuildSupportedUnknownParameterValue() throws Exception { page.asText().contains("This is a mark for test")); } + public void testWhenProjectWithExistingParamAndOverridingParamWhenRebuild() + throws Exception { + FreeStyleProject project = createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty( + new StringParameterDefinition("existing", "defaultValue"))); + + // Build (#1) + project.scheduleBuild2(0, new Cause.UserIdCause(), + new ParametersAction(new StringParameterValue("existing", "overridingValue"))) + .get(); + HtmlPage rebuildConfigPage = createWebClient().getPage(project, + "1/rebuild"); + // Rebuild (#2) + submit(rebuildConfigPage.getFormByName("config")); + + List parameterValues = project.getBuildByNumber(2).getAction(ParametersAction.class).getParameters(); + + assertThat(parameterValues, hasStringParamValues(equalToStringParamValue("existing", "overridingValue"))); + assertThat(parameterValues, hasNoStringParamValues(equalToStringParamValue("existing", "defaultValue"))); + } + + public void testWhenProjectWithExistingParamAndOverridingParamWhenRebuildOfLastBuild() + throws Exception { + FreeStyleProject project = createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty( + new StringParameterDefinition("existing", "defaultValue"))); + + // Build (#1) + project.scheduleBuild2(0, new Cause.UserIdCause(), + new ParametersAction(new StringParameterValue("existing", "overridingValue"))) + .get(); + HtmlPage rebuildConfigPage = createWebClient().getPage(project, + "1/rebuild"); + // Rebuild (#2) + submit(rebuildConfigPage.getFormByName("config")); + + HtmlPage projectPage = createWebClient().getPage(project); + WebAssert.assertLinkPresentWithText(projectPage, "Rebuild Last"); + + HtmlAnchor rebuildHref = projectPage.getAnchorByText("Rebuild Last"); + assertEquals("Rebuild Last should point to the second build", "/" + + project.getUrl() + "lastCompletedBuild/rebuild", + rebuildHref.getHrefAttribute()); + + List parameterValues = project.getLastCompletedBuild().getAction(ParametersAction.class).getParameters(); + + assertThat(parameterValues, hasStringParamValues(equalToStringParamValue("existing", "overridingValue"))); + assertThat(parameterValues, hasNoStringParamValues(equalToStringParamValue("existing", "defaultValue"))); + } + + public void testWhenProjectWithExistingParamAndInjectedParamWhenRebuild() + throws Exception { + FreeStyleProject project = createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty( + new StringParameterDefinition("oldName", "oldValue"))); + + // Build (#1) + project.scheduleBuild2(0, new Cause.UserIdCause(), + new ParametersAction(new StringParameterValue("injectedName", "injectedValue"))) + .get(); + HtmlPage rebuildConfigPage = createWebClient().getPage(project, + "1/rebuild"); + // Rebuild (#2) + submit(rebuildConfigPage.getFormByName("config")); + + List parameterValues = project.getBuildByNumber(2).getAction(ParametersAction.class).getParameters(); + + assertThat(parameterValues, hasStringParamValues( + equalToStringParamValue("oldName", "oldValue"), + equalToStringParamValue("injectedName", "injectedValue") + )); + } + + public void testWhenProjectWithExistingParamAndInjectedParamWhenRebuildOfLastBuild() + throws Exception { + FreeStyleProject project = createFreeStyleProject(); + project.addProperty(new ParametersDefinitionProperty( + new StringParameterDefinition("oldName", "oldValue"))); + + // Build (#1) + project.scheduleBuild2(0, new Cause.UserIdCause(), + new ParametersAction(new StringParameterValue("injectedName", "injectedValue"))) + .get(); + HtmlPage rebuildConfigPage = createWebClient().getPage(project, + "1/rebuild"); + // Rebuild (#2) + submit(rebuildConfigPage.getFormByName("config")); + + HtmlPage projectPage = createWebClient().getPage(project); + WebAssert.assertLinkPresentWithText(projectPage, "Rebuild Last"); + + HtmlAnchor rebuildHref = projectPage.getAnchorByText("Rebuild Last"); + assertEquals("Rebuild Last should point to the second build", "/" + + project.getUrl() + "lastCompletedBuild/rebuild", + rebuildHref.getHrefAttribute()); + + List parameterValues = project.getLastCompletedBuild().getAction(ParametersAction.class).getParameters(); + + assertThat(parameterValues, hasStringParamValues( + equalToStringParamValue("oldName", "oldValue"), + equalToStringParamValue("injectedName", "injectedValue") + )); + } + /** * A parameter value rebuild plugin does not know. */ diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java b/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java new file mode 100644 index 00000000..f25f6abe --- /dev/null +++ b/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java @@ -0,0 +1,47 @@ +package com.sonyericsson.rebuild.matchers; + +import hudson.model.ParameterValue; +import org.hamcrest.Description; +import org.junit.internal.matchers.TypeSafeMatcher; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public final class IsCollectionContainingStringParameterValues extends TypeSafeMatcher> { + + private final List matchers; + + public static IsCollectionContainingStringParameterValues hasStringParamValues(StringParameterValueMatcher... items) { + return new IsCollectionContainingStringParameterValues(items); + } + + IsCollectionContainingStringParameterValues(StringParameterValueMatcher... items) { + this.matchers = new ArrayList(items.length); + for (StringParameterValueMatcher matcher : items) { + matchers.add(matcher); + } + } + + @Override + public boolean matchesSafely(Collection items) { + Map resultMap = new HashMap(); + for (StringParameterValueMatcher stringParameterValueMatcher : matchers) { + resultMap.put(stringParameterValueMatcher, false); + for (ParameterValue item : items) { + if (stringParameterValueMatcher.matches(item)) { + resultMap.replace(stringParameterValueMatcher, true); + break; + } + } + } + return !resultMap.values().contains(false); + } + + @Override + public void describeTo(Description description) { + description.appendList("<[", ", ", "]>", matchers); + } +} diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java b/src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java new file mode 100644 index 00000000..c37829d3 --- /dev/null +++ b/src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java @@ -0,0 +1,30 @@ +package com.sonyericsson.rebuild.matchers; + +import hudson.model.ParameterValue; +import org.hamcrest.Description; +import org.junit.internal.matchers.TypeSafeMatcher; + +import java.util.Collection; + +public final class IsNotCollectionContainingStringParameterValues extends TypeSafeMatcher> { + + private final IsCollectionContainingStringParameterValues delegate; + + public static IsNotCollectionContainingStringParameterValues hasNoStringParamValues(StringParameterValueMatcher... items) { + return new IsNotCollectionContainingStringParameterValues(items); + } + + private IsNotCollectionContainingStringParameterValues(StringParameterValueMatcher... items) { + delegate = new IsCollectionContainingStringParameterValues(items); + } + + @Override + public boolean matchesSafely(Collection items) { + return !delegate.matchesSafely(items); + } + + @Override + public void describeTo(Description description) { + delegate.describeTo(description); + } +} diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java b/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java new file mode 100644 index 00000000..23f9b39b --- /dev/null +++ b/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java @@ -0,0 +1,30 @@ +package com.sonyericsson.rebuild.matchers; + +import hudson.model.StringParameterValue; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; + +public final class StringParameterValueMatcher extends BaseMatcher { + + private final StringParameterValue thisParameterValue; + + StringParameterValueMatcher(StringParameterValue thisParameterValue) { + this.thisParameterValue = thisParameterValue; + } + + public static StringParameterValueMatcher equalToStringParamValue(String name, String value) { + return new StringParameterValueMatcher(new StringParameterValue(name, value)); + } + + @Override + public boolean matches(Object parameterValue) { + return parameterValue instanceof StringParameterValue + && thisParameterValue.getName().equals(((StringParameterValue)parameterValue).getName()) + && thisParameterValue.value.equals(((StringParameterValue)parameterValue).value); + } + + @Override + public void describeTo(Description description) { + description.appendText(thisParameterValue.toString()); + } +} From 87f1de37dd55f3ce9384e592569bc54e14b836af Mon Sep 17 00:00:00 2001 From: Owen Wood Date: Fri, 11 Dec 2015 10:53:28 +1000 Subject: [PATCH 4/6] JENKINS-31843 - Added null check for paramAction --- src/main/java/com/sonyericsson/rebuild/RebuildAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sonyericsson/rebuild/RebuildAction.java b/src/main/java/com/sonyericsson/rebuild/RebuildAction.java index d743b6f0..31fbb856 100644 --- a/src/main/java/com/sonyericsson/rebuild/RebuildAction.java +++ b/src/main/java/com/sonyericsson/rebuild/RebuildAction.java @@ -302,7 +302,7 @@ public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws Servl public int compare(ParameterValue o1, ParameterValue o2) { return o1.getName().compareTo(o2.getName()); } - }, Iterables.concat(values, paramAction.getParameters())); + }, Iterables.concat(values, paramAction == null ? new ArrayList() : paramAction.getParameters())); List actions = constructRebuildCause(build, new ParametersAction(Lists.newArrayList(mergedValues))); Hudson.getInstance().getQueue().schedule((Queue.Task) build.getParent(), 0, actions); From ce52b5d1530fabf011d5d5f2bfdba9966cc6b1cc Mon Sep 17 00:00:00 2001 From: Owen Wood Date: Fri, 11 Dec 2015 11:57:37 +1000 Subject: [PATCH 5/6] JENKINS-31843 - Replaced map.replace (1.8) with map.put (1.7) --- .../matchers/IsCollectionContainingStringParameterValues.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java b/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java index f25f6abe..e4513b43 100644 --- a/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java +++ b/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java @@ -32,7 +32,7 @@ public boolean matchesSafely(Collection items) { resultMap.put(stringParameterValueMatcher, false); for (ParameterValue item : items) { if (stringParameterValueMatcher.matches(item)) { - resultMap.replace(stringParameterValueMatcher, true); + resultMap.put(stringParameterValueMatcher, true); break; } } From 753ef9d70b0a060bb79dedd1bd9159ba5f52b925 Mon Sep 17 00:00:00 2001 From: Owen Wood Date: Tue, 22 Dec 2015 06:51:59 +1000 Subject: [PATCH 6/6] JENKINS-31843 - Refactored matchers and test names --- .../rebuild/RebuildValidatorTest.java | 29 +++++----- ...ectionContainingStringParameterValues.java | 47 ---------------- ...ectionContainingStringParameterValues.java | 30 ----------- .../matchers/StringParameterValueMatcher.java | 30 ----------- .../StringParameterValuesMatcher.java | 54 +++++++++++++++++++ 5 files changed, 68 insertions(+), 122 deletions(-) delete mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java delete mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java delete mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java create mode 100644 src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValuesMatcher.java diff --git a/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java b/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java index 416c05c9..33aaee31 100644 --- a/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java +++ b/src/test/java/com/sonyericsson/rebuild/RebuildValidatorTest.java @@ -50,9 +50,8 @@ import java.util.List; import java.util.concurrent.ExecutionException; -import static com.sonyericsson.rebuild.matchers.IsCollectionContainingStringParameterValues.hasStringParamValues; -import static com.sonyericsson.rebuild.matchers.IsNotCollectionContainingStringParameterValues.hasNoStringParamValues; -import static com.sonyericsson.rebuild.matchers.StringParameterValueMatcher.equalToStringParamValue; +import static com.sonyericsson.rebuild.matchers.StringParameterValuesMatcher.hasStringParamValues; +import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertThat; /** @@ -398,7 +397,7 @@ public void testRebuildSupportedUnknownParameterValue() throws Exception { page.asText().contains("This is a mark for test")); } - public void testWhenProjectWithExistingParamAndOverridingParamWhenRebuild() + public void testNewParametersShouldOverrideExistingParametersIfHaveSameName() throws Exception { FreeStyleProject project = createFreeStyleProject(); project.addProperty(new ParametersDefinitionProperty( @@ -415,11 +414,11 @@ public void testWhenProjectWithExistingParamAndOverridingParamWhenRebuild() List parameterValues = project.getBuildByNumber(2).getAction(ParametersAction.class).getParameters(); - assertThat(parameterValues, hasStringParamValues(equalToStringParamValue("existing", "overridingValue"))); - assertThat(parameterValues, hasNoStringParamValues(equalToStringParamValue("existing", "defaultValue"))); + assertThat(parameterValues, hasStringParamValues(new StringParameterValue("existing", "overridingValue"))); + assertThat(parameterValues, not(hasStringParamValues(new StringParameterValue("existing", "defaultValue")))); } - public void testWhenProjectWithExistingParamAndOverridingParamWhenRebuildOfLastBuild() + public void testRebuildingLastBuildShouldMaintainExistingParameters() throws Exception { FreeStyleProject project = createFreeStyleProject(); project.addProperty(new ParametersDefinitionProperty( @@ -444,11 +443,11 @@ public void testWhenProjectWithExistingParamAndOverridingParamWhenRebuildOfLastB List parameterValues = project.getLastCompletedBuild().getAction(ParametersAction.class).getParameters(); - assertThat(parameterValues, hasStringParamValues(equalToStringParamValue("existing", "overridingValue"))); - assertThat(parameterValues, hasNoStringParamValues(equalToStringParamValue("existing", "defaultValue"))); + assertThat(parameterValues, hasStringParamValues(new StringParameterValue("existing", "overridingValue"))); + assertThat(parameterValues, not(hasStringParamValues(new StringParameterValue("existing", "defaultValue")))); } - public void testWhenProjectWithExistingParamAndInjectedParamWhenRebuild() + public void testInjectedParametersShouldOverrideExistingParametersIfHaveSameName() throws Exception { FreeStyleProject project = createFreeStyleProject(); project.addProperty(new ParametersDefinitionProperty( @@ -466,12 +465,12 @@ public void testWhenProjectWithExistingParamAndInjectedParamWhenRebuild() List parameterValues = project.getBuildByNumber(2).getAction(ParametersAction.class).getParameters(); assertThat(parameterValues, hasStringParamValues( - equalToStringParamValue("oldName", "oldValue"), - equalToStringParamValue("injectedName", "injectedValue") + new StringParameterValue("oldName", "oldValue"), + new StringParameterValue("injectedName", "injectedValue") )); } - public void testWhenProjectWithExistingParamAndInjectedParamWhenRebuildOfLastBuild() + public void testRebuildingLastBuildShouldMaintainInjectedParameters() throws Exception { FreeStyleProject project = createFreeStyleProject(); project.addProperty(new ParametersDefinitionProperty( @@ -497,8 +496,8 @@ public void testWhenProjectWithExistingParamAndInjectedParamWhenRebuildOfLastBui List parameterValues = project.getLastCompletedBuild().getAction(ParametersAction.class).getParameters(); assertThat(parameterValues, hasStringParamValues( - equalToStringParamValue("oldName", "oldValue"), - equalToStringParamValue("injectedName", "injectedValue") + new StringParameterValue("oldName", "oldValue"), + new StringParameterValue("injectedName", "injectedValue") )); } diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java b/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java deleted file mode 100644 index e4513b43..00000000 --- a/src/test/java/com/sonyericsson/rebuild/matchers/IsCollectionContainingStringParameterValues.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sonyericsson.rebuild.matchers; - -import hudson.model.ParameterValue; -import org.hamcrest.Description; -import org.junit.internal.matchers.TypeSafeMatcher; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public final class IsCollectionContainingStringParameterValues extends TypeSafeMatcher> { - - private final List matchers; - - public static IsCollectionContainingStringParameterValues hasStringParamValues(StringParameterValueMatcher... items) { - return new IsCollectionContainingStringParameterValues(items); - } - - IsCollectionContainingStringParameterValues(StringParameterValueMatcher... items) { - this.matchers = new ArrayList(items.length); - for (StringParameterValueMatcher matcher : items) { - matchers.add(matcher); - } - } - - @Override - public boolean matchesSafely(Collection items) { - Map resultMap = new HashMap(); - for (StringParameterValueMatcher stringParameterValueMatcher : matchers) { - resultMap.put(stringParameterValueMatcher, false); - for (ParameterValue item : items) { - if (stringParameterValueMatcher.matches(item)) { - resultMap.put(stringParameterValueMatcher, true); - break; - } - } - } - return !resultMap.values().contains(false); - } - - @Override - public void describeTo(Description description) { - description.appendList("<[", ", ", "]>", matchers); - } -} diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java b/src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java deleted file mode 100644 index c37829d3..00000000 --- a/src/test/java/com/sonyericsson/rebuild/matchers/IsNotCollectionContainingStringParameterValues.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sonyericsson.rebuild.matchers; - -import hudson.model.ParameterValue; -import org.hamcrest.Description; -import org.junit.internal.matchers.TypeSafeMatcher; - -import java.util.Collection; - -public final class IsNotCollectionContainingStringParameterValues extends TypeSafeMatcher> { - - private final IsCollectionContainingStringParameterValues delegate; - - public static IsNotCollectionContainingStringParameterValues hasNoStringParamValues(StringParameterValueMatcher... items) { - return new IsNotCollectionContainingStringParameterValues(items); - } - - private IsNotCollectionContainingStringParameterValues(StringParameterValueMatcher... items) { - delegate = new IsCollectionContainingStringParameterValues(items); - } - - @Override - public boolean matchesSafely(Collection items) { - return !delegate.matchesSafely(items); - } - - @Override - public void describeTo(Description description) { - delegate.describeTo(description); - } -} diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java b/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java deleted file mode 100644 index 23f9b39b..00000000 --- a/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValueMatcher.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sonyericsson.rebuild.matchers; - -import hudson.model.StringParameterValue; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; - -public final class StringParameterValueMatcher extends BaseMatcher { - - private final StringParameterValue thisParameterValue; - - StringParameterValueMatcher(StringParameterValue thisParameterValue) { - this.thisParameterValue = thisParameterValue; - } - - public static StringParameterValueMatcher equalToStringParamValue(String name, String value) { - return new StringParameterValueMatcher(new StringParameterValue(name, value)); - } - - @Override - public boolean matches(Object parameterValue) { - return parameterValue instanceof StringParameterValue - && thisParameterValue.getName().equals(((StringParameterValue)parameterValue).getName()) - && thisParameterValue.value.equals(((StringParameterValue)parameterValue).value); - } - - @Override - public void describeTo(Description description) { - description.appendText(thisParameterValue.toString()); - } -} diff --git a/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValuesMatcher.java b/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValuesMatcher.java new file mode 100644 index 00000000..2d8a05d0 --- /dev/null +++ b/src/test/java/com/sonyericsson/rebuild/matchers/StringParameterValuesMatcher.java @@ -0,0 +1,54 @@ +package com.sonyericsson.rebuild.matchers; + +import hudson.model.ParameterValue; +import hudson.model.StringParameterValue; +import org.hamcrest.Description; +import org.junit.internal.matchers.TypeSafeMatcher; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public final class StringParameterValuesMatcher extends TypeSafeMatcher> { + + private final List thisParameters; + + public static StringParameterValuesMatcher hasStringParamValues(StringParameterValue... parameters) { + return new StringParameterValuesMatcher(parameters); + } + + StringParameterValuesMatcher(StringParameterValue... parameters) { + this.thisParameters = new ArrayList(parameters.length); + for (StringParameterValue parameter : parameters) { + thisParameters.add(parameter); + } + } + + @Override + public boolean matchesSafely(Collection parameters) { + Map resultMap = new HashMap(); + for (StringParameterValue stringParameterValue : thisParameters) { + resultMap.put(stringParameterValue, false); + for (ParameterValue parameter : parameters) { + if (matchesInternal(stringParameterValue, parameter)) { + resultMap.put(stringParameterValue, true); + break; + } + } + } + return !resultMap.values().contains(false); + } + + private boolean matchesInternal(StringParameterValue thisParameter, ParameterValue parameter) { + return parameter instanceof StringParameterValue + && thisParameter.getName().equals((parameter).getName()) + && thisParameter.value.equals(((StringParameterValue)parameter).value); + } + + @Override + public void describeTo(Description description) { + description.appendValueList("<[", ", ", "]>", thisParameters); + } +}