/* * JBoss, Home of Professional Open Source * Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @authors tag. All rights reserved. * See the copyright.txt in the distribution for a * full listing of individual contributors. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ package org.jboss.as.controller.operation.validation; import static org.junit.Assert.fail; import java.math.BigDecimal; import java.math.BigInteger; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.operations.validation.ModelTypeValidator; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; import org.jboss.dmr.ValueExpression; import org.junit.Test; /** * Unit tests of {@link ModelTypeValidator} * * @author Brian Stansberry (c) 2011 Red Hat Inc. */ public class ModelTypeValidatorUnitTestCase { @Test public void testAllowNull() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.BOOLEAN, true); assertOk(testee, new ModelNode()); testee = new ModelTypeValidator(ModelType.BOOLEAN, false); assertInvalid(testee, new ModelNode()); } @Test public void testAllowExpressions() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.BOOLEAN, false, true); assertOk(testee, new ModelNode().set(new ValueExpression("{test}"))); testee = new ModelTypeValidator(ModelType.BOOLEAN, false, false); assertInvalid(testee, new ModelNode().set(new ValueExpression("{test}"))); } @Test public void testBigDecimal() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.BIG_DECIMAL, false, false, false); validateNumbers(testee); testee = new ModelTypeValidator(ModelType.BIG_DECIMAL, false, false, true); assertOk(testee, new ModelNode().set(new BigDecimal(1))); assertInvalid(testee, new ModelNode().set(1)); } @Test public void testBigInteger() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.BIG_INTEGER, false, false, false); validateNumbers(testee); testee = new ModelTypeValidator(ModelType.BIG_INTEGER, false, false, true); assertOk(testee, new ModelNode().set(new BigInteger("1"))); assertInvalid(testee, new ModelNode().set(1)); } @Test public void testDouble() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.DOUBLE, false, false, false); validateNumbers(testee); testee = new ModelTypeValidator(ModelType.DOUBLE, false, false, true); assertOk(testee, new ModelNode().set((double) 1)); assertInvalid(testee, new ModelNode().set(1)); } @Test public void testInt() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.INT, false, false, false); validateNumbers(testee); invalidateIntRange(testee); testee = new ModelTypeValidator(ModelType.INT, false, false, true); assertOk(testee, new ModelNode().set(1)); assertInvalid(testee, new ModelNode().set((double) 1)); } @Test public void testLong() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.LONG, false, false, false); validateNumbers(testee); invalidateLongRange(testee); testee = new ModelTypeValidator(ModelType.LONG, false, false, true); assertOk(testee, new ModelNode().set(1L)); assertInvalid(testee, new ModelNode().set(1)); } @Test public void testString() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.STRING, false, false, false); validateNumbers(testee); testee = new ModelTypeValidator(ModelType.STRING, false, false, true); assertOk(testee, new ModelNode().set("1")); assertInvalid(testee, new ModelNode().set(1)); } @Test public void testBoolean() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.BOOLEAN, false, false, false); assertOk(testee, new ModelNode().set(true)); assertOk(testee, new ModelNode().set("true")); assertOk(testee, new ModelNode().set("TruE")); assertOk(testee, new ModelNode().set("false")); assertOk(testee, new ModelNode().set("fAlsE")); assertInvalid(testee, new ModelNode().set("fals")); assertInvalid(testee, new ModelNode().set(0)); testee = new ModelTypeValidator(ModelType.BOOLEAN, false, false, true); assertOk(testee, new ModelNode().set(true)); assertInvalid(testee, new ModelNode().set("false")); assertInvalid(testee, new ModelNode().set(0)); } @Test public void testProperty() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.PROPERTY, false, false, false); assertOk(testee, new ModelNode().set("a", "b")); ModelNode node = new ModelNode(); node.get("a").set("b"); assertOk(testee, node); // We may decide not to support this node = new ModelNode(); node.add("a"); node.add("b"); assertOk(testee, node); testee = new ModelTypeValidator(ModelType.PROPERTY, false, false, true); assertOk(testee, new ModelNode().set("a", "b")); node = new ModelNode(); node.get("a").set("b"); assertInvalid(testee, node); } @Test public void testObject() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.OBJECT, false, false, false); assertOk(testee, new ModelNode().set("a", "b")); ModelNode node = new ModelNode(); node.get("a").set("b"); assertOk(testee, node); node = new ModelNode(); node.add(new ModelNode().set("a", 1)); node.add(new ModelNode().set("b", 2)); assertOk(testee, node); node = new ModelNode(); node.add("a"); node.add("b"); assertInvalid(testee, node); testee = new ModelTypeValidator(ModelType.OBJECT, false, false, true); node = new ModelNode(); node.get("a").set("b"); assertOk(testee, node); assertInvalid(testee, new ModelNode().set("a", "b")); } @Test public void testList() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.LIST, false, false, false); ModelNode node = new ModelNode(); node.add(new ModelNode().set("a", 1)); node.add(new ModelNode().set("b", 2)); assertOk(testee, node); node = new ModelNode(); node.get("a").set(1); node.get("b").set(2); assertInvalid(testee, node); } @Test public void testBytes() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.BYTES, false, false, false); assertOk(testee, new ModelNode().set(new byte[0])); assertInvalid(testee, new ModelNode().set("bytes")); } @Test public void testExpression() { ModelTypeValidator testee = new ModelTypeValidator(ModelType.EXPRESSION, false, false, false); assertOk(testee, new ModelNode().set(new ValueExpression("${test}"))); assertInvalid(testee, new ModelNode().set("${test}")); } private static void validateNumbers(ModelTypeValidator testee) { assertOk(testee, new ModelNode().set(new BigDecimal(1))); assertOk(testee, new ModelNode().set(new BigInteger("1"))); assertOk(testee, new ModelNode().set(1)); assertOk(testee, new ModelNode().set(1L)); assertOk(testee, new ModelNode().set((double) 1)); assertOk(testee, new ModelNode().set("1")); } private static void invalidateIntRange(ModelTypeValidator testee) { assertInvalid(testee, new ModelNode().set(BigDecimal.valueOf(Integer.MAX_VALUE).add(BigDecimal.ONE))); assertInvalid(testee, new ModelNode().set(BigDecimal.valueOf(Integer.MIN_VALUE).subtract(BigDecimal.ONE))); assertInvalid(testee, new ModelNode().set(BigInteger.valueOf(Integer.MAX_VALUE).add(BigInteger.ONE))); assertInvalid(testee, new ModelNode().set(BigInteger.valueOf(Integer.MIN_VALUE).subtract(BigInteger.ONE))); assertInvalid(testee, new ModelNode().set(Integer.MAX_VALUE + 1L)); assertInvalid(testee, new ModelNode().set(Integer.MIN_VALUE - 1L)); assertInvalid(testee, new ModelNode().set(Integer.MAX_VALUE + 1d)); assertInvalid(testee, new ModelNode().set(Integer.MIN_VALUE - 1d)); } private static void invalidateLongRange(ModelTypeValidator testee) { assertInvalid(testee, new ModelNode().set(BigDecimal.valueOf(Long.MAX_VALUE).add(BigDecimal.ONE))); assertInvalid(testee, new ModelNode().set(BigDecimal.valueOf(Long.MIN_VALUE).subtract(BigDecimal.ONE))); assertInvalid(testee, new ModelNode().set(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE))); assertInvalid(testee, new ModelNode().set(BigInteger.valueOf(Long.MIN_VALUE).subtract(BigInteger.ONE))); assertInvalid(testee, new ModelNode().set(Long.MAX_VALUE * 10d)); assertInvalid(testee, new ModelNode().set(Long.MIN_VALUE * 10d)); } private static void assertOk(ModelTypeValidator validator, ModelNode toTest) { try { validator.validateParameter("test", toTest); } catch (OperationFailedException e) { fail("Validation should have passed but received " + e.getFailureDescription().toString()); } } private static void assertInvalid(ModelTypeValidator validator, ModelNode toTest) { try { validator.validateParameter("test", toTest); fail("Validation should have failed "); } catch (OperationFailedException e) { // good } } }