blob: 5b6c892070b91c0dad94e53fc94bb4540fc5e3cf [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.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.apache.openaz.xacml.api.AttributeValue;
import org.apache.openaz.xacml.api.XACML3;
import org.apache.openaz.xacml.pdp.policy.Bag;
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.policy.FunctionArgumentBag;
import org.apache.openaz.xacml.pdp.std.StdFunctions;
import org.apache.openaz.xacml.pdp.std.functions.FunctionDefinitionHigherOrderBag;
import org.apache.openaz.xacml.std.datatypes.DataTypes;
import org.junit.Test;
/**
* Test of PDP Functions (See XACML core spec section A.3) TO RUN - use jUnit In Eclipse select this file or
* the enclosing directory, right-click and select Run As/JUnit Test
*/
public class FunctionDefinitionHigherOrderBagTest {
/*
* variables useful in the following tests
*/
List<FunctionArgument> arguments = new ArrayList<FunctionArgument>();
//
// ANY-OF tests
//
@Test
public void testAny_of() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansTrue = null;
Bag bagStringBooleansFalse = null;
// primitive attrs
FunctionArgumentAttributeValue attra = null;
FunctionArgumentAttributeValue attrb = null;
FunctionArgumentAttributeValue attrh = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringEqual = null;
FunctionArgumentAttributeValue attrPredicateStringIntersection = null;
FunctionArgumentAttributeValue attrPredicateBooleanFromString = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue(a));
bagace.add(DataTypes.DT_STRING.createAttributeValue(c));
bagace.add(DataTypes.DT_STRING.createAttributeValue(e));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
// create primitive attrs
attra = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(a));
attrb = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(b));
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
// predicates passed as function arguments
attrPredicateStringEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_EQUAL));
attrPredicateStringIntersection = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_INTERSECTION));
attrPredicateBooleanFromString = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagbdfhj = new FunctionArgumentBag(bagbdfhj);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionArgumentBag attrBagStringBooleansFalse = new FunctionArgumentBag(bagStringBooleansFalse);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_ANY_OF;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ANY_OF, fd.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());
// normal match
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attra);
arguments.add(attrBagabcdefg);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// bag in first position - match
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagabcdefg);
arguments.add(attra);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// normal no-match
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attra);
arguments.add(attrBagbdfhj);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// multiple primitives
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrh);
arguments.add(attrb);
arguments.add(attrBagace);
arguments.add(attra);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Predicate error: function:string-equal Expected 2 arguments, got 4",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no primitives - predicate function expects 2
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Predicate error: function:string-equal Expected 2 arguments, got 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no primitives - predicate expects only 1 arg
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansFalse);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrh);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// no bag
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Did not get any Bag argument; must have at least 1", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// extra bag
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrh);
arguments.add(attrBagStringBooleansTrue);
arguments.add(attrh);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of must have only 1 bag; found one at index 2 and another at 4", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// non-boolean predicate
arguments.clear();
arguments.add(attrPredicateStringIntersection);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Predicate Function must return boolean, but 'urn:oasis:names:tc:xacml:1.0:function:string-intersection' returns 'string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate after first arg
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Predicate error: function:string-equal Expected data type 'string' saw 'anyURI' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Predicate Function (first argument) was null", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of Got null argument at index 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testAll_of() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
String w = "w";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansFalse = null;
Bag bagStringBooleansTrue = null;
// primitive attrs
FunctionArgumentAttributeValue attra = null;
FunctionArgumentAttributeValue attrh = null;
FunctionArgumentAttributeValue attrw = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringEqual = null;
FunctionArgumentAttributeValue attrPredicateStringIntersection = null;
FunctionArgumentAttributeValue attrPredicateStringGreaterThan = null;
FunctionArgumentAttributeValue attrPredicateBooleanFromString = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue(a));
bagace.add(DataTypes.DT_STRING.createAttributeValue(c));
bagace.add(DataTypes.DT_STRING.createAttributeValue(e));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
// create primitive attrs
attra = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(a));
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
attrw = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(w));
// predicates passed as function arguments
attrPredicateStringEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_EQUAL));
attrPredicateStringIntersection = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_INTERSECTION));
attrPredicateStringGreaterThan = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_GREATER_THAN));
attrPredicateBooleanFromString = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagbdfhj = new FunctionArgumentBag(bagbdfhj);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionArgumentBag attrBagStringBooleansFalse = new FunctionArgumentBag(bagStringBooleansFalse);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_ALL_OF;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ALL_OF, fd.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());
// normal match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrw);
arguments.add(attrBagace);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// normal no-match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attra);
arguments.add(attrBagbdfhj);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// no primitives - predicate function expects 2
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of Predicate error: function:string-equal Expected 2 arguments, got 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no primitives - predicate expects only 1 arg
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansFalse);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// no bag
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of Did not get any Bag argument; must have at least 1", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// extra bag
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrh);
arguments.add(attrBagStringBooleansTrue);
arguments.add(attrh);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of must have only 1 bag; found one at index 2 and another at 4", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// non-boolean predicate
arguments.clear();
arguments.add(attrPredicateStringIntersection);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of Predicate Function must return boolean, but 'urn:oasis:names:tc:xacml:1.0:function:string-intersection' returns 'string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate after first arg
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of Predicate error: function:string-greater-than Expected data type 'string' saw 'anyURI' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of Predicate Function (first argument) was null", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of Got null argument at index 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testAny_of_any() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
String w = "w";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansFalse = null;
Bag bagStringBooleansTrue = null;
Bag bagBooleansFalse = null;
Bag bagBooleansTrue = null;
// primitive attrs
FunctionArgumentAttributeValue attra = null;
FunctionArgumentAttributeValue attrh = null;
FunctionArgumentAttributeValue attrw = null;
FunctionArgumentAttributeValue attrInt4 = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringEqual = null;
FunctionArgumentAttributeValue attrPredicateStringIntersection = null;
FunctionArgumentAttributeValue attrPredicateStringGreaterThan = null;
FunctionArgumentAttributeValue attrPredicateBooleanFromString = null;
FunctionArgumentAttributeValue attrPredicateNof = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue(a));
bagace.add(DataTypes.DT_STRING.createAttributeValue(c));
bagace.add(DataTypes.DT_STRING.createAttributeValue(e));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagBooleansTrue = new Bag();
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(true));
bagBooleansFalse = new Bag();
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
// create primitive attrs
attra = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(a));
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
attrw = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(w));
attrInt4 = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(4));
// predicates passed as function arguments
attrPredicateStringEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_EQUAL));
attrPredicateStringIntersection = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_INTERSECTION));
attrPredicateStringGreaterThan = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_GREATER_THAN));
attrPredicateBooleanFromString = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING));
attrPredicateNof = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_N_OF));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagbdfhj = new FunctionArgumentBag(bagbdfhj);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionArgumentBag attrBagStringBooleansFalse = new FunctionArgumentBag(bagStringBooleansFalse);
FunctionArgumentBag attrBagBooleansTrue = new FunctionArgumentBag(bagBooleansTrue);
FunctionArgumentBag attrBagBooleansFalse = new FunctionArgumentBag(bagBooleansFalse);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_ANY_OF_ANY;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ANY_OF_ANY, fd.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());
// normal match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrw);
arguments.add(attrBagace);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// normal no-match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attra);
arguments.add(attrBagbdfhj);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// no primitives - predicate function expects 2
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Predicate error: function:string-equal Expected 2 arguments, got 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// no primitives - predicate expects only 1 arg
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansFalse);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// n-of with lots of bags - success
arguments.clear();
arguments.add(attrPredicateNof);
arguments.add(attrInt4);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// n-of with lots of bags - fail
arguments.clear();
arguments.add(attrPredicateNof);
arguments.add(attrInt4);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansTrue);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
arguments.add(attrBagBooleansFalse);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Bag is empty at index 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no bag
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Predicate error: function:string-greater-than Expected 2 arguments, got 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// non-boolean predicate
arguments.clear();
arguments.add(attrPredicateStringIntersection);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Predicate Function must return boolean, but 'urn:oasis:names:tc:xacml:1.0:function:string-intersection' returns 'string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate after first arg
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Predicate error: function:string-greater-than Expected data type 'string' saw 'anyURI' at arg index 0",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Predicate Function (first argument) was null", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-any Got null argument at index 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testAll_of_any() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
String w = "w";
String x = "x";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagawx = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansFalse = null;
Bag bagStringBooleansTrue = null;
Bag bagBooleansFalse = null;
Bag bagBooleansTrue = null;
// primitive attrs
FunctionArgumentAttributeValue attra = null;
FunctionArgumentAttributeValue attrh = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringEqual = null;
FunctionArgumentAttributeValue attrPredicateStringIntersection = null;
FunctionArgumentAttributeValue attrPredicateStringLessThan = null;
FunctionArgumentAttributeValue attrPredicateStringGreaterThan = null;
FunctionArgumentAttributeValue attrPredicateBooleanFromString = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue(a));
bagace.add(DataTypes.DT_STRING.createAttributeValue(c));
bagace.add(DataTypes.DT_STRING.createAttributeValue(e));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagawx = new Bag();
bagawx.add(DataTypes.DT_STRING.createAttributeValue(a));
bagawx.add(DataTypes.DT_STRING.createAttributeValue(w));
bagawx.add(DataTypes.DT_STRING.createAttributeValue(x));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagBooleansTrue = new Bag();
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(true));
bagBooleansFalse = new Bag();
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
// create primitive attrs
attra = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(a));
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
// predicates passed as function arguments
attrPredicateStringEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_EQUAL));
attrPredicateStringIntersection = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_INTERSECTION));
attrPredicateStringLessThan = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_LESS_THAN));
attrPredicateStringGreaterThan = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_GREATER_THAN));
attrPredicateBooleanFromString = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagawx = new FunctionArgumentBag(bagawx);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_ALL_OF_ANY;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ALL_OF_ANY, fd.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());
// normal match
arguments.clear();
arguments.add(attrPredicateStringLessThan);
arguments.add(attrBagabcdefg);
arguments.add(attrBagawx);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// normal no-match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagawx);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// primitive instead of bag
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attra);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any 2nd argument must be bag, got 'string'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
arguments.add(attra);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any 3rd argument must be bag, got 'string'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no primitives - predicate expects only 1 arg
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansTrue);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Predicate error: function:boolean-from-string Expected 1 arguments, got 2",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagEmpty);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// no bag
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Expected 3 arguments, got 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// non-boolean predicate
arguments.clear();
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Predicate Function must return boolean, but 'urn:oasis:names:tc:xacml:1.0:function:string-intersection' returns 'string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate after first arg
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any 2nd argument must be bag, got 'anyURI'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Predicate error: function:string-greater-than Expected data type 'string' saw 'integer' at arg index 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no args
arguments.clear();
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Expected at least 2 arguments, got 0", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// one arg
arguments.clear();
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Expected at least 2 arguments, got 1", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// too many args
arguments.clear();
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Expected 3 arguments, got 4", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any Expected 3 arguments, got 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-any 3rd argument must be bag, got 'null'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testAny_of_all() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
String w = "w";
String x = "x";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagewx = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansFalse = null;
Bag bagStringBooleansTrue = null;
Bag bagBooleansFalse = null;
Bag bagBooleansTrue = null;
// primitive attrs
FunctionArgumentAttributeValue attra = null;
FunctionArgumentAttributeValue attrh = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringEqual = null;
FunctionArgumentAttributeValue attrPredicateStringIntersection = null;
FunctionArgumentAttributeValue attrPredicateStringGreaterThanOrEqual = null;
FunctionArgumentAttributeValue attrPredicateStringGreaterThan = null;
FunctionArgumentAttributeValue attrPredicateBooleanFromString = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue(a));
bagace.add(DataTypes.DT_STRING.createAttributeValue(c));
bagace.add(DataTypes.DT_STRING.createAttributeValue(e));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagewx = new Bag();
bagewx.add(DataTypes.DT_STRING.createAttributeValue(e));
bagewx.add(DataTypes.DT_STRING.createAttributeValue(w));
bagewx.add(DataTypes.DT_STRING.createAttributeValue(x));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagBooleansTrue = new Bag();
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(true));
bagBooleansFalse = new Bag();
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
// create primitive attrs
attra = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(a));
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
// predicates passed as function arguments
attrPredicateStringEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_EQUAL));
attrPredicateStringIntersection = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_INTERSECTION));
attrPredicateStringGreaterThanOrEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_GREATER_THAN_OR_EQUAL));
attrPredicateStringGreaterThan = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_GREATER_THAN));
attrPredicateBooleanFromString = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagewx = new FunctionArgumentBag(bagewx);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_ANY_OF_ALL;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ANY_OF_ALL, fd.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());
// normal match
arguments.clear();
arguments.add(attrPredicateStringGreaterThanOrEqual);
arguments.add(attrBagewx);
arguments.add(attrBagace);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// normal no-match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagewx);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// primitive instead of bag
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attra);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all 2nd argument must be bag, got 'string'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
arguments.add(attra);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all 3rd argument must be bag, got 'string'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no primitives - predicate expects only 1 arg
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansTrue);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Predicate error: function:boolean-from-string Expected 1 arguments, got 2",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagEmpty);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// no bag
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Expected 3 arguments, got 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// non-boolean predicate
arguments.clear();
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Predicate Function must return boolean, but 'urn:oasis:names:tc:xacml:1.0:function:string-intersection' returns 'string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate after first arg
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all 2nd argument must be bag, got 'anyURI'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Predicate error: function:string-greater-than Expected data type 'string' saw 'integer' at arg index 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no args
arguments.clear();
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Expected at least 2 arguments, got 0", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// one arg
arguments.clear();
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Expected at least 2 arguments, got 1", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// too many args
arguments.clear();
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Expected 3 arguments, got 4", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all Expected 3 arguments, got 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:any-of-all 3rd argument must be bag, got 'null'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testAll_of_all() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
String w = "w";
String x = "x";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagawx = null;
Bag bagwx = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansFalse = null;
Bag bagStringBooleansTrue = null;
Bag bagBooleansFalse = null;
Bag bagBooleansTrue = null;
// primitive attrs
FunctionArgumentAttributeValue attra = null;
FunctionArgumentAttributeValue attrh = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringEqual = null;
FunctionArgumentAttributeValue attrPredicateStringIntersection = null;
FunctionArgumentAttributeValue attrPredicateStringGreaterThan = null;
FunctionArgumentAttributeValue attrPredicateBooleanFromString = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue(a));
bagace.add(DataTypes.DT_STRING.createAttributeValue(c));
bagace.add(DataTypes.DT_STRING.createAttributeValue(e));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagawx = new Bag();
bagawx.add(DataTypes.DT_STRING.createAttributeValue(a));
bagawx.add(DataTypes.DT_STRING.createAttributeValue(w));
bagawx.add(DataTypes.DT_STRING.createAttributeValue(x));
bagwx = new Bag();
bagwx.add(DataTypes.DT_STRING.createAttributeValue(w));
bagwx.add(DataTypes.DT_STRING.createAttributeValue(x));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagBooleansTrue = new Bag();
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansTrue.add(DataTypes.DT_BOOLEAN.createAttributeValue(true));
bagBooleansFalse = new Bag();
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
bagBooleansFalse.add(DataTypes.DT_BOOLEAN.createAttributeValue(false));
// create primitive attrs
attra = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(a));
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
// predicates passed as function arguments
attrPredicateStringEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_EQUAL));
attrPredicateStringIntersection = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_INTERSECTION));
attrPredicateStringGreaterThan = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_GREATER_THAN));
attrPredicateBooleanFromString = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_BOOLEAN_FROM_STRING));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagawx = new FunctionArgumentBag(bagawx);
FunctionArgumentBag attrBagwx = new FunctionArgumentBag(bagwx);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_ALL_OF_ALL;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_ALL_OF_ALL, fd.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());
// normal match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagwx);
arguments.add(attrBagace);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
Boolean resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// normal no-match
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagawx);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagwx);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertFalse(resValue);
// primitive instead of bag
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attra);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all 2nd argument must be bag, got 'string'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
arguments.clear();
arguments.add(attrPredicateStringEqual);
arguments.add(attrBagace);
arguments.add(attra);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all 3rd argument must be bag, got 'string'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no primitives - predicate expects only 1 arg
arguments.clear();
arguments.add(attrPredicateBooleanFromString);
arguments.add(attrBagStringBooleansTrue);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Predicate error: function:boolean-from-string Expected 1 arguments, got 2",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagace);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagEmpty);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
resValue = (Boolean)res.getValue().getValue();
assertTrue(resValue);
// no bag
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Expected 3 arguments, got 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// non-boolean predicate
arguments.clear();
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Predicate Function must return boolean, but 'urn:oasis:names:tc:xacml:1.0:function:string-intersection' returns 'string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate after first arg
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrPredicateStringIntersection);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all 2nd argument must be bag, got 'anyURI'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagwx);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Predicate error: function:string-greater-than Expected data type 'string' saw 'integer' at arg index 1",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// no args
arguments.clear();
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Expected at least 2 arguments, got 0", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// one arg
arguments.clear();
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Expected at least 2 arguments, got 1", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// too many args
arguments.clear();
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Expected 3 arguments, got 4", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all Expected 3 arguments, got 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringGreaterThan);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:all-of-all 3rd argument must be bag, got 'null'", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
@Test
public void testMap() {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String h = "h";
String j = "j";
Bag bagabcdefg = null;
Bag bagbdfhj = null;
Bag bagace = null;
Bag bagb = null;
Bag bagaaacccef = null;
Bag bagInt = null;
Bag bagStringInt = null;
Bag bagEmpty = null;
Bag bagStringBooleansFalse = null;
Bag bagStringBooleansTrue = null;
Bag bagInt123 = null;
Bag bagInt789 = null;
// primitive attrs
FunctionArgumentAttributeValue attrh = null;
FunctionArgumentAttributeValue attrInt7 = null;
// predicates passed as arguments
FunctionArgumentAttributeValue attrPredicateStringNormalizeToLowerCase = null;
FunctionArgumentAttributeValue attrPredicateIntegerEqual = null;
FunctionArgumentAttributeValue attrPredicateIntegerAdd = null;
try {
// Create Bag contents
bagabcdefg = new Bag();
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(a));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(b));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(c));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(d));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(e));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(f));
bagabcdefg.add(DataTypes.DT_STRING.createAttributeValue(g));
bagbdfhj = new Bag();
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(b));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(d));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(f));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(h));
bagbdfhj.add(DataTypes.DT_STRING.createAttributeValue(j));
bagace = new Bag();
bagace.add(DataTypes.DT_STRING.createAttributeValue("A"));
bagace.add(DataTypes.DT_STRING.createAttributeValue("C"));
bagace.add(DataTypes.DT_STRING.createAttributeValue("E"));
bagb = new Bag();
bagb.add(DataTypes.DT_STRING.createAttributeValue(b));
bagaaacccef = new Bag();
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(a));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(c));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(e));
bagaaacccef.add(DataTypes.DT_STRING.createAttributeValue(f));
bagInt = new Bag();
bagInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagStringInt = new Bag();
bagStringInt.add(DataTypes.DT_STRING.createAttributeValue(a));
bagStringInt.add(DataTypes.DT_INTEGER.createAttributeValue(123));
bagEmpty = new Bag();
bagStringBooleansTrue = new Bag();
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansTrue.add(DataTypes.DT_STRING.createAttributeValue("true"));
bagStringBooleansFalse = new Bag();
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagStringBooleansFalse.add(DataTypes.DT_STRING.createAttributeValue("false"));
bagInt123 = new Bag();
bagInt123.add(DataTypes.DT_INTEGER.createAttributeValue(1));
bagInt123.add(DataTypes.DT_INTEGER.createAttributeValue(2));
bagInt123.add(DataTypes.DT_INTEGER.createAttributeValue(3));
bagInt789 = new Bag();
bagInt789.add(DataTypes.DT_INTEGER.createAttributeValue(7));
bagInt789.add(DataTypes.DT_INTEGER.createAttributeValue(8));
bagInt789.add(DataTypes.DT_INTEGER.createAttributeValue(9));
// create primitive attrs
attrh = new FunctionArgumentAttributeValue(DataTypes.DT_STRING.createAttributeValue(h));
attrInt7 = new FunctionArgumentAttributeValue(DataTypes.DT_INTEGER.createAttributeValue(7));
// predicates passed as function arguments
attrPredicateStringNormalizeToLowerCase = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_STRING_NORMALIZE_TO_LOWER_CASE));
attrPredicateIntegerEqual = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_INTEGER_EQUAL));
attrPredicateIntegerAdd = new FunctionArgumentAttributeValue(
DataTypes.DT_ANYURI
.createAttributeValue(XACML3.ID_FUNCTION_INTEGER_ADD));
} catch (Exception ex) {
fail("creating attribute e=" + ex);
}
// make into attributes
FunctionArgumentBag attrBagabcdefg = new FunctionArgumentBag(bagabcdefg);
FunctionArgumentBag attrBagace = new FunctionArgumentBag(bagace);
FunctionArgumentBag attrBagStringInt = new FunctionArgumentBag(bagStringInt);
FunctionArgumentBag attrBagEmpty = new FunctionArgumentBag(bagEmpty);
FunctionArgumentBag attrBagStringBooleansTrue = new FunctionArgumentBag(bagStringBooleansTrue);
FunctionArgumentBag attrBagInt789 = new FunctionArgumentBag(bagInt789);
FunctionDefinitionHigherOrderBag<?, ?> fd = (FunctionDefinitionHigherOrderBag<?, ?>)StdFunctions.FD_MAP;
// check identity and type of the thing created
assertEquals(XACML3.ID_FUNCTION_MAP, fd.getId());
assertNull(fd.getDataTypeId());
// just to be safe... If tests take too long these can probably be eliminated
assertTrue(fd.returnsBag());
// normal match
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrBagace);
ExpressionResult res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertTrue(res.isBag());
Bag bag = res.getBag();
assertEquals(3, bag.size());
List<AttributeValue<?>> bagAttributes = bag.getAttributeValueList();
try {
assertTrue(bagAttributes.contains(DataTypes.DT_STRING.createAttributeValue("a")));
assertFalse(bagAttributes.contains(DataTypes.DT_STRING.createAttributeValue("A")));
assertTrue(bagAttributes.contains(DataTypes.DT_STRING.createAttributeValue("c")));
assertFalse(bagAttributes.contains(DataTypes.DT_STRING.createAttributeValue("C")));
assertTrue(bagAttributes.contains(DataTypes.DT_STRING.createAttributeValue("e")));
assertFalse(bagAttributes.contains(DataTypes.DT_STRING.createAttributeValue("E")));
} catch (Exception ex) {
fail("checking result e=" + ex);
}
// 2-input predicate
arguments.clear();
arguments.add(attrPredicateIntegerAdd);
arguments.add(attrInt7);
arguments.add(attrBagInt789);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertTrue(res.isBag());
bag = res.getBag();
assertEquals(3, bag.size());
bagAttributes = bag.getAttributeValueList();
try {
assertTrue(bagAttributes.contains(DataTypes.DT_INTEGER.createAttributeValue("14")));
assertTrue(bagAttributes.contains(DataTypes.DT_INTEGER.createAttributeValue("15")));
assertTrue(bagAttributes.contains(DataTypes.DT_INTEGER.createAttributeValue("16")));
} catch (Exception ex) {
fail("checking result e=" + ex);
}
// predicate returns booleans
arguments.clear();
arguments.add(attrPredicateIntegerEqual);
arguments.add(attrInt7);
arguments.add(attrBagInt789);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertTrue(res.isBag());
bag = res.getBag();
assertEquals(3, bag.size());
bagAttributes = bag.getAttributeValueList();
try {
assertEquals(bagAttributes.get(0), (DataTypes.DT_BOOLEAN.createAttributeValue(true)));
assertEquals(bagAttributes.get(1), (DataTypes.DT_BOOLEAN.createAttributeValue(false)));
assertEquals(bagAttributes.get(2), (DataTypes.DT_BOOLEAN.createAttributeValue(false)));
} catch (Exception ex) {
fail("checking result e=" + ex);
}
// predicate returns bag
// no primitives - predicate function expects 2
arguments.clear();
arguments.add(attrPredicateIntegerAdd);
arguments.add(attrBagace);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map Predicate error: function:integer-add Expected 2 arguments, got 1", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bag is empty
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrh);
arguments.add(attrBagEmpty);
res = fd.evaluate(null, arguments);
assertTrue(res.isOk());
assertTrue(res.isBag());
bag = res.getBag();
assertEquals(0, bag.size());
;
// no bag
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrh);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map Did not get any Bag argument; must have at least 1", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// extra bag
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrh);
arguments.add(attrBagStringBooleansTrue);
arguments.add(attrh);
arguments.add(attrBagStringBooleansTrue);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map must have only 1 bag; found one at index 2 and another at 4", res
.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bad predicate
arguments.clear();
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map First argument expected URI, got http://www.w3.org/2001/XMLSchema#string",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate gets unexpected number of args
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map Predicate error: function:string-normalize-to-lower-case Expected 1 arguments, got 2",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// predicate gets bad primitive type
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map Predicate error: function:string-normalize-to-lower-case Expected 1 arguments, got 2",
res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// bags of different types
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrh);
arguments.add(attrBagStringInt);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
// first null
arguments.clear();
arguments.add(null);
arguments.add(attrBagabcdefg);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map Predicate Function (first argument) was null", res.getStatus()
.getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
// second null
arguments.clear();
arguments.add(attrPredicateStringNormalizeToLowerCase);
arguments.add(attrBagabcdefg);
arguments.add(null);
res = fd.evaluate(null, arguments);
assertFalse(res.isOk());
assertEquals("function:map Got null argument at index 2", res.getStatus().getStatusMessage());
assertEquals("urn:oasis:names:tc:xacml:1.0:status:processing-error", res.getStatus().getStatusCode()
.getStatusCodeValue().stringValue());
}
}