blob: 0774b0bebbf4d6c0ad13a3ed417984590bda1541 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.openaz.xacml.pdp.std.functions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.math.BigInteger;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.security.auth.x500.X500Principal;
import org.apache.openaz.xacml.api.XACML3;
import org.apache.openaz.xacml.pdp.policy.ExpressionResult;
import org.apache.openaz.xacml.pdp.policy.FunctionArgument;
import org.apache.openaz.xacml.pdp.policy.FunctionArgumentAttributeValue;
import org.apache.openaz.xacml.pdp.std.StdFunctions;
import org.apache.openaz.xacml.pdp.std.functions.FunctionDefinitionStringConversion;
import org.apache.openaz.xacml.std.datatypes.DataTypes;
import org.apache.openaz.xacml.std.datatypes.IPAddress;
import org.apache.openaz.xacml.std.datatypes.IPv4Address;
import org.apache.openaz.xacml.std.datatypes.IPv6Address;
import org.apache.openaz.xacml.std.datatypes.ISO8601Date;
import org.apache.openaz.xacml.std.datatypes.ISO8601DateTime;
import org.apache.openaz.xacml.std.datatypes.ISO8601Time;
import org.apache.openaz.xacml.std.datatypes.ISO8601TimeZone;
import org.apache.openaz.xacml.std.datatypes.PortRange;
import org.apache.openaz.xacml.std.datatypes.RFC2396DomainName;
import org.apache.openaz.xacml.std.datatypes.RFC822Name;
import org.apache.openaz.xacml.std.datatypes.XPathDayTimeDuration;
import org.apache.openaz.xacml.std.datatypes.XPathYearMonthDuration;
import org.junit.Test;
/**
* Tests for converting objects to/from Strings. TO RUN - use jUnit In Eclipse select this file or the
* enclosing directory, right-click and select Run As/JUnit Test
*/
public class FunctionDefinitionStringConversionTest {
/*
* variables useful in the following tests
*/
List<FunctionArgument> arguments = new ArrayList<FunctionArgument>();
/**
* Boolean
*/
@Test
public void testBoolean_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("true"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_BOOLEAN_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_BOOLEAN.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertEquals(new Boolean(true), resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:boolean-from-string Cannot convert from \"java.lang.String\" with value \"not valid obj value\" to boolean",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:boolean-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_boolean() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "false";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_BOOLEAN
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_BOOLEAN;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_BOOLEAN, fd.getId());
assertEquals(DataTypes.DT_BOOLEAN.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-boolean Expected data type 'boolean' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* Integer
*/
@Test
public void testInteger_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123456"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_INTEGER_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_INTEGER_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_INTEGER.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
BigInteger resValue = (BigInteger)res.getValue().getValue();
assertEquals(new BigInteger("123456"), resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:integer-from-string For input string: \"n\"", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:integer-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_integer() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "1234";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_DOUBLE
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_INTEGER;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_INTEGER, fd.getId());
assertEquals(DataTypes.DT_INTEGER.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-integer Expected data type 'integer' saw 'double' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* Double
*/
@Test
public void testDouble_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("5.432"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_DOUBLE_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_DOUBLE_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_DOUBLE.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Double resValue = (Double)res.getValue().getValue();
assertEquals(new Double(5.432), resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:double-from-string For input string: \"not valid obj value\"", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:double-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_double() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrObjBig = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "5.432";
String objValueStringBig = "55555555555555555555.123455";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_DOUBLE
.createAttributeValue(objValueString));
attrObjBig = new FunctionArgumentAttributeValue(
DataTypes.DT_DOUBLE
.createAttributeValue(objValueStringBig));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_DOUBLE;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DOUBLE, fd.getId());
assertEquals(DataTypes.DT_DOUBLE.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
arguments.clear();
arguments.add(attrObjBig);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("5.555555555555556E19", res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-double Expected data type 'double' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* Time
*/
@Test
public void testTime_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrString2 = null;
FunctionArgumentAttributeValue attrString3 = null;
FunctionArgumentAttributeValue attrString4 = null;
FunctionArgumentAttributeValue attrStringTimeZone = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("05:12:34.323"));
attrString2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("5:12:34.323"));
attrString3 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("05:12"));
attrString4 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("05:12:34"));
attrStringTimeZone = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("05:12:34.323+03:00"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_TIME_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_TIME_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_TIME.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
ISO8601Time resValue = (ISO8601Time)res.getValue().getValue();
assertEquals(new ISO8601Time(5, 12, 34, 323), resValue);
// check missing 0 in front
arguments.clear();
arguments.add(attrString2);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:time-from-string Invalid hour of day", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// check missing seconds/msecs
arguments.clear();
arguments.add(attrString3);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:time-from-string Time string too short", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// check missing just msecs
arguments.clear();
arguments.add(attrString4);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601Time)res.getValue().getValue();
assertEquals(new ISO8601Time(5, 12, 34, 0), resValue);
// check TimeZone
arguments.clear();
arguments.add(attrStringTimeZone);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601Time)res.getValue().getValue();
assertEquals(new ISO8601Time(new ISO8601TimeZone(180), 5, 12, 34, 323), resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:time-from-string Invalid hour of day", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:time-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_time() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrObj2 = null;
FunctionArgumentAttributeValue attrObjTimeZone = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_TIME
.createAttributeValue("05:12:34.323"));
attrObj2 = new FunctionArgumentAttributeValue(
DataTypes.DT_TIME
.createAttributeValue("05:01:02.323"));
attrObjTimeZone = new FunctionArgumentAttributeValue(
DataTypes.DT_TIME
.createAttributeValue("05:12:34.323+03:00"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_TIME;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_TIME, fd.getId());
assertEquals(DataTypes.DT_TIME.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("05:12:34.323", res.getValue().getValue());
// missing digits in string value?
arguments.clear();
arguments.add(attrObj2);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("05:01:02.323", res.getValue().getValue());
// include TimeZone
arguments.clear();
arguments.add(attrObjTimeZone);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("05:12:34.323+03:00", res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-time Expected data type 'time' saw 'integer' at arg index 0", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* Date
*/
@Test
public void testDate_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrString2 = null;
FunctionArgumentAttributeValue attrString3 = null;
FunctionArgumentAttributeValue attrString4 = null;
FunctionArgumentAttributeValue attrString5 = null;
FunctionArgumentAttributeValue attrString6 = null;
FunctionArgumentAttributeValue attrString7 = null;
FunctionArgumentAttributeValue attrString8 = null;
FunctionArgumentAttributeValue attrString9 = null;
FunctionArgumentAttributeValue attrStringDateZone = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-12"));
attrString2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("-2013-05-12"));
attrString3 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("1232013-05-12"));
attrString4 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("-1232013-05-12"));
attrString5 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("213-05-12"));
attrString6 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-5-12"));
attrString7 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-2"));
attrString8 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-32-12"));
attrString9 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-45"));
attrStringDateZone = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-12+03:00"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_DATE_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_DATE_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_DATE.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
ISO8601Date resValue = (ISO8601Date)res.getValue().getValue();
assertEquals(new ISO8601Date(2013, 5, 12), resValue);
// check negative
arguments.clear();
arguments.add(attrString2);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601Date)res.getValue().getValue();
assertEquals(new ISO8601Date(-2013, 5, 12), resValue);
// check big
arguments.clear();
arguments.add(attrString3);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601Date)res.getValue().getValue();
assertEquals(new ISO8601Date(1232013, 5, 12), resValue);
// check big negative
arguments.clear();
arguments.add(attrString4);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601Date)res.getValue().getValue();
assertEquals(new ISO8601Date(-1232013, 5, 12), resValue);
// bad year
arguments.clear();
arguments.add(attrString5);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Invalid year (must be at least 4 digits)", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad month
arguments.clear();
arguments.add(attrString6);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Invalid month", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad day format
arguments.clear();
arguments.add(attrString7);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Invalid day", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// month out of range
arguments.clear();
arguments.add(attrString8);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Invalid month", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// day out of range
arguments.clear();
arguments.add(attrString9);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Invalid day", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// check TimeZone
arguments.clear();
arguments.add(attrStringDateZone);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601Date)res.getValue().getValue();
assertEquals(new ISO8601Date(new ISO8601TimeZone(180), 2013, 5, 12), resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Invalid year", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:date-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_date() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrObj2 = null;
FunctionArgumentAttributeValue attrObjDateZone = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_DATE
.createAttributeValue("2013-05-12"));
attrObj2 = new FunctionArgumentAttributeValue(
DataTypes.DT_DATE
.createAttributeValue("0001-01-01"));
attrObjDateZone = new FunctionArgumentAttributeValue(
DataTypes.DT_DATE
.createAttributeValue("2013-05-12+03:00"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_DATE;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DATE, fd.getId());
assertEquals(DataTypes.DT_DATE.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("2013-05-12", res.getValue().getValue());
// missing digits in string value?
arguments.clear();
arguments.add(attrObj2);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("1-01-01", res.getValue().getValue());
// include DateZone
arguments.clear();
arguments.add(attrObjDateZone);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("2013-05-12+03:00", res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-date Expected data type 'date' saw 'integer' at arg index 0", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* DateTime
*/
@Test
public void testDateTime_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrString2 = null;
FunctionArgumentAttributeValue attrString3 = null;
FunctionArgumentAttributeValue attrString4 = null;
FunctionArgumentAttributeValue attrString5 = null;
FunctionArgumentAttributeValue attrString6 = null;
FunctionArgumentAttributeValue attrString7 = null;
FunctionArgumentAttributeValue attrString8 = null;
FunctionArgumentAttributeValue attrString9 = null;
FunctionArgumentAttributeValue attrStringDateTimeZone = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-12T12:14:15.323"));
attrString2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("-2013-05-12T12:14:15.323"));
attrString3 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("1232013-05-12T12:14:15.323"));
attrString4 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("-1232013-05-12T12:14:15.323"));
attrString5 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("213-05-12T12:14:15.323"));
attrString6 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-5-12T12:14:15.323"));
attrString7 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-2T12:14:15.323"));
attrString8 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-32-12T12:14:15.323"));
attrString9 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-45T12:14:15.323"));
attrStringDateTimeZone = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2013-05-12T12:14:15.323+03:00"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_DATETIME_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_DATETIME_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_DATETIME.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
ISO8601DateTime resValue = (ISO8601DateTime)res.getValue().getValue();
assertEquals(new ISO8601DateTime(null, new ISO8601Date(2013, 5, 12), new ISO8601Time(12, 14, 15, 323)),
resValue);
// check negative
arguments.clear();
arguments.add(attrString2);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601DateTime)res.getValue().getValue();
assertEquals(new ISO8601DateTime(null, new ISO8601Date(-2013, 5, 12),
new ISO8601Time(12, 14, 15, 323)), resValue);
// check big
arguments.clear();
arguments.add(attrString3);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601DateTime)res.getValue().getValue();
assertEquals(new ISO8601DateTime(null, new ISO8601Date(1232013, 5, 12), new ISO8601Time(12, 14, 15,
323)),
resValue);
// check big negative
arguments.clear();
arguments.add(attrString4);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601DateTime)res.getValue().getValue();
assertEquals(new ISO8601DateTime(null, new ISO8601Date(-1232013, 5, 12), new ISO8601Time(12, 14, 15,
323)),
resValue);
// bad year
arguments.clear();
arguments.add(attrString5);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Invalid year (must be at least 4 digits)", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad month
arguments.clear();
arguments.add(attrString6);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Invalid month", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad day format
arguments.clear();
arguments.add(attrString7);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Invalid day", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// month out of range
arguments.clear();
arguments.add(attrString8);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Invalid month", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// day out of range
arguments.clear();
arguments.add(attrString9);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Invalid day", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// check TimeZone
arguments.clear();
arguments.add(attrStringDateTimeZone);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (ISO8601DateTime)res.getValue().getValue();
assertEquals(new ISO8601DateTime(new ISO8601TimeZone(180), new ISO8601Date(new ISO8601TimeZone(180),
2013, 5, 12),
new ISO8601Time(new ISO8601TimeZone(180), 12, 14, 15, 323)),
resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Invalid year", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dateTime-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_dateTime() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrObj2 = null;
FunctionArgumentAttributeValue attrObjDateTimeZone = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_DATETIME
.createAttributeValue("2013-05-12T12:14:15.323"));
attrObj2 = new FunctionArgumentAttributeValue(
DataTypes.DT_DATETIME
.createAttributeValue("0001-01-01T12:14:15.323"));
attrObjDateTimeZone = new FunctionArgumentAttributeValue(
DataTypes.DT_DATETIME
.createAttributeValue("2013-05-12T12:14:15.323+03:00"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_DATETIME;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DATETIME, fd.getId());
assertEquals(DataTypes.DT_DATETIME.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("2013-05-12T12:14:15.323", res.getValue().getValue());
// missing digits in string value?
arguments.clear();
arguments.add(attrObj2);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("1-01-01T12:14:15.323", res.getValue().getValue());
// include DateTimeZone
arguments.clear();
arguments.add(attrObjDateTimeZone);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("2013-05-12T12:14:15.323+03:00", res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-dateTime Expected data type 'dateTime' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* URI
*/
@Test
public void testURI_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("http://someMachine.com/subdir"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_ANYURI_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ANYURI_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_ANYURI.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
URI resValue = (URI)res.getValue().getValue();
try {
assertEquals(new URI("http://someMachine.com/subdir"), resValue);
} catch (URISyntaxException e) {
fail("uri generation e=" + e);
}
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:anyURI-from-string Illegal character in path at index 3: not valid obj value",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:anyURI-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_anyURI() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "http://aMachine.com:8080/aRef";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_ANYURI;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_ANYURI, fd.getId());
assertEquals(DataTypes.DT_ANYURI.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-anyURI Expected data type 'anyURI' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* XPathDayTimeDuration
*/
@Test
public void testXPathDayTimeDuration_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringNeg1 = null;
FunctionArgumentAttributeValue attrStringNeg2 = null;
FunctionArgumentAttributeValue attrStringNoDay = null;
FunctionArgumentAttributeValue attrStringNoHour = null;
FunctionArgumentAttributeValue attrStringNoMin = null;
FunctionArgumentAttributeValue attrStringNoSec = null;
FunctionArgumentAttributeValue attrStringNoP = null;
FunctionArgumentAttributeValue attrStringSecondsDot = null;
FunctionArgumentAttributeValue attrStringMissingTOk = null;
FunctionArgumentAttributeValue attrStringMissingTBad = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3DT10H30M23S"));
attrStringNeg1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("-P3DT10H30M23S"));
attrStringNeg2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P-3DT10H30M23S"));
attrStringNoDay = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("PT10H30M23S"));
attrStringNoHour = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3DT30M23S"));
attrStringNoMin = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3DT10H23S"));
attrStringNoSec = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3DT10H30M"));
attrStringNoP = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("3DT10H30M"));
attrStringSecondsDot = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3DT10H30M23.456S"));
attrStringMissingTOk = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3D"));
attrStringMissingTBad = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3D10H30M23S"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_DAYTIMEDURATION_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_DAYTIMEDURATION_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_DAYTIMEDURATION.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
XPathDayTimeDuration resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 3, 10, 30, 23), resValue);
// negative values in front is allowed
arguments.clear();
arguments.add(attrStringNeg1);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(-1, 3, 10, 30, 23), resValue);
// negative in middle of string not ok
arguments.clear();
arguments.add(attrStringNeg2);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dayTimeDuration-from-string Invalid chunk \"P-3DT10H30M23S\" at position 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// omit parts that are 0
arguments.clear();
arguments.add(attrStringNoDay);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 0, 10, 30, 23), resValue);
arguments.clear();
arguments.add(attrStringNoHour);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 3, 0, 30, 23), resValue);
arguments.clear();
arguments.add(attrStringNoMin);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 3, 10, 0, 23), resValue);
arguments.clear();
arguments.add(attrStringNoSec);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 3, 10, 30, 0), resValue);
// P must always be present
arguments.clear();
arguments.add(attrStringNoP);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dayTimeDuration-from-string Invalid ISO8601 duration string \"3DT10H30M\" at position 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// seconds may contain decimal
arguments.clear();
arguments.add(attrStringSecondsDot);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 3, 10, 30, 23.456), resValue);
// T must be absent iff all time items are absent
arguments.clear();
arguments.add(attrStringMissingTOk);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathDayTimeDuration)res.getValue().getValue();
assertEquals(new XPathDayTimeDuration(1, 3, 0, 0, 0), resValue);
// negative in middle of string not ok
arguments.clear();
arguments.add(attrStringMissingTBad);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dayTimeDuration-from-string Invalid ISO8601 duration string \"P3D10H30M23S\" at position 6: out of order component",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dayTimeDuration-from-string Invalid ISO8601 duration string \"not valid obj value\" at position 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dayTimeDuration-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_dayTimeDuration() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "P3DT10H30M23S";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_DAYTIMEDURATION
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_DAYTIMEDURATION;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DAYTIMEDURATION, fd.getId());
assertEquals(DataTypes.DT_DAYTIMEDURATION.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-dayTimeDuration Expected data type 'dayTimeDuration' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* XPathYearMonthDuration
*/
@Test
public void testXPathYearMonthDuration_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringNeg1 = null;
FunctionArgumentAttributeValue attrStringNeg2 = null;
FunctionArgumentAttributeValue attrStringNoYear1 = null;
FunctionArgumentAttributeValue attrStringNoYear2 = null;
FunctionArgumentAttributeValue attrStringNoMonth1 = null;
FunctionArgumentAttributeValue attrStringNoMonth2 = null;
FunctionArgumentAttributeValue attrStringNoValue = null;
FunctionArgumentAttributeValue attrStringNoP = null;
FunctionArgumentAttributeValue attrStringBigMonths = null;
FunctionArgumentAttributeValue attrStringMissingTOk = null;
FunctionArgumentAttributeValue attrStringMissingTBad = null;
FunctionArgumentAttributeValue attrStringZeroMonths = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P1Y2M"));
attrStringNeg1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("-P1Y2M"));
attrStringNeg2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P-1Y2M"));
attrStringNoYear1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P2M"));
attrStringNoYear2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("PY2M"));
attrStringNoMonth1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P1Y"));
attrStringNoMonth2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P1YM"));
attrStringNoValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P"));
attrStringNoP = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("1Y2M"));
attrStringBigMonths = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P1Y12M"));
attrStringMissingTOk = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3D"));
attrStringMissingTBad = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P3D10H30M23S"));
attrStringZeroMonths = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("P0M"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_YEARMONTHDURATION_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_YEARMONTHDURATION_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_YEARMONTHDURATION.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
XPathYearMonthDuration resValue = (XPathYearMonthDuration)res.getValue().getValue();
assertEquals(new XPathYearMonthDuration(1, 1, 2), resValue);
// negative values in front is allowed
arguments.clear();
arguments.add(attrStringNeg1);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathYearMonthDuration)res.getValue().getValue();
assertEquals(new XPathYearMonthDuration(-1, 1, 2), resValue);
// negative in middle of string not ok
arguments.clear();
arguments.add(attrStringNeg2);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid chunk \"P-1Y2M\" at position 1", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// omit parts that are 0
arguments.clear();
arguments.add(attrStringNoYear1);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathYearMonthDuration)res.getValue().getValue();
assertEquals(new XPathYearMonthDuration(1, 0, 2), resValue);
arguments.clear();
arguments.add(attrStringNoYear2);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid chunk \"PY2M\" at position 1", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrStringNoMonth1);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathYearMonthDuration)res.getValue().getValue();
assertEquals(new XPathYearMonthDuration(1, 1, 0), resValue);
arguments.clear();
arguments.add(attrStringNoMonth2);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid chunk \"P1YM\" at position 3", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// No field with a value
arguments.clear();
arguments.add(attrStringNoValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"P\": No duration components following P",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// P must always be present
arguments.clear();
arguments.add(attrStringNoP);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"1Y2M\" at position 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// Canonical Form of output may not have more than 12 months, but input as string is ok?
arguments.clear();
arguments.add(attrStringBigMonths);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathYearMonthDuration)res.getValue().getValue();
assertEquals(new XPathYearMonthDuration(1, 1, 12), resValue);
// Canonical representation of 0 Months
arguments.clear();
arguments.add(attrStringZeroMonths);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (XPathYearMonthDuration)res.getValue().getValue();
assertEquals(new XPathYearMonthDuration(1, 0, 0), resValue);
// T must be absent iff all time items are absent
arguments.clear();
arguments.add(attrStringMissingTOk);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid XPath yearMonthDuraiton \"{durationSign=1years=0months=0days=3hours=0minutes=0seconds=0millis=0}\": includes days, hours, minutes, or seconds",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// negative in middle of string not ok
arguments.clear();
arguments.add(attrStringMissingTBad);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"P3D10H30M23S\" at position 6: out of order component",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Invalid ISO8601 duration string \"not valid obj value\" at position 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:yearMonthDuration-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_yearMonthDuration() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "P1Y2M";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_YEARMONTHDURATION
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_YEARMONTHDURATION;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_YEARMONTHDURATION, fd.getId());
assertEquals(DataTypes.DT_YEARMONTHDURATION.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-yearMonthDuration Expected data type 'yearMonthDuration' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* X500Principal See http://www.ietf.org/rfc/rfc2253.txt and http://www.ietf.org/rfc/rfc2251.txt
*/
@Test
public void testX500Principal_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringNoComma = null;
FunctionArgumentAttributeValue attrStringEmpty = null;
FunctionArgumentAttributeValue attrStringNoValue = null;
FunctionArgumentAttributeValue attrStringOrder = null;
FunctionArgumentAttributeValue attrStringDottedDecimalOID = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("CN=Name, L=local, ST=NJ, O=ATT, C=USA"));
attrStringNoComma = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("CN=Name, L=local ST=NJ, O=ATT, C=USA"));
attrStringEmpty = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(""));
attrStringNoValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("CN=Name, L=, ST=NJ, O=ATT, C=USA"));
attrStringOrder = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("L=local, ST=NJ, O=ATT, CN=Name, C=USA"));
attrStringDottedDecimalOID = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2.5.4.3=A. N. Other"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_X500NAME_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_X500NAME_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_X500NAME.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
X500Principal resValue = (X500Principal)res.getValue().getValue();
assertEquals(new X500Principal("CN=Name, L=local, ST=NJ, O=ATT, C=USA"), resValue);
// no comma between components => next attribute/value is included as part of first value
arguments.clear();
arguments.add(attrStringNoComma);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (X500Principal)res.getValue().getValue();
assertEquals(new X500Principal("CN=Name, L=local ST=NJ, O=ATT, C=USA"), resValue);
// nothing in name (fail)
arguments.clear();
arguments.add(attrStringEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (X500Principal)res.getValue().getValue();
assertEquals(new X500Principal(""), resValue);
// type value with no =
arguments.clear();
arguments.add(attrStringNoValue);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (X500Principal)res.getValue().getValue();
assertEquals(new X500Principal("CN=Name, L=, ST=NJ, O=ATT, C=USA"), resValue);
// different order
arguments.clear();
arguments.add(attrStringOrder);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (X500Principal)res.getValue().getValue();
assertNotEquals(new X500Principal("CN=Name, L=local, ST=NJ, O=ATT, C=USA"), resValue);
// dotted-decimal name with numbers
arguments.clear();
arguments.add(attrStringDottedDecimalOID);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (X500Principal)res.getValue().getValue();
assertEquals(new X500Principal("2.5.4.3=A. N. Other"), resValue);
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:x500Name-from-string improperly specified input name: not valid obj value",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:x500Name-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_x500Name() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "CN=Name, L=local, ST=NJ, O=ATT, C=USA";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_X500NAME
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_X500NAME;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_X500NAME, fd.getId());
assertEquals(DataTypes.DT_X500NAME.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-x500Name Expected data type 'x500Name' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* RFC822Name
*/
@Test
public void testRFC822Name_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringCapsDomain = null;
FunctionArgumentAttributeValue attrStringCapsLocal = null;
FunctionArgumentAttributeValue attrStringMissingAt = null;
FunctionArgumentAttributeValue attrStringMissingLocal = null;
FunctionArgumentAttributeValue attrStringMissingDomain = null;
FunctionArgumentAttributeValue attrStringEmpty = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("local@Domain"));
attrStringCapsDomain = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("local@DOMAIN"));
attrStringCapsLocal = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("LOCAL@Domain"));
attrStringMissingAt = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("localDomain"));
attrStringMissingLocal = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("@Domain"));
attrStringMissingDomain = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("local@"));
attrStringEmpty = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(""));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_RFC822NAME_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_RFC822NAME_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_RFC822NAME.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
RFC822Name resValue = (RFC822Name)res.getValue().getValue();
assertEquals(new RFC822Name("local", "domain"), resValue);
// caps domain
arguments.clear();
arguments.add(attrStringCapsDomain);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (RFC822Name)res.getValue().getValue();
assertEquals(new RFC822Name("local", "domain"), resValue);
// caps local
arguments.clear();
arguments.add(attrStringCapsLocal);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (RFC822Name)res.getValue().getValue();
assertNotEquals(new RFC822Name("local", "domain"), resValue);
// missing at
arguments.clear();
arguments.add(attrStringMissingAt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"localDomain\": missing local part",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// missing local
arguments.clear();
arguments.add(attrStringMissingLocal);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"@Domain\": empty parts", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// missing domain
arguments.clear();
arguments.add(attrStringMissingDomain);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"local@\": empty parts", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// empty
arguments.clear();
arguments.add(attrStringEmpty);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"\": missing local part", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:rfc822Name-from-string Invalid RFC822Name \"not valid obj value\": missing local part",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:rfc822Name-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_rfc822Name() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "local@DOMAIN";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_RFC822NAME
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_RFC822NAME;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_RFC822NAME, fd.getId());
assertEquals(DataTypes.DT_RFC822NAME.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals("local@domain", res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-rfc822Name Expected data type 'rfc822Name' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* IPAddress
*/
@Test
public void testIPAddress_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrStringFull = null;
FunctionArgumentAttributeValue attrStringMissingElement = null;
FunctionArgumentAttributeValue attrStringTooManyElement = null;
FunctionArgumentAttributeValue attrStringIllegalElement = null;
FunctionArgumentAttributeValue attrStringOutOfOrder = null;
FunctionArgumentAttributeValue attrStringMask = null;
FunctionArgumentAttributeValue attrStringMissingMaskElement = null;
FunctionArgumentAttributeValue attrStringTooManyMaskElement = null;
FunctionArgumentAttributeValue attrStringIllegalMaskElement = null;
FunctionArgumentAttributeValue attrStringMaskNoValue = null;
FunctionArgumentAttributeValue attrStringMinusPort = null;
FunctionArgumentAttributeValue attrStringPortMinus = null;
FunctionArgumentAttributeValue attrStringPortPort = null;
FunctionArgumentAttributeValue attrStringNoPort = null;
FunctionArgumentAttributeValue attrStringBadPort = null;
FunctionArgumentAttributeValue attrStringTooManyPorts = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
// set up for v4 address tests - this setup and the tests are repeated for V6
short[] addrShorts = {
123, 134, 156, 255
};
short[] addrMaskShorts = {
255, 255, 255, 255
};
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255"));
attrStringFull = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255/255.255.255.255:123-456"));
attrStringMissingElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.255"));
attrStringTooManyElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.255.111.222"));
attrStringIllegalElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.256.255"));
attrStringOutOfOrder = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.256.255:123-456/255.255.255.255"));
attrStringMask = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255/255.255.255.255"));
attrStringMissingMaskElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255/123.134.255"));
attrStringTooManyMaskElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255/122.134.155.111.222"));
attrStringIllegalMaskElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255/123.134.256.255"));
attrStringMaskNoValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255/"));
// optional mask
// "/" with no mask (fail)
attrStringMinusPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255:-123"));
attrStringPortMinus = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255:123-"));
attrStringPortPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255:1234567-432"));
attrStringNoPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255:"));
attrStringBadPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255:12.34"));
attrStringTooManyPorts = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("123.134.156.255:-123-456"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_IPADDRESS_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_IPADDRESS_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_IPADDRESS.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
IPAddress resValue = (IPAddress)res.getValue().getValue();
assertEquals(new IPv4Address(addrShorts, null, null), resValue);
// fully-loaded address
arguments.clear();
arguments.add(attrStringFull);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv4Address(addrShorts, addrMaskShorts, PortRange.newInstance("123-456")),
resValue);
} catch (Exception e) {
fail("port error e=" + e);
}
// missing element
arguments.clear();
arguments.add(attrStringMissingElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.255\": invalid address",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// too many elements
arguments.clear();
arguments.add(attrStringTooManyElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.255.111.222\": invalid address",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// illegal element
arguments.clear();
arguments.add(attrStringIllegalElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.256.255\": invalid octet: \"256",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// Out of order
arguments.clear();
arguments.add(attrStringOutOfOrder);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.256.255:123-456/255.255.255.255\": out of order components",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// simple mask
arguments.clear();
arguments.add(attrStringMask);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv4Address(addrShorts, addrMaskShorts, null), resValue);
} catch (Exception e) {
fail("port error e=" + e);
}
// missing mask element
arguments.clear();
arguments.add(attrStringMissingMaskElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.255\": invalid address",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// too many mask elements
arguments.clear();
arguments.add(attrStringTooManyMaskElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"122.134.155.111.222\": invalid address",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// illegal Mask element
arguments.clear();
arguments.add(attrStringIllegalMaskElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.256.255\": invalid octet: \"256",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// mask indicator without value
arguments.clear();
arguments.add(attrStringMaskNoValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"\": invalid address", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// portrange (-port, port-, port-port)
arguments.clear();
arguments.add(attrStringMinusPort);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv4Address(addrShorts, null, PortRange.newInstance("-123")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
arguments.clear();
arguments.add(attrStringPortMinus);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv4Address(addrShorts, null, PortRange.newInstance("123-")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
arguments.clear();
arguments.add(attrStringPortPort);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv4Address(addrShorts, null, PortRange.newInstance("1234567-432")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
// ":" without port
arguments.clear();
arguments.add(attrStringNoPort);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv4 address string \"123.134.156.255:\": no portrange given after ':'",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad port number
arguments.clear();
arguments.add(attrStringBadPort);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid PortRange \"12.34\": invalid port number", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad port range
arguments.clear();
arguments.add(attrStringTooManyPorts);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid PortRange \"-123-456\": too many ranges", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Unknown IPAddress type for \"not valid obj value\"", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
//
// V6 IP Addresses
//
// reset the variable for IPv6 tests
FunctionArgumentAttributeValue attrStringAlternateFull = null;
FunctionArgumentAttributeValue attrStringEmptyElement = null;
FunctionArgumentAttributeValue attrString2xEmptyElement = null;
FunctionArgumentAttributeValue attrStringNoStartBracket = null;
FunctionArgumentAttributeValue attrStringNoEndBracket = null;
short[] addrv6Shorts = {
(short)0x2001, (short)0xdb8, (short)0x85a3, (short)0x0, (short)0x0, (short)0x8a2e, (short)0x370,
(short)0x1
};
Short prefix = new Short((short)121);
try {
attrString1 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]"));
attrStringFull = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/121]:123-456"));
attrStringAlternateFull = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]/121:123-456"));
attrStringEmptyElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3::8a2e:370:1]"));
attrString2xEmptyElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3::8a2e::1]"));
attrStringNoStartBracket = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("2002:db8:85a3::8a2e::1]"));
attrStringNoEndBracket = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3::8a2e::1"));
attrStringMissingElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:1]"));
attrStringTooManyElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1:123]"));
attrStringIllegalElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:mnop:85a3:0:0:8a2e:370:1]"));
attrStringOutOfOrder = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:mnop:85a3:0:0:8a2e:370:1:123-456/121]"));
attrStringMask = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/21]"));
attrStringIllegalMaskElement = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/130]"));
attrStringMaskNoValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1/]"));
attrStringMinusPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:-123"));
attrStringPortMinus = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:123-"));
attrStringPortPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:1234567-432"));
attrStringNoPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:"));
attrStringBadPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:12.34"));
attrStringTooManyPorts = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("[2001:db8:85a3:0:0:8a2e:370:1]:-123-456"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
// test normal
arguments.clear();
arguments.add(attrString1);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
assertEquals(new IPv6Address(addrv6Shorts, null, null), resValue);
// fully-loaded address - "prefix" is inside the brackets (not clear if this is correct)
arguments.clear();
arguments.add(attrStringFull);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, new Short(prefix), PortRange.newInstance("123-456")),
resValue);
} catch (Exception e) {
fail("port error e=" + e);
}
// Alternate way of identifying "prefix" - outside the brackets
arguments.clear();
arguments.add(attrStringAlternateFull);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, prefix, PortRange.newInstance("123-456")), resValue);
} catch (Exception e) {
fail("port error e=" + e);
}
// consecutive zero elements removed
arguments.clear();
arguments.add(attrStringEmptyElement);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, prefix, null), resValue);
} catch (Exception e) {
fail("port error e=" + e);
}
// consecutive zero elements removed in two locations (no-no)
arguments.clear();
arguments.add(attrString2xEmptyElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:db8:85a3::8a2e::1\": multiple zero runs",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// address must have [] on it
arguments.clear();
arguments.add(attrStringNoStartBracket);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2002:db8:85a3::8a2e::1]\": missing opening bracket",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrStringNoEndBracket);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"[2001:db8:85a3::8a2e::1\": missing closing bracket",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// missing element
arguments.clear();
arguments.add(attrStringMissingElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:db8:85a3:0:0:8a2e:1\": not enough address fields",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// too many elements
arguments.clear();
arguments.add(attrStringTooManyElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:db8:85a3:0:0:8a2e:370:1:123\"",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// illegal element
arguments.clear();
arguments.add(attrStringIllegalElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address component \"mnop\": invalid hex",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// Out of order
arguments.clear();
arguments.add(attrStringOutOfOrder);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6Address string \"2001:mnop:85a3:0:0:8a2e:370:1:123-456\"",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// simple mask
arguments.clear();
arguments.add(attrStringMask);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, prefix, null), resValue);
} catch (Exception e) {
fail("port error e=" + e);
}
// illegal Mask element
arguments.clear();
arguments.add(attrStringIllegalMaskElement);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid Ipv6Address string \"[2001:db8:85a3:0:0:8a2e:370:1/130]\": prefix is larger than 128",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// mask indicator without value
arguments.clear();
arguments.add(attrStringMaskNoValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid Ipv6Address string \"[2001:db8:85a3:0:0:8a2e:370:1/]\": prefix designation without value",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// portrange (-port, port-, port-port)
arguments.clear();
arguments.add(attrStringMinusPort);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, null, PortRange.newInstance("-123")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
arguments.clear();
arguments.add(attrStringPortMinus);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, null, PortRange.newInstance("123-")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
arguments.clear();
arguments.add(attrStringPortPort);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (IPAddress)res.getValue().getValue();
try {
assertEquals(new IPv6Address(addrv6Shorts, null, PortRange.newInstance("1234567-432")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
// ":" without port
arguments.clear();
arguments.add(attrStringNoPort);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid IPv6 address string \"[2001:db8:85a3:0:0:8a2e:370:1]:\": no portrange given after ':'",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad port number
arguments.clear();
arguments.add(attrStringBadPort);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid PortRange \"12.34\": invalid port number", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad port range
arguments.clear();
arguments.add(attrStringTooManyPorts);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:ipAddress-from-string Invalid PortRange \"-123-456\": too many ranges", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_ipAddress() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrObjV6 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "123.145.255.255";
String objValueStringV6 = "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_IPADDRESS
.createAttributeValue(objValueString));
attrObjV6 = new FunctionArgumentAttributeValue(
DataTypes.DT_IPADDRESS
.createAttributeValue(objValueStringV6));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_IPADDRESS;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_IPADDRESS, fd.getId());
assertEquals(DataTypes.DT_IPADDRESS.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal V4
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// test normal V6
arguments.clear();
arguments.add(attrObjV6);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueStringV6.toLowerCase(), res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-ipAddress Expected data type 'ipAddress' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
/**
* RFC2396DomainName
*/
@Test
public void testRFC2396DomainName_from_string() {
FunctionArgumentAttributeValue attrString1 = null;
FunctionArgumentAttributeValue attrString2 = null;
FunctionArgumentAttributeValue attrStringMinusPort = null;
FunctionArgumentAttributeValue attrStringPortMinus = null;
FunctionArgumentAttributeValue attrStringPortPort = null;
FunctionArgumentAttributeValue attrStringNoPort = null;
FunctionArgumentAttributeValue attrStringBadPort = null;
FunctionArgumentAttributeValue attrStringTooManyPorts = null;
FunctionArgumentAttributeValue attrStringBadValue = null;
FunctionArgumentAttributeValue attrStringBadType = null;
try {
attrString1 = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue("host"));
attrString2 = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host"));
attrStringMinusPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host:-123"));
attrStringPortMinus = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host:123-"));
attrStringPortPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host:1234567-432"));
attrStringNoPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host:"));
attrStringBadPort = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host:12.34"));
attrStringTooManyPorts = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("host.host:-123-456"));
attrStringBadValue = new FunctionArgumentAttributeValue(
DataTypes.DT_STRING
.createAttributeValue("not valid obj value"));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_DNSNAME_FROM_STRING;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_DNSNAME_FROM_STRING, fd.getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_DNSNAME.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrString1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
RFC2396DomainName resValue = (RFC2396DomainName)res.getValue().getValue();
assertEquals(new RFC2396DomainName("host", null), resValue);
arguments.clear();
arguments.add(attrString2);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (RFC2396DomainName)res.getValue().getValue();
assertEquals(new RFC2396DomainName("host.host", null), resValue);
// portrange (-port, port-, port-port)
arguments.clear();
arguments.add(attrStringMinusPort);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (RFC2396DomainName)res.getValue().getValue();
try {
assertEquals(new RFC2396DomainName("host.host", PortRange.newInstance("-123")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
arguments.clear();
arguments.add(attrStringPortMinus);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (RFC2396DomainName)res.getValue().getValue();
try {
assertEquals(new RFC2396DomainName("host.host", PortRange.newInstance("123-")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
arguments.clear();
arguments.add(attrStringPortPort);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (RFC2396DomainName)res.getValue().getValue();
try {
assertEquals(new RFC2396DomainName("host.host", PortRange.newInstance("1234567-432")), resValue);
} catch (ParseException e) {
fail("port error e=" + e);
}
// ":" without port
arguments.clear();
arguments.add(attrStringNoPort);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dnsName-from-string Invalid RFC 2396 port range \"host.host:\": no port numbers",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad port number
arguments.clear();
arguments.add(attrStringBadPort);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dnsName-from-string Invalid RFC 2396 port range \"12.34\"", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad port range
arguments.clear();
arguments.add(attrStringTooManyPorts);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dnsName-from-string Invalid RFC 2396 port range \"-123-456\"", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad value
arguments.clear();
arguments.add(attrStringBadValue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dnsName-from-string Invalid RFC 2396 host name \"not valid obj value\"", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:syntax-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:dnsName-from-string Expected data type 'string' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testString_from_dnsName() {
FunctionArgumentAttributeValue attrObj1 = null;
FunctionArgumentAttributeValue attrStringBadType = null;
String objValueString = "someName.com";
try {
attrObj1 = new FunctionArgumentAttributeValue(
DataTypes.DT_DNSNAME
.createAttributeValue(objValueString));
attrStringBadType = new FunctionArgumentAttributeValue(
DataTypes.DT_INTEGER
.createAttributeValue(123));
} catch (Exception e) {
fail("creating attribute e=" + e);
}
FunctionDefinitionStringConversion<?, ?> fd = (FunctionDefinitionStringConversion<?, ?>)StdFunctions.FD_STRING_FROM_DNSNAME;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_STRING_FROM_DNSNAME, fd.getId());
assertEquals(DataTypes.DT_DNSNAME.getId(), fd.getDataTypeArgs().getId());
assertEquals(DataTypes.DT_STRING.getId(), fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertFalse(fd.returnsBag());
assertEquals(new Integer(1), fd.getNumArgs());
// test normal
arguments.clear();
arguments.add(attrObj1);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertEquals(objValueString, res.getValue().getValue());
// bad arg type
arguments.clear();
arguments.add(attrStringBadType);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:string-from-dnsName Expected data type 'dnsName' saw 'integer' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
}