@Override public MaterialConfig config() { return new PluggableSCMMaterialConfig(name, scmConfig, folder, filter); }
public PluggableSCMMaterial(PluggableSCMMaterialConfig config) { this(); this.name = config.getName(); this.scmId = config.getScmId(); this.scmConfig = config.getSCMConfig(); this.folder = config.getFolder(); this.filter = config.filter(); }
public static PluggableSCMMaterialConfig fromJSON(JsonReader jsonReader, ConfigHelperOptions options) { PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(); CruiseConfig cruiseConfig = options.getCruiseConfig(); if (cruiseConfig != null) { String ref = jsonReader.getString("ref"); pluggableSCMMaterialConfig.setSCMConfig(cruiseConfig.getSCMs().find(ref)); pluggableSCMMaterialConfig.setScmId(ref); } jsonReader.readStringIfPresent("destination", pluggableSCMMaterialConfig::setFolder); jsonReader.optJsonObject("filter").ifPresent(filterReader -> { pluggableSCMMaterialConfig.setFilter(FilterRepresenter.fromJSON(filterReader)); }); return pluggableSCMMaterialConfig; } }
public void validateNotSubdirectoryOf(String otherSCMMaterialFolder) { String myDirPath = this.getFolder(); if (myDirPath == null || otherSCMMaterialFolder == null) { return; } if (FilenameUtil.isNormalizedDirectoryPathInsideNormalizedParentDirectory(myDirPath, otherSCMMaterialFolder)) { addError(FOLDER, "Invalid Destination Directory. Every material needs a different destination directory and the directories should not be nested."); } }
@Override public String getDisplayName() { CaseInsensitiveString name = getName(); return name == null || name.isBlank() ? getUriForDisplay() : CaseInsensitiveString.str(name); }
@Test public void shouldSetConfigAttributesForSCMMaterialWhenDataIsEmpty() throws Exception { Map<String, String> attributes = new HashMap<>(); attributes.put(PluggableSCMMaterialConfig.SCM_ID, "scm-id"); attributes.put(PluggableSCMMaterialConfig.FOLDER, ""); attributes.put(PluggableSCMMaterialConfig.FILTER, ""); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(); pluggableSCMMaterialConfig.setFolder("dest"); pluggableSCMMaterialConfig.setFilter(new Filter(new IgnoredFiles("/foo/**.*"))); pluggableSCMMaterialConfig.setConfigAttributes(attributes); assertThat(pluggableSCMMaterialConfig.getScmId(), is("scm-id")); assertThat(pluggableSCMMaterialConfig.getFolder(), is(nullValue())); assertThat(pluggableSCMMaterialConfig.filter(), is(new Filter())); }
@Test public void shouldSetConfigAttributesForSCMMaterial() throws Exception { Map<String, String> attributes = new HashMap<>(); attributes.put(PluggableSCMMaterialConfig.SCM_ID, "scm-id"); attributes.put(PluggableSCMMaterialConfig.FOLDER, "dest"); attributes.put(PluggableSCMMaterialConfig.FILTER, "/foo/**.*,/another/**.*,bar"); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(); pluggableSCMMaterialConfig.setConfigAttributes(attributes); assertThat(pluggableSCMMaterialConfig.getScmId(), is("scm-id")); assertThat(pluggableSCMMaterialConfig.getFolder(), is("dest")); assertThat(pluggableSCMMaterialConfig.filter(), is(new Filter(new IgnoredFiles("/foo/**.*"), new IgnoredFiles("/another/**.*"), new IgnoredFiles("bar")))); }
@Test public void shouldAllowFolderAndFilterForPluggableSCMMaterialForPipeline() throws Exception { CruiseConfig configToSave = new BasicCruiseConfig(); SCM scm = new SCM(); String scmId = "scm-id"; scm.setId(scmId); scm.setName("name"); scm.setPluginConfiguration(new PluginConfiguration("plugin-id", "1.0")); scm.setConfiguration(new Configuration(getConfigurationProperty("url", false, "http://go"))); configToSave.getSCMs().add(scm); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(scmId); pluggableSCMMaterialConfig.setSCMConfig(scm); pluggableSCMMaterialConfig.setFolder("dest"); pluggableSCMMaterialConfig.setFilter(new Filter(new IgnoredFiles("x"), new IgnoredFiles("y"))); configToSave.addPipeline("default", PipelineConfigMother.pipelineConfig("test", new MaterialConfigs(pluggableSCMMaterialConfig), new JobConfigs(new JobConfig("ls")))); xmlWriter.write(configToSave, output, false); GoConfigHolder goConfigHolder = xmlLoader.loadConfigHolder(output.toString()); PipelineConfig pipelineConfig = goConfigHolder.config.pipelineConfigByName(new CaseInsensitiveString("test")); MaterialConfig materialConfig = pipelineConfig.materialConfigs().get(0); assertThat(materialConfig instanceof PluggableSCMMaterialConfig, is(true)); assertThat(((PluggableSCMMaterialConfig) materialConfig).getScmId(), is(scmId)); assertThat(((PluggableSCMMaterialConfig) materialConfig).getSCMConfig(), is(scm)); assertThat(materialConfig.getFolder(), is("dest")); assertThat(materialConfig.filter(), is(new Filter(new IgnoredFiles("x"), new IgnoredFiles("y")))); }
public static void toJSON(OutputWriter jsonWriter, PluggableSCMMaterialConfig pluggableSCMMaterialConfig) { jsonWriter.add("ref", pluggableSCMMaterialConfig.getScmId()); if (pluggableSCMMaterialConfig.filter().isEmpty()) { jsonWriter.renderNull("filter"); } else { jsonWriter.addChild("filter", filterWriter -> FilterRepresenter.toJSON(filterWriter, pluggableSCMMaterialConfig.filter())); } jsonWriter.add("destination", pluggableSCMMaterialConfig.getFolder()); }
PipelineConfig pipelineConfig = goConfigHolder.config.pipelineConfigByName(new CaseInsensitiveString("new_name")); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = (PluggableSCMMaterialConfig) pipelineConfig.materialConfigs().get(0); assertThat(pluggableSCMMaterialConfig.getSCMConfig(), is(goConfigHolder.config.getSCMs().get(0))); assertThat(pluggableSCMMaterialConfig.getFolder(), is(nullValue())); assertThat(pluggableSCMMaterialConfig.filter(), is(new Filter()));
@Test public void shouldAllowSCMTypeMaterialForPipeline() throws Exception { CruiseConfig configToSave = new BasicCruiseConfig(); SCM scm = new SCM(); String scmId = "scm-id"; scm.setId(scmId); scm.setName("name"); scm.setPluginConfiguration(new PluginConfiguration("plugin-id", "1.0")); scm.setConfiguration(new Configuration(getConfigurationProperty("url", false, "http://go"))); configToSave.getSCMs().add(scm); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(scmId); pluggableSCMMaterialConfig.setSCMConfig(scm); configToSave.addPipeline("default", PipelineConfigMother.pipelineConfig("test", new MaterialConfigs(pluggableSCMMaterialConfig), new JobConfigs(new JobConfig("ls")))); xmlWriter.write(configToSave, output, false); GoConfigHolder goConfigHolder = xmlLoader.loadConfigHolder(output.toString()); PipelineConfig pipelineConfig = goConfigHolder.config.pipelineConfigByName(new CaseInsensitiveString("test")); MaterialConfig materialConfig = pipelineConfig.materialConfigs().get(0); assertThat(materialConfig instanceof PluggableSCMMaterialConfig, is(true)); assertThat(((PluggableSCMMaterialConfig) materialConfig).getScmId(), is(scmId)); assertThat(((PluggableSCMMaterialConfig) materialConfig).getSCMConfig(), is(scm)); assertThat(materialConfig.getFolder(), is(nullValue())); assertThat(materialConfig.filter(), is(new Filter())); }
@Test public void shouldCorrectlyGet_Name_DisplayName_Description_LongDescription_UriForDisplay() { SCM scmConfig = mock(SCM.class); when(scmConfig.getName()).thenReturn("scm-name"); when(scmConfig.getConfigForDisplay()).thenReturn("k1:v1"); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, null, null); assertThat(pluggableSCMMaterialConfig.getName(), is(new CaseInsensitiveString("scm-name"))); assertThat(pluggableSCMMaterialConfig.getDisplayName(), is("scm-name")); assertThat(pluggableSCMMaterialConfig.getLongDescription(), is("k1:v1")); assertThat(pluggableSCMMaterialConfig.getUriForDisplay(), is("k1:v1")); when(scmConfig.getName()).thenReturn(null); pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, null, null); assertThat(pluggableSCMMaterialConfig.getName(), is(nullValue())); assertThat(pluggableSCMMaterialConfig.getDisplayName(), is("k1:v1")); }
@Test public void shouldAddErrorWhenAssociatedSCMPluginIsMissing() throws Exception { PipelineConfigSaveValidationContext configSaveValidationContext = mock(PipelineConfigSaveValidationContext.class); when(configSaveValidationContext.findScmById(anyString())).thenReturn(mock(SCM.class)); SCM scmConfig = mock(SCM.class); when(scmConfig.doesPluginExist()).thenReturn(false); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "usr/home", null); pluggableSCMMaterialConfig.setScmId("scm-id"); pluggableSCMMaterialConfig.validateTree(configSaveValidationContext); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1)); assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Could not find plugin for scm-id: [scm-id].")); }
@Test public void shouldGetNameFromSCMName() { PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(); SCM scmConfig = SCMMother.create("scm-id", "scm-name", "plugin-id", "1.0", new Configuration(create("k1", false, "v1"))); pluggableSCMMaterialConfig.setSCMConfig(scmConfig); assertThat(pluggableSCMMaterialConfig.getName().toString(), is("scm-name")); pluggableSCMMaterialConfig.setSCMConfig(null); assertThat(pluggableSCMMaterialConfig.getName(), is(nullValue())); }
@Test public void shouldCheckEquals() throws Exception { SCM scmConfig = SCMMother.create("scm-id", "scm-name", "plugin-id", "1.0", new Configuration(create("k1", false, "v1"))); // same fingerprint PluggableSCMMaterialConfig p1 = new PluggableSCMMaterialConfig(); p1.setSCMConfig(scmConfig); PluggableSCMMaterialConfig p2 = new PluggableSCMMaterialConfig(); p2.setSCMConfig(scmConfig); assertThat(p1.equals(p2), is(true)); // folder p2.setFolder("dest"); assertThat(p1.equals(p2), is(false)); // scmConfig null p1 = new PluggableSCMMaterialConfig(); p2 = new PluggableSCMMaterialConfig(); assertThat(p1.equals(p2), is(true)); p2.setSCMConfig(scmConfig); assertThat(p1.equals(p2), is(false)); p1.setSCMConfig(scmConfig); p2 = new PluggableSCMMaterialConfig(); assertThat(p1.equals(p2), is(false)); p2.setSCMConfig(scmConfig); assertThat(p1.equals(p2), is(true)); // null comparison assertThat(p1.equals(null), is(false)); }
@Test public void shouldSetSCMIdAsNullIfSCMConfigIsNull() { pluggableSCMMaterialConfig.setSCMConfig(null); assertThat(pluggableSCMMaterialConfig.getScmId(), is(nullValue())); assertThat(pluggableSCMMaterialConfig.getSCMConfig(), is(nullValue())); }
@Test public void shouldGetExistingOrDefaultPluggableSCMMaterialCorrectly() { SvnMaterialConfig svn = new SvnMaterialConfig("http://test.com", false); PluggableSCMMaterialConfig pluggableSCMMaterialOne = new PluggableSCMMaterialConfig("scm-id-1"); PluggableSCMMaterialConfig pluggableSCMMaterialTwo = new PluggableSCMMaterialConfig("scm-id-2"); assertThat(new MaterialConfigs(svn, pluggableSCMMaterialTwo).getExistingOrDefaultMaterial(pluggableSCMMaterialOne).getScmId(), is("scm-id-2")); assertThat(new MaterialConfigs(svn).getExistingOrDefaultMaterial(pluggableSCMMaterialOne).getScmId(), is("scm-id-1")); }
@Test public void shouldGetFilterAsString() { PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(); pluggableSCMMaterialConfig.setFilter(new Filter(new IgnoredFiles("/foo/**.*"), new IgnoredFiles("/another/**.*"), new IgnoredFiles("bar"))); assertThat(pluggableSCMMaterialConfig.getFilterAsString(), is("/foo/**.*,/another/**.*,bar")); pluggableSCMMaterialConfig.setFilter(new Filter()); assertThat(pluggableSCMMaterialConfig.getFilterAsString(), is("")); }
@Test public void shouldAddErrorIDestinationIsNotValid() throws Exception { ConfigSaveValidationContext configSaveValidationContext = mock(ConfigSaveValidationContext.class); SCM scmConfig = mock(SCM.class); when(configSaveValidationContext.findScmById(anyString())).thenReturn(scmConfig); when(scmConfig.doesPluginExist()).thenReturn(true); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "/usr/home", null); pluggableSCMMaterialConfig.setScmId("scm-id"); pluggableSCMMaterialConfig.validateConcreteMaterial(configSaveValidationContext); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1)); assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.FOLDER), is("Dest folder '/usr/home' is not valid. It must be a sub-directory of the working folder.")); pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "./../crap", null); pluggableSCMMaterialConfig.setScmId("scm-id"); pluggableSCMMaterialConfig.validateConcreteMaterial(configSaveValidationContext); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(2)); assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.FOLDER), is("Invalid directory name './../crap'. It should be a valid relative path.")); }
@Test public void shouldPassMaterialUniquenessIfIfNoDuplicateSCMFound() throws Exception { Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>(); nameToMaterialMap.put(new CaseInsensitiveString("scm-id-new"), new PluggableSCMMaterialConfig("scm-id-new")); nameToMaterialMap.put(new CaseInsensitiveString("foo"), new GitMaterialConfig("url")); pluggableSCMMaterialConfig.validateNameUniqueness(nameToMaterialMap); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(0)); assertThat(nameToMaterialMap.size(), is(3)); }