/*
* 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.config;
import com.thoughtworks.go.config.elastic.ElasticConfig;
import com.thoughtworks.go.config.elastic.ElasticProfile;
import com.thoughtworks.go.config.elastic.ElasticProfiles;
import com.thoughtworks.go.config.materials.MaterialConfigs;
import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig;
import com.thoughtworks.go.domain.materials.MaterialConfig;
import com.thoughtworks.go.domain.packagerepository.*;
import com.thoughtworks.go.domain.scm.SCMMother;
import com.thoughtworks.go.domain.scm.SCMs;
import com.thoughtworks.go.helper.GoConfigMother;
import com.thoughtworks.go.helper.MaterialConfigsMother;
import com.thoughtworks.go.util.Node;
import org.hamcrest.MatcherAssert;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static junit.framework.TestCase.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.mock;
public class PipelineConfigSaveValidationContextTest {
private PipelineConfig pipelineConfig;
private PipelineConfigSaveValidationContext pipelineContext;
@Before
public void setUp() throws Exception {
pipelineConfig = mock(PipelineConfig.class);
pipelineContext = PipelineConfigSaveValidationContext.forChain(true, "group", pipelineConfig);
}
@Test
public void shouldCreatePipelineValidationContext() {
assertThat(pipelineContext.getPipeline(), is(pipelineConfig));
assertThat(pipelineContext.getStage(), is(nullValue()));
assertThat(pipelineContext.getJob(), is(nullValue()));
}
@Test
public void shouldCreateStageValidationContextBasedOnParent() {
StageConfig stageConfig = mock(StageConfig.class);
PipelineConfigSaveValidationContext stageContext = PipelineConfigSaveValidationContext.forChain(true, "group", pipelineConfig, stageConfig);
assertThat(stageContext.getPipeline(), is(pipelineConfig));
assertThat(stageContext.getStage(), is(stageConfig));
assertThat(stageContext.getJob(), is(nullValue()));
}
@Test
public void shouldCreateJobValidationContextBasedOnParent() {
StageConfig stageConfig = mock(StageConfig.class);
JobConfig jobConfig = mock(JobConfig.class);
PipelineConfigSaveValidationContext jobContext = PipelineConfigSaveValidationContext.forChain(true, "group", pipelineConfig, stageConfig, jobConfig);
assertThat(jobContext.getPipeline(), is(pipelineConfig));
assertThat(jobContext.getStage(), is(stageConfig));
assertThat(jobContext.getJob(), is(jobConfig));
}
@Test
public void shouldGetAllMaterialsByFingerPrint() throws Exception {
CruiseConfig cruiseConfig = new GoConfigMother().cruiseConfigWithPipelineUsingTwoMaterials();
MaterialConfig expectedMaterial = MaterialConfigsMother.multipleMaterialConfigs().get(1);
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig);
MaterialConfigs allMaterialsByFingerPrint = context.getAllMaterialsByFingerPrint(expectedMaterial.getFingerprint());
assertThat(allMaterialsByFingerPrint.size(), is(1));
assertThat(allMaterialsByFingerPrint.first(), is(expectedMaterial));
}
@Test
public void shouldReturnNullIfMatchingMaterialConfigIsNotFound() throws Exception {
CruiseConfig cruiseConfig = new GoConfigMother().cruiseConfigWithPipelineUsingTwoMaterials();
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig);
assertThat(context.getAllMaterialsByFingerPrint("does_not_exist"), is(nullValue()));
}
@Test
public void shouldGetDependencyMaterialsForPipelines(){
BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1", "p2", "p3");
PipelineConfig p2 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p2"));
p2.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p1"),new CaseInsensitiveString("stage") ));
PipelineConfig p3 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p3"));
p3.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p2"),new CaseInsensitiveString("stage") ));
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig);
assertThat(context.getDependencyMaterialsFor(new CaseInsensitiveString("p1")).getDependencies().isEmpty(), is(true));
assertThat(context.getDependencyMaterialsFor(new CaseInsensitiveString("p2")).getDependencies(), contains(new Node.DependencyNode(new CaseInsensitiveString("p1"),new CaseInsensitiveString("stage"))));
assertThat(context.getDependencyMaterialsFor(new CaseInsensitiveString("p3")).getDependencies(), contains(new Node.DependencyNode(new CaseInsensitiveString("p2"),new CaseInsensitiveString("stage"))));
assertThat(context.getDependencyMaterialsFor(new CaseInsensitiveString("junk")).getDependencies().isEmpty(), is(true));
}
@Test
public void shouldGetParentDisplayName(){
assertThat(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig()).getParentDisplayName(), is("pipeline"));
assertThat(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig(), new StageConfig()).getParentDisplayName(), is("stage"));
assertThat(PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig(), new StageConfig(), new JobConfig()).getParentDisplayName(), is("job"));
}
@Test
public void shouldFindPipelineByName(){
BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1");
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig(new CaseInsensitiveString("p2"), new MaterialConfigs()));
assertThat(context.getPipelineConfigByName(new CaseInsensitiveString("p1")), is(cruiseConfig.allPipelines().get(0)));
}
@Test
public void shouldReturnNullWhenNoMatchingPipelineIsFound() throws Exception {
BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1");
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig(new CaseInsensitiveString("p2"), new MaterialConfigs()));
assertThat(context.getPipelineConfigByName(new CaseInsensitiveString("does_not_exist")), is(nullValue()));
}
@Test
public void shouldGetPipelineGroupForPipelineInContext(){
String pipelineName = "p1";
BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines(pipelineName);
PipelineConfig p1 = cruiseConfig.pipelineConfigByName(new CaseInsensitiveString(pipelineName));
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, PipelineConfigs.DEFAULT_GROUP, cruiseConfig, p1);
assertThat(context.getPipelineGroup(), is(cruiseConfig.findGroup(PipelineConfigs.DEFAULT_GROUP)));
}
@Test
public void shouldGetServerSecurityContext() {
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
SecurityConfig securityConfig = new SecurityConfig();
securityConfig.addRole(new RoleConfig(new CaseInsensitiveString("admin")));
securityConfig.adminsConfig().add(new AdminUser(new CaseInsensitiveString("super-admin")));
cruiseConfig.server().useSecurity(securityConfig);
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig);
Assert.assertThat(context.getServerSecurityConfig(), is(securityConfig));
}
@Test
public void shouldReturnIfTheContextBelongsToPipeline(){
ValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", new PipelineConfig());
Assert.assertThat(context.isWithinPipelines(), is(true));
Assert.assertThat(context.isWithinTemplates(), is(false));
}
@Test
public void shouldCheckForExistenceOfTemplate(){
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
cruiseConfig.addTemplate(new PipelineTemplateConfig(new CaseInsensitiveString("t1")));
PipelineConfigSaveValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig());
assertThat(context.doesTemplateExist(new CaseInsensitiveString("t1")), is(true));
assertThat(context.doesTemplateExist(new CaseInsensitiveString("t2")), is(false));
}
@Test
public void shouldCheckForExistenceOfSCM() throws Exception {
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
cruiseConfig.setSCMs(new SCMs(SCMMother.create("scm-id")));
ValidationContext context = ConfigSaveValidationContext.forChain(cruiseConfig);
MatcherAssert.assertThat(context.findScmById("scm-id").getId(), is("scm-id"));
}
@Test
public void shouldCheckForExistenceOfPackage() throws Exception {
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
cruiseConfig.setPackageRepositories(new PackageRepositories(PackageRepositoryMother.create("repo-id")));
cruiseConfig.getPackageRepositories().find("repo-id").setPackages(new Packages(PackageDefinitionMother.create("package-id")));
ValidationContext context = ConfigSaveValidationContext.forChain(cruiseConfig);
MatcherAssert.assertThat(context.findPackageById("package-id").getId(), is("repo-id"));
}
@Test
public void isValidProfileIdShouldBeValidInPresenceOfElasticProfile() {
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
ElasticConfig elasticConfig = new ElasticConfig();
elasticConfig.setProfiles(new ElasticProfiles(new ElasticProfile("docker.unit-test", "docker")));
cruiseConfig.setServerConfig(new ServerConfig(elasticConfig));
ValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig());
assertTrue(context.isValidProfileId("docker.unit-test"));
}
@Test
public void isValidProfileIdShouldBeInValidInAbsenceOfElasticProfileForTheGivenId() {
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
ElasticConfig elasticConfig = new ElasticConfig();
elasticConfig.setProfiles(new ElasticProfiles(new ElasticProfile("docker.unit-test", "docker")));
cruiseConfig.setServerConfig(new ServerConfig(elasticConfig));
ValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig());
assertFalse(context.isValidProfileId("invalid.profile-id"));
}
@Test
public void isValidProfileIdShouldBeInValidInAbsenceOfElasticProfiles() {
BasicCruiseConfig cruiseConfig = new BasicCruiseConfig();
ValidationContext context = PipelineConfigSaveValidationContext.forChain(true, "group", cruiseConfig, new PipelineConfig());
assertFalse(context.isValidProfileId("docker.unit-test"));
}
}