/* * 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.Filter; import com.thoughtworks.go.config.materials.IgnoredFiles; import com.thoughtworks.go.config.materials.PackageMaterialConfig; import com.thoughtworks.go.config.materials.PluggableSCMMaterialConfig; import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig; import com.thoughtworks.go.config.materials.git.GitMaterialConfig; import com.thoughtworks.go.config.materials.mercurial.HgMaterialConfig; import com.thoughtworks.go.config.materials.perforce.P4MaterialConfig; import com.thoughtworks.go.config.materials.svn.SvnMaterialConfig; import com.thoughtworks.go.config.materials.tfs.TfsMaterialConfig; import com.thoughtworks.go.config.pluggabletask.PluggableTask; import com.thoughtworks.go.config.remote.PartialConfig; import com.thoughtworks.go.domain.KillAllChildProcessTask; import com.thoughtworks.go.domain.config.Configuration; import com.thoughtworks.go.domain.config.PluginConfiguration; import com.thoughtworks.go.domain.label.PipelineLabel; import com.thoughtworks.go.domain.materials.MaterialConfig; import com.thoughtworks.go.domain.packagerepository.PackageDefinition; import com.thoughtworks.go.domain.packagerepository.PackageRepositories; import com.thoughtworks.go.domain.packagerepository.PackageRepository; import com.thoughtworks.go.domain.scm.SCM; import com.thoughtworks.go.domain.scm.SCMs; import com.thoughtworks.go.plugin.access.configrepo.contract.*; import com.thoughtworks.go.plugin.access.configrepo.contract.material.*; import com.thoughtworks.go.plugin.access.configrepo.contract.tasks.*; import com.thoughtworks.go.security.GoCipher; import com.thoughtworks.go.util.command.HgUrlArgument; import org.apache.commons.collections.map.HashedMap; import org.bouncycastle.crypto.InvalidCipherTextException; import org.junit.Before; import org.junit.Test; import java.util.*; import static junit.framework.TestCase.fail; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.isA; import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ConfigConverterTest { private ConfigConverter configConverter; private GoCipher goCipher; private PartialConfigLoadContext context; private List<String> filter = new ArrayList<>(); private CachedGoConfig cachedGoConfig; Collection<CREnvironmentVariable> environmentVariables = new ArrayList<>(); Collection<CRTab> tabs = new ArrayList<>(); Collection<String> resources = new ArrayList<>(); Collection<CRArtifact> artifacts = new ArrayList<>(); Collection<CRPropertyGenerator> artifactPropertiesGenerators = new ArrayList<>(); List<CRTask> tasks = new ArrayList<>(); ArrayList<String> authorizedRoles; ArrayList<String> authorizedUsers; ArrayList<CRJob> jobs; private CRStage crStage; private CRTrackingTool trackingTool; private CRTimer timer; private ArrayList<CRMaterial> materials; private List<CRStage> stages; private CRGitMaterial git; @Before public void setUp() throws InvalidCipherTextException { environmentVariables = new ArrayList<>(); tabs = new ArrayList<>(); resources = new ArrayList<>(); artifacts = new ArrayList<>(); artifactPropertiesGenerators = new ArrayList<>(); tasks = new ArrayList<>(); authorizedRoles = new ArrayList<>(); authorizedUsers = new ArrayList<>(); jobs = new ArrayList<>(); stages = new ArrayList<>(); materials = new ArrayList<>(); cachedGoConfig = mock(CachedGoConfig.class); goCipher = mock(GoCipher.class); context = mock(PartialConfigLoadContext.class); configConverter = new ConfigConverter(goCipher, cachedGoConfig); String encryptedText = "secret"; when(goCipher.decrypt("encryptedvalue")).thenReturn(encryptedText); when(goCipher.encrypt("secret")).thenReturn("encryptedvalue"); filter = new ArrayList<>(); filter.add("filter"); environmentVariables.add(new CREnvironmentVariable("key", "value")); tabs.add(new CRTab("tabname","tabpath")); resources.add("resource1"); artifacts.add(new CRArtifact("src","dest")); artifactPropertiesGenerators.add(new CRPropertyGenerator("name","src","path")); tasks.add(new CRFetchArtifactTask(CRRunIf.failed, null, "upstream", "stage", "job", "src", "dest", false)); jobs.add(new CRJob("name",environmentVariables, tabs, resources,null, artifacts, artifactPropertiesGenerators, true, 5, 120, tasks)); authorizedUsers.add("authUser"); authorizedRoles.add("authRole"); CRApproval approval = new CRApproval(CRApprovalCondition.manual, authorizedRoles, authorizedUsers); crStage = new CRStage("stageName",true,true,true, approval,environmentVariables,jobs); stages.add(crStage); git = new CRGitMaterial("name", "folder", true,true, filter, "url", "branch",false); materials.add(git); trackingTool = new CRTrackingTool("link","regex"); timer = new CRTimer("timer",true); } @Test public void shouldConvertEnvironmentVariableWhenNotSecure() { CREnvironmentVariable crEnvironmentVariable = new CREnvironmentVariable("key1", "value"); EnvironmentVariableConfig result = configConverter.toEnvironmentVariableConfig(crEnvironmentVariable); assertThat(result.getValue(), is("value")); assertThat(result.getName(), is("key1")); assertThat(result.isSecure(), is(false)); } @Test public void shouldConvertEnvironmentVariableWhenSecure() { CREnvironmentVariable crEnvironmentVariable = new CREnvironmentVariable("key1", null, "encryptedvalue"); EnvironmentVariableConfig result = configConverter.toEnvironmentVariableConfig(crEnvironmentVariable); assertThat(result.isSecure(), is(true)); assertThat(result.getValue(), is("secret")); assertThat(result.getName(), is("key1")); } @Test public void shouldMigrateEnvironment() { ArrayList<CREnvironmentVariable> environmentVariables = new ArrayList<>(); environmentVariables.add(new CREnvironmentVariable("key", "value")); ArrayList<String> agents = new ArrayList<>(); agents.add("12"); ArrayList<String> pipelines = new ArrayList<>(); pipelines.add("pipe1"); CREnvironment crEnvironment = new CREnvironment("dev", environmentVariables, agents, pipelines); BasicEnvironmentConfig environmentConfig = configConverter.toEnvironmentConfig(crEnvironment); assertThat(environmentConfig.name().toLower(), is("dev")); assertThat(environmentConfig.contains("pipe1"), is(true)); assertThat(environmentConfig.hasVariable("key"), is(true)); assertThat(environmentConfig.hasAgent("12"), is(true)); } @Test public void shouldMigratePluggableTask() { ArrayList<CRConfigurationProperty> configs = new ArrayList<>(); configs.add(new CRConfigurationProperty("k", "m", null)); CRPluggableTask pluggableTask = new CRPluggableTask(CRRunIf.any, null, new CRPluginConfiguration("myplugin", "1"), configs); PluggableTask result = (PluggableTask) configConverter.toAbstractTask(pluggableTask); assertThat(result.getPluginConfiguration().getId(), is("myplugin")); assertThat(result.getPluginConfiguration().getVersion(), is("1")); assertThat(result.getConfiguration().getProperty("k").getValue(), is("m")); assertThat(result.getConditions().first(), is(RunIfConfig.ANY)); } @Test public void shouldMigrateRakeTask() { CRBuildTask crBuildTask = new CRBuildTask(CRRunIf.failed, null, "Rakefile.rb", "build", "src", CRBuildFramework.rake); RakeTask result = (RakeTask) configConverter.toAbstractTask(crBuildTask); assertRakeTask(result); } private void assertRakeTask(RakeTask result) { assertThat(result.getConditions().first(), is(RunIfConfig.FAILED)); assertThat(result.getBuildFile(), is("Rakefile.rb")); assertThat(result.getTarget(), is("build")); assertThat(result.workingDirectory(), is("src")); } @Test public void shouldMigrateAntTask() { CRTask cancel = new CRBuildTask(CRRunIf.failed, null, "Rakefile.rb", "build", "src", CRBuildFramework.rake); CRBuildTask crBuildTask = new CRBuildTask(CRRunIf.failed, cancel, "ant", "build", "src", CRBuildFramework.ant); AntTask result = (AntTask) configConverter.toAbstractTask(crBuildTask); assertThat(result.getConditions().first(), is(RunIfConfig.FAILED)); assertThat(result.getBuildFile(), is("ant")); assertThat(result.getTarget(), is("build")); assertThat(result.workingDirectory(), is("src")); assertThat(result.cancelTask() instanceof RakeTask, is(true)); assertRakeTask((RakeTask) result.cancelTask()); } @Test public void shouldMigrateNantTask() { CRBuildTask crBuildTask = new CRNantTask(CRRunIf.passed, null, "nant", "build", "src", "path"); NantTask result = (NantTask) configConverter.toAbstractTask(crBuildTask); assertThat(result.getConditions().first(), is(RunIfConfig.PASSED)); assertThat(result.getBuildFile(), is("nant")); assertThat(result.getTarget(), is("build")); assertThat(result.workingDirectory(), is("src")); } @Test public void shouldConvertExecTaskWhenCancelIsNotSpecified() { CRExecTask crExecTask = new CRExecTask(CRRunIf.failed, null, "bash", "work", 120L, Arrays.asList("1", "2")); ExecTask result = (ExecTask) configConverter.toAbstractTask(crExecTask); assertThat(result.getConditions().first(), is(RunIfConfig.FAILED)); assertThat(result.command(), is("bash")); assertThat(result.getArgList(), hasItem(new Argument("1"))); assertThat(result.getArgList(), hasItem(new Argument("2"))); assertThat(result.workingDirectory(), is("work")); assertThat(result.getTimeout(), is(120L)); assertThat(result.getOnCancelConfig().getTask(), instanceOf(KillAllChildProcessTask.class)); } @Test public void shouldConvertExecTaskWhenCancelIsSpecified() { CRExecTask crExecTask = new CRExecTask(CRRunIf.failed, new CRExecTask("kill"), "bash", "work", 120L, Arrays.asList("1", "2")); ExecTask result = (ExecTask) configConverter.toAbstractTask(crExecTask); assertThat(result.getConditions().first(), is(RunIfConfig.FAILED)); assertThat(result.command(), is("bash")); assertThat(result.getArgList(), hasItem(new Argument("1"))); assertThat(result.getArgList(), hasItem(new Argument("2"))); assertThat(result.workingDirectory(), is("work")); assertThat(result.getTimeout(), is(120L)); assertThat(result.getOnCancelConfig().getTask(), instanceOf(ExecTask.class)); ExecTask cancel = (ExecTask)result.getOnCancelConfig().getTask(); assertThat(cancel.command(),is("kill")); } @Test public void shouldConvertFetchArtifactTaskAndSetEmptyStringWhenPipelineIsNotSpecified() { // if not then null causes errors in parameter expansion CRFetchArtifactTask crFetchArtifactTask = new CRFetchArtifactTask(CRRunIf.passed, null, null, "stage", "job", "src", null, false); FetchTask result = (FetchTask) configConverter.toAbstractTask(crFetchArtifactTask); assertThat(result.getConditions().first(), is(RunIfConfig.PASSED)); assertThat(result.getDest(),is("")); assertThat(result.getJob().toLower(), is("job")); assertThat(result.getPipelineName().toLower(), is("")); assertThat(result.getSrc(), is("src")); assertThat(result.isSourceAFile(), is(true)); } @Test public void shouldConvertFetchArtifactTaskWhenDestinationIsNotSpecified() { CRFetchArtifactTask crFetchArtifactTask = new CRFetchArtifactTask(CRRunIf.passed, null, "upstream", "stage", "job", "src", null, false); FetchTask result = (FetchTask) configConverter.toAbstractTask(crFetchArtifactTask); assertThat(result.getConditions().first(), is(RunIfConfig.PASSED)); assertThat(result.getDest(),is("")); assertThat(result.getJob().toLower(), is("job")); assertThat(result.getPipelineName().toLower(), is("upstream")); assertThat(result.getSrc(), is("src")); assertThat(result.isSourceAFile(), is(true)); } @Test public void shouldConvertFetchArtifactTaskWhenSourceIsDirectory() { CRFetchArtifactTask crFetchArtifactTask = new CRFetchArtifactTask(CRRunIf.failed, null, "upstream", "stage", "job", "src", "dest", true); FetchTask result = (FetchTask) configConverter.toAbstractTask(crFetchArtifactTask); assertThat(result.getConditions().first(), is(RunIfConfig.FAILED)); assertThat(result.getDest(), is("dest")); assertThat(result.getJob().toLower(), is("job")); assertThat(result.getPipelineName().toLower(), is("upstream")); assertThat(result.getSrc(), is("src")); assertNull(result.getSrcfile()); assertThat(result.isSourceAFile(), is(false)); } @Test public void shouldConvertFetchArtifactTaskWhenSourceIsFile() { CRFetchArtifactTask crFetchArtifactTask = new CRFetchArtifactTask(CRRunIf.failed, null, "upstream", "stage", "job", "src", "dest", false); FetchTask result = (FetchTask) configConverter.toAbstractTask(crFetchArtifactTask); assertThat(result.getConditions().first(), is(RunIfConfig.FAILED)); assertThat(result.getDest(), is("dest")); assertThat(result.getJob().toLower(), is("job")); assertThat(result.getPipelineName().toLower(), is("upstream")); assertThat(result.getSrc(), is("src")); assertNull(result.getSrcdir()); assertThat(result.isSourceAFile(), is(true)); } @Test public void shouldConvertDependencyMaterial() { CRDependencyMaterial crDependencyMaterial = new CRDependencyMaterial("name", "pipe", "stage"); DependencyMaterialConfig dependencyMaterialConfig = (DependencyMaterialConfig) configConverter.toMaterialConfig(crDependencyMaterial,context); assertThat(dependencyMaterialConfig.getName().toLower(), is("name")); assertThat(dependencyMaterialConfig.getPipelineName().toLower(), is("pipe")); assertThat(dependencyMaterialConfig.getStageName().toLower(), is("stage")); } @Test public void shouldConvertGitMaterial() { CRGitMaterial crGitMaterial = new CRGitMaterial("name", "folder", true,true, filter, "url", "branch",false); GitMaterialConfig gitMaterialConfig = (GitMaterialConfig) configConverter.toMaterialConfig(crGitMaterial,context); assertThat(gitMaterialConfig.getName().toLower(), is("name")); assertThat(gitMaterialConfig.getFolder(), is("folder")); assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.isInvertFilter(), is(false)); assertThat(gitMaterialConfig.getFilterAsString(), is("filter")); assertThat(gitMaterialConfig.getUrl(), is("url")); assertThat(gitMaterialConfig.getBranch(), is("branch")); } @Test public void shouldConvertGitMaterialWhenWhitelist() { CRGitMaterial crGitMaterial = new CRGitMaterial("name", "folder", true,true, filter, "url", "branch",true); GitMaterialConfig gitMaterialConfig = (GitMaterialConfig) configConverter.toMaterialConfig(crGitMaterial,context); assertThat(gitMaterialConfig.getName().toLower(), is("name")); assertThat(gitMaterialConfig.getFolder(), is("folder")); assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.isInvertFilter(), is(true)); assertThat(gitMaterialConfig.getFilterAsString(), is("filter")); assertThat(gitMaterialConfig.getUrl(), is("url")); assertThat(gitMaterialConfig.getBranch(), is("branch")); } @Test public void shouldConvertGitMaterialWhenNulls() { CRGitMaterial crGitMaterial = new CRGitMaterial(); crGitMaterial.setUrl("url"); GitMaterialConfig gitMaterialConfig = (GitMaterialConfig) configConverter.toMaterialConfig(crGitMaterial,context); assertNull(crGitMaterial.getName()); assertNull(crGitMaterial.getDirectory()); assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.isShallowClone(), is(false)); assertThat(gitMaterialConfig.filter(), is(new Filter())); assertThat(gitMaterialConfig.getUrl(), is("url")); assertThat(gitMaterialConfig.getBranch(), is("master")); } @Test public void shouldConvertConfigMaterialWhenConfigRepoIsGitWithUrlOnly() { // this url would be configured inside xml config-repo section GitMaterialConfig configRepoMaterial = new GitMaterialConfig("url"); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial(); MaterialConfig materialConfig = configConverter.toMaterialConfig(crConfigMaterial,context); assertNull("shouldSetEmptyMaterialNameAsInConfigRepoSourceCode",materialConfig.getName()); GitMaterialConfig gitMaterialConfig = (GitMaterialConfig)materialConfig; assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.getUrl(), is("url")); assertNull(gitMaterialConfig.getFolder()); assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.isShallowClone(), is(false)); assertThat(gitMaterialConfig.filter(), is(new Filter())); assertThat(gitMaterialConfig.getUrl(), is("url")); assertThat(gitMaterialConfig.getBranch(), is("master")); } @Test public void shouldConvertConfigMaterialWhenConfigRepoIsGitWithBlacklist() { // this url would be configured inside xml config-repo section GitMaterialConfig configRepoMaterial = new GitMaterialConfig("url"); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial(); crConfigMaterial.setFilter(new CRFilter(filter,false)); MaterialConfig materialConfig = configConverter.toMaterialConfig(crConfigMaterial,context); assertNull("shouldSetEmptyMaterialNameAsInConfigRepoSourceCode",materialConfig.getName()); GitMaterialConfig gitMaterialConfig = (GitMaterialConfig)materialConfig; assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.getUrl(), is("url")); assertNull(gitMaterialConfig.getFolder()); assertThat(gitMaterialConfig.getAutoUpdate(), is(true)); assertThat(gitMaterialConfig.isShallowClone(), is(false)); Filter blacklistFilter = new Filter(new IgnoredFiles("filter")); assertThat(gitMaterialConfig.filter(), is(blacklistFilter)); assertThat(gitMaterialConfig.getUrl(), is("url")); assertThat(gitMaterialConfig.getBranch(), is("master")); } @Test public void shouldConvertConfigMaterialWhenConfigRepoIsHgWithWhitelist() { // this url would be configured inside xml config-repo section HgMaterialConfig configRepoMaterial = new HgMaterialConfig("url","folder"); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial(null, null,new CRFilter(filter,true)); MaterialConfig materialConfig = configConverter.toMaterialConfig(crConfigMaterial,context); assertNull("shouldSetEmptyMaterialNameAsInConfigRepoSourceCode",materialConfig.getName()); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig)materialConfig; assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("filter")); assertThat(hgMaterialConfig.getUrl(), is("url")); Filter whitelistFilter = new Filter(new IgnoredFiles("filter")); assertThat(hgMaterialConfig.filter(), is(whitelistFilter)); assertThat(hgMaterialConfig.isInvertFilter(),is(true)); } @Test public void shouldConvertConfigMaterialWhenConfigRepoIsHgWithEmptyFilter() { // this url would be configured inside xml config-repo section HgMaterialConfig configRepoMaterial = new HgMaterialConfig("url","folder"); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial(null, null,new CRFilter(new ArrayList<>(),true)); MaterialConfig materialConfig = configConverter.toMaterialConfig(crConfigMaterial,context); assertNull("shouldSetEmptyMaterialNameAsInConfigRepoSourceCode",materialConfig.getName()); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig)materialConfig; assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("")); assertThat(hgMaterialConfig.getUrl(), is("url")); assertThat(hgMaterialConfig.filter(), is(new Filter())); assertThat(hgMaterialConfig.isInvertFilter(),is(false)); } @Test public void shouldConvertConfigMaterialWhenConfigRepoIsHg() { // these parameters would be configured inside xml config-repo section HgMaterialConfig configRepoMaterial = new HgMaterialConfig(new HgUrlArgument("url"),true,new Filter(new IgnoredFiles("ignore")),false,"folder",new CaseInsensitiveString("name")); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial("example", null,null); MaterialConfig materialConfig = configConverter.toMaterialConfig(crConfigMaterial,context); assertThat("shouldSetMaterialNameAsInConfigRepoSourceCode",materialConfig.getName().toLower(), is("example")); assertThat("shouldUseFolderFromXMLWhenConfigRepoHasNone",materialConfig.getFolder(), is("folder")); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig)materialConfig; assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("ignore")); assertThat(hgMaterialConfig.getUrl(), is("url")); } @Test public void shouldConvertConfigMaterialWhenConfigRepoIsHgWithDestination() { // these parameters would be configured inside xml config-repo section HgMaterialConfig configRepoMaterial = new HgMaterialConfig(new HgUrlArgument("url"),true,new Filter(new IgnoredFiles("ignore")),false,"folder",new CaseInsensitiveString("name")); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial("example", "dest1",null); MaterialConfig materialConfig = configConverter.toMaterialConfig(crConfigMaterial,context); assertThat("shouldSetMaterialNameAsInConfigRepoSourceCode",materialConfig.getName().toLower(), is("example")); assertThat("shouldUseFolderFromConfigRepoWhenSpecified",materialConfig.getFolder(), is("dest1")); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig)materialConfig; assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("ignore")); assertThat(hgMaterialConfig.getUrl(), is("url")); } @Test public void shouldConvertConfigMaterialWhenPluggableScmMaterial() { SCM myscm = new SCM("scmid", new PluginConfiguration(), new Configuration()); SCMs scms = new SCMs(myscm); BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.setSCMs(scms); when(cachedGoConfig.currentConfig()).thenReturn(cruiseConfig); PluggableSCMMaterialConfig configRepoMaterial = new PluggableSCMMaterialConfig(new CaseInsensitiveString("scmid"),myscm,null,null); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial("example", "dest1",null); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = (PluggableSCMMaterialConfig)configConverter.toMaterialConfig(crConfigMaterial,context); assertThat(pluggableSCMMaterialConfig.getName().toLower(),is("example")); assertThat(pluggableSCMMaterialConfig.getSCMConfig(),is(myscm)); assertThat(pluggableSCMMaterialConfig.getScmId(),is("scmid")); assertThat(pluggableSCMMaterialConfig.getFolder(),is("dest1")); assertThat(pluggableSCMMaterialConfig.getFilterAsString(), is("")); } @Test public void shouldFailToConvertConfigMaterialWhenPluggableScmMaterialWithWhitelist() { SCM myscm = new SCM("scmid", new PluginConfiguration(), new Configuration()); SCMs scms = new SCMs(myscm); BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.setSCMs(scms); when(cachedGoConfig.currentConfig()).thenReturn(cruiseConfig); PluggableSCMMaterialConfig configRepoMaterial = new PluggableSCMMaterialConfig(new CaseInsensitiveString("scmid"),myscm,null,null); when(context.configMaterial()).thenReturn(configRepoMaterial); CRConfigMaterial crConfigMaterial = new CRConfigMaterial("example", "dest1",new CRFilter(filter,true)); try { configConverter.toMaterialConfig(crConfigMaterial, context); fail("should have thrown"); } catch (ConfigConvertionException ex) { assertThat(ex.getMessage(),is("Plugable SCMs do not support whitelisting")); } } @Test public void shouldConvertHgMaterial() { CRHgMaterial crHgMaterial = new CRHgMaterial("name", "folder", true, false, filter, "url"); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig) configConverter.toMaterialConfig(crHgMaterial,context); assertThat(hgMaterialConfig.getName().toLower(), is("name")); assertThat(hgMaterialConfig.getFolder(), is("folder")); assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("filter")); assertThat(hgMaterialConfig.getUrl(), is("url")); } @Test public void shouldConvertHgMaterialWhenNullName() { CRHgMaterial crHgMaterial = new CRHgMaterial(null, "folder", true, false, filter, "url"); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig) configConverter.toMaterialConfig(crHgMaterial,context); assertNull(hgMaterialConfig.getName()); assertThat(hgMaterialConfig.getFolder(), is("folder")); assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("filter")); assertThat(hgMaterialConfig.getUrl(), is("url")); } @Test public void shouldConvertHgMaterialWhenEmptyName() { CRHgMaterial crHgMaterial = new CRHgMaterial("", "folder", true, false, filter, "url"); HgMaterialConfig hgMaterialConfig = (HgMaterialConfig) configConverter.toMaterialConfig(crHgMaterial,context); assertNull(hgMaterialConfig.getName()); assertThat(hgMaterialConfig.getFolder(), is("folder")); assertThat(hgMaterialConfig.getAutoUpdate(), is(true)); assertThat(hgMaterialConfig.getFilterAsString(), is("filter")); assertThat(hgMaterialConfig.getUrl(), is("url")); } @Test public void shouldConvertP4MaterialWhenEncryptedPassword() { CRP4Material crp4Material = CRP4Material.withEncryptedPassword( "name","folder",false,false, filter,"server:port","user","encryptedvalue",true,"view"); P4MaterialConfig p4MaterialConfig = (P4MaterialConfig)configConverter.toMaterialConfig(crp4Material,context); assertThat(p4MaterialConfig.getName().toLower(), is("name")); assertThat(p4MaterialConfig.getFolder(), is("folder")); assertThat(p4MaterialConfig.getAutoUpdate(), is(false)); assertThat(p4MaterialConfig.getFilterAsString(), is("filter")); assertThat(p4MaterialConfig.getUrl(), is("server:port")); assertThat(p4MaterialConfig.getUserName(), is("user")); assertThat(p4MaterialConfig.getPassword(), is("secret")); assertThat(p4MaterialConfig.getUseTickets(), is(true)); assertThat(p4MaterialConfig.getView(), is("view")); } @Test public void shouldConvertP4MaterialWhenPlainPassword() { CRP4Material crp4Material = CRP4Material.withPlainPassword( "name", "folder", false, false, filter, "server:port", "user", "secret", true, "view"); P4MaterialConfig p4MaterialConfig = (P4MaterialConfig)configConverter.toMaterialConfig(crp4Material,context); assertThat(p4MaterialConfig.getName().toLower(), is("name")); assertThat(p4MaterialConfig.getFolder(), is("folder")); assertThat(p4MaterialConfig.getAutoUpdate(), is(false)); assertThat(p4MaterialConfig.getFilterAsString(), is("filter")); assertThat(p4MaterialConfig.getUrl(), is("server:port")); assertThat(p4MaterialConfig.getUserName(), is("user")); assertThat(p4MaterialConfig.getPassword(), is("secret")); assertThat(p4MaterialConfig.getUseTickets(), is(true)); assertThat(p4MaterialConfig.getView(), is("view")); } @Test public void shouldConvertSvmMaterialWhenEncryptedPassword() { CRSvnMaterial crSvnMaterial = CRSvnMaterial.withEncryptedPassword("name", "folder", true, false, filter, "url", "username", "encryptedvalue", true); SvnMaterialConfig svnMaterialConfig = (SvnMaterialConfig)configConverter.toMaterialConfig(crSvnMaterial,context); assertThat(svnMaterialConfig.getName().toLower(), is("name")); assertThat(svnMaterialConfig.getFolder(), is("folder")); assertThat(svnMaterialConfig.getAutoUpdate(), is(true)); assertThat(svnMaterialConfig.getFilterAsString(), is("filter")); assertThat(svnMaterialConfig.getUrl(), is("url")); assertThat(svnMaterialConfig.getUserName(), is("username")); assertThat(svnMaterialConfig.getPassword(), is("secret")); assertThat(svnMaterialConfig.isCheckExternals(), is(true)); } @Test public void shouldConvertSvmMaterialWhenPlainPassword() { CRSvnMaterial crSvnMaterial = new CRSvnMaterial("name","folder",true,false, filter,"url","username","secret",true); SvnMaterialConfig svnMaterialConfig = (SvnMaterialConfig)configConverter.toMaterialConfig(crSvnMaterial,context); assertThat(svnMaterialConfig.getName().toLower(), is("name")); assertThat(svnMaterialConfig.getFolder(), is("folder")); assertThat(svnMaterialConfig.getAutoUpdate(), is(true)); assertThat(svnMaterialConfig.getFilterAsString(), is("filter")); assertThat(svnMaterialConfig.getUrl(), is("url")); assertThat(svnMaterialConfig.getUserName(), is("username")); assertThat(svnMaterialConfig.getPassword(), is("secret")); assertThat(svnMaterialConfig.isCheckExternals(), is(true)); } @Test public void shouldConvertTfsMaterialWhenPlainPassword() { CRTfsMaterial crTfsMaterial = CRTfsMaterial.withPlainPassword( "name", "folder", false, false, filter, "url", "domain" ,"user", "secret", "project"); TfsMaterialConfig tfsMaterialConfig = (TfsMaterialConfig)configConverter.toMaterialConfig(crTfsMaterial,context); assertThat(tfsMaterialConfig.getName().toLower(), is("name")); assertThat(tfsMaterialConfig.getFolder(), is("folder")); assertThat(tfsMaterialConfig.getAutoUpdate(), is(false)); assertThat(tfsMaterialConfig.getFilterAsString(), is("filter")); assertThat(tfsMaterialConfig.getUrl(), is("url")); assertThat(tfsMaterialConfig.getUserName(), is("user")); assertThat(tfsMaterialConfig.getPassword(), is("secret")); assertThat(tfsMaterialConfig.getDomain(), is("domain")); assertThat(tfsMaterialConfig.getProjectPath(), is("project")); } @Test public void shouldConvertTfsMaterialWhenEncryptedPassword() { CRTfsMaterial crTfsMaterial = CRTfsMaterial.withEncryptedPassword( "name", "folder", false, false, filter, "url", "domain", "user", "encryptedvalue", "project"); TfsMaterialConfig tfsMaterialConfig = (TfsMaterialConfig)configConverter.toMaterialConfig(crTfsMaterial,context); assertThat(tfsMaterialConfig.getName().toLower(), is("name")); assertThat(tfsMaterialConfig.getFolder(), is("folder")); assertThat(tfsMaterialConfig.getAutoUpdate(), is(false)); assertThat(tfsMaterialConfig.getFilterAsString(), is("filter")); assertThat(tfsMaterialConfig.getUrl(), is("url")); assertThat(tfsMaterialConfig.getUserName(), is("user")); assertThat(tfsMaterialConfig.getPassword(), is("secret")); assertThat(tfsMaterialConfig.getDomain(), is("domain")); assertThat(tfsMaterialConfig.getProjectPath(), is("project")); } @Test public void shouldConvertPluggableScmMaterial() { SCM myscm = new SCM("scmid", new PluginConfiguration(), new Configuration()); SCMs scms = new SCMs(myscm); BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.setSCMs(scms); when(cachedGoConfig.currentConfig()).thenReturn(cruiseConfig); CRPluggableScmMaterial crPluggableScmMaterial = new CRPluggableScmMaterial("name","scmid","directory",filter); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = (PluggableSCMMaterialConfig)configConverter.toMaterialConfig(crPluggableScmMaterial,context); assertThat(pluggableSCMMaterialConfig.getName().toLower(),is("name")); assertThat(pluggableSCMMaterialConfig.getSCMConfig(),is(myscm)); assertThat(pluggableSCMMaterialConfig.getScmId(),is("scmid")); assertThat(pluggableSCMMaterialConfig.getFolder(),is("directory")); assertThat(pluggableSCMMaterialConfig.getFilterAsString(), is("filter")); } @Test public void shouldConvertPackageMaterial() { PackageRepositories repositories = new PackageRepositories(); PackageRepository packageRepository = new PackageRepository(); PackageDefinition definition = new PackageDefinition("package-id", "n", new Configuration()); packageRepository.addPackage(definition); repositories.add(packageRepository); BasicCruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.setPackageRepositories(repositories); when(cachedGoConfig.currentConfig()).thenReturn(cruiseConfig); CRPackageMaterial crPackageMaterial = new CRPackageMaterial("name","package-id"); PackageMaterialConfig packageMaterialConfig = (PackageMaterialConfig)configConverter.toMaterialConfig(crPackageMaterial,context); assertThat(packageMaterialConfig.getName().toLower(),is("name")); assertThat(packageMaterialConfig.getPackageId(),is("package-id")); assertThat(packageMaterialConfig.getPackageDefinition(),is(definition)); } @Test public void shouldConvertArtifactPlanWhenDestinationIsNull() { ArtifactPlan artifactPlan = configConverter.toArtifactPlan(new CRArtifact("src",null)); assertThat(artifactPlan.getDest(),is("")); } @Test public void shouldConvertArtifactPlanWhenDestinationIsSet() { ArtifactPlan artifactPlan = configConverter.toArtifactPlan(new CRArtifact("src","dest")); assertThat(artifactPlan.getDest(),is("dest")); } @Test public void shouldConvertJob() { CRJob crJob = new CRJob("name",environmentVariables, tabs, resources, null, artifacts, artifactPropertiesGenerators, false, 5, 120, tasks); JobConfig jobConfig = configConverter.toJobConfig(crJob); assertThat(jobConfig.name().toLower(),is("name")); assertThat(jobConfig.hasVariable("key"),is(true)); assertThat(jobConfig.getTabs().first().getName(),is("tabname")); assertThat(jobConfig.resources(),hasItem(new Resource("resource1"))); assertThat(jobConfig.artifactPlans(),hasItem(new ArtifactPlan("src", "dest"))); assertThat(jobConfig.getProperties(),hasItem(new ArtifactPropertiesGenerator("name","src","path"))); assertThat(jobConfig.isRunOnAllAgents(),is(false)); assertThat(jobConfig.getRunInstanceCount(),is("5")); assertThat(jobConfig.getTimeout(),is("120")); assertThat(jobConfig.getTasks().size(),is(1)); } @Test public void shouldConvertJobWhenHasElasticProfileId() { CRJob crJob = new CRJob("name",environmentVariables, tabs, null, "myprofile", artifacts, artifactPropertiesGenerators, false, 5, 120, tasks); JobConfig jobConfig = configConverter.toJobConfig(crJob); assertThat(jobConfig.getElasticProfileId(),is("myprofile")); assertThat(jobConfig.resources().size(),is(0)); } @Test public void shouldConvertJobWhenRunInstanceCountIsNotSpecified() { CRJob crJob = new CRJob("name",environmentVariables, tabs, resources, null, artifacts, artifactPropertiesGenerators, null, 120, tasks); JobConfig jobConfig = configConverter.toJobConfig(crJob); assertThat(jobConfig.isRunOnAllAgents(),is(false)); assertNull(jobConfig.getRunInstanceCount()); assertThat(jobConfig.getTimeout(),is("120")); assertThat(jobConfig.getTasks().size(),is(1)); } @Test public void shouldConvertJobWhenRunInstanceCountIsAll() { CRJob crJob = new CRJob("name",environmentVariables, tabs, resources, null, artifacts, artifactPropertiesGenerators, "all", 120, tasks); JobConfig jobConfig = configConverter.toJobConfig(crJob); assertNull(jobConfig.getRunInstanceCount()); assertThat(jobConfig.isRunOnAllAgents(),is(true)); assertThat(jobConfig.getTimeout(),is("120")); assertThat(jobConfig.getTasks().size(),is(1)); } @Test public void shouldConvertApprovalWhenManualAndAuth() { CRApproval crApproval = new CRApproval(CRApprovalCondition.manual, authorizedRoles, authorizedUsers); Approval approval = configConverter.toApproval(crApproval); assertThat(approval.isManual(),is(true)); assertThat(approval.isAuthorizationDefined(),is(true)); assertThat(approval.getAuthConfig().getRoles(),hasItem(new AdminRole(new CaseInsensitiveString("authRole")))); assertThat(approval.getAuthConfig().getUsers(),hasItem(new AdminUser(new CaseInsensitiveString("authUser")))); } @Test public void shouldConvertApprovalWhenManualAndNoAuth() { CRApproval crApproval = new CRApproval(CRApprovalCondition.manual, new ArrayList<>(), new ArrayList<>()); Approval approval = configConverter.toApproval(crApproval); assertThat(approval.isManual(),is(true)); assertThat(approval.isAuthorizationDefined(),is(false)); } @Test public void shouldConvertApprovalWhenSuccess() { CRApproval crApproval = new CRApproval(CRApprovalCondition.success, new ArrayList<>(), new ArrayList<>()); Approval approval = configConverter.toApproval(crApproval); assertThat(approval.isManual(),is(false)); assertThat(approval.isAuthorizationDefined(),is(false)); } @Test public void shouldConvertStage() { CRApproval approval = new CRApproval(CRApprovalCondition.manual, authorizedRoles, authorizedUsers); CRStage crStage = new CRStage("stageName",true,true,true, approval,environmentVariables,jobs); StageConfig stageConfig = configConverter.toStage(crStage); assertThat(stageConfig.name().toLower(),is("stagename")); assertThat(stageConfig.isFetchMaterials(),is(true)); assertThat(stageConfig.isCleanWorkingDir(),is(true)); assertThat(stageConfig.isArtifactCleanupProhibited(),is(true)); assertThat(stageConfig.getVariables().hasVariable("key"),is(true)); assertThat(stageConfig.getJobs().size(),is(1)); } @Test public void shouldConvertPipeline() { CRPipeline crPipeline = new CRPipeline("pipename","group1","label",true, trackingTool,null,timer,environmentVariables,materials,stages); PipelineConfig pipelineConfig = configConverter.toPipelineConfig(crPipeline,context); assertThat(pipelineConfig.name().toLower(),is("pipename")); assertThat(pipelineConfig.materialConfigs().first() instanceof GitMaterialConfig,is(true)); assertThat(pipelineConfig.first().name().toLower(),is("stagename")); assertThat(pipelineConfig.getVariables().hasVariable("key"),is(true)); assertThat(pipelineConfig.trackingTool().getLink(),is("link")); assertThat(pipelineConfig.getTimer().getTimerSpec(),is("timer")); assertThat(pipelineConfig.getLabelTemplate(),is("label")); } @Test public void shouldConvertMinimalPipeline() { CRPipeline crPipeline = new CRPipeline(); crPipeline.setName("p1"); List<CRStage> min_stages = new ArrayList<>(); CRStage min_stage = new CRStage(); min_stage.setName("build"); Collection<CRJob> min_jobs = new ArrayList<>(); CRJob job = new CRJob(); job.setName("buildjob"); List<CRTask> min_tasks = new ArrayList<>(); min_tasks.add(new CRBuildTask("rake")); job.setTasks(min_tasks); min_jobs.add(job); min_stage.setJobs(min_jobs); min_stages.add(min_stage); crPipeline.setStages(min_stages); Collection<CRMaterial> min_materials = new ArrayList<>(); CRSvnMaterial crSvnMaterial = new CRSvnMaterial(); crSvnMaterial.setUrl("url"); min_materials.add(crSvnMaterial); crPipeline.setMaterials(min_materials); PipelineConfig pipelineConfig = configConverter.toPipelineConfig(crPipeline,context); assertThat(pipelineConfig.name().toLower(),is("p1")); assertThat(pipelineConfig.materialConfigs().first() instanceof SvnMaterialConfig,is(true)); assertThat(pipelineConfig.first().name().toLower(),is("build"));; assertThat(pipelineConfig.getLabelTemplate(),is(PipelineLabel.COUNT_TEMPLATE)); } @Test public void shouldConvertPipelineGroup() { List<CRPipeline> pipelines = new ArrayList<>(); pipelines.add(new CRPipeline("pipename","group","label",true, trackingTool,null,timer,environmentVariables,materials,stages)); Map<String,List<CRPipeline>> map = new HashedMap(); map.put("group",pipelines); Map.Entry<String,List<CRPipeline>> crPipelineGroup = map.entrySet().iterator().next(); PipelineConfigs pipelineConfigs = configConverter.toBasicPipelineConfigs(crPipelineGroup, context); assertThat(pipelineConfigs.getGroup(),is("group")); assertThat(pipelineConfigs.getPipelines().size(),is(1)); } @Test public void shouldConvertPipelineGroupWhenNoName() { List<CRPipeline> pipelines = new ArrayList<>(); pipelines.add(new CRPipeline("pipename",null,"label",true, trackingTool,null,timer,environmentVariables,materials,stages)); Map<String,List<CRPipeline>> map = new HashedMap(); map.put(null,pipelines); Map.Entry<String,List<CRPipeline>> crPipelineGroup = map.entrySet().iterator().next(); PipelineConfigs pipelineConfigs = configConverter.toBasicPipelineConfigs(crPipelineGroup, context); assertThat(pipelineConfigs.getGroup(),is(PipelineConfigs.DEFAULT_GROUP)); assertThat(pipelineConfigs.getPipelines().size(),is(1)); } @Test public void shouldConvertPipelineGroupWhenEmptyName() { List<CRPipeline> pipelines = new ArrayList<>(); pipelines.add(new CRPipeline("pipename","","label",true, trackingTool,null,timer,environmentVariables,materials,stages)); Map<String,List<CRPipeline>> map = new HashedMap(); map.put("",pipelines); Map.Entry<String,List<CRPipeline>> crPipelineGroup = map.entrySet().iterator().next(); PipelineConfigs pipelineConfigs = configConverter.toBasicPipelineConfigs(crPipelineGroup, context); assertThat(pipelineConfigs.getGroup(),is(PipelineConfigs.DEFAULT_GROUP)); assertThat(pipelineConfigs.getPipelines().size(),is(1)); } @Test public void shouldConvertPartialConfigWithGroupsAndEnvironments() { CRPipeline pipeline = new CRPipeline("pipename", "group", "label", true, trackingTool, null, timer, environmentVariables, materials, stages); ArrayList<String> agents = new ArrayList<>(); agents.add("12"); ArrayList<String> pipelineNames = new ArrayList<>(); pipelineNames.add("pipename"); CREnvironment crEnvironment = new CREnvironment("dev", environmentVariables, agents, pipelineNames); CRParseResult crPartialConfig = new CRParseResult(); crPartialConfig.getEnvironments().add(crEnvironment); crPartialConfig.getPipelines().add(pipeline); PartialConfig partialConfig = configConverter.toPartialConfig(crPartialConfig, context); assertThat(partialConfig.getGroups().size(),is(1)); assertThat(partialConfig.getEnvironments().size(),is(1)); } @Test public void shouldConvertCRTimerWhenAllAssigned(){ CRTimer timer = new CRTimer("0 15 * * 6",true); TimerConfig result = configConverter.toTimerConfig(timer); assertThat(result.getTimerSpec(),is("0 15 * * 6")); assertThat(result.getOnlyOnChanges(),is(true)); } @Test public void shouldConvertCRTimerWhenNullOnChanges(){ CRTimer timer = new CRTimer("0 15 * * 6",null); TimerConfig result = configConverter.toTimerConfig(timer); assertThat(result.getTimerSpec(),is("0 15 * * 6")); assertThat(result.getOnlyOnChanges(),is(false)); } @Test public void shouldFailConvertCRTimerWhenNullSpec(){ CRTimer timer = new CRTimer(null,false); try { configConverter.toTimerConfig(timer); fail("should have thrown"); } catch(Exception ex) { //ok } } }