@Test public void shouldNotValidateNestingOfMaterialDirectoriesBasedOnServerSideFileSystem() throws IOException { final File workingDir = temporaryFolder.newFolder("go-working-dir"); final File material1 = new File(workingDir, "material1"); material1.mkdirs(); final Path material2 = Files.createSymbolicLink(Paths.get(new File(workingDir, "material2").getPath()), Paths.get(material1.getPath())); pluggableSCMMaterialConfig.setFolder(material1.getAbsolutePath()); pluggableSCMMaterialConfig.validateNotSubdirectoryOf(material2.toAbsolutePath().toString()); assertNull(pluggableSCMMaterialConfig.errors().getAllOn(FOLDER)); } }
@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 shouldAddErrorWhenMatchingScmConfigDoesNotExist() throws Exception { PipelineConfigSaveValidationContext validationContext = mock(PipelineConfigSaveValidationContext.class); when(validationContext.findScmById(anyString())).thenReturn(null); SCM scmConfig = mock(SCM.class); when(scmConfig.doesPluginExist()).thenReturn(true); PluggableSCMMaterialConfig pluggableSCMMaterialConfig = new PluggableSCMMaterialConfig(null, scmConfig, "usr/home", null); pluggableSCMMaterialConfig.setScmId("scm-id"); pluggableSCMMaterialConfig.validateTree(validationContext); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1)); assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Could not find SCM for given scm-id: [scm-id].")); }
@Test public void shouldAddErrorIfSCMNameUniquenessValidationFails() throws Exception { Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>(); PluggableSCMMaterialConfig existingMaterial = new PluggableSCMMaterialConfig("scm-id"); nameToMaterialMap.put(new CaseInsensitiveString("scm-id"), existingMaterial); nameToMaterialMap.put(new CaseInsensitiveString("foo"), new GitMaterialConfig("url")); pluggableSCMMaterialConfig.validateNameUniqueness(nameToMaterialMap); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1)); assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Duplicate SCM material detected!")); assertThat(existingMaterial.errors().getAll().size(), is(1)); assertThat(existingMaterial.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Duplicate SCM material detected!")); assertThat(nameToMaterialMap.size(), is(2)); }
@Test public void shouldNotAddErrorDuringUniquenessValidationIfSCMNameIsEmpty() throws Exception { pluggableSCMMaterialConfig.setScmId(""); Map<CaseInsensitiveString, AbstractMaterialConfig> nameToMaterialMap = new HashMap<>(); pluggableSCMMaterialConfig.validateNameUniqueness(nameToMaterialMap); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(0)); assertThat(nameToMaterialMap.size(), is(0)); }
@Test public void shouldAddErrorIfMaterialDoesNotHaveASCMId() throws Exception { pluggableSCMMaterialConfig.setScmId(null); pluggableSCMMaterialConfig.validateConcreteMaterial(new ConfigSaveValidationContext(null, null)); assertThat(pluggableSCMMaterialConfig.errors().getAll().size(), is(1)); assertThat(pluggableSCMMaterialConfig.errors().on(PluggableSCMMaterialConfig.SCM_ID), is("Please select a SCM")); }
@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)); }
@Test public void shouldFailValidationIfDestinationDirectoryIsNested() { pluggableSCMMaterialConfig.setFolder("f1"); pluggableSCMMaterialConfig.validateNotSubdirectoryOf("f1/f2"); assertFalse(pluggableSCMMaterialConfig.errors().isEmpty()); Assert.assertThat(pluggableSCMMaterialConfig.errors().on(FOLDER), is("Invalid Destination Directory. Every material needs a different destination directory and the directories should not be nested.")); }
@Test public void shouldFailValidationIfDestinationDirectoryIsNestedAfterNormalization() { pluggableSCMMaterialConfig.setFolder("f1/f2/../../f3"); pluggableSCMMaterialConfig.validateNotSubdirectoryOf("f3/f4"); Assert.assertThat(pluggableSCMMaterialConfig.errors().on(FOLDER), is("Invalid Destination Directory. Every material needs a different destination directory and the directories should not be nested.")); }
@Test public void shouldFailValidationIfDestinationDirectoryIsOutsideCurrentWorkingDirectoryAfterNormalization() { pluggableSCMMaterialConfig.setFolder("f1/../../f3"); pluggableSCMMaterialConfig.validateConcreteMaterial(null); Assert.assertThat(pluggableSCMMaterialConfig.errors().on(FOLDER), is("Dest folder 'f1/../../f3' is not valid. It must be a sub-directory of the working folder.")); }
@Test public void shouldNotFailValidationIfDestinationDirectoryIsMultilevelButNotNested() { pluggableSCMMaterialConfig.setFolder("f1/f2/f3"); pluggableSCMMaterialConfig.validateNotSubdirectoryOf("f1/f2/f"); assertNull(pluggableSCMMaterialConfig.errors().getAllOn(FOLDER)); }