/*
* 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.config;
import com.rits.cloning.Cloner;
import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig;
import com.thoughtworks.go.config.materials.git.GitMaterialConfig;
import com.thoughtworks.go.config.merge.MergePipelineConfigs;
import com.thoughtworks.go.config.remote.*;
import com.thoughtworks.go.domain.ConfigErrors;
import com.thoughtworks.go.domain.materials.MaterialConfig;
import com.thoughtworks.go.helper.*;
import org.hamcrest.core.Is;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.thoughtworks.go.helper.PartialConfigMother.createRepoOrigin;
import static com.thoughtworks.go.helper.PipelineConfigMother.createGroup;
import static com.thoughtworks.go.helper.PipelineConfigMother.createPipelineConfig;
import static com.thoughtworks.go.util.ArrayUtil.asList;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
public class MergeCruiseConfigTest extends CruiseConfigTestBase {
@Before
public void setup() throws Exception {
pipelines = new BasicPipelineConfigs("existing_group", new Authorization());
cruiseConfig = new BasicCruiseConfig(new BasicCruiseConfig(pipelines), createPartial());
goConfigMother = new GoConfigMother();
}
@Override
protected BasicCruiseConfig createCruiseConfig(BasicPipelineConfigs pipelineConfigs) {
return new BasicCruiseConfig(new BasicCruiseConfig(pipelineConfigs),
// we append one more, remote pipeline in the same group as requested local ones to make test use MergePipelineConfigs
PartialConfigMother.withPipelineInGroup("remote-pipe-1", pipelineConfigs.getGroup()));
}
@Override
protected BasicCruiseConfig createCruiseConfig() {
return new BasicCruiseConfig(new BasicCruiseConfig(), new PartialConfig());
}
@Test
public void shouldMergeWhenSameEnvironmentExistsInManyPartials(){
BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1", "p2");
ConfigRepoConfig repoConfig1 = new ConfigRepoConfig(MaterialConfigsMother.gitMaterialConfig("url1"), "plugin");
ConfigRepoConfig repoConfig2 = new ConfigRepoConfig(MaterialConfigsMother.gitMaterialConfig("url2"), "plugin");
cruiseConfig.setConfigRepos(new ConfigReposConfig(repoConfig1, repoConfig2));
PartialConfig partialConfigInRepo1 = PartialConfigMother.withEnvironment("environment", new RepoConfigOrigin(repoConfig1, "repo1_r1"));
RepoConfigOrigin configOrigin = new RepoConfigOrigin(repoConfig2, "repo2_r1");
PartialConfig partialConfigInRepo2 = PartialConfigMother.withEnvironment("environment", configOrigin);
BasicEnvironmentConfig environment2InRepo2 = EnvironmentConfigMother.environment("environment2_in_repo2");
environment2InRepo2.setOrigins(configOrigin);
partialConfigInRepo2.getEnvironments().add(environment2InRepo2);
cruiseConfig.merge(asList(partialConfigInRepo2, partialConfigInRepo1), false);
assertThat(cruiseConfig.getEnvironments().hasEnvironmentNamed(new CaseInsensitiveString("environment")),is(true));
assertThat(cruiseConfig.getEnvironments().hasEnvironmentNamed(new CaseInsensitiveString("environment2_in_repo2")),is(true));
}
@Test
public void mergeShouldThrowWhenCalledSecondTime() {
cruiseConfig = new BasicCruiseConfig(new BasicCruiseConfig(pipelines), PartialConfigMother.withEnvironment("remote-env"));
assertThat(cruiseConfig.getEnvironments().size(),is(1));
try {
cruiseConfig.merge(Arrays.asList(PartialConfigMother.withEnvironment("remote-env")), false);
}
catch (RuntimeException ex)
{
//ok
assertThat(cruiseConfig.getEnvironments().size(),is(1));
cruiseConfig.validateAfterPreprocess();
return;
}
fail("should have thrown");
}
@Test
public void shouldReturnRemoteOriginOfTheGroup()
{
assertThat(cruiseConfig.findGroup("remote_group").getOrigin(), Is.<ConfigOrigin>is(createRepoOrigin()));
}
@Test
public void getAllLocalPipelineConfigs_shouldReturnOnlyLocalPipelinesWhenRemoteExist()
{
PipelineConfig pipeline1 = createPipelineConfig("local-pipe-1", "stage1");
cruiseConfig.getGroups().addPipeline("existing_group", pipeline1);
List<PipelineConfig> localPipelines = cruiseConfig.getAllLocalPipelineConfigs(false);
assertThat(localPipelines.size(),is(1));
assertThat(localPipelines,hasItem(pipeline1));
}
@Test
public void getAllLocalPipelineConfigs_shouldReturnEmptyListWhenNoLocalPipelines()
{
List<PipelineConfig> localPipelines = cruiseConfig.getAllLocalPipelineConfigs(false);
assertThat(localPipelines.size(),is(0));
}
@Test
public void getAllLocalPipelineConfigs_shouldExcludePipelinesReferencedByRemoteEnvironmentWhenRequested()
{
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("local-pipeline-1"));
cruiseConfig = new BasicCruiseConfig(pipelines);
ConfigReposConfig reposConfig = new ConfigReposConfig();
ConfigRepoConfig configRepoConfig = new ConfigRepoConfig(new GitMaterialConfig("http://git"), "myplug");
reposConfig.add(configRepoConfig);
cruiseConfig.setConfigRepos(reposConfig);
PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("remote-pipeline-1", "g2");
BasicEnvironmentConfig remoteEnvironment = new BasicEnvironmentConfig(new CaseInsensitiveString("UAT"));
remoteEnvironment.setOrigins(new RepoConfigOrigin());
// remote environment declares a local pipeline as member
remoteEnvironment.addPipeline(new CaseInsensitiveString("local-pipeline-1"));
partialConfig.getEnvironments().add(remoteEnvironment);
partialConfig.setOrigins(new RepoConfigOrigin(configRepoConfig,"123"));
cruiseConfig.merge(Arrays.asList(partialConfig),true);
assertThat(cruiseConfig.hasPipelineNamed(new CaseInsensitiveString("local-pipeline-1")),is(true));
List<PipelineConfig> localPipelines = cruiseConfig.getAllLocalPipelineConfigs(true);
assertThat(localPipelines.size(),is(0));
}
@Test
public void shouldGetPipelinesWithGroupName() throws Exception {
PipelineConfig pipeline1 = createPipelineConfig("pipeline1", "stage1");
cruiseConfig.getGroups().addPipeline("existing_group", pipeline1);
assertThat(cruiseConfig.pipelines("existing_group"), hasItem(pipeline1));
assertThat(cruiseConfig.pipelines("remote_group").hasPipeline(new CaseInsensitiveString("remote-pipe-1")), is(true));
}
@Test
public void shouldReturnTrueForPipelineThatInFirstGroup_WhenFirstGroupIsLocal() {
PipelineConfigs group1 = createGroup("group1", createPipelineConfig("pipeline1", "stage1"));
CruiseConfig config = new BasicCruiseConfig(new BasicCruiseConfig(group1), new PartialConfig());
assertThat("shouldReturnTrueForPipelineThatInFirstGroup", config.isInFirstGroup(new CaseInsensitiveString("pipeline1")), is(true));
}
@Test
public void shouldReturnTrueForPipelineThatInFirstGroup_WhenFirstGroupIsRemote() {
CruiseConfig config = new BasicCruiseConfig(new BasicCruiseConfig(),
PartialConfigMother.withPipelineInGroup("remote-pipe-1", "remote_group"));
assertThat("shouldReturnTrueForPipelineThatInFirstGroup", config.isInFirstGroup(new CaseInsensitiveString("remote-pipe-1")), is(true));
}
@Test
public void shouldReturnFalseForPipelineThatNotInFirstGroup_WhenSecondGroupIsLocal() {
PipelineConfigs group1 = createGroup("group1", createPipelineConfig("pipeline1", "stage1"));
PipelineConfigs group2 = createGroup("group2", createPipelineConfig("pipeline2", "stage2"));
CruiseConfig config = new BasicCruiseConfig(new BasicCruiseConfig(group1, group2), new PartialConfig());
assertThat("shouldReturnFalseForPipelineThatNotInFirstGroup", config.isInFirstGroup(new CaseInsensitiveString("pipeline2")), is(false));
}
@Test
public void shouldReturnFalseForPipelineThatNotInFirstGroup_WhenSecondGroupIsRemote() {
PipelineConfigs group1 = createGroup("group1", createPipelineConfig("pipeline1", "stage1"));
CruiseConfig config = new BasicCruiseConfig(new BasicCruiseConfig(group1),
PartialConfigMother.withPipelineInGroup("remote-pipe-1", "remote_group"));
assertThat("shouldReturnFalseForPipelineThatNotInFirstGroup", config.isInFirstGroup(new CaseInsensitiveString("pipeline2")), is(false));
}
@Test
public void shouldGenerateAMapOfAllPipelinesAndTheirParentDependencies_WhenAllPipelinesInMapAreLocal() {
/*
* -----+ p2 --> p4
* p1
* -----+ p3
*
* */
PipelineConfig p1 = createPipelineConfig("p1", "s1", "j1");
PipelineConfig p2 = createPipelineConfig("p2", "s2", "j1");
p2.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p1"), new CaseInsensitiveString("s1")));
PipelineConfig p3 = createPipelineConfig("p3", "s3", "j1");
p3.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p1"), new CaseInsensitiveString("s1")));
PipelineConfig p4 = createPipelineConfig("p4", "s4", "j1");
p4.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p2"), new CaseInsensitiveString("s2")));
pipelines.addAll(Arrays.asList(p4, p2, p1, p3));
cruiseConfig = new BasicCruiseConfig(new BasicCruiseConfig(pipelines),
PartialConfigMother.withPipelineInGroup("remote-pipe-1", "remote_group"));
Map<String, List<PipelineConfig>> expectedPipelines = cruiseConfig.generatePipelineVsDownstreamMap();
assertThat(expectedPipelines.size(), is(5));
assertThat(expectedPipelines.get("p1"), hasItems(p2, p3));
assertThat(expectedPipelines.get("p2"), hasItems(p4));
assertThat(expectedPipelines.get("p3").isEmpty(), is(true));
assertThat(expectedPipelines.get("p4").isEmpty(), is(true));
assertThat(expectedPipelines.get("remote-pipe-1").isEmpty(), is(true));
}
@Test
public void shouldGenerateAMapOfAllPipelinesAndTheirParentDependencies_WhenThereAreRemotePipelinesInMap() {
/*
* -----+ p2 --> p4
* p1
* -----+ p3 --> remote-pipe-1
*
* */
PipelineConfig p1 = createPipelineConfig("p1", "s1", "j1");
PipelineConfig p2 = createPipelineConfig("p2", "s2", "j1");
p2.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p1"), new CaseInsensitiveString("s1")));
PipelineConfig p3 = createPipelineConfig("p3", "s3", "j1");
p3.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p1"), new CaseInsensitiveString("s1")));
PipelineConfig p4 = createPipelineConfig("p4", "s4", "j1");
p4.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p2"), new CaseInsensitiveString("s2")));
pipelines.addAll(Arrays.asList(p4, p2, p1, p3));
PipelineConfig remotePipe1 = createPipelineConfig("remote-pipe-1", "s5", "j1");
remotePipe1.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p3"), new CaseInsensitiveString("s3")));
PartialConfig part = new PartialConfig();
part.getGroups().addPipeline("remoteGroup", remotePipe1);
cruiseConfig = new BasicCruiseConfig(new BasicCruiseConfig(pipelines), part);
Map<String, List<PipelineConfig>> expectedPipelines = cruiseConfig.generatePipelineVsDownstreamMap();
assertThat(expectedPipelines.size(), is(5));
assertThat(expectedPipelines.get("p1"), hasItems(p2, p3));
assertThat(expectedPipelines.get("p2"), hasItems(p4));
assertThat(expectedPipelines.get("p3"), hasItems(remotePipe1));
assertThat(expectedPipelines.get("remote-pipe-1").isEmpty(), is(true));
assertThat(expectedPipelines.get("p4").isEmpty(), is(true));
}
@Test
public void shouldCollectOriginErrorsFromEnvironments_InMergedConfig() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipe2", "g2");
partialConfig.getGroups().get(0).get(0).setOrigin(new RepoConfigOrigin());
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
BasicEnvironmentConfig uat = new BasicEnvironmentConfig(new CaseInsensitiveString("UAT"));
uat.addPipeline(new CaseInsensitiveString("pipe2"));
cruiseConfig.addEnvironment(uat);
List<ConfigErrors> allErrors = cruiseConfig.validateAfterPreprocess();
assertThat(allErrors.size(), is(1));
assertNotNull(allErrors.get(0).on("origin"));
}
@Test
public void shouldCollectOriginErrorsFromMaterialConfigs_InMergedConfig() {
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipe2", "g2");
partialConfig.getGroups().get(0).get(0).setOrigin(new RepoConfigOrigin());
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
PipelineConfig pipeline1 = goConfigMother.addPipeline(cruiseConfig, "pipeline1", "stage", "build");
PipelineConfig pipeline2 = PipelineConfigMother.createPipelineConfigWithStage("pipeline2", "stage");
pipeline2.setOrigin(new RepoConfigOrigin());
partialConfig.getGroups().addPipeline("g2", pipeline2);
goConfigMother.setDependencyOn(cruiseConfig, pipeline1, "pipeline2", "stage");
List<ConfigErrors> allErrors = cruiseConfig.validateAfterPreprocess();
assertThat(allErrors.size(), is(1));
assertNotNull(allErrors.get(0).on("origin"));
}
@Test
public void shouldCollectAllTheErrorsInTheChildren_InMergedConfig() {
BasicCruiseConfig mainCruiseConfig = GoConfigMother.configWithPipelines("pipeline-1");
PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipe2", "g2");
partialConfig.getGroups().get(0).get(0).setOrigin(new RepoConfigOrigin());
CruiseConfig config = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
shouldCollectAllTheErrorsInTheChilderHelper(config);
}
@Test
public void shouldCollectPipelineNameConflictErrorsInTheChildren_InMergedConfig_WhenPipelinesIn2Groups() {
BasicCruiseConfig mainCruiseConfig = GoConfigMother.configWithPipelines("pipeline-1");
PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipeline-1", "g2");
partialConfig.setOrigin(new RepoConfigOrigin());
CruiseConfig config = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
List<ConfigErrors> allErrors = config.validateAfterPreprocess();
assertThat(allErrors.size(), is(2));
assertThat(allErrors.get(0).on("name"), is("You have defined multiple pipelines named 'pipeline-1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]"));
assertThat(allErrors.get(1).on("name"), is("You have defined multiple pipelines named 'pipeline-1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]"));
}
@Test
public void shouldCollectPipelineNameConflictErrorsInTheChildren_InMergedConfig2_WhenPipelinesInDefaultGroup() {
BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("pipeline1");
// pipeline1 is in xml and in config repo - this is an error at merged scope
PartialConfig remotePart = PartialConfigMother.withPipelineInGroup("pipeline1", "defaultGroup");
remotePart.setOrigin(new RepoConfigOrigin());
BasicCruiseConfig merged = new BasicCruiseConfig(cruiseConfig, remotePart);
List<ConfigErrors> allErrors = merged.validateAfterPreprocess();
assertThat(remotePart.getGroups().get(0).getPipelines().get(0).errors().size(), is(1));
assertThat(allErrors.size(), is(2));
assertThat(allErrors.get(0).on("name"), is("You have defined multiple pipelines named 'pipeline1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]"));
assertThat(allErrors.get(1).on("name"), is("You have defined multiple pipelines named 'pipeline1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]"));
}
@Test
public void shouldCollectPipelineNameConflictErrorsInTheChildren_InMergedConfig_WhenCloned() {
//we need this case because cloning has proven to be problematic with complex object graph in merged config
BasicCruiseConfig mainCruiseConfig = GoConfigMother.configWithPipelines("pipeline-1");
PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipeline-1", "g2");
partialConfig.setOrigin(new RepoConfigOrigin());
CruiseConfig config = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
Cloner CLONER = new Cloner();
CruiseConfig cloned = CLONER.deepClone(config);
List<ConfigErrors> allErrors = cloned.validateAfterPreprocess();
assertThat(allErrors.size(), is(2));
assertThat(allErrors.get(0).on("name"), is("You have defined multiple pipelines named 'pipeline-1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]"));
assertThat(allErrors.get(1).on("name"), is("You have defined multiple pipelines named 'pipeline-1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]"));
}
@Test
public void shouldReturnGroupsOtherThanMain_WhenMerged() {
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipeline("pipe2"));
assertNotSame(mainCruiseConfig.getGroups(), cruiseConfig.getGroups());
}
@Test
public void shouldReturnTrueHasPipelinesFrom2Parts() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipeline("pipe2"));
assertThat(cruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe1")), is(true));
assertThat(cruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe2")), is(true));
}
@Test
public void shouldReturnFalseWhenHasNotPipelinesFrom2Parts() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipeline("pipe2"));
assertThat(cruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe3")), is(false));
}
@Test
public void shouldReturnGroupsFrom2Parts() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipelineInGroup("pipe2", "g2"));
assertThat(cruiseConfig.hasPipelineGroup("g2"), is(true));
}
@Test
public void addPipeline_shouldAddPipelineToMain() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
pipelines.setOrigin(new FileConfigOrigin());
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipeline("pipe2"));
cruiseConfig.addPipeline("group_main", PipelineConfigMother.pipelineConfig("pipe3"));
assertThat(mainCruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe3")), is(true));
assertThat(cruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe3")), is(true));
}
@Test
public void addPipelineWithoutValidation_shouldAddPipelineToMain() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
pipelines.setOrigin(new FileConfigOrigin());
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipeline("pipe2"));
cruiseConfig.addPipelineWithoutValidation("group_main", PipelineConfigMother.pipelineConfig("pipe3"));
assertThat(mainCruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe3")), is(true));
assertThat(cruiseConfig.hasPipelineNamed(new CaseInsensitiveString("pipe3")), is(true));
}
@Test
public void shouldgetAllPipelineNamesFromAllParts() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipelineInGroup("pipe2", "g2"), PartialConfigMother.withPipelineInGroup("pipe3", "g3"));
assertThat(cruiseConfig.getAllPipelineNames(), contains(
new CaseInsensitiveString("pipe1"),
new CaseInsensitiveString("pipe2"),
new CaseInsensitiveString("pipe3")));
}
@Test
public void createsMergePipelineConfigsOnlyWhenManyParts() {
assertThat(cruiseConfig.getGroups().get(0) instanceof MergePipelineConfigs, is(false));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig,
PartialConfigMother.withPipelineInGroup("pipe2", "existing_group"));
assertThat(cruiseConfig.getGroups().get(0) instanceof MergePipelineConfigs, is(true));
}
@Test
public void shouldGetUniqueMaterialsWithConfigRepos() {
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
ConfigReposConfig reposConfig = new ConfigReposConfig();
GitMaterialConfig configRepo = new GitMaterialConfig("http://git");
reposConfig.add(new ConfigRepoConfig(configRepo, "myplug"));
mainCruiseConfig.setConfigRepos(reposConfig);
PartialConfig partialConfig = PartialConfigMother.withPipeline("pipe2");
MaterialConfig pipeRepo = partialConfig.getGroups().get(0).get(0).materialConfigs().get(0);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
Set<MaterialConfig> materials = cruiseConfig.getAllUniqueMaterialsBelongingToAutoPipelinesAndConfigRepos();
assertThat(materials, hasItem(configRepo));
assertThat(materials, hasItem(pipeRepo));
assertThat(materials.size(), is(2));
}
@Test
public void shouldGetUniqueMaterialsWithoutConfigRepos() {
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
ConfigReposConfig reposConfig = new ConfigReposConfig();
GitMaterialConfig configRepo = new GitMaterialConfig("http://git");
reposConfig.add(new ConfigRepoConfig(configRepo, "myplug"));
mainCruiseConfig.setConfigRepos(reposConfig);
PartialConfig partialConfig = PartialConfigMother.withPipeline("pipe2");
MaterialConfig pipeRepo = partialConfig.getGroups().get(0).get(0).materialConfigs().get(0);
cruiseConfig = new BasicCruiseConfig(mainCruiseConfig, partialConfig);
Set<MaterialConfig> materials = cruiseConfig.getAllUniqueMaterialsBelongingToAutoPipelines();
assertThat(materials, hasItem(pipeRepo));
assertThat(materials.size(), is(1));
}
@Test
public void shouldUpdatePipelineConfigsListWhenAPartialIsMerged(){
cruiseConfig = new BasicCruiseConfig(pipelines);
PartialConfig partial = PartialConfigMother.withPipeline("pipeline3");
ConfigRepoConfig configRepoConfig = new ConfigRepoConfig(new GitMaterialConfig("http://git"), "myplug");
partial.setOrigins(new RepoConfigOrigin(configRepoConfig,"123"));
ConfigReposConfig reposConfig = new ConfigReposConfig();
reposConfig.add(configRepoConfig);
cruiseConfig.setConfigRepos(reposConfig);
cruiseConfig.merge(Arrays.asList(partial), false);
PipelineConfig pipeline3 = partial.getGroups().first().findBy(new CaseInsensitiveString("pipeline3"));
assertThat(cruiseConfig.getAllPipelineConfigs().contains(pipeline3), is(true));
assertThat(cruiseConfig.getAllPipelineNames().contains(pipeline3.name()), is(true));
}
}