/* * The MIT License * * Copyright (c) 2012-2013 IKEDA Yasuyuki * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package jp.ikedam.jenkins.plugins.jobcopy_builder; import java.io.IOException; import java.io.PrintStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import jenkins.model.Jenkins; import hudson.EnvVars; import hudson.matrix.Axis; import hudson.matrix.AxisList; import hudson.matrix.MatrixProject; import hudson.matrix.TextAxis; import hudson.model.FreeStyleBuild; import hudson.model.Cause; import hudson.model.Descriptor.FormException; import hudson.model.FreeStyleProject; import hudson.model.ParametersAction; import hudson.model.ParametersDefinitionProperty; import hudson.model.StringParameterDefinition; import hudson.model.StringParameterValue; import hudson.model.Result; import hudson.plugins.promoted_builds.JobPropertyImpl; import hudson.plugins.promoted_builds.PromotionProcess; import hudson.plugins.promoted_builds.conditions.DownstreamPassCondition; import hudson.plugins.promoted_builds.conditions.ManualCondition; import hudson.util.ComboBoxModel; import hudson.util.FormValidation; import org.jvnet.hudson.test.HudsonTestCase; import org.xml.sax.SAXException; /** * Tests for JobcopyBuilder, corresponded to Jenkins. * */ public class JobcopyBuilderJenkinsTest extends HudsonTestCase { private JobcopyBuilder.DescriptorImpl getDescriptor() { return (JobcopyBuilder.DescriptorImpl)(new JobcopyBuilder(null, null, false, null, null)).getDescriptor(); } public void testDescriptorDoFillFromJobNameItems() throws IOException { JobcopyBuilder.DescriptorImpl descriptor = getDescriptor(); // Job will be added after new job created. ComboBoxModel beforeList = descriptor.doFillFromJobNameItems(); FreeStyleProject project = createFreeStyleProject("testDescriptorDoFillFromJobNameItems1"); String newJobname = project.getName(); ComboBoxModel afterList = descriptor.doFillFromJobNameItems(); assertEquals("new job created", beforeList.size() + 1, afterList.size()); assertTrue("new job created", afterList.contains(newJobname)); } public void testDescriptorDoCheckFromJobName() throws IOException { JobcopyBuilder.DescriptorImpl descriptor = getDescriptor(); FreeStyleProject project = createFreeStyleProject("testDescriptorDoCheckFromJobName1"); String existJobname = project.getName(); // exist job { assertEquals( "exist job", FormValidation.Kind.OK, descriptor.doCheckFromJobName(existJobname).kind ); } // exist job surrounded with blank { assertEquals( "exist job surrounded with blank", FormValidation.Kind.OK, descriptor.doCheckFromJobName(" " + existJobname + " ").kind ); } // non-exist job { assertEquals( "non-exist job", FormValidation.Kind.WARNING, descriptor.doCheckFromJobName("nosuchjob").kind ); } // uses variable { assertEquals( "uses variable", FormValidation.Kind.OK, descriptor.doCheckFromJobName("nosuchjob${name}").kind ); } // escaped dollar { // Not warned even if no such job exists. assertEquals( "escaped dollar", FormValidation.Kind.OK, descriptor.doCheckFromJobName("$$nosuchjob").kind ); } // null { assertEquals( "null", FormValidation.Kind.ERROR, descriptor.doCheckFromJobName(null).kind ); } // empty { assertEquals( "empty", FormValidation.Kind.ERROR, descriptor.doCheckFromJobName("").kind ); } // blank { assertEquals( "blank", FormValidation.Kind.ERROR, descriptor.doCheckFromJobName(" ").kind ); } } public void testDescriptorDoCheckToJobName() throws IOException { JobcopyBuilder.DescriptorImpl descriptor = getDescriptor(); FreeStyleProject project = createFreeStyleProject("testDescriptorDoCheckToJobName1"); String existJobname = project.getName(); // exist job, overwrite { assertEquals( "exist job, overwrite", FormValidation.Kind.OK, descriptor.doCheckToJobName(existJobname, true).kind ); } // exist job, not overwrite { assertEquals( "exist job, not overwrite", FormValidation.Kind.WARNING, descriptor.doCheckToJobName(existJobname, false).kind ); } // exist job surrounded with blank, not overwrite { assertEquals( "exist job surrounded with blank, not overwrite", FormValidation.Kind.WARNING, descriptor.doCheckToJobName(" " + existJobname + " ", false).kind ); } // non-exist job, overwrite { assertEquals( "non-exist job", FormValidation.Kind.OK, descriptor.doCheckToJobName("nosuchjob", true).kind ); } // non-exist job, not overwrite { assertEquals( "non-exist job", FormValidation.Kind.OK, descriptor.doCheckToJobName("nosuchjob", false).kind ); } // uses variable { assertEquals( "uses variable", FormValidation.Kind.OK, descriptor.doCheckToJobName("nosuchjob${name}", false).kind ); } // null { assertEquals( "null", FormValidation.Kind.ERROR, descriptor.doCheckToJobName(null, false).kind ); } // empty { assertEquals( "empty", FormValidation.Kind.ERROR, descriptor.doCheckToJobName("", false).kind ); } // blank { assertEquals( "blank", FormValidation.Kind.ERROR, descriptor.doCheckToJobName(" ", false).kind ); } } /** * Test cases that builds succeed * @throws IOException * @throws InterruptedException * @throws ExecutionException */ public void testPerform() throws IOException, InterruptedException, ExecutionException { FreeStyleProject fromJob = createFreeStyleProject("testPerform1"); String toJobName = "JobCopiedTo"; FreeStyleProject toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); if(toJob != null) { toJob.delete(); } // Set up the job copied from. // Define parameters replaced in ReplaceOperation fromJob.addProperty(new ParametersDefinitionProperty( new StringParameterDefinition( "PARAM1", "DEFAULTVALUE", "Description" ) )); // disable the job. fromJob.disable(); fromJob.save(); ParametersAction paramAction = new ParametersAction( new StringParameterValue("fromJobName", fromJob.getName()), new StringParameterValue("toJobName", toJobName) ); // No variable use. { List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new EnableOperation()); lst.add(new ReplaceOperation( "PARAM1", false, "PARAM2", false )); JobcopyBuilder target = new JobcopyBuilder(fromJob.getName(), toJobName, false, lst, null); FreeStyleProject project = createFreeStyleProject("testPerform2"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("No variable use", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("No variable use", toJob); assertFalse("No variable use", toJob.isDisabled()); ParametersDefinitionProperty prop = toJob.getAction(ParametersDefinitionProperty.class); assertFalse("No variable use", prop.getParameterDefinitionNames().contains("PARAM1")); assertTrue("No variable use", prop.getParameterDefinitionNames().contains("PARAM2")); toJob.delete(); } // Using variables. { List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new EnableOperation()); lst.add(new ReplaceOperation( "PARAM1", false, "PARAM2", false )); JobcopyBuilder target = new JobcopyBuilder("${fromJobName}", "${toJobName}", false, lst, null); FreeStyleProject project = createFreeStyleProject("testPerform3"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("Using variables", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("Using variables", toJob); assertFalse("Using variables", toJob.isDisabled()); ParametersDefinitionProperty prop = toJob.getAction(ParametersDefinitionProperty.class); assertFalse("Using variables", prop.getParameterDefinitionNames().contains("PARAM1")); assertTrue("Using variables", prop.getParameterDefinitionNames().contains("PARAM2")); toJob.delete(); } // overwrite { // create new job { List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new EnableOperation()); JobcopyBuilder target = new JobcopyBuilder(fromJob.getName(), toJobName, false, lst, null); FreeStyleProject project = createFreeStyleProject("testPerform4"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("overwrite(create a new job)", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("overwrite(create a new job)", toJob); assertFalse("overwrite(create a new job)", toJob.isDisabled()); ParametersDefinitionProperty prop = toJob.getAction(ParametersDefinitionProperty.class); assertTrue("overwrite(create a new job)", prop.getParameterDefinitionNames().contains("PARAM1")); assertFalse("overwrite(create a new job)", prop.getParameterDefinitionNames().contains("PARAM2")); toJob.save(); // Execute it. assertEquals("overwrite(create a new job)", 0, toJob.getBuilds().size()); b = toJob.scheduleBuild2(toJob.getQuietPeriod()).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("overwrite(create a new job)", 1, toJob.getBuilds().size()); } // overwrite { List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new ReplaceOperation( "PARAM1", false, "PARAM2", false )); JobcopyBuilder target = new JobcopyBuilder(fromJob.getName(), toJobName, true, lst, null); FreeStyleProject project = createFreeStyleProject("testPerform5"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("overwrite(overwrite)", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("overwrite(overwrite)", toJob); assertTrue("overwrite(overwrite)", toJob.isDisabled()); ParametersDefinitionProperty prop = toJob.getAction(ParametersDefinitionProperty.class); assertFalse("overwrite(overwrite)", prop.getParameterDefinitionNames().contains("PARAM1")); assertTrue("overwrite(overwrite)", prop.getParameterDefinitionNames().contains("PARAM2")); assertEquals("overwrite(overwrite)", 1, toJob.getBuilds().size()); } toJob.delete(); } // null for jobcopyOperationList { JobcopyBuilder target = new JobcopyBuilder(fromJob.getName(), toJobName, false, null, null); FreeStyleProject project = createFreeStyleProject("testPerform6"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("null for jobcopyOperationList", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("null for jobcopyOperationList", toJob); toJob.delete(); } // empty for jobcopyOperationList { JobcopyBuilder target = new JobcopyBuilder(fromJob.getName(), toJobName, false, new ArrayList<JobcopyOperation>(0), null); FreeStyleProject project = createFreeStyleProject("testPerform7"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("empty for jobcopyOperationList", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("empty for jobcopyOperationList", toJob); toJob.delete(); } } /** * Used for a error case test. * * This class must be serializable, so anonymous class cannot be applied. */ static private class NullJobcopyOperation extends JobcopyOperation implements Serializable { private static final long serialVersionUID = -4314651910414654207L; @Override public String perform(String xmlString, String encoding, EnvVars env, PrintStream logger) { return null; } }; /** * Test cases that builds fail * @throws IOException * @throws ExecutionException * @throws InterruptedException */ public void testPerformError() throws IOException, InterruptedException, ExecutionException { FreeStyleProject project = createFreeStyleProject("testPerformError1"); String toJobName = "JobCopiedTo"; FreeStyleProject toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); if(toJob != null) { toJob.delete(); } ParametersAction paramAction = new ParametersAction( new StringParameterValue("EMPTY", ""), new StringParameterValue("NOSUCHJOB", "nosuchjob") ); // From Job Name is null. { JobcopyBuilder target = new JobcopyBuilder(null, toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From Job Name is null", Result.FAILURE, b.getResult()); } // From Job Name is empty. { JobcopyBuilder target = new JobcopyBuilder("", toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From Job Name is empty", Result.FAILURE, b.getResult()); } // From Job Name is blank. { JobcopyBuilder target = new JobcopyBuilder(" ", toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From Job Name is blank", Result.FAILURE, b.getResult()); } // From Job Name gets empty. { JobcopyBuilder target = new JobcopyBuilder("${EMPTY}", toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From Job Name gets empty", Result.FAILURE, b.getResult()); } // From Job Name gets blank. { JobcopyBuilder target = new JobcopyBuilder(" ${EMPTY} ", toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From Job Name gets blank", Result.FAILURE, b.getResult()); } // To Job Name is null. { JobcopyBuilder target = new JobcopyBuilder(project.getName(), null, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("To Job Name is null", Result.FAILURE, b.getResult()); } // To Job Name is empty. { JobcopyBuilder target = new JobcopyBuilder(project.getName(), "", true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("To Job Name is empty", Result.FAILURE, b.getResult()); } // To Job Name is blank. { JobcopyBuilder target = new JobcopyBuilder(project.getName(), " ", true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("To Job Name is blank", Result.FAILURE, b.getResult()); } // To Job Name gets empty. { JobcopyBuilder target = new JobcopyBuilder(project.getName(), "${EMPTY}", true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("To Job Name gets empty", Result.FAILURE, b.getResult()); } // To Job Name gets blank. { JobcopyBuilder target = new JobcopyBuilder(project.getName(), " ${EMPTY} ", true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("To Job Name gets blank", Result.FAILURE, b.getResult()); } // From job does not exist. { JobcopyBuilder target = new JobcopyBuilder("nosuchjob", toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From job does not exist", Result.FAILURE, b.getResult()); } // From job(expanded) does not exist. { JobcopyBuilder target = new JobcopyBuilder("${NOSUCHJOB}", toJobName, true, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("From job(expanded) does not exist.", Result.FAILURE, b.getResult()); } // To job exists, and not overwrite. { FreeStyleProject existJob = createFreeStyleProject("testPerformError2"); JobcopyBuilder target = new JobcopyBuilder(project.getName(), existJob.getName(), false, new ArrayList<JobcopyOperation>(), null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("To job exists, and not overwrite", Result.FAILURE, b.getResult()); } // JobcopyOperation returned error. { List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new NullJobcopyOperation()); JobcopyBuilder target = new JobcopyBuilder(project.getName(), toJobName, true, lst, null); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("JobcopyOperation returned error.", Result.FAILURE, b.getResult()); } // Failed to create a job // I have no idea to achieve this... } // Test the behavior with AdditionalFileset public void testPerformWithAdditionalFileset() throws IOException, InterruptedException, FormException, ExecutionException { FreeStyleProject fromJob = createFreeStyleProject("testPerformWithAdditionalFileset1"); String toJobName = "JobCopiedTo"; FreeStyleProject toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); if(toJob != null) { toJob.delete(); } // Set up the job copied from. // Define Promoted Builds. { JobPropertyImpl promotion = new JobPropertyImpl(fromJob); fromJob.addProperty(promotion); PromotionProcess process1 = promotion.addProcess("Downstream"); process1.icon = "Gold Star"; process1.conditions.add(new DownstreamPassCondition("Downstream-Test-1")); PromotionProcess process2 = promotion.addProcess("Manual"); process2.icon = "Green Star"; process2.conditions.add(new ManualCondition()); } fromJob.save(); ParametersAction paramAction = new ParametersAction( new StringParameterValue("fromJobName", fromJob.getName()), new StringParameterValue("toJobName", toJobName) ); // Copy all files { List<JobcopyOperation> opList = new ArrayList<JobcopyOperation>(); opList.add(new ReplaceOperation( "Test-1", false, "Test-2", false )); List<AdditionalFileset> filesetList = new ArrayList<AdditionalFileset>(); filesetList.add(new AdditionalFileset( "promotions/*/config.xml", null, false, opList )); JobcopyBuilder target = new JobcopyBuilder( fromJob.getName(), toJobName, false, null, filesetList ); FreeStyleProject project = createFreeStyleProject("testPerformWithAdditionalFileset2"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("Copy all files", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("Copy all files", toJob); JobPropertyImpl promotion = toJob.getProperty(JobPropertyImpl.class); assertNotNull("Copy all files", promotion); assertEquals("Copy all files", 2, promotion.getItems().size()); // Downstream // Gold Star // Downstream-Test-1 PromotionProcess process1 = promotion.getItem("Downstream"); assertNotNull("Copy all files", process1); assertEquals("Copy all files", "Gold Star", process1.getIcon()); assertEquals("Copy all files", 1, process1.conditions.size()); assertTrue("Copy all files", process1.conditions.get(0) instanceof DownstreamPassCondition); assertEquals("Copy all files", "Downstream-Test-2", ((DownstreamPassCondition)process1.conditions.get(0)).getJobs()); // Manual // Green Star PromotionProcess process2 = promotion.getItem("Manual"); assertNotNull("Copy all files", process2); assertEquals("Copy all files", "Green Star", process2.getIcon()); assertEquals("Copy all files", 1, process2.conditions.size()); assertTrue("Copy all files", process2.conditions.get(0) instanceof ManualCondition); toJob.delete(); } // Copy part of files { List<AdditionalFileset> filesetList = new ArrayList<AdditionalFileset>(); filesetList.add(new AdditionalFileset( "promotions/*/config.xml", "promotions/Manual/*", false, null )); JobcopyBuilder target = new JobcopyBuilder( fromJob.getName(), toJobName, false, null, filesetList ); FreeStyleProject project = createFreeStyleProject("testPerformWithAdditionalFileset3"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("Copy part of files", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("Copy part of files", toJob); JobPropertyImpl promotion = toJob.getProperty(JobPropertyImpl.class); assertNotNull("Copy part of files", promotion); assertEquals("Copy part of files", 1, promotion.getItems().size()); assertNotNull("Copy part of files", promotion.getItem("Downstream")); assertNull("Copy part of files", promotion.getItem("Manual")); toJob.delete(); } // Overwrite { // Copy a job { List<JobcopyOperation> opList = new ArrayList<JobcopyOperation>(); List<AdditionalFileset> filesetList = new ArrayList<AdditionalFileset>(); filesetList.add(new AdditionalFileset( "promotions/*/config.xml", null, false, opList )); JobcopyBuilder target = new JobcopyBuilder( fromJob.getName(), toJobName, false, null, filesetList ); FreeStyleProject project = createFreeStyleProject("testPerformWithAdditionalFileset4"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("Overwrite: Create a job", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("Overwrite: Create a job", toJob); JobPropertyImpl promotion = toJob.getProperty(JobPropertyImpl.class); assertNotNull("Overwrite: Create a job", promotion); // Downstream // Gold Star // Downstream-Test-1 PromotionProcess process1 = promotion.getItem("Downstream"); assertNotNull("Overwrite: Create a job", process1); assertTrue("Overwrite: Create a job", process1.conditions.get(0) instanceof DownstreamPassCondition); assertEquals("Overwrite: Create a job", "Downstream-Test-1", ((DownstreamPassCondition)process1.conditions.get(0)).getJobs()); } // not overwrite { List<JobcopyOperation> opList = new ArrayList<JobcopyOperation>(); opList.add(new ReplaceOperation( "Test-1", false, "Test-2", false )); List<AdditionalFileset> filesetList = new ArrayList<AdditionalFileset>(); filesetList.add(new AdditionalFileset( "promotions/*/config.xml", null, false, opList )); JobcopyBuilder target = new JobcopyBuilder( fromJob.getName(), toJobName, true, null, filesetList ); FreeStyleProject project = createFreeStyleProject("testPerformWithAdditionalFileset5"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("Overwrite: not overwrite", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("Overwrite: not overwrite", toJob); JobPropertyImpl promotion = toJob.getProperty(JobPropertyImpl.class); assertNotNull("Overwrite: not overwrite", promotion); // Downstream // Gold Star // Downstream-Test-1 PromotionProcess process1 = promotion.getItem("Downstream"); assertNotNull("Overwrite: not overwrite", process1); assertTrue("Overwrite: not overwrite", process1.conditions.get(0) instanceof DownstreamPassCondition); // Not changed! assertEquals("Overwrite: not overwrite", "Downstream-Test-1", ((DownstreamPassCondition)process1.conditions.get(0)).getJobs()); } // overwrite { List<JobcopyOperation> opList = new ArrayList<JobcopyOperation>(); opList.add(new ReplaceOperation( "Test-1", false, "Test-3", false )); List<AdditionalFileset> filesetList = new ArrayList<AdditionalFileset>(); filesetList.add(new AdditionalFileset( "promotions/*/config.xml", null, true, opList )); JobcopyBuilder target = new JobcopyBuilder( fromJob.getName(), toJobName, true, null, filesetList ); FreeStyleProject project = createFreeStyleProject("testPerformWithAdditionalFileset6"); project.getBuildersList().add(target); FreeStyleBuild b = project.scheduleBuild2( project.getQuietPeriod(), new Cause.UserIdCause(), paramAction ).get(); while(b.isBuilding()) { Thread.sleep(100); } assertEquals("Overwrite: overwrite", Result.SUCCESS, b.getResult()); toJob = (FreeStyleProject)Jenkins.getInstance().getItem(toJobName); assertNotNull("Overwrite: overwrite", toJob); JobPropertyImpl promotion = toJob.getProperty(JobPropertyImpl.class); assertNotNull("Overwrite: overwrite", promotion); // Downstream // Gold Star // Downstream-Test-1 PromotionProcess process1 = promotion.getItem("Downstream"); assertNotNull("Overwrite: not overwrite", process1); assertTrue("Overwrite: not overwrite", process1.conditions.get(0) instanceof DownstreamPassCondition); // changed! assertEquals("Overwrite: not overwrite", "Downstream-Test-3", ((DownstreamPassCondition)process1.conditions.get(0)).getJobs()); } toJob.delete(); } } public void testView() throws IOException, SAXException { List<JobcopyOperation> lst = new ArrayList<JobcopyOperation>(); lst.add(new EnableOperation()); lst.add(new ReplaceOperation( "PARAM1", false, "PARAM2", false )); JobcopyBuilder target = new JobcopyBuilder("fromJob", "toJob", false, lst, null); FreeStyleProject project = createFreeStyleProject("testView1"); project.getBuildersList().add(target); WebClient wc = new WebClient(); wc.getPage(project, "configure"); } // https://github.com/ikedam/jobcopy-builder/issues/11 public void testOverwritingMatrix() throws Exception { String destProjectName = "destProject"; Axis axis1 = new TextAxis("axis1", "value1-1", "value1-2"); Axis axis2 = new TextAxis("axis2", "value2-1", "value2-2"); String combinationFilter = "!(axis1 == \"value1-1\" && axis2 == \"value2-1\")"; MatrixProject srcProject = createMatrixProject(); srcProject.setAxes(new AxisList( axis1, axis2 )); srcProject.setCombinationFilter(combinationFilter); srcProject.save(); FreeStyleProject copier = createFreeStyleProject(); copier.getBuildersList().add(new JobcopyBuilder( srcProject.getName(), destProjectName, true, Collections.<JobcopyOperation>emptyList(), Collections.<AdditionalFileset>emptyList() )); copier.save(); assertBuildStatusSuccess(copier.scheduleBuild2(0)); { MatrixProject p = jenkins.getItemByFullName(destProjectName, MatrixProject.class); assertNotNull(p); assertEquals(combinationFilter, p.getCombinationFilter()); } // Remove an axis and combination filter. srcProject.setCombinationFilter(null); srcProject.setAxes(new AxisList(axis1)); srcProject.save(); assertBuildStatusSuccess(copier.scheduleBuild2(0)); { MatrixProject p = jenkins.getItemByFullName(destProjectName, MatrixProject.class); assertNotNull(p); assertNull(p.getCombinationFilter()); } srcProject.setAxes(new AxisList( axis1, axis2 )); srcProject.setCombinationFilter(combinationFilter); srcProject.save(); assertBuildStatusSuccess(copier.scheduleBuild2(0)); { MatrixProject p = jenkins.getItemByFullName(destProjectName, MatrixProject.class); assertNotNull(p); assertEquals(combinationFilter, p.getCombinationFilter()); } } }