private void validatePipelineName() { if (!new NameTypeValidator().isNameValid(name)) { errors().add(NAME, NameTypeValidator.errorMessage("pipeline", name)); } }
private void pipelineCreationSpecificValidations(PipelineConfigSaveValidationContext validationContext) { if (validationContext.isPipelineBeingCreated()) { validationContext.getGroups().validatePipelineNameUniqueness(); PipelineConfigs group = validationContext.getPipelineGroup(); group.validateGroupNameAndAddErrorsTo(pipelineConfig.errors()); } }
@Test public void shouldValidateCorrectPipelineLabelWithTruncationSyntax() { String labelFormat = "pipeline-${COUNT}-${git[:7]}-alpha"; PipelineConfig pipelineConfig = createAndValidatePipelineLabel(labelFormat); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), is(nullValue())); }
@Test public void shouldErrorOutIfDuplicatePipelineIsAddedToSameGroup() { PipelineConfig pipeline1 = createPipelineConfig("pipeline1", "stage1"); PipelineConfig pipeline2 = createPipelineConfig("pipeline1", "stage1"); PipelineConfigs defaultGroup = createGroup("defaultGroup", pipeline1, pipeline2); PipelineGroups pipelineGroups = new PipelineGroups(defaultGroup); pipelineGroups.validate(null); assertThat(pipeline1.errors().isEmpty(), is(false)); assertThat(pipeline1.errors().on(PipelineConfig.NAME), is("You have defined multiple pipelines named 'pipeline1'. Pipeline names must be unique. Source(s): [cruise-config.xml]")); assertThat(pipeline2.errors().isEmpty(), is(false)); assertThat(pipeline2.errors().on(PipelineConfig.NAME), is("You have defined multiple pipelines named 'pipeline1'. Pipeline names must be unique. Source(s): [cruise-config.xml]")); }
@Test public void shouldValidateMissingLabel() { PipelineConfig pipelineConfig = createAndValidatePipelineLabel(null); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), is(PipelineConfig.BLANK_LABEL_TEMPLATE_ERROR_MESSAGE)); pipelineConfig = createAndValidatePipelineLabel(""); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), is(PipelineConfig.BLANK_LABEL_TEMPLATE_ERROR_MESSAGE)); }
@Test public void shouldValidatePipelineName() { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("foo bar", "stage1", "job1"); pipelineConfig.validate(null); assertThat(pipelineConfig.errors().isEmpty(), is(false)); assertThat(pipelineConfig.errors().on(PipelineConfig.NAME), is("Invalid pipeline name 'foo bar'. This must be alphanumeric and can contain underscores and periods (however, it cannot start with a period). The maximum allowed length is 255 characters.")); }
@Test public void shouldNotAllowLabelTemplateWithLengthOfZeroInTruncationSyntax() throws Exception { String labelFormat = "pipeline-${COUNT}-${git[:0]}-alpha"; PipelineConfig pipelineConfig = createAndValidatePipelineLabel(labelFormat); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), is(String.format("Length of zero not allowed on label %s defined on pipeline %s.", labelFormat, pipelineConfig.name()))); }
@Test public void validate_shouldEnsureThatPipelineFollowsTheNameType() { PipelineConfig config = new PipelineConfig(new CaseInsensitiveString(".name"), new MaterialConfigs()); config.validate(null); assertThat(config.errors().isEmpty(), is(false)); assertThat(config.errors().on(PipelineConfig.NAME), is("Invalid pipeline name '.name'. This must be alphanumeric and can contain underscores and periods (however, it cannot start with a period). The maximum allowed length is 255 characters.")); }
@Test public void shouldValidateIncorrectPipelineLabelWithTruncationSyntax() { String labelFormat = "pipeline-${COUNT}-${noSuch[:7]}-alpha"; PipelineConfig pipelineConfig = createAndValidatePipelineLabel(labelFormat); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), startsWith("You have defined a label template in pipeline")); }
@Test public void shouldValidatePipelineLabelWithBrokenTruncationSyntax1() { String labelFormat = "pipeline-${COUNT}-${git[:7}-alpha"; PipelineConfig pipelineConfig = createAndValidatePipelineLabel(labelFormat); String expectedLabelTemplate = "Invalid label 'pipeline-${COUNT}-${git[:7}-alpha'."; assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), startsWith(expectedLabelTemplate)); }
@Test public void shouldValidatePipelineLabelWithNonExistingMaterial() { String labelFormat = "pipeline-${COUNT}-${NoSuchMaterial}"; PipelineConfig pipelineConfig = createAndValidatePipelineLabel(labelFormat); assertThat(pipelineConfig.errors().on(PipelineConfig.LABEL_TEMPLATE), startsWith("You have defined a label template in pipeline")); }
@Test public void validate_shouldEnsureThatTemplateFollowsTheNameType() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("name"), new MaterialConfigs()); pipelineConfig.setTemplateName(new CaseInsensitiveString(".Name")); config.addPipeline("group", pipelineConfig); pipelineConfig.validateTemplate(new PipelineTemplateConfig()); assertThat(pipelineConfig.errors().isEmpty(), is(false)); assertThat(pipelineConfig.errors().on(PipelineConfig.TEMPLATE_NAME), is("Invalid template name '.Name'. This must be alphanumeric and can contain underscores and periods (however, it cannot start with a period). The maximum allowed length is 255 characters.")); }
@Test public void shouldValidateGroupNameWhenPipelineIsBeingCreatedUnderANonExistantGroup() { BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1"); PipelineConfig p1 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p1")); String groupName = "%$-with-invalid-characters"; cruiseConfig.addPipeline(groupName, p1); p1.validateTree(PipelineConfigSaveValidationContext.forChain(true, groupName, cruiseConfig, p1)); assertFalse(p1.errors().isEmpty()); assertThat(p1.errors().on(PipelineConfigs.GROUP), contains("Invalid group name '%$-with-invalid-characters'")); }
@Test public void shouldValidatePipelineToCheckItDoesNotAllowBothTemplateAndStages() throws Exception { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("p"), new MaterialConfigs()); pipelineConfig.templatize(new CaseInsensitiveString("template")); pipelineConfig.addStageWithoutValidityAssertion(new StageConfig(new CaseInsensitiveString("stage"), new JobConfigs())); preprocessor.process(new BasicCruiseConfig(new BasicPipelineConfigs(pipelineConfig))); assertThat(pipelineConfig.hasTemplateApplied(), is(false)); assertThat(pipelineConfig.errors().on("stages"), is("Cannot add stages to pipeline 'p' which already references template 'template'")); assertThat(pipelineConfig.errors().on("template"), is("Cannot set template 'template' on pipeline 'p' because it already has stages defined")); }
@Test public void shouldAllowDependenciesFromMultiplePipelinesToTheSamePipeline() { pipeline.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("pipeline2"), new CaseInsensitiveString("stage"))); PipelineConfig pipeline3 = config.pipelineConfigByName(new CaseInsensitiveString("pipeline3")); pipeline3.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("pipeline2"), new CaseInsensitiveString("stage"))); pipeline.validate(null); assertThat(pipeline.errors().isEmpty(), is(true)); pipeline3.validate(null); assertThat(pipeline3.errors().isEmpty(), is(true)); }
@Test public void shouldProvideContextWhenAnExceptionOccursBecauseOfIncompleteParamAtEnd() throws NoSuchFieldException { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("cruise", "dev", "ant"); pipelineConfig.setLabelTemplate("abc#{"); new ParamResolver(new ParamSubstitutionHandlerFactory(params(param("foo", "pavan"), param("bar", "jj"))), fieldCache).resolve(pipelineConfig); assertThat(pipelineConfig.errors().on("labelTemplate"), is("Incomplete param usage in 'abc#{'")); }
@Test public void shouldProvideContextWhenAnExceptionOccurs() throws NoSuchFieldException { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("cruise", "dev", "ant"); pipelineConfig.setLabelTemplate("#a"); new ParamResolver(new ParamSubstitutionHandlerFactory(params(param("foo", "pavan"), param("bar", "jj"))), fieldCache).resolve(pipelineConfig); assertThat(pipelineConfig.errors().on("labelTemplate"), is("Error when processing params for '#a' used in field 'labelTemplate', # must be followed by a parameter pattern or escaped by another #")); }
@Test public void shouldProvideContextWhenAnExceptionOccursBecauseOfHashAtEnd() throws NoSuchFieldException { PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("cruise", "dev", "ant"); pipelineConfig.setLabelTemplate("abc#"); new ParamResolver(new ParamSubstitutionHandlerFactory(params(param("foo", "pavan"), param("bar", "jj"))), fieldCache).resolve(pipelineConfig); assertThat(pipelineConfig.errors().on("labelTemplate"), is("Error when processing params for 'abc#' used in field 'labelTemplate', # must be followed by a parameter pattern or escaped by another #")); }
@Test public void shouldAddValidationErrorWhenAssociatedTemplateDoesNotExist() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("wunderbar"), new MaterialConfigs()); config.addPipeline("group", pipelineConfig); pipelineConfig.setTemplateName(new CaseInsensitiveString("does-not-exist")); pipelineConfig.validateTemplate(null); assertThat(pipelineConfig.errors().on("pipeline"), is("Pipeline 'wunderbar' refers to non-existent template 'does-not-exist'.")); }
@Test public void shouldValidateAPipelineHasAtleastOneStage() { PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("p"), new MaterialConfigs()); pipelineConfig.validateTree(PipelineConfigSaveValidationContext.forChain(true, "group", new BasicCruiseConfig(new BasicPipelineConfigs("group", new Authorization())), pipelineConfig)); assertThat(pipelineConfig.errors().on("pipeline"), is("Pipeline 'p' does not have any stages configured. A pipeline must have at least one stage.")); }