/* * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.model.common.expression.script; import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.crypto.ProtectorImpl; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.util.SchemaTestConstants; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; import java.util.Collection; import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; import javax.xml.datatype.DatatypeConstants; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import static org.testng.AssertJUnit.*; /** * @author semancik */ public class TestExpressionFunctions { public static final File TEST_DIR = new File("src/test/resources/expression/functions"); public static final File USER_JACK_FILE = new File(TEST_DIR, "user-jack.xml"); public static final File ACCOUNT_JACK_FILE = new File(TEST_DIR, "account-jack.xml"); public static final File RESOURCE_OPENDJ_FILE = new File(TEST_DIR, "resource-opendj.xml"); private static final String ATTR_FULLNAME_LOCAL_PART = "fullname"; private static final String ATTR_WEAPON_LOCAL_PART = "weapon"; @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @Test public void testGetExtensionPropertyValue() throws Exception { final String TEST_NAME = "testGetExtensionPropertyValue"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<UserType> userJack = PrismTestUtil.parseObject(USER_JACK_FILE); // WHEN String shipExtension = f.getExtensionPropertyValue(userJack.asObjectable(), SchemaTestConstants.EXTENSION_SHIP_ELEMENT); // THEN assertEquals("Wrong value for extension "+SchemaTestConstants.EXTENSION_SHIP_ELEMENT, "Black Pearl", shipExtension); } @Test public void testGetExtensionPropertyValueParts() throws Exception { final String TEST_NAME = "testGetExtensionPropertyValueParts"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<UserType> userJack = PrismTestUtil.parseObject(USER_JACK_FILE); // WHEN String shipExtension = f.getExtensionPropertyValue(userJack.asObjectable(), SchemaTestConstants.EXTENSION_SHIP_ELEMENT.getNamespaceURI(), SchemaTestConstants.EXTENSION_SHIP_ELEMENT.getLocalPart()); // THEN assertEquals("Wrong value for extension "+SchemaTestConstants.EXTENSION_SHIP_ELEMENT, "Black Pearl", shipExtension); } @Test public void testGetExtensionPropertyValueNotPresent() throws Exception { final String TEST_NAME = "testGetExtensionPropertyValueNotPresent"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<UserType> userJack = PrismTestUtil.parseObject(USER_JACK_FILE); // WHEN String extensionVal = f.getExtensionPropertyValue(userJack.asObjectable(), new QName(SchemaTestConstants.NS_EXTENSION, "kajdsfhklfdsjh")); // THEN assertNull("Unexpected value for extension "+SchemaTestConstants.EXTENSION_SHIP_ELEMENT+": "+extensionVal, extensionVal); } @Test public void testGetExtensionPropertyValueNullObject() throws Exception { final String TEST_NAME = "testGetExtensionPropertyValueNullObject"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); // WHEN String shipExtension = f.getExtensionPropertyValue(null, SchemaTestConstants.EXTENSION_SHIP_ELEMENT); // THEN assertNull("Unexpected value for extension "+SchemaTestConstants.EXTENSION_SHIP_ELEMENT+": "+shipExtension, shipExtension); } @Test public void testGetAttributeValueParts() throws Exception { final String TEST_NAME = "testGetAttributeValueParts"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<ShadowType> accountJack = PrismTestUtil.parseObject(ACCOUNT_JACK_FILE); // WHEN String attrVal = f.getAttributeValue(accountJack.asObjectable(), MidPointConstants.NS_RI, ATTR_FULLNAME_LOCAL_PART); // THEN assertEquals("Wrong value for attribute "+ATTR_FULLNAME_LOCAL_PART, "Jack Sparrow", attrVal); } @Test public void testGetAttributeValueDefaultRi() throws Exception { final String TEST_NAME = "testGetAttributeValueDefaultRi"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<ShadowType> accountJack = PrismTestUtil.parseObject(ACCOUNT_JACK_FILE); // WHEN String attrVal = f.getAttributeValue(accountJack.asObjectable(), ATTR_FULLNAME_LOCAL_PART); // THEN assertEquals("Wrong value for attribute "+ATTR_FULLNAME_LOCAL_PART, "Jack Sparrow", attrVal); } @Test public void testGetAttributeValuesParts() throws Exception { final String TEST_NAME = "testGetAttributeValuesParts"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<ShadowType> accountJack = PrismTestUtil.parseObject(ACCOUNT_JACK_FILE); // WHEN Collection<String> attrVals = f.getAttributeValues(accountJack.asObjectable(), MidPointConstants.NS_RI, ATTR_WEAPON_LOCAL_PART); // THEN TestUtil.assertSetEquals("Wrong value for attribute "+ATTR_WEAPON_LOCAL_PART, attrVals, "rum", "smell"); } @Test public void testGetAttributeValuesDefaultRi() throws Exception { final String TEST_NAME = "testGetAttributeValuesDefaultRi"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<ShadowType> accountJack = PrismTestUtil.parseObject(ACCOUNT_JACK_FILE); // WHEN Collection<String> attrVals = f.getAttributeValues(accountJack.asObjectable(), ATTR_WEAPON_LOCAL_PART); // THEN TestUtil.assertSetEquals("Wrong value for attribute "+ATTR_WEAPON_LOCAL_PART, attrVals, "rum", "smell"); } @Test public void testgetResourceIcfConfigurationPropertyValueStringHost() throws Exception { final String TEST_NAME = "testgetResourceIcfConfigurationPropertyValueStringHost"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<ResourceType> resource = PrismTestUtil.parseObject(RESOURCE_OPENDJ_FILE); // WHEN String val = f.getResourceIcfConfigurationPropertyValue(resource.asObjectable(), "host"); // THEN assertEquals("Wrong value of ICF configuration property", "localhost", val); } @Test public void testgetResourceIcfConfigurationPropertyValueStringPort() throws Exception { final String TEST_NAME = "testgetResourceIcfConfigurationPropertyValueStringPort"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); PrismObject<ResourceType> resource = PrismTestUtil.parseObject(RESOURCE_OPENDJ_FILE); // WHEN int val = f.getResourceIcfConfigurationPropertyValue(resource.asObjectable(), "port"); // THEN assertEquals("Wrong value of ICF configuration property", 10389, val); } @Test public void testDetermineLdapSingleAttributeValue01() throws Exception { final String TEST_NAME = "testDetermineLdapSingleAttributeValue01"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); String dn = "uid=foo, ou=People, dc=example,dc=com"; String attributeName = "uid"; Collection<String> values = MiscUtil.createCollection("bar", "foo", "FooBAR"); // WHEN String resultValue = f.determineLdapSingleAttributeValue(dn, attributeName, values); // THEN assertNotNull("Result value is null", resultValue); System.out.println("Resulting value: "+resultValue); assertEquals("Wrong result value", "foo", resultValue); } @Test public void testDetermineLdapSingleAttributeValue02() throws Exception { System.out.println("\n===[ testDetermineLdapSingleAttributeValue02 ]===\n"); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); String dn = "cn=jack+uid=FooBAR, ou=People, dc=example,dc=com"; String attributeName = "uid"; Collection<String> values = MiscUtil.createCollection("bar", "foo", "FooBAR"); // WHEN String resultValue = f.determineLdapSingleAttributeValue(dn, attributeName, values); // THEN assertNotNull("Result value is null", resultValue); System.out.println("Resulting value: "+resultValue); assertEquals("Wrong result value", "FooBAR", resultValue); } /** * Single value is always returned regardless of DN */ @Test public void testDetermineLdapSingleAttributeValueSingle() throws Exception { System.out.println("\n===[ testDetermineLdapSingleAttributeValueSingle ]===\n"); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); String dn = "cn=jack+uid=FooBar, ou=People, dc=example,dc=com"; String attributeName = "uid"; Collection<String> values = MiscUtil.createCollection("heh"); // WHEN String resultValue = f.determineLdapSingleAttributeValue(dn, attributeName, values); // THEN assertNotNull("Result value is null", resultValue); System.out.println("Resulting value: "+resultValue); assertEquals("Wrong result value", "heh", resultValue); } @Test public void testDetermineLdapSingleAttributeValueNull() throws Exception { System.out.println("\n===[ testDetermineLdapSingleAttributeValueNull ]===\n"); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); String dn = "cn=jack+uid=FooBar, ou=People, dc=example,dc=com"; String attributeName = "uid"; Collection<String> values = MiscUtil.createCollection("heh"); // WHEN String resultValue = f.determineLdapSingleAttributeValue(dn, attributeName, null); // THEN System.out.println("Resulting value: "+resultValue); assertNull("Result value is not null", resultValue); } @Test public void testDetermineLdapSingleAttributeValueFallback() throws Exception { System.out.println("\n===[ testDetermineLdapSingleAttributeValueFallback ]===\n"); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); String dn = "cn=jack, ou=People, dc=example,dc=com"; String attributeName = "uid"; Collection<String> values = MiscUtil.createCollection("foo", "bar", "foobar"); // WHEN String resultValue = f.determineLdapSingleAttributeValue(dn, attributeName, values); // THEN assertNotNull("Result value is null", resultValue); System.out.println("Resulting value: "+resultValue); assertEquals("Wrong result value", "bar", resultValue); } @Test public void testFormatDateTime() throws Exception { System.out.println("\n===[ testFormatDateTime ]===\n"); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); XMLGregorianCalendar xmlCal = XmlTypeConverter.createXMLGregorianCalendar(1975, 5, 30, 22, 30, 0, 0, DatatypeConstants.FIELD_UNDEFINED); // don't use GMT (offset 0) because serialized value is then in local time // WHEN String resultValue = f.formatDateTime("yyyy MM dd HH:mm:ss.SSS", xmlCal); // don't include timezone in the format string, it is hard to check then // THEN assertNotNull("Result value is null", resultValue); System.out.println("Resulting value: "+resultValue); assertEquals("Wrong result value", "1975 05 30 22:30:00.000", resultValue); } @Test public void testParseDateTime() throws Exception { final String TEST_NAME = "testParseDateTime"; TestUtil.displayTestTile(TEST_NAME); // GIVEN BasicExpressionFunctions f = createBasicFunctions(); // WHEN XMLGregorianCalendar resultValue = f.parseDateTime("yyyy MM dd HH:mm:ss.SSS zzzz", "1975 05 30 22:30:00.000 Central European Time"); // THEN assertNotNull("Result value is null", resultValue); System.out.println("Resulting value: "+resultValue); XMLGregorianCalendar xmlCal = XmlTypeConverter.createXMLGregorianCalendar(1975, 5, 30, 21, 30, 0); assertEquals("Wrong result value", xmlCal, resultValue); } private BasicExpressionFunctions createBasicFunctions() throws SchemaException, SAXException, IOException { PrismContext prismContext = PrismTestUtil.createInitializedPrismContext(); Protector protector = new ProtectorImpl(); return new BasicExpressionFunctions(prismContext, protector); } @Test public void testStringify() throws Exception { final String TEST_NAME = "testStringifyString"; TestUtil.displayTestTile(TEST_NAME); BasicExpressionFunctions basic = createBasicFunctions(); assertEquals("foo", basic.stringify("foo")); assertEquals("foo", basic.stringify(poly("foo"))); assertEquals("foo", basic.stringify(PrismTestUtil.createPolyStringType("foo"))); assertEquals("42", basic.stringify(42)); assertEquals("", basic.stringify(null)); assertEquals("", basic.stringify("")); } @Test public void testConcatName() throws Exception { final String TEST_NAME = "testConcatName"; TestUtil.displayTestTile(TEST_NAME); BasicExpressionFunctions basic = createBasicFunctions(); assertEquals("foo bar", basic.concatName("foo","bar")); assertEquals("foo bar", basic.concatName(poly("foo"),"bar")); assertEquals("foo bar", basic.concatName("foo",poly("bar"))); assertEquals("foo", basic.concatName("foo","")); assertEquals("foo", basic.concatName("foo",null)); assertEquals("foo bar", basic.concatName("foo",null,"bar")); assertEquals("foo bar", basic.concatName("foo","","bar")); assertEquals("foo bar", basic.concatName("foo ","bar")); assertEquals("foo bar", basic.concatName("foo"," bar")); assertEquals("foo bar", basic.concatName(" foo "," bar ")); assertEquals("foo bar", basic.concatName(" foo ",null," bar ")); assertEquals("foo bar", basic.concatName(" foo "," "," bar ")); } private PolyString poly(String s) { return PrismTestUtil.createPolyString(s); } @Test public void testToAscii() throws Exception { final String TEST_NAME = "testToAscii"; TestUtil.displayTestTile(TEST_NAME); BasicExpressionFunctions basic = createBasicFunctions(); assertEquals("foo", basic.toAscii("foo")); assertEquals("foo", basic.toAscii(poly("foo"))); assertEquals("foo", basic.toAscii(PrismTestUtil.createPolyStringType("foo"))); assertEquals("Cortuv hrad, tam Strasa!", basic.toAscii("Čórtův hrád, tam Strašá!")); assertEquals("hrabe Teleke z Toloko", basic.toAscii(poly("hrabě Teleke z Tölökö"))); assertEquals("Vedeckotechnicka revoluce neni zadna idyla!", basic.toAscii(PrismTestUtil.createPolyStringType("Vědeckotechnická revoluce není žádná idyla!"))); assertEquals(null, basic.toAscii(null)); assertEquals("", basic.toAscii("")); } @Test public void testComposeDn() throws Exception { final String TEST_NAME = "testComposeDn"; TestUtil.displayTestTile(TEST_NAME); BasicExpressionFunctions basic = createBasicFunctions(); assertEquals("cn=foo,o=bar", basic.composeDn("cn","foo","o","bar")); assertEquals("cn=foo,o=bar", basic.composeDn("cn",PrismTestUtil.createPolyString("foo"),"o","bar")); assertEquals("cn=foo,o=bar", basic.composeDn("cn",PrismTestUtil.createPolyStringType("foo"),"o","bar")); assertEquals("cn=foo,o=bar", basic.composeDn("cn","foo",new Rdn("o","bar"))); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDn(new Rdn("cn","foo"),"ou","baz",new Rdn("o","bar"))); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDn(new Rdn("cn","foo"),"ou","baz","o","bar")); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDn(new Rdn("cn","foo"),new LdapName("ou=baz,o=bar"))); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDn("cn","foo",new LdapName("ou=baz,o=bar"))); assertEquals("cn=foo\\,foo,ou=baz,o=bar", basic.composeDn("cn","foo,foo",new LdapName("ou=baz,o=bar"))); assertEquals("cn=foo\\=foo,ou=baz,o=bar", basic.composeDn("cn","foo=foo",new LdapName("ou=baz,o=bar"))); assertEquals(null, basic.composeDn(null)); assertEquals(null, basic.composeDn()); assertEquals(null, basic.composeDn("")); assertEquals(null, basic.composeDn(" ")); } @Test public void testComposeDnWithSuffix() throws Exception { final String TEST_NAME = "testComposeDnWithSuffix"; TestUtil.displayTestTile(TEST_NAME); BasicExpressionFunctions basic = createBasicFunctions(); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDnWithSuffix(new Rdn("cn","foo"),"ou=baz,o=bar")); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDnWithSuffix(new Rdn("cn","foo"),new LdapName("ou=baz,o=bar"))); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn","foo","ou=baz,o=bar")); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn",PrismTestUtil.createPolyString("foo"),"ou=baz,o=bar")); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn",PrismTestUtil.createPolyStringType("foo"),"ou=baz,o=bar")); assertEquals("cn=foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn","foo",new LdapName("ou=baz,o=bar"))); assertEquals("cn=foo,ou=baz\\,baz,o=bar", basic.composeDnWithSuffix("cn","foo","ou=baz\\,baz,o=bar")); assertEquals("cn=foo,ou=baz\\,baz,o=bar", basic.composeDnWithSuffix("cn","foo",new LdapName("ou=baz\\,baz,o=bar"))); assertEquals("cn=foo\\,foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn","foo,foo","ou=baz,o=bar")); assertEquals("cn=foo\\,foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn","foo,foo",new LdapName("ou=baz,o=bar"))); assertEquals("cn=foo\\=foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn","foo=foo","ou=baz,o=bar")); assertEquals("cn=foo\\=foo,ou=baz,o=bar", basic.composeDnWithSuffix("cn","foo=foo",new LdapName("ou=baz,o=bar"))); assertEquals("ou=baz,o=bar", basic.composeDnWithSuffix("ou=baz,o=bar")); assertEquals("ou=baz, o=bar", basic.composeDnWithSuffix("ou=baz, o=bar")); assertEquals("OU=baz, o=bar", basic.composeDnWithSuffix("OU=baz, o=bar")); assertEquals("ou=baz,o=bar", basic.composeDnWithSuffix(new LdapName("ou=baz,o=bar"))); assertEquals(null, basic.composeDnWithSuffix(null)); assertEquals(null, basic.composeDnWithSuffix()); assertEquals(null, basic.composeDnWithSuffix("")); assertEquals(null, basic.composeDnWithSuffix(" ")); } @Test public void testParseFullName() throws Exception { final String TEST_NAME = "testParseFullName"; TestUtil.displayTestTile(TEST_NAME); BasicExpressionFunctions basic = createBasicFunctions(); assertEquals(null, basic.parseGivenName(null)); assertEquals(null, basic.parseGivenName(" ")); assertEquals("Jack", basic.parseGivenName("Jack Sparrow")); assertEquals("Jack", basic.parseGivenName(" Jack Sparrow ")); assertEquals("Jack", basic.parseGivenName(new PolyString("Jack Sparrow"))); assertEquals("Sparrow", basic.parseFamilyName("Jack Sparrow")); assertEquals("Sparrow", basic.parseFamilyName(" Jack Sparrow ")); assertEquals("Tim", basic.parseGivenName("Tim Berners-Lee")); assertEquals("Berners-Lee", basic.parseFamilyName("Tim Berners-Lee")); assertEquals("Cassius", basic.parseGivenName("Cassius Marcellus \"Muhammad Ali\" Clay, Jr.")); assertEquals("Marcellus", basic.parseAdditionalName("Cassius Marcellus \"Muhammad Ali\" Clay, Jr.")); assertEquals("Clay", basic.parseFamilyName("Cassius Marcellus \"Muhammad Ali\" Clay, Jr.")); assertEquals("Muhammad Ali", basic.parseNickName("Cassius Marcellus \"Muhammad Ali\" Clay, Jr.")); assertEquals("Jr.", basic.parseHonorificSuffix("Cassius Marcellus \"Muhammad Ali\" Clay, Jr.")); assertEquals("Radovan", basic.parseGivenName("Ing. Radovan Semančík, PhD.")); assertEquals("Semančík", basic.parseFamilyName("Ing. Radovan Semančík, PhD.")); assertEquals("Ing.", basic.parseHonorificPrefix("Ing. Radovan Semančík, PhD.")); assertEquals("PhD.", basic.parseHonorificSuffix("Ing. Radovan Semančík, PhD.")); } }