/* * 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 * * * Copyright 2006-2008 Sun Microsystems, Inc. */ package org.opends.server.controls; import java.util.ArrayList; import java.util.List; import org.opends.server.api.MatchingRuleFactory; import org.opends.server.api.MatchingRule; import org.opends.server.core.DirectoryServer; import org.opends.server.schema.BooleanEqualityMatchingRuleFactory; import org.opends.server.schema.DistinguishedNameEqualityMatchingRuleFactory; import org.opends.server.schema.IntegerEqualityMatchingRuleFactory; import org.opends.server.types.*; import org.opends.server.protocols.asn1.ASN1Writer; import org.opends.server.protocols.asn1.ASN1; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; /** * Test MatchedValuesControl */ public class MatchedValuesControlTest extends ControlsTestCase { /** * Check "enum" values */ @Test public void checkFilterValues() throws Exception { assertEquals(MatchedValuesFilter.EQUALITY_MATCH_TYPE, (byte) 0xA3); assertEquals(MatchedValuesFilter.SUBSTRINGS_TYPE ,(byte)0xA4); assertEquals(MatchedValuesFilter.GREATER_OR_EQUAL_TYPE,(byte)0xA5); assertEquals(MatchedValuesFilter.LESS_OR_EQUAL_TYPE,(byte)0xA6); assertEquals(MatchedValuesFilter.PRESENT_TYPE ,(byte)0x87); assertEquals(MatchedValuesFilter.APPROXIMATE_MATCH_TYPE,(byte)0xA8); assertEquals(MatchedValuesFilter.EXTENSIBLE_MATCH_TYPE,(byte)0xA9); } @DataProvider(name = "equalityFilterData") public Object[][] createEqualityFilterData() { return new Object[][] { { "description", "description" }, { "objectclass", "top" }, { "faketype", "fakevalue" }, }; } /** * Test createEqualityFilter */ @Test(dataProvider = "equalityFilterData") public void checkCreateEqualityFilter(String type, String value) throws Exception { MatchedValuesFilter mvf; // // ( String rawAttributeType, ASN1OctetStringrawAssertionValue) // // Check null, null try { mvf = MatchedValuesFilter.createEqualityFilter((String) null, (ByteString) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createEqualityFilter(type, (ByteString) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } mvf = MatchedValuesFilter.createEqualityFilter(type, ByteString.valueOf( value)); assertNotNull(mvf); assertEquals(mvf.getRawAttributeType(), type); assertEquals(mvf.getRawAssertionValue(), ByteString.valueOf(value)); assertEquals(mvf.getMatchType(), MatchedValuesFilter.EQUALITY_MATCH_TYPE); checkEncodeDecode(mvf); // Check null, value try { mvf = MatchedValuesFilter.createEqualityFilter((String) null, ByteString.valueOf(value)); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // // ( AttributeType attributeType, AttributeValue assertionValue // AttributeType attType = DirectoryServer.getAttributeType(type); AttributeValue attVal = null; if (attType != null) { attVal = AttributeValues.create(attType, value); } // Check null, null try { mvf = MatchedValuesFilter.createEqualityFilter((AttributeType) null, (AttributeValue) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createEqualityFilter(attType, (AttributeValue) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, value // As we provide dummy type and value string, attType and attVal // could // be null. if ((attType != null) && (attVal != null)) { mvf = MatchedValuesFilter.createEqualityFilter(attType, attVal); assertNotNull(mvf); assertEquals(mvf.getAttributeType(), attType); assertEquals(mvf.getAssertionValue(), attVal); assertEquals(mvf.getMatchType(), MatchedValuesFilter.EQUALITY_MATCH_TYPE); checkEncodeDecode(mvf); } // Check null, value try { mvf = MatchedValuesFilter.createEqualityFilter((AttributeType) null, attVal); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } } @DataProvider(name = "substringsFilterData") public Object[][] createSubstringsFilterData() { ArrayList<String> l = new ArrayList<String>(3) ; l.add("subAny") ; l.add("o") ; l.add("fakesubAny"); return new Object[][] { { "description", "subInitial" ,l, "subFinal" }, { "objectclass", "t", l,"p" }, { "fakeobjecttype", "fakesubInitial" , l,"fakesubFinal"}, }; } /** * Test createEqualityFilter */ @Test(dataProvider = "substringsFilterData") public void checkCreateSubstringsFilter(String type, String subInitial, List<String> subAny, String subFinal) throws Exception { // input parameter String rawAttTypeTest = type; AttributeType attTypeTest = DirectoryServer.getAttributeType(type); ByteString subInitialTest = ByteString.valueOf(subInitial); List<ByteString> subAnyTest = new ArrayList<ByteString>(subAny.size()); for (String s : subAny) { subAnyTest.add(ByteString.valueOf(s)); } ByteString subFinalTest = ByteString.valueOf(subFinal); // test parameter AttributeType attTypeCurrent; String rawAttTypeTestCurrent; ByteString subInitialTestCurrent; List<ByteString> subAnyTestCurrent; ByteString subFinalTestCurrent; for (int i = 0; i <= 15; i++) { attTypeCurrent = null; rawAttTypeTestCurrent = null; subInitialTestCurrent = null; subAnyTestCurrent = null; subFinalTestCurrent = null; if ((i & 0x8) != 0) attTypeCurrent = attTypeTest; if ((i & 0x8) != 0) rawAttTypeTestCurrent = rawAttTypeTest; if ((i & 0x4) != 0) subInitialTestCurrent = subInitialTest; if ((i & 0x2) != 0) subAnyTestCurrent = subAnyTest; if ((i & 0x1) != 0) subFinalTestCurrent = subFinalTest; if (attTypeCurrent == null) { rawAttTypeTestCurrent = null ; } boolean exceptionExpected = (attTypeCurrent == null); try { MatchedValuesFilter mvf = MatchedValuesFilter.createSubstringsFilter( rawAttTypeTestCurrent, subInitialTestCurrent, subAnyTestCurrent, subFinalTestCurrent); if (exceptionExpected) { assertTrue(false, "Expected NullPointerException"); } assertNotNull(mvf); assertEquals(mvf.getMatchType(), MatchedValuesFilter.SUBSTRINGS_TYPE); assertEquals(rawAttTypeTestCurrent, mvf.getRawAttributeType()); if (subInitialTestCurrent == null) { assertNull(mvf.getSubInitialElement()); } else { assertEquals(subInitialTestCurrent, mvf.getSubInitialElement()); } if (subAnyTestCurrent == null) { assertNull(mvf.getSubAnyElements()); } else { List<ByteString> ret = mvf.getSubAnyElements(); assertNotNull(ret); assertEquals(subAnyTestCurrent.size(), ret.size()); for (ByteString r : ret) { assertTrue(subAnyTestCurrent.contains(r)); } if (subFinalTestCurrent == null) { assertNull(mvf.getSubFinalElement()); } else { assertEquals(subFinalTestCurrent, mvf.getSubFinalElement()); } mvf = MatchedValuesFilter.createSubstringsFilter(attTypeCurrent, subInitialTestCurrent, subAnyTestCurrent, subFinalTestCurrent); assertNotNull(mvf); assertEquals(mvf.getMatchType(), MatchedValuesFilter.SUBSTRINGS_TYPE); assertEquals(attTypeCurrent, mvf.getAttributeType()); if (subInitialTestCurrent == null) { assertNull(mvf.getSubInitialElement()); } else { assertEquals(subInitialTestCurrent, mvf.getSubInitialElement()); } ret = mvf.getSubAnyElements(); assertNotNull(ret); assertEquals(subAnyTestCurrent.size(), ret.size()); for (ByteString r : ret) { assertTrue(subAnyTestCurrent.contains(r)); } if (subFinalTestCurrent == null) { assertNull(mvf.getSubFinalElement()); } else { assertEquals(subFinalTestCurrent, mvf.getSubFinalElement()); } } } catch (Throwable t) { if ( ! exceptionExpected) { assertTrue(false, "Exception not excepted: " + t.getMessage()); } } } } /** * Test GreaterOrEqualFilter */ @Test(dataProvider = "equalityFilterData") public void checkGreaterOrEqualFilter(String type, String value) throws Exception { MatchedValuesFilter mvf; // // ( String rawAttributeType, ASN1OctetStringrawAssertionValue) // // Check null, null try { mvf = MatchedValuesFilter.createGreaterOrEqualFilter((String) null, (ByteString) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createGreaterOrEqualFilter(type, (ByteString) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, value // As we provide dummy type and value string, attType and attVal // could // be null. if ((type != null) && (value != null)) { mvf = MatchedValuesFilter.createGreaterOrEqualFilter(type, ByteString.valueOf(value)); assertNotNull(mvf); assertEquals(mvf.getRawAttributeType(), type); assertEquals(mvf.getRawAssertionValue(), ByteString.valueOf(value)); assertEquals(mvf.getMatchType(), MatchedValuesFilter.GREATER_OR_EQUAL_TYPE); } // Check null, value try { mvf = MatchedValuesFilter.createGreaterOrEqualFilter((String) null, ByteString.valueOf(value)); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // // ( AttributeType attributeType, AttributeValue assertionValue // AttributeType attType = DirectoryServer.getAttributeType(type); AttributeValue attVal = null; if (attType != null) { attVal = AttributeValues.create(attType, value); } // Check null, null try { mvf = MatchedValuesFilter.createGreaterOrEqualFilter( (AttributeType) null, (AttributeValue) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createGreaterOrEqualFilter(attType, (AttributeValue) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, value if ((attType != null) && (attVal != null)) { mvf = MatchedValuesFilter.createGreaterOrEqualFilter(attType, attVal); assertNotNull(mvf); assertEquals(mvf.getAttributeType(), attType); assertEquals(mvf.getAssertionValue(), attVal); assertEquals(mvf.getMatchType(), MatchedValuesFilter.GREATER_OR_EQUAL_TYPE); } // Check null, value try { mvf = MatchedValuesFilter.createGreaterOrEqualFilter( (AttributeType) null, attVal); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } } /** * Test LessOrEqualFilter */ @Test(dataProvider = "equalityFilterData") public void checkLessOrEqualFilter(String type, String value) throws Exception { // // ( String rawAttributeType, ASN1OctetStringrawAssertionValue) // // Check null, null MatchedValuesFilter mvf; try { mvf = MatchedValuesFilter.createLessOrEqualFilter((String) null, (ByteString) null); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createLessOrEqualFilter(type, (ByteString) null); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, value mvf = MatchedValuesFilter.createLessOrEqualFilter(type, ByteString.valueOf(value)); assertNotNull(mvf); assertEquals(mvf.getRawAttributeType(), type); assertEquals(mvf.getRawAssertionValue(), ByteString.valueOf(value)); assertEquals(mvf.getMatchType(), MatchedValuesFilter.LESS_OR_EQUAL_TYPE); // Check null, value try { mvf = MatchedValuesFilter.createLessOrEqualFilter((String) null, ByteString.valueOf(value)); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } ; // // ( AttributeType attributeType, AttributeValue assertionValue // AttributeType attType = DirectoryServer.getAttributeType(type); AttributeValue attVal = null ; if (attType != null) { attVal = AttributeValues.create(attType, value); } // Check null, null try { mvf = MatchedValuesFilter.createLessOrEqualFilter((AttributeType) null, (AttributeValue) null); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createLessOrEqualFilter(attType, (AttributeValue) null); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, value // As we provide dummy type and value string, attType and attVal // could // be null. if ((attType != null) && (attVal != null)) { mvf = MatchedValuesFilter.createLessOrEqualFilter(attType, attVal); assertNotNull(mvf); assertEquals(mvf.getAttributeType(), attType); assertEquals(mvf.getAssertionValue(), attVal); assertEquals(mvf.getMatchType(), MatchedValuesFilter.LESS_OR_EQUAL_TYPE); } // Check null, value try { mvf = MatchedValuesFilter.createLessOrEqualFilter((AttributeType) null, attVal); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } } /** * Test PresentFilter */ @Test(dataProvider = "equalityFilterData") public void checkPresentFilter( String type, String value) throws Exception { // // ( String rawAttributeType) // // Check null MatchedValuesFilter mvf = null; try { mvf = MatchedValuesFilter.createPresentFilter((String) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type mvf = MatchedValuesFilter.createPresentFilter(type); assertNotNull(mvf); assertEquals(mvf.getRawAttributeType(), type); assertEquals(mvf.getMatchType(), MatchedValuesFilter.PRESENT_TYPE); // // ( AttributeType attributeType // AttributeType attType = DirectoryServer.getAttributeType(type); // Check null try { mvf = MatchedValuesFilter.createPresentFilter((AttributeType) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // excepted behavior } catch (AssertionError e) { // excepted behavior } // Check type, if (attType != null) { mvf = MatchedValuesFilter.createPresentFilter(attType); assertNotNull(mvf); assertEquals(mvf.getAttributeType(), attType); assertEquals(mvf.getMatchType(), MatchedValuesFilter.PRESENT_TYPE); } } /** * Test ApproximateFilter */ @Test(dataProvider = "equalityFilterData") public void checkApproximateFilter(String type, String value) throws Exception { MatchedValuesFilter mvf; // // ( String rawAttributeType, ASN1OctetStringrawAssertionValue) // // Check null, null try { mvf = MatchedValuesFilter.createApproximateFilter((String) null, (ByteString) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // expected behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createApproximateFilter(type, (ByteString) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // expected behavior } catch (AssertionError e) { // excepted behavior } // Check type, value mvf = MatchedValuesFilter.createApproximateFilter(type, ByteString.valueOf(value)); assertNotNull(mvf); assertEquals(mvf.getRawAttributeType(), type); assertEquals(mvf.getRawAssertionValue(), ByteString.valueOf(value)); assertEquals(mvf.getMatchType(), MatchedValuesFilter.APPROXIMATE_MATCH_TYPE); // Check null, value try { mvf = MatchedValuesFilter.createApproximateFilter((String) null, ByteString.valueOf(value)); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // expected behavior } catch (AssertionError e) { // excepted behavior } // // ( AttributeType attributeType, AttributeValue assertionValue // AttributeType attType = DirectoryServer.getAttributeType(type); AttributeValue attVal = null ; if (attType != null) { attVal = AttributeValues.create(attType, value); } // Check null, null try { mvf = MatchedValuesFilter.createApproximateFilter((AttributeType) null, (AttributeValue) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // expected behavior } catch (AssertionError e) { // excepted behavior } // Check type, null try { mvf = MatchedValuesFilter.createApproximateFilter(attType, (AttributeValue) null); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // expected behavior } catch (AssertionError e) { // excepted behavior } // Check type, value // As we provide dummy type and value string, attType and attVal could // be null. if ((attType != null) && (attVal != null)) { mvf = MatchedValuesFilter.createApproximateFilter(attType, attVal); assertNotNull(mvf); assertEquals(mvf.getAttributeType(), attType); assertEquals(mvf.getAssertionValue(), attVal); assertEquals(mvf.getMatchType(), MatchedValuesFilter.APPROXIMATE_MATCH_TYPE); } // Check null, value try { mvf = MatchedValuesFilter.createApproximateFilter((AttributeType) null, attVal); assertTrue(false, "Expected NullPointerException"); } catch (NullPointerException e) { // expected behavior } catch (AssertionError e) { // excepted behavior } } @DataProvider(name = "extensibleMatchFilterData") public Object[][] createExtensibleMatchFilterData() throws Exception { MatchingRuleFactory<?> factory = new BooleanEqualityMatchingRuleFactory(); factory.initializeMatchingRule(null); MatchingRule booleanEquality = factory.getMatchingRules().iterator().next(); factory = new IntegerEqualityMatchingRuleFactory(); factory.initializeMatchingRule(null); MatchingRule integerEquality = factory.getMatchingRules().iterator().next(); factory = new DistinguishedNameEqualityMatchingRuleFactory(); factory.initializeMatchingRule(null); MatchingRule distinguishedEquality = factory.getMatchingRules().iterator().next(); return new Object[][] { { "description", booleanEquality, "description" }, { "objectclass", integerEquality ,"top" }, { "fakeobjecttype", distinguishedEquality, "fakevalue" }, }; } /** * Test ExtensibleMatchFilter */ @Test(dataProvider = "extensibleMatchFilterData") public void checkExtensibleMatchFilter( String type, MatchingRule matchingRule, String value) throws Exception { // input value String rawAttTypeTest = type ; AttributeType attTypeTest = DirectoryServer.getAttributeType(type) ; String matchingRuleIdTest = matchingRule.getOID() ; ByteString rawAttValueTest = (attTypeTest == null) ? null : ByteString.valueOf(value); AttributeValue attValueTest = (attTypeTest == null) ? null : AttributeValues.create(attTypeTest, value); // // parameter used for the test. String rawAttTypeTestCurrent; AttributeType attTypeTestCurrent ; String rawMatchingRuleidTestCurrent ; MatchingRule matchingRuleidTestCurrent ; ByteString rawAttValueTestCurrent; AttributeValue attValueTestCurrent; for (int i= 0 ; i <= 7 ; i++) { rawAttTypeTestCurrent = null; rawMatchingRuleidTestCurrent = null; matchingRuleidTestCurrent = null ; rawAttValueTestCurrent = null; attTypeTestCurrent = null; attValueTestCurrent = null ; if ((i & 0x4) != 0) attTypeTestCurrent = attTypeTest; if ((i & 0x4) != 0) rawAttTypeTestCurrent = rawAttTypeTest; if ((i & 0x2) != 0) rawMatchingRuleidTestCurrent = matchingRuleIdTest; if ((i & 0x2) != 0) matchingRuleidTestCurrent = matchingRule ; if ((i & 0x1) != 0) rawAttValueTestCurrent = rawAttValueTest; if ((i & 0x1) != 0) attValueTestCurrent = attValueTest; boolean exceptionExpected = (attTypeTestCurrent == null) || (attValueTestCurrent == null) || (matchingRuleidTestCurrent == null); MatchedValuesFilter mvf = null; try { // Create filter with raw value mvf = MatchedValuesFilter.createExtensibleMatchFilter(rawAttTypeTestCurrent, rawMatchingRuleidTestCurrent, rawAttValueTestCurrent); if ( exceptionExpected) { assertTrue(false, "Expected NullPointerException"); } else { assertNotNull(mvf); assertEquals(mvf.getMatchType(), MatchedValuesFilter.EXTENSIBLE_MATCH_TYPE); assertEquals(rawMatchingRuleidTestCurrent, mvf.getMatchingRuleID()); assertEquals(rawAttValueTestCurrent, mvf.getRawAssertionValue()); mvf = MatchedValuesFilter.createExtensibleMatchFilter( attTypeTestCurrent, matchingRuleidTestCurrent, attValueTestCurrent); assertNotNull(mvf); assertEquals(mvf.getMatchType(), MatchedValuesFilter.EXTENSIBLE_MATCH_TYPE); assertEquals(matchingRuleidTestCurrent, mvf.getMatchingRule()); assertEquals(attValueTestCurrent, mvf.getAssertionValue()); } } catch (Throwable t) { if ( ! exceptionExpected) { assertTrue(false, "Exception not excepted" + t.getMessage()); } } } } /** * Check encode/decode method */ private void checkEncodeDecode(MatchedValuesFilter mvf) { ByteStringBuilder bsb = new ByteStringBuilder(); ASN1Writer writer = ASN1.getWriter(bsb); try { mvf.encode(writer); MatchedValuesFilter newMvf = MatchedValuesFilter.decode(ASN1 .getReader(bsb)); assertEquals(newMvf.toString(), mvf.toString()); } catch (Exception e) { assertTrue(false, "Unexpected LDAPException ; msg=" + e.getMessage()); } } }