package alien4cloud.tosca.properties.constraints; import lombok.Getter; import lombok.Setter; import org.junit.Assert; import org.junit.Test; import org.alien4cloud.tosca.model.definitions.constraints.EqualConstraint; import org.alien4cloud.tosca.model.definitions.constraints.GreaterOrEqualConstraint; import org.alien4cloud.tosca.model.definitions.constraints.GreaterThanConstraint; import org.alien4cloud.tosca.model.definitions.constraints.InRangeConstraint; import org.alien4cloud.tosca.model.definitions.constraints.LengthConstraint; import org.alien4cloud.tosca.model.definitions.constraints.LessOrEqualConstraint; import org.alien4cloud.tosca.model.definitions.constraints.LessThanConstraint; import org.alien4cloud.tosca.model.definitions.constraints.MaxLengthConstraint; import org.alien4cloud.tosca.model.definitions.constraints.MinLengthConstraint; import org.alien4cloud.tosca.model.definitions.constraints.PatternConstraint; import org.alien4cloud.tosca.model.definitions.constraints.ValidValuesConstraint; import alien4cloud.tosca.normative.ToscaType; import alien4cloud.tosca.properties.constraints.exception.ConstraintValueDoNotMatchPropertyTypeException; import alien4cloud.tosca.properties.constraints.exception.ConstraintViolationException; import alien4cloud.utils.VersionUtil; import com.google.common.collect.Lists; public class PropertiesConstraintsTest { @Getter @Setter private static class TestClass { private Toto toto; } @Getter @Setter private static class Toto { private String tata; private String[] titi; } @Test public void testEqualConstraintSatisfied() throws Exception { EqualConstraint constraint = new EqualConstraint(); constraint.setEqual("1"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(1l); constraint.setEqual("toto"); constraint.initialize(ToscaType.STRING_TYPE); constraint.validate("toto"); constraint.setEqual("1.6"); constraint.initialize(ToscaType.VERSION_TYPE); constraint.validate(VersionUtil.parseVersion("1.6")); } @Test(expected = ConstraintViolationException.class) public void testEqualConstraintFailed() throws Exception { EqualConstraint constraint = new EqualConstraint(); constraint.setEqual("1"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(2l); } @Test(expected = ConstraintViolationException.class) public void testComplexEqualConstraintFailed() throws Exception { EqualConstraint constraint = new EqualConstraint(); constraint.setEqual("toto:\n" + " tata: tata\n" + " titi:\n" + " - titi1\n" + " - titi2\n"); TestClass testClass = new TestClass(); testClass.setToto(new Toto()); testClass.getToto().setTata("tata"); testClass.getToto().setTiti(new String[] { "titi11", "titi22" }); constraint.validate(testClass); } @Test public void testInRangeConstraintSatisfied() throws Exception { InRangeConstraint constraint = new InRangeConstraint(); constraint.setInRange(Lists.newArrayList("1", "4")); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.setInRange(Lists.newArrayList("1.6", "1.8")); constraint.initialize(ToscaType.VERSION_TYPE); constraint.validate(VersionUtil.parseVersion("1.7")); } @Test(expected = ConstraintViolationException.class) public void testInRangeConstraintFailed() throws Exception { InRangeConstraint constraint = new InRangeConstraint(); constraint.setInRange(Lists.newArrayList("1", "4")); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(0l); } @Test(expected = ConstraintViolationException.class) public void testVersionInRangeConstraintFailed() throws Exception { InRangeConstraint constraint = new InRangeConstraint(); constraint.setInRange(Lists.newArrayList("1.6", "1.8")); constraint.initialize(ToscaType.VERSION_TYPE); constraint.validate(VersionUtil.parseVersion("1.9")); } @Test public void testLengthMinLengthMaxLengthConstraintSatisfied() throws Exception { LengthConstraint lengthConstraint = new LengthConstraint(); lengthConstraint.setLength(5); lengthConstraint.validate("abcde"); MinLengthConstraint minLengthConstraint = new MinLengthConstraint(); minLengthConstraint.setMinLength(5); minLengthConstraint.validate("abcdef"); MaxLengthConstraint maxLengthConstraint = new MaxLengthConstraint(); maxLengthConstraint.setMaxLength(5); maxLengthConstraint.validate("abc"); } @Test(expected = ConstraintViolationException.class) public void testLengthConstraintFailed() throws Exception { LengthConstraint lengthConstraint = new LengthConstraint(); lengthConstraint.setLength(4); lengthConstraint.validate("abcde"); } @Test(expected = ConstraintViolationException.class) public void testMinLengthConstraintFailed() throws Exception { MinLengthConstraint lengthConstraint = new MinLengthConstraint(); lengthConstraint.setMinLength(5); lengthConstraint.validate("abc"); } @Test(expected = ConstraintViolationException.class) public void testMaxLengthConstraintFailed() throws Exception { MaxLengthConstraint lengthConstraint = new MaxLengthConstraint(); lengthConstraint.setMaxLength(5); lengthConstraint.validate("abcdefgh"); } @Test public void testGeConstraintSatisfied() throws Exception { GreaterOrEqualConstraint constraint = new GreaterOrEqualConstraint(); constraint.setGreaterOrEqual("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(2l); constraint.validate(3l); constraint.validate(Long.MAX_VALUE); constraint.setGreaterOrEqual("5"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(5l); constraint.validate(6l); constraint.validate(7l); constraint.setGreaterOrEqual("1.6.1"); constraint.initialize(ToscaType.VERSION_TYPE); constraint.validate(VersionUtil.parseVersion("1.6.1")); constraint.validate(VersionUtil.parseVersion("1.6.1.1")); } @Test(expected = ConstraintViolationException.class) public void testGeConstraintFailed() throws Exception { GreaterOrEqualConstraint constraint = new GreaterOrEqualConstraint(); constraint.setGreaterOrEqual("1.6.1"); constraint.initialize(ToscaType.VERSION_TYPE); constraint.validate(VersionUtil.parseVersion("1.6.0")); } @Test(expected = ConstraintValueDoNotMatchPropertyTypeException.class) public void testGeConstraintStringFailed() throws Exception { GreaterOrEqualConstraint constraint = new GreaterOrEqualConstraint(); constraint.setGreaterOrEqual("b"); constraint.initialize(ToscaType.STRING_TYPE); constraint.validate("a"); } @Test(expected = ConstraintViolationException.class) public void testGeConstraintVersionFailed() throws Exception { GreaterOrEqualConstraint constraint = new GreaterOrEqualConstraint(); constraint.setGreaterOrEqual("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(1l); } @Test public void testLeConstraintSatisfied() throws Exception { LessOrEqualConstraint constraint = new LessOrEqualConstraint(); constraint.setLessOrEqual("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(2l); constraint.validate(1l); constraint.validate(Long.MIN_VALUE); constraint.setLessOrEqual("5"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(5l); constraint.validate(4l); constraint.validate(3l); } @Test(expected = ConstraintViolationException.class) public void testLeConstraintFailed() throws Exception { LessOrEqualConstraint constraint = new LessOrEqualConstraint(); constraint.setLessOrEqual("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(3l); } @Test public void testGtConstraintSatisfied() throws Exception { GreaterThanConstraint constraint = new GreaterThanConstraint(); constraint.setGreaterThan("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(3l); constraint.validate(Long.MAX_VALUE); constraint.setGreaterThan("5"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(6l); constraint.validate(7l); } @Test(expected = ConstraintViolationException.class) public void testGtConstraintFailed() throws Exception { GreaterThanConstraint constraint = new GreaterThanConstraint(); constraint.setGreaterThan("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(1l); } @Test public void testLtConstraintSatisfied() throws Exception { LessThanConstraint constraint = new LessThanConstraint(); constraint.setLessThan("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(1l); constraint.validate(Long.MIN_VALUE); constraint.setLessThan("5"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(4l); constraint.validate(3l); } @Test(expected = ConstraintViolationException.class) public void testLtConstraintFailed() throws Exception { LessThanConstraint constraint = new LessThanConstraint(); constraint.setLessThan("2"); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(3l); } @Test public void testRegexpConstraintSatisfied() throws Exception { PatternConstraint constraint = new PatternConstraint(); constraint.initialize(ToscaType.STRING_TYPE); constraint.setPattern("\\d+"); constraint.validate("123456"); } @Test(expected = ConstraintViolationException.class) public void testRegexpConstraintFailed() throws Exception { PatternConstraint constraint = new PatternConstraint(); constraint.setPattern("\\d+"); constraint.validate("1234er56"); } @Test public void testValidValuesConstraintSatisfied() throws Exception { ValidValuesConstraint constraint = new ValidValuesConstraint(); constraint.setValidValues(Lists.newArrayList("1", "2", "3", "4")); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(1l); constraint.validate(2l); constraint.validate(3l); constraint.validate(4l); } @Test(expected = ConstraintViolationException.class) public void testValidValuesConstraintFailed() throws Exception { ValidValuesConstraint constraint = new ValidValuesConstraint(); constraint.setValidValues(Lists.newArrayList("1", "2", "3", "4")); constraint.initialize(ToscaType.INTEGER_TYPE); constraint.validate(5l); } @Test public void testTimeSizeInRangeConstraint() throws Exception { InRangeConstraint inRangeConstraint = new InRangeConstraint(); inRangeConstraint.setInRange(Lists.newArrayList("1 MB", "2 GB")); inRangeConstraint.initialize(ToscaType.SIZE_TYPE); inRangeConstraint.validate(ToscaType.SIZE_TYPE.parse("1 GB")); try { inRangeConstraint.validate(ToscaType.SIZE_TYPE.parse("1 TB")); Assert.fail("Value not in range, validation must fail"); } catch (ConstraintViolationException e) { } try { inRangeConstraint.validate(ToscaType.SIZE_TYPE.parse("100 B")); Assert.fail("Value not in range, validation must fail"); } catch (ConstraintViolationException e) { } inRangeConstraint = new InRangeConstraint(); inRangeConstraint.setInRange(Lists.newArrayList("1 m", "2 d")); inRangeConstraint.initialize(ToscaType.TIME_TYPE); inRangeConstraint.validate(ToscaType.TIME_TYPE.parse("1 h")); try { inRangeConstraint.validate(ToscaType.TIME_TYPE.parse("5 d")); Assert.fail("Value not in range, validation must fail"); } catch (ConstraintViolationException e) { } try { inRangeConstraint.validate(ToscaType.TIME_TYPE.parse("1 s")); Assert.fail("Value not in range, validation must fail"); } catch (ConstraintViolationException e) { } } }