/* * Copyright 2015 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.domain; import com.rits.cloning.Cloner; import com.thoughtworks.go.config.*; import org.junit.Before; import org.junit.Test; import java.lang.reflect.Field; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsNot.not; import static org.hamcrest.number.OrderingComparison.greaterThan; import static org.hamcrest.number.OrderingComparison.lessThan; import static org.junit.Assert.assertThat; public class ResourceTest { @Before public void setUp() throws Exception { } @Test public void shouldAllowValidResourceNameForAgentResources() throws Exception { Resource resource = resource("- foo|bar baz.quux"); resource.validate(ConfigSaveValidationContext.forChain(new BasicCruiseConfig())); assertThat(resource.errors().isEmpty(), is(true)); } @Test public void shouldAllowParamsInsideResourceNameWhenInsideTemplates() throws Exception { Resource resource = resource("#{PARAMS}"); ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig()); resource.validate(context); assertThat(resource.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 { Resource resource = resource("}#PARAMS{"); ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig()); resource.validate(context); assertThat(resource.errors().isEmpty(), is(true)); } @Test public void shouldNotAllowInvalidResourceNamesWhenInsideTemplates() throws Exception { Resource resource = resource("#?{45}"); ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new TemplatesConfig()); resource.validate(context); assertThat(resource.errors().isEmpty(), is(false)); assertThat(resource.errors().on(JobConfig.RESOURCES), is(String.format("Resource name '#?{45}' is not valid. Valid names can contain valid parameter syntax or valid alphanumeric with hyphens,dots or pipes"))); } @Test public void shouldNotAllowParamsInsideResourceNameWhenOutsideTemplates() throws Exception { Resource resource = resource("#{PARAMS}"); ValidationContext context = ConfigSaveValidationContext.forChain(new BasicCruiseConfig(), new PipelineConfig()); resource.validate(context); assertThat(resource.errors().isEmpty(), is(false)); assertThat(resource.errors().on(JobConfig.RESOURCES), is(String.format("Resource name '#{PARAMS}' is not valid. Valid names much match '%s'", Resource.VALID_REGEX))); } @Test public void shouldNotAllowInvalidResourceNameForAgentResources() throws Exception { Resource resource = resource("foo$bar"); resource.validate(ConfigSaveValidationContext.forChain(new BasicCruiseConfig())); ConfigErrors configErrors = resource.errors(); assertThat(configErrors.isEmpty(), is(false)); assertThat(configErrors.on(JobConfig.RESOURCES), is(String.format("Resource name 'foo$bar' is not valid. Valid names much match '%s'", Resource.VALID_REGEX))); } private Resource resource(String name) { Resource resource = new Resource(); resource.setName(name); return resource; } @Test public void shouldBeEqualBasedOnContentAndNotID() { assertThat(new Resource("resource1"), is(new Resource("resource1"))); assertThat(new Resource("resource1"), not(new Resource("resource2"))); Resource resource = new Resource("resource1"); resource.setId(999); assertThat(resource, is(new Resource("resource1"))); } @Test //This is to work around a bug caused by MagicalCruiseConfigLoader, // since it uses direct field access public void shouldUseTrimmedNameInEquals() throws NoSuchFieldException, IllegalAccessException { Resource resource = new Resource(); Field field = resource.getClass().getDeclaredField("name"); field.setAccessible(true); field.set(resource, "resource1 "); assertThat(new Resource("resource1"), is(resource)); } @Test public void shouldCompareBasedOnName() { Resource resourceA = new Resource("aaa"); Resource resourceB = new Resource("bbb"); assertThat(resourceA.compareTo(resourceB), is(lessThan(0))); assertThat(resourceB.compareTo(resourceA), is(greaterThan(0))); assertThat(resourceA.compareTo(resourceA), is(0)); } @Test public void shouldBeAbleToCreateACopyOfItself() throws Exception { Resource existingResource = new Resource("some-name"); existingResource.setId(2); existingResource.setBuildId(10); existingResource.addError("abc", "def"); assertThat(existingResource, equalTo(new Resource(existingResource))); assertThat(existingResource, equalTo(new Cloner().deepClone(existingResource))); } }