/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Portions Copyright 2006 Sun Microsystems, Inc. */ package org.opends.server.schema; import static org.testng.Assert.*; import org.opends.server.api.OrderingMatchingRule; import org.opends.server.core.DirectoryException; import org.opends.server.core.DirectoryServer; import org.opends.server.protocols.asn1.ASN1OctetString; import org.opends.server.types.AcceptRejectWarn; import org.opends.server.types.ByteString; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * Test The Ordering matching rules and the Ordering matching rule api. */ public class OrderingMatchingRuleTest extends SchemaTestCase { @DataProvider(name="Orderingmatchingrules") public Object[][] createOrderingMatchingRuleTest() { return new Object[][] { {"GeneralizedTimeOrderingMatchingRule","20060906135030+0101", "20060906135030+2359", 1}, {"GeneralizedTimeOrderingMatchingRule", "20060912180130Z", "20060912180130Z", 0}, {"GeneralizedTimeOrderingMatchingRule", "20060912180130Z", "20060912180129Z", 1}, {"GeneralizedTimeOrderingMatchingRule", "20060912180129Z", "20060912180130Z", -1}, {"GeneralizedTimeOrderingMatchingRule", "20060912180129.000Z", "20060912180130.001Z", -1}, {"GeneralizedTimeOrderingMatchingRule", "20060912180129.1Z", "20060912180130.2Z", -1}, {"GeneralizedTimeOrderingMatchingRule", "20060912180129.11Z", "20060912180130.12Z", -1}, // following test is currently disabled because it does not work // {"NumericStringOrderingMatchingRule", "1", "09", -1}, // see issue 638 {"NumericStringOrderingMatchingRule", "1", "999999999999999999999", -1}, {"NumericStringOrderingMatchingRule", "1", "9", -1}, {"NumericStringOrderingMatchingRule", "1", " 1 ", 0}, {"NumericStringOrderingMatchingRule", "0", "1", -1}, {"NumericStringOrderingMatchingRule", "1", "0", 1}, {"IntegerOrderingMatchingRule", "1", "0", 1}, {"IntegerOrderingMatchingRule", "1", "1", 0}, {"IntegerOrderingMatchingRule", "45", "54", -1}, {"IntegerOrderingMatchingRule", "-63", "63", -1}, {"IntegerOrderingMatchingRule", "-63", "0", -1}, {"IntegerOrderingMatchingRule", "63", "0", 1}, {"IntegerOrderingMatchingRule", "0", "-63", 1}, {"IntegerOrderingMatchingRule", "987654321987654321987654321", "987654321987654321987654322", -1}, {"UUIDOrderingMatchingRule", "12345678-9ABC-DEF0-1234-1234567890ab", "12345678-9abc-def0-1234-1234567890ab", 0}, {"UUIDOrderingMatchingRule", "12345678-9abc-def0-1234-1234567890ab", "12345678-9abc-def0-1234-1234567890ab", 0}, {"UUIDOrderingMatchingRule", "02345678-9abc-def0-1234-1234567890ab", "12345678-9abc-def0-1234-1234567890ab", -1}, {"UUIDOrderingMatchingRule", "12345678-9abc-def0-1234-1234567890ab", "02345678-9abc-def0-1234-1234567890ab", 1}, {"CaseExactOrderingMatchingRule", "12345678", "02345678", 1}, {"CaseExactOrderingMatchingRule","abcdef", "bcdefa", -1}, {"CaseExactOrderingMatchingRule","abcdef", "abcdef", 0}, {"CaseIgnoreOrderingMatchingRule", "12345678", "02345678", 1}, {"CaseIgnoreOrderingMatchingRule","abcdef", "bcdefa", -1}, {"CaseIgnoreOrderingMatchingRule","abcdef", "abcdef", 0}, {"CaseIgnoreOrderingMatchingRule","abcdef", "ABCDEF", 0}, {"CaseIgnoreOrderingMatchingRule","abcdef", "aCcdef", -1}, {"CaseIgnoreOrderingMatchingRule","aCcdef", "abcdef", 1}, }; } /** * Test the comparison of valid values. */ @Test(dataProvider= "Orderingmatchingrules") public void OrderingMatchingRules(String ruleClassName, String value1, String value2, int result) throws Exception { // load the mathing rule code Class rule = Class.forName("org.opends.server.schema."+ruleClassName); // Make sure that the specified class can be instantiated as a task. OrderingMatchingRule ruleInstance = (OrderingMatchingRule) rule.newInstance(); // we should call initializeMatchingRule but they all seem empty at the // moment. // ruleInstance.initializeMatchingRule(configEntry); ByteString normalizedValue1 = ruleInstance.normalizeValue(new ASN1OctetString(value1)); ByteString normalizedValue2 = ruleInstance.normalizeValue(new ASN1OctetString(value2)); int res = ruleInstance.compareValues(normalizedValue1, normalizedValue2); if (result == 0) { if (res != 0) { fail(ruleClassName + ".compareValues should return 0 for values " + value1 + " and " + value2); } } else if (result > 0) { if (res <= 0) { fail(ruleClassName + ".compareValues should return a positive integer " + "for values : " + value1 + " and " + value2); } } else { if (res >= 0) { fail(ruleClassName + ".compareValues should return a negative integer " + "for values : " + value1 + " and " + value2); } } } @DataProvider(name="OrderingMatchingRuleInvalidValues") public Object[][] createOrderingMatchingRuleInvalidValues() { return new Object[][] { {"GeneralizedTimeOrderingMatchingRule", "20060912180130"}, {"GeneralizedTimeOrderingMatchingRule","2006123123595aZ"}, {"GeneralizedTimeOrderingMatchingRule","200a1231235959Z"}, {"GeneralizedTimeOrderingMatchingRule","2006j231235959Z"}, {"GeneralizedTimeOrderingMatchingRule","20061231#35959Z"}, {"GeneralizedTimeOrderingMatchingRule","20060912180a30Z"}, {"GeneralizedTimeOrderingMatchingRule","20060912180030Z.01"}, {"GeneralizedTimeOrderingMatchingRule","200609121800"}, {"GeneralizedTimeOrderingMatchingRule","20060912180129.hhZ"}, {"GeneralizedTimeOrderingMatchingRule","20060912180129.1hZ"}, {"GeneralizedTimeOrderingMatchingRule","20060906135030+aa01"}, {"GeneralizedTimeOrderingMatchingRule","2006"}, /* disabled because these tests are failing * see issue 675 {"GeneralizedTimeOrderingMatchingRule","20060906135030+3359"}, {"GeneralizedTimeOrderingMatchingRule","20060906135030+2389"}, {"GeneralizedTimeOrderingMatchingRule","20060906135030+2361"},*/ {"GeneralizedTimeOrderingMatchingRule","20060906135030+"}, {"GeneralizedTimeOrderingMatchingRule","20060906135030+0"}, {"GeneralizedTimeOrderingMatchingRule","20060906135030+010"}, {"NumericStringOrderingMatchingRule", "jfhslur"}, {"NumericStringOrderingMatchingRule", "123AB"}, {"IntegerOrderingMatchingRule", " 63 "}, {"IntegerOrderingMatchingRule", "- 63"}, {"IntegerOrderingMatchingRule", "+63"}, {"IntegerOrderingMatchingRule", "AB"}, {"IntegerOrderingMatchingRule", "0xAB"}, {"UUIDOrderingMatchingRule", "G2345678-9abc-def0-1234-1234567890ab"}, {"UUIDOrderingMatchingRule", "g2345678-9abc-def0-1234-1234567890ab"}, {"UUIDOrderingMatchingRule", "12345678/9abc/def0/1234/1234567890ab"}, {"UUIDOrderingMatchingRule", "12345678-9abc-def0-1234-1234567890a"}, }; } /** * Test that invalid values are rejected. */ @Test(dataProvider= "OrderingMatchingRuleInvalidValues") public void OrderingMatchingRulesInvalidValues(String ruleClassName, String value) throws Exception { // load the matching rule code Class rule = Class.forName("org.opends.server.schema."+ruleClassName); // Make sure that the specified class can be instantiated as a task. OrderingMatchingRule ruleInstance = (OrderingMatchingRule) rule.newInstance(); // we should call initializeMatchingRule but they all seem empty at the // moment. // ruleInstance.initializeMatchingRule(configEntry); // normalize the 2 provided values try { ruleInstance.normalizeValue(new ASN1OctetString(value)); } catch (DirectoryException e) { // that's the expected path : the matching rule has detected that // the value is incorrect. return; } // if we get there with false value for success then the tested // matching rule did not raised the Exception. fail(ruleClassName + " did not catch that value " + value + " is invalid."); } /** * Test that invalid values are rejected. */ @Test(dataProvider= "OrderingMatchingRuleInvalidValues") public void OrderingMatchingRulesInvalidValuesWarn(String ruleClassName, String value) throws Exception { // load the matching rule code Class rule = Class.forName("org.opends.server.schema."+ruleClassName); // Make sure that the specified class can be instantiated as a task. OrderingMatchingRule ruleInstance = (OrderingMatchingRule) rule.newInstance(); AcceptRejectWarn accept = DirectoryServer.getSyntaxEnforcementPolicy(); DirectoryServer.setSyntaxEnforcementPolicy(AcceptRejectWarn.WARN); // normalize the 2 provided values try { ruleInstance.normalizeValue(new ASN1OctetString(value)); } catch (Exception e) { fail(ruleClassName + " in warn mode should not reject value " + value + e); return; } finally { DirectoryServer.setSyntaxEnforcementPolicy(accept); } } }