/*
* Copyright 2017 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.remote.work;
import com.google.gson.Gson;
import com.thoughtworks.go.config.ArtifactPlans;
import com.thoughtworks.go.config.ArtifactPropertiesGenerators;
import com.thoughtworks.go.config.EnvironmentVariablesConfig;
import com.thoughtworks.go.config.Resources;
import com.thoughtworks.go.domain.DefaultJobPlan;
import com.thoughtworks.go.domain.JobIdentifier;
import com.thoughtworks.go.domain.MaterialRevision;
import com.thoughtworks.go.domain.MaterialRevisions;
import com.thoughtworks.go.domain.buildcause.BuildCause;
import com.thoughtworks.go.domain.materials.Modification;
import com.thoughtworks.go.helper.MaterialsMother;
import com.thoughtworks.go.helper.ModificationsMother;
import com.thoughtworks.go.util.command.EnvironmentVariableContext;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class BuildAssignmentTest {
@Test
public void shouldStartWithNoEnvironmentContext() throws Exception {
BuildAssignment buildAssignment = BuildAssignment.create(jobForPipeline("foo"), BuildCause.createManualForced(), new ArrayList<>(), null);
assertThat(buildAssignment.initialEnvironmentVariableContext(), is(new EnvironmentVariableContext()));
}
@Test
public void shouldEnhanceInitialEnvironmentContext() throws Exception {
BuildAssignment buildAssignment = BuildAssignment.create(jobForPipeline("foo"), BuildCause.createManualForced(), new ArrayList<>(), null);
buildAssignment.enhanceEnvironmentVariables(new EnvironmentVariableContext("foo", "bar"));
assertThat(buildAssignment.initialEnvironmentVariableContext(), is(new EnvironmentVariableContext("foo", "bar")));
}
@Test
public void shouldNotHaveReferenceToModifiedFilesSinceLargeCommitsCouldCauseBothServerAndAgentsToRunOutOfMemory_MoreoverThisInformationIsNotRequiredOnAgentSide() {
List<Modification> modificationsForSvn = ModificationsMother.multipleModificationList();
List<Modification> modificationsForHg = ModificationsMother.multipleModificationList();
MaterialRevision svn = new MaterialRevision(MaterialsMother.svnMaterial(), modificationsForSvn);
MaterialRevision hg = new MaterialRevision(MaterialsMother.hgMaterial(), modificationsForHg);
MaterialRevisions materialRevisions = new MaterialRevisions(svn, hg);
BuildCause buildCause = BuildCause.createWithModifications(materialRevisions, "user1");
BuildAssignment buildAssignment = BuildAssignment.create(jobForPipeline("foo"), buildCause, new ArrayList<>(), null);
assertThat(buildAssignment.getBuildApprover(), is("user1"));
assertThat(buildAssignment.materialRevisions().getRevisions().size(), is(materialRevisions.getRevisions().size()));
assertRevisions(buildAssignment, svn);
assertRevisions(buildAssignment, hg);
}
@Test
public void shouldCopyAdditionalDataToBuildAssignment() {
MaterialRevision packageMaterialRevision = ModificationsMother.createPackageMaterialRevision("revision");
Map<String, String> additionalData = new HashMap<>();
additionalData.put("a1", "v1");
additionalData.put("a2", "v2");
String additionalDataAsString = new Gson().toJson(additionalData);
packageMaterialRevision.getModifications().first().setAdditionalData(additionalDataAsString);
MaterialRevisions materialRevisions = new MaterialRevisions(packageMaterialRevision);
BuildCause buildCause = BuildCause.createWithModifications(materialRevisions, "user1");
BuildAssignment buildAssignment = BuildAssignment.create(jobForPipeline("foo"), buildCause, new ArrayList<>(), null);
assertThat(buildAssignment.getBuildApprover(), is("user1"));
assertThat(buildAssignment.materialRevisions().getRevisions().size(), is(materialRevisions.getRevisions().size()));
assertRevisions(buildAssignment, packageMaterialRevision);
Modification actualModification = buildAssignment.materialRevisions().getRevisions().get(0).getModification(0);
assertThat(actualModification.getAdditionalData(), is(additionalDataAsString));
assertThat(actualModification.getAdditionalDataMap(), is(additionalData));
}
private void assertRevisions(BuildAssignment buildAssignment, MaterialRevision expectedRevision) {
MaterialRevision actualRevision = buildAssignment.materialRevisions().findRevisionFor(expectedRevision.getMaterial());
assertThat(actualRevision.getMaterial(), is(expectedRevision.getMaterial()));
assertThat(actualRevision.getModifications().size(), is(expectedRevision.getModifications().size()));
for (int i = 0; i < actualRevision.getModifications().size(); i++) {
final Modification actualModification = actualRevision.getModifications().get(i);
final Modification expectedModification = expectedRevision.getModifications().get(i);
assertThat(actualModification.getRevision(), is(expectedModification.getRevision()));
assertThat(actualModification.getModifiedFiles().isEmpty(), is(true));
}
}
private DefaultJobPlan jobForPipeline(String pipelineName) {
JobIdentifier jobIdentifier = new JobIdentifier(pipelineName, 1, "1", "defaultStage", "1", "job1", 100L);
return new DefaultJobPlan(new Resources(), new ArtifactPlans(), new ArtifactPropertiesGenerators(), 1L, jobIdentifier, null, new EnvironmentVariablesConfig(), new EnvironmentVariablesConfig(), null);
}
}