/*
* 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.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig;
import com.thoughtworks.go.config.remote.*;
import com.thoughtworks.go.domain.CaseInsensitiveStringTest;
import com.thoughtworks.go.domain.PipelineGroups;
import com.thoughtworks.go.domain.PiplineConfigVisitor;
import com.thoughtworks.go.helper.*;
import org.hamcrest.core.Is;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import static com.thoughtworks.go.helper.PipelineConfigMother.createGroup;
import static com.thoughtworks.go.helper.PipelineConfigMother.createPipelineConfig;
import static java.util.Arrays.asList;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class BasicCruiseConfigTest extends CruiseConfigTestBase {
@Before
public void setup() throws Exception {
pipelines = new BasicPipelineConfigs("existing_group", new Authorization());
cruiseConfig = new BasicCruiseConfig(pipelines);
goConfigMother = new GoConfigMother();
}
@Override
protected BasicCruiseConfig createCruiseConfig(BasicPipelineConfigs pipelineConfigs) {
return new BasicCruiseConfig(pipelineConfigs);
}
@Override
protected BasicCruiseConfig createCruiseConfig() {
return new BasicCruiseConfig();
}
@Test
public void getAllLocalPipelineConfigs_shouldReturnOnlyLocalPipelinesWhenNoRemotes() {
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 shouldGenerateAMapOfAllPipelinesAndTheirParentDependencies() {
/*
* -----+ 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(asList(p4, p2, p1, p3));
Map<String, List<PipelineConfig>> expectedPipelines = cruiseConfig.generatePipelineVsDownstreamMap();
assertThat(expectedPipelines.size(), is(4));
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));
}
@Test
public void shouldSetOriginInPipelines() {
pipelines = new BasicPipelineConfigs("group_main", new Authorization(), PipelineConfigMother.pipelineConfig("pipe1"));
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
PipelineConfig pipe = pipelines.get(0);
mainCruiseConfig.setOrigins(new FileConfigOrigin());
assertThat(pipe.getOrigin(), Is.<ConfigOrigin>is(new FileConfigOrigin()));
}
@Test
public void shouldSetOriginInEnvironments() {
BasicCruiseConfig mainCruiseConfig = new BasicCruiseConfig(pipelines);
BasicEnvironmentConfig env = new BasicEnvironmentConfig(new CaseInsensitiveString("e"));
mainCruiseConfig.addEnvironment(env);
mainCruiseConfig.setOrigins(new FileConfigOrigin());
assertThat(env.getOrigin(), Is.<ConfigOrigin>is(new FileConfigOrigin()));
}
@Test
public void shouldGetPipelinesWithGroupName() throws Exception {
PipelineConfigs group1 = createGroup("group1", createPipelineConfig("pipeline1", "stage1"));
PipelineConfigs group2 = createGroup("group2", createPipelineConfig("pipeline2", "stage2"));
CruiseConfig config = createCruiseConfig();
config.setGroup(new PipelineGroups(group1, group2));
assertThat(config.pipelines("group1"), is(group1));
assertThat(config.pipelines("group2"), is(group2));
}
@Test
public void shouldReturnTrueForPipelineThatInFirstGroup() {
PipelineConfigs group1 = createGroup("group1", createPipelineConfig("pipeline1", "stage1"));
CruiseConfig config = new BasicCruiseConfig(group1);
assertThat("shouldReturnTrueForPipelineThatInFirstGroup", config.isInFirstGroup(new CaseInsensitiveString("pipeline1")), is(true));
}
@Test
public void shouldReturnFalseForPipelineThatNotInFirstGroup() {
PipelineConfigs group1 = createGroup("group1", createPipelineConfig("pipeline1", "stage1"));
PipelineConfigs group2 = createGroup("group2", createPipelineConfig("pipeline2", "stage2"));
CruiseConfig config = new BasicCruiseConfig(group1, group2);
assertThat("shouldReturnFalseForPipelineThatNotInFirstGroup", config.isInFirstGroup(new CaseInsensitiveString("pipeline2")), is(false));
}
@Test
public void shouldIncludeRemotePipelinesAsPartOfCachedPipelineConfigs() {
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.withPipeline("pipeline_in_repo1", new RepoConfigOrigin(repoConfig1, "repo1_r1"));
PartialConfig partialConfigInRepo2 = PartialConfigMother.withPipeline("pipeline_in_repo2", new RepoConfigOrigin(repoConfig2, "repo2_r1"));
cruiseConfig.merge(asList(partialConfigInRepo1, partialConfigInRepo2), false);
assertThat(cruiseConfig.getAllPipelineNames().contains(new CaseInsensitiveString("pipeline_in_repo1")), is(true));
assertThat(cruiseConfig.getAllPipelineNames().contains(new CaseInsensitiveString("pipeline_in_repo2")), is(true));
}
@Test
public void shouldRejectRemotePipelinesNotOriginatingFromRegisteredConfigReposFromCachedPipelineConfigs() {
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(repoConfig2));
PartialConfig partialConfigInRepo1 = PartialConfigMother.withPipeline("pipeline_in_repo1", new RepoConfigOrigin(repoConfig1, "repo1_r1"));
PartialConfig partialConfigInRepo2 = PartialConfigMother.withPipeline("pipeline_in_repo2", new RepoConfigOrigin(repoConfig2, "repo2_r1"));
cruiseConfig.merge(asList(partialConfigInRepo1, partialConfigInRepo2), false);
assertThat(cruiseConfig.getAllPipelineNames().contains(new CaseInsensitiveString("pipeline_in_repo1")), is(false));
assertThat(cruiseConfig.getAllPipelineNames().contains(new CaseInsensitiveString("pipeline_in_repo2")), is(true));
}
@Test
public void shouldReturnAListOfPipelineNamesAssociatedWithOneTemplate() {
ArrayList<CaseInsensitiveString> pipelinesAssociatedWithATemplate = new ArrayList<>();
pipelinesAssociatedWithATemplate.add(new CaseInsensitiveString("p1"));
BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig();
new GoConfigMother().addPipelineWithTemplate(cruiseConfig, "p1", "t1", "s1", "j1");
assertThat(cruiseConfig.pipelinesAssociatedWithTemplate(new CaseInsensitiveString("t1")), is(pipelinesAssociatedWithATemplate));
}
@Test
public void shouldReturnNullForAssociatedPipelineNamesWhenTemplateNameIsBlank() {
ArrayList<CaseInsensitiveString> pipelinesAssociatedWithATemplate = new ArrayList<>();
pipelinesAssociatedWithATemplate.add(new CaseInsensitiveString("p1"));
BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig();
new GoConfigMother().addPipelineWithTemplate(cruiseConfig, "p1", "t1", "s1", "j1");
assertThat(cruiseConfig.pipelinesAssociatedWithTemplate(new CaseInsensitiveString("")), is(new ArrayList<CaseInsensitiveString>()));
}
@Test
public void shouldReturnAnEmptyListForPipelinesIfTemplateNameIsNull() {
BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig();
assertThat(cruiseConfig.pipelinesAssociatedWithTemplate(null).isEmpty(), is(true));
}
@Test
public void shouldReturnAnEmptyListIfThereAreNoPipelinesAssociatedWithGivenTemplate() {
BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig();
assertThat(cruiseConfig.pipelinesAssociatedWithTemplate(new CaseInsensitiveString("non-existent-template")).isEmpty(), is(true));
}
@Test
public void shouldReturnAMapOfAllTemplateNamesToPipelinesForAnAdminUser() {
BasicCruiseConfig cruiseConfig = getCruiseConfigWithSecurityEnabled();
new GoConfigMother().addPipelineWithTemplate(cruiseConfig, "p1", "t1", "s1", "j1");
new GoConfigMother().addPipelineWithTemplate(cruiseConfig, "p2", "t2", "s2", "j2");
HashMap<CaseInsensitiveString, List<CaseInsensitiveString>> map = new HashMap<>();
List<CaseInsensitiveString> template1Pipelines = Arrays.asList(new CaseInsensitiveString("p1"));
List<CaseInsensitiveString> template2Pipelines = Arrays.asList(new CaseInsensitiveString("p2"));
map.put(new CaseInsensitiveString("t1"), template1Pipelines);
map.put(new CaseInsensitiveString("t2"), template2Pipelines);
assertThat(cruiseConfig.templatesWithPipelinesForUser("admin", null), is(map));
}
@Test
public void shouldReturnASubsetOfTemplatesToPipelinesMapForTemplateAdmin() {
BasicCruiseConfig cruiseConfig = getCruiseConfigWithSecurityEnabled();
CaseInsensitiveString templateAdmin = new CaseInsensitiveString("template-admin");
new GoConfigMother().addPipelineWithTemplate(cruiseConfig, "p1", "t1", "s1", "j1");
PipelineTemplateConfig template2 = PipelineTemplateConfigMother.createTemplate("t2", new Authorization(new AdminsConfig(new AdminUser(templateAdmin))), StageConfigMother.manualStage("foo"));
cruiseConfig.addTemplate(template2);
HashMap<CaseInsensitiveString, List<CaseInsensitiveString>> map = new HashMap<>();
map.put(new CaseInsensitiveString("t2"), new ArrayList<>());
assertThat(cruiseConfig.templatesWithPipelinesForUser(templateAdmin.toString(), null), is(map));
}
@Test
public void shouldReturnASubsetOfTemplatesToPipelinesMapForTemplateViewUser() {
BasicCruiseConfig cruiseConfig = getCruiseConfigWithSecurityEnabled();
CaseInsensitiveString templateViewUser = new CaseInsensitiveString("template-view");
PipelineTemplateConfig template2 = PipelineTemplateConfigMother.createTemplate("t2", new Authorization(new ViewConfig(new AdminUser(templateViewUser))), StageConfigMother.manualStage("foo"));
cruiseConfig.addTemplate(template2);
HashMap<CaseInsensitiveString, List<CaseInsensitiveString>> map = new HashMap<>();
map.put(new CaseInsensitiveString("t2"), new ArrayList<>());
assertThat(cruiseConfig.templatesWithPipelinesForUser(templateViewUser.toString(), null), is(map));
}
@Test
public void shouldReturnASubsetOfTemplatesToPipelinesMapForGroupAdmin() {
BasicCruiseConfig cruiseConfig = getCruiseConfigWithSecurityEnabled();
CaseInsensitiveString groupAdmin = new CaseInsensitiveString("template-view");
new GoConfigMother().addPipelineWithGroup(cruiseConfig, "group", "p1", "s1", "j1");
PipelineConfigs pipelineConfigs = cruiseConfig.getGroups().get(0);
pipelineConfigs.setAuthorization(new Authorization(new AdminsConfig(new AdminUser(groupAdmin))));
PipelineTemplateConfig template2 = PipelineTemplateConfigMother.createTemplate("t2", StageConfigMother.manualStage("foo"));
cruiseConfig.addTemplate(template2);
HashMap<CaseInsensitiveString, List<CaseInsensitiveString>> map = new HashMap<>();
map.put(new CaseInsensitiveString("t2"), new ArrayList<>());
assertThat(cruiseConfig.templatesWithPipelinesForUser(groupAdmin.toString(), null), is(map));
}
@Test
public void shouldReturnAnEmptyMapForARegularUser() {
BasicCruiseConfig cruiseConfig = getCruiseConfigWithSecurityEnabled();
CaseInsensitiveString regularUser = new CaseInsensitiveString("view");
new GoConfigMother().addPipelineWithTemplate(cruiseConfig, "p1", "t1", "s1", "j1");
assertThat(cruiseConfig.templatesWithPipelinesForUser(regularUser.toString(), null), is(new HashMap<>()));
}
private BasicCruiseConfig getCruiseConfigWithSecurityEnabled() {
BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig();
ServerConfig serverConfig = new ServerConfig(new SecurityConfig(null, null, false, new AdminsConfig(new AdminUser(new CaseInsensitiveString("admin")))), null);
cruiseConfig.setServerConfig(serverConfig);
GoConfigMother.enableSecurityWithPasswordFile(cruiseConfig);
return cruiseConfig;
}
}