/* * Copyright 2016 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.thoughtworks.go.domain; import com.thoughtworks.go.config.*; import com.thoughtworks.go.util.FileUtil; import com.thoughtworks.go.util.TestFileUtil; import com.thoughtworks.go.util.command.EnvironmentVariableContext; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static com.thoughtworks.go.helper.EnvironmentVariablesConfigMother.env; import static com.thoughtworks.go.utils.SerializationTester.serializeAndDeserialize; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.*; public class DefaultJobPlanTest { private File workingFolder; private File toClean; @Before public void setUp() throws IOException { workingFolder = TestFileUtil.createTempFolder("workingFolder"); File file = new File(workingFolder, "cruise-output/log.xml"); file.getParentFile().mkdirs(); file.createNewFile(); } @After public void tearDown() { FileUtil.deleteFolder(workingFolder); FileUtils.deleteQuietly(toClean); } @Test public void shouldMatchResourcesIfBuildPlanHasNoResources() { DefaultJobPlan plan = new DefaultJobPlan(new Resources(), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); Resources agentResources = new Resources(new Resource("Foo")); assertTrue(plan.match(agentResources)); } @Test public void shouldMatchIfBuildPlanAndAgentHaveSameResources() { DefaultJobPlan plan = new DefaultJobPlan(new Resources(new Resource("Foo")), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); assertTrue(plan.match(new Resources(new Resource("Foo")))); } @Test public void shouldNotMatchIfAgentDonotContainBuildPlanResources() { DefaultJobPlan plan = new DefaultJobPlan(new Resources(new Resource("Foo")), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); assertFalse(plan.match(new Resources(new Resource("Bar")))); } @Test public void shouldMatchIfAgentAndBuildPlanResourcesIrrespectiveOfOrder() { DefaultJobPlan plan = new DefaultJobPlan(new Resources(new Resource("Foo"), new Resource("Bar"), new Resource("car")), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); assertTrue(plan.match( new Resources(new Resource("Bar"), new Resource("car"), new Resource("Foo")))); } @Test public void shouldMatchIfBothAgentAndBuildPlanHaveNotResources() { DefaultJobPlan plan = new DefaultJobPlan(new Resources(), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); assertTrue(plan.match(new Resources())); } @Test public void shouldMergeTestReportFilesAndUploadResult() throws Exception { ArtifactPlans artifactPlans = new ArtifactPlans(); DefaultJobPlan plan = new DefaultJobPlan(new Resources(), artifactPlans, new ArtifactPropertiesGenerators(), -1, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); artifactPlans.add(new TestArtifactPlan("test1", "test")); artifactPlans.add(new TestArtifactPlan("test2", "test")); final File firstTestFolder = prepareTestFolder(workingFolder, "test1"); final File secondTestFolder = prepareTestFolder(workingFolder, "test2"); StubGoPublisher publisher = new StubGoPublisher(); plan.publishArtifacts(publisher, workingFolder); publisher.assertPublished(firstTestFolder.getAbsolutePath(), "test"); publisher.assertPublished(secondTestFolder.getAbsolutePath(), "test"); publisher.assertPublished("result", "testoutput"); publisher.assertPublished("result" + File.separator + "index.html", "testoutput"); } @Test public void shouldReportErrorWithTestArtifactSrcWhenUploadFails() throws Exception { ArtifactPlans artifactPlans = new ArtifactPlans(); DefaultJobPlan plan = new DefaultJobPlan(new Resources(), artifactPlans, new ArtifactPropertiesGenerators(), -1, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); artifactPlans.add(new TestArtifactPlan("test1", "test")); artifactPlans.add(new TestArtifactPlan("test2", "test")); prepareTestFolder(workingFolder, "test1"); prepareTestFolder(workingFolder, "test2"); StubGoPublisher publisherThatShouldFail = new StubGoPublisher(true); try { plan.publishArtifacts(publisherThatShouldFail, workingFolder); } catch (Exception e) { assertThat(e.getMessage(), containsString("Failed to upload [test1, test2]")); } } @Test public void shouldUploadFilesCorrectly() throws Exception { ArtifactPlans artifactPlans = new ArtifactPlans(); final File src1 = TestFileUtil.createTestFolder(workingFolder, "src1"); TestFileUtil.createTestFile(src1, "test.txt"); artifactPlans.add(new ArtifactPlan(src1.getName(), "dest")); final File src2 = TestFileUtil.createTestFolder(workingFolder, "src2"); TestFileUtil.createTestFile(src1, "test.txt"); artifactPlans.add(new ArtifactPlan(src2.getName(), "test")); StubGoPublisher publisher = new StubGoPublisher(); DefaultJobPlan plan = new DefaultJobPlan(new Resources(), artifactPlans, new ArtifactPropertiesGenerators(), -1, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); plan.publishArtifacts(publisher, workingFolder); Map<File, String> expectedFiles = new HashMap<File, String>() { { put(src1, "dest"); put(src2, "test"); } }; assertThat(publisher.publishedFiles(), is(expectedFiles)); } @Test public void shouldUploadFilesWhichMathedWildCard() throws Exception { ArtifactPlans artifactPlans = new ArtifactPlans(); final File src1 = TestFileUtil.createTestFolder(workingFolder, "src1"); final File testFile1 = TestFileUtil.createTestFile(src1, "test1.txt"); final File testFile2 = TestFileUtil.createTestFile(src1, "test2.txt"); final File testFile3 = TestFileUtil.createTestFile(src1, "readme.pdf"); artifactPlans.add(new ArtifactPlan(src1.getName() + "/*", "dest")); StubGoPublisher publisher = new StubGoPublisher(); DefaultJobPlan plan = new DefaultJobPlan(new Resources(), artifactPlans, new ArtifactPropertiesGenerators(), -1, null, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); plan.publishArtifacts(publisher, workingFolder); Map<File, String> expectedFiles = new HashMap<File, String>() { { put(testFile1, "dest"); put(testFile2, "dest"); put(testFile3, "dest"); } }; assertThat(publisher.publishedFiles(), is(expectedFiles)); } @Test public void shouldApplyEnvironmentVariablesWhenRunningTheJob() { EnvironmentVariablesConfig variables = new EnvironmentVariablesConfig(); variables.add("VARIABLE_NAME", "variable value"); DefaultJobPlan plan = new DefaultJobPlan(new Resources(), new ArtifactPlans(), new ArtifactPropertiesGenerators(), -1, null, null, variables, new EnvironmentVariablesConfig(), null); EnvironmentVariableContext variableContext = new EnvironmentVariableContext(); plan.applyTo(variableContext); assertThat(variableContext.getProperty("VARIABLE_NAME"), is("variable value")); } private File prepareTestFolder(File workingFolder, String folderName) throws Exception { File testFolder = TestFileUtil.createTestFolder(workingFolder, folderName); File testFile = TestFileUtil.createTestFile(testFolder, "testFile.xml"); String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<testsuite errors=\"0\" failures=\"0\" tests=\"7\" time=\"0.429\" >\n" + "<testcase/>\n" + "</testsuite>\n"; FileUtil.writeContentToFile(content, testFile); return testFolder; } @Test public void shouldBeAbleToSerializeAndDeserialize() throws ClassNotFoundException, IOException { DefaultJobPlan original = new DefaultJobPlan(new Resources(), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, new JobIdentifier(), "uuid", new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null); DefaultJobPlan clone = (DefaultJobPlan) serializeAndDeserialize(original); assertThat(clone,is(original)); } @Test public void shouldRespectTriggerVariablesOverConfigVariables() { DefaultJobPlan original = new DefaultJobPlan(new Resources(), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 0, new JobIdentifier(), "uuid", env(new String[]{"blah","foo"},new String[]{"value","bar"}), new EnvironmentVariablesConfig(), null); original.setTriggerVariables(env(new String[]{"blah","another"},new String[]{"override","anotherValue"})); EnvironmentVariableContext variableContext = new EnvironmentVariableContext(); original.applyTo(variableContext); assertThat(variableContext.getProperty("blah"),is("override")); assertThat(variableContext.getProperty("foo"),is("bar")); //becuase its a security issue to let operator set values for unconfigured variables assertThat(variableContext.getProperty("another"),is(nullValue())); } }