@Test public void shouldReturnIfTheContextBelongsToTemplate() { ValidationContext context = ConfigSaveValidationContext.forChain(new TemplatesConfig()); assertThat(context.isWithinPipelines(), is(false)); assertThat(context.isWithinTemplates(), is(true)); }
@Test public void shouldGetPipelineConfigByName() { BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("p1"); ValidationContext context = ConfigSaveValidationContext.forChain(cruiseConfig); assertThat(context.getPipelineConfigByName(new CaseInsensitiveString("p1")), is(cruiseConfig.allPipelines().get(0))); assertThat(context.getPipelineConfigByName(new CaseInsensitiveString("does_not_exist")), is(nullValue())); }
@Test public void testShouldReturnTrueIfTemplatesIsAnAncestor() { ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig(), new PipelineTemplateConfig()); assertThat(context.isWithinTemplates(), is(true)); }
@Test public void shouldInvalidateEmptyAddress() { AgentConfig agentConfig = new AgentConfig("uuid", "host", ""); agentConfig.validate(ConfigSaveValidationContext.forChain(agentConfig)); assertThat(agentConfig.errors().on(AgentConfig.IP_ADDRESS), is("IpAddress cannot be empty if it is present.")); }
@Test public void testShouldReturnFalseIfTemplatesIsNotAnAncestor() { ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new PipelineGroups(), new BasicPipelineConfigs(), new PipelineConfig()); assertThat(context.isWithinTemplates(), is(false)); }
@Test public void shouldAllowParamsInsideResourceNameWhenInsideTemplates() throws Exception { ResourceConfig resourceConfig = resource("#{PARAMS}"); ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig()); resourceConfig.validate(context); assertThat(resourceConfig.errors().isEmpty(), is(true)); }
@Test // Note : At the Resource class level there is no way of accurately validating Parameters. This will only be invalidated when template gets used. public void validate_shouldAllowAnyCombinationOfHashesAndCurlyBraces() throws Exception { ResourceConfig resourceConfig = resource("}#PARAMS{"); ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig()); resourceConfig.validate(context); assertThat(resourceConfig.errors().isEmpty(), is(true)); }
@Test public void shouldValidateThatTheTimeoutIsAValidNumber() { JobConfig job = new JobConfig("job"); job.setTimeout("5.5"); job.validate(ConfigSaveValidationContext.forChain(new BasicCruiseConfig())); assertThat(job.errors().isEmpty(), is(true)); }
@Test public void shouldMarkJobInvalidIfTimeoutIsNotAValidNumber() { JobConfig job = new JobConfig("job"); job.setTimeout("5.5MN"); job.validate(ConfigSaveValidationContext.forChain(new BasicCruiseConfig())); assertThat(job.errors().isEmpty(), is(false)); assertThat(job.errors().on(JobConfig.TIMEOUT), is("Timeout should be a valid number as it represents number of minutes")); }
@Test public void shouldReturnValidWhenThereIsNoCycle() throws Exception { CruiseConfig cruiseConfig = new BasicCruiseConfig(); PipelineConfig pipeline1 = goConfigMother.addPipeline(cruiseConfig, "pipeline1", "stage", "build"); PipelineConfig pipeline2 = goConfigMother.addPipeline(cruiseConfig, "pipeline2", "stage", "build"); goConfigMother.setDependencyOn(cruiseConfig, pipeline2, "pipeline1", "stage"); pipeline1.materialConfigs().validate(ConfigSaveValidationContext.forChain(cruiseConfig)); assertThat(pipeline1.materialConfigs().errors().isEmpty(), is(true)); pipeline2.materialConfigs().validate(ConfigSaveValidationContext.forChain(cruiseConfig)); assertThat(pipeline2.materialConfigs().errors().isEmpty(), is(true)); } @Test
@Test public void validateTree_configRepoShouldBeInvalidIfMaterialConfigHasErrors() { CruiseConfig cruiseConfig = new BasicCruiseConfig(); MaterialConfig materialConfig = mock(MaterialConfig.class); when(materialConfig.errors()).thenReturn(new ConfigErrors()); ConfigRepoConfig configRepoConfig = new ConfigRepoConfig(materialConfig, "plug", "id"); cruiseConfig.setConfigRepos(new ConfigReposConfig(configRepoConfig)); ConfigSaveValidationContext validationContext = ConfigSaveValidationContext.forChain(cruiseConfig); assertFalse(configRepoConfig.validateTree(validationContext)); assertTrue(configRepoConfig.errors().isEmpty()); assertFalse(configRepoConfig.getMaterialConfig().errors().isEmpty()); }
@Test public void shouldAddErrorsOfEachArgumentToTheParent() { Argument argument = new Argument("invalid-argument"); argument.addError(ExecTask.ARG_LIST_STRING, "Invalid argument"); ExecTask execTask = new ExecTask("echo", new Arguments(argument), null); execTask.validate(ConfigSaveValidationContext.forChain(new BasicCruiseConfig())); assertThat(execTask.errors().on(ExecTask.ARG_LIST_STRING), is("Invalid argument")); }
@Test public void shouldNotRunMultipleMaterialsValidationIfPipelineContainsOnlyOneMaterial() { CruiseConfig config = GoConfigMother.configWithPipelines("one"); PipelineConfig pipelineOne = config.pipelineConfigByName(new CaseInsensitiveString("one")); SvnMaterialConfig svnMaterialConfig = MaterialConfigsMother.svnMaterialConfig(); svnMaterialConfig.setFolder(null); pipelineOne.setMaterialConfigs(new MaterialConfigs(svnMaterialConfig)); pipelineOne.materialConfigs().validate(ConfigSaveValidationContext.forChain(config)); assertThat(svnMaterialConfig.errors().toString(), svnMaterialConfig.errors().getAll().size(), is(0)); }
@Test public void validate_shouldSkipValidationOfPluggableArtifact_IsWithinTemplate() { FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new TemplatesConfig(), upstream.getStage(new CaseInsensitiveString("up-stage1")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldPopulateErrorsIfFetchArtifactFromPipelineThatIsNotDependency() { FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("dummy"), new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.PIPELINE_NAME), is("Pipeline \"downstream\" tries to fetch artifact from pipeline " + "\"dummy\" which is not an upstream pipeline")); }
@Test public void should_NOT_BeValidWhen_pathFromAncestor_isInvalid_becauseRefferedPipelineIsNotAnAncestor() { FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("random_pipeline/upstream"), new CaseInsensitiveString("random-stage1"), new CaseInsensitiveString("random-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.PIPELINE_NAME), is("Pipeline named 'random_pipeline' exists, but is not an ancestor of 'downstream' as declared in 'random_pipeline/upstream'.")); }
@Test public void should_NOT_BeValidWhen_NO_pathFromAncestorIsGiven_butAncestorPipelineIsBeingFetchedFrom() { FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(null, new CaseInsensitiveString("uppest-stage3"), new CaseInsensitiveString("uppest-job3"), "s3"); StageConfig stage = downstream.getStage(new CaseInsensitiveString("stage")); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, stage, stage.getJobs().get(0))); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.STAGE), is("\"downstream :: stage :: job\" tries to fetch artifact from stage \"downstream :: uppest-stage3\" which does not exist.")); }
@Test public void shouldPopulateErrorIfFetchArtifactFromDependentPipelineButStageDoesNotExist() { FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream"), new CaseInsensitiveString("stage-does-not-exist"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")), downstream.getStage( new CaseInsensitiveString("stage")), downstream.getStage(new CaseInsensitiveString("stage")).getJobs().get(0))); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.STAGE), is("\"downstream :: stage :: job\" tries to fetch artifact from stage " + "\"upstream :: stage-does-not-exist\" which does not exist.")); }
@Test public void shouldBeValidIfFetchArtifactUsingAStageBeforeCurrentInTheSamePipeline() { upstream.getStage("stage").jobConfigByConfigName("job").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream"), new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, upstream, upstream.getStage(new CaseInsensitiveString("up-stage1")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void validate_shouldNotErrorWhenReferencingFilePipelineFromConfigRepositoryPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new FileConfigOrigin()); downstream.setOrigin(new RepoConfigOrigin()); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }