/*************************GO-LICENSE-START*********************************
* Copyright 2014 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.config;
import com.thoughtworks.go.config.materials.PackageMaterialConfig;
import com.thoughtworks.go.config.materials.PluggableSCMMaterialConfig;
import com.thoughtworks.go.config.merge.MergePipelineConfigs;
import com.thoughtworks.go.domain.packagerepository.PackageDefinition;
import com.thoughtworks.go.domain.packagerepository.PackageRepository;
import com.thoughtworks.go.domain.packagerepository.Packages;
import com.thoughtworks.go.domain.scm.SCM;
import org.junit.Test;
import java.util.Iterator;
import static com.thoughtworks.go.util.ReflectionUtil.setField;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.*;
public class GoConfigGraphWalkerTest {
@Test
public void walkedObject_shouldOnlyAcceptObjectsInThoughtworksPackage() {
assertThat(new GoConfigGraphWalker.WalkedObject("non-tw object").shouldWalk(), is(false));
assertThat(new GoConfigGraphWalker.WalkedObject(new PipelineConfig()).shouldWalk(), is(true));
}
@Test
public void walkedObject_shouldWalkMergePipelineConfigs()
{
assertThat(new GoConfigGraphWalker.WalkedObject(new MergePipelineConfigs(new BasicPipelineConfigs())).shouldWalk(), is(true));
}
@Test
public void walkedObject_shouldNotWalkNull() {
assertThat(new GoConfigGraphWalker.WalkedObject(null).shouldWalk(), is(false));
}
private PipelineConfig mockPipelineConfig() {
PipelineConfig pipe = mock(PipelineConfig.class);
when(pipe.iterator()).thenReturn(new Iterator<StageConfig>() {
@Override
public boolean hasNext() {
return false;
}
@Override
public StageConfig next() {
return null;
}
@Override
public void remove() {
}
});
return pipe;
}
@Test
public void shouldWalkPipelineConfigsInBasicPipelineConfigs()
{
PipelineConfig pipe = mockPipelineConfig();
BasicPipelineConfigs basicPipelines = new BasicPipelineConfigs(pipe);
new GoConfigGraphWalker(basicPipelines).walk(new GoConfigGraphWalker.Handler() {
@Override
public void handle(Validatable validatable, ValidationContext ctx) {
validatable.validate(ctx);
}
});
verify(pipe, atLeastOnce()).validate(any(ValidationContext.class));
}
@Test
public void shouldWalkPipelineConfigsInMergePipelineConfigs()
{
PipelineConfig pipe = mockPipelineConfig();
MergePipelineConfigs mergePipelines = new MergePipelineConfigs(new BasicPipelineConfigs(pipe));
new GoConfigGraphWalker(mergePipelines).walk(new GoConfigGraphWalker.Handler() {
@Override
public void handle(Validatable validatable, ValidationContext ctx) {
validatable.validate(ctx);
}
});
verify(pipe, atLeastOnce()).validate(any(ValidationContext.class));
}
@Test
public void shouldNotWalkFieldsWhichAreTaggedWithIgnoreTraversal() {
PackageRepository repository = mock(PackageRepository.class);
PackageDefinition packageDefinition = new PackageDefinition();
packageDefinition.setRepository(repository);
new GoConfigGraphWalker(packageDefinition).walk(new GoConfigGraphWalker.Handler() {
@Override
public void handle(Validatable validatable, ValidationContext ctx) {
validatable.validate(ctx);
}
});
verify(repository, never()).validate(any(ValidationContext.class));
}
@Test
public void shouldNotWalkPackageDefinitionWhileTraversingPackageMaterial() {
PackageDefinition packageDefinition = mock(PackageDefinition.class);
PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig("package-id");
setField(packageMaterialConfig, "packageDefinition", packageDefinition);
BasicCruiseConfig config = new BasicCruiseConfig();
PackageRepository packageRepository=mock(PackageRepository.class);
when(packageRepository.getPackages()).thenReturn(new Packages(packageDefinition));
when(packageDefinition.getRepository()).thenReturn(packageRepository);
when(packageRepository.doesPluginExist()).thenReturn(true);
when(packageDefinition.getId()).thenReturn("package-id");
config.getPackageRepositories().add(packageRepository);
final ConfigSaveValidationContext context = new ConfigSaveValidationContext(config);
new GoConfigGraphWalker(packageMaterialConfig).walk(new GoConfigGraphWalker.Handler() {
@Override
public void handle(Validatable validatable, ValidationContext ctx) {
validatable.validate(context);
}
});
verify(packageDefinition, never()).validate(any(ValidationContext.class));
}
@Test
public void shouldNotWalkSCMMaterialWhileTraversingPluggableSCMMaterial() {
SCM scmConfig = mock(SCM.class);
when(scmConfig.getName()).thenReturn("scm");
when(scmConfig.getId()).thenReturn("scm-id");
PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig("scm-id");
setField(pluggableSCMMaterialConfig, "scmConfig", scmConfig);
BasicCruiseConfig config = new BasicCruiseConfig();
config.getSCMs().add(scmConfig);
final ConfigSaveValidationContext context = new ConfigSaveValidationContext(config);
new GoConfigGraphWalker(pluggableSCMMaterialConfig).walk(new GoConfigGraphWalker.Handler() {
@Override
public void handle(Validatable validatable, ValidationContext ctx) {
validatable.validate(context);
}
});
verify(scmConfig, never()).validate(any(ValidationContext.class));
}
}