| /* |
| * 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.directory.shared.ldap.name; |
| |
| |
| import javax.naming.InvalidNameException; |
| import javax.naming.NamingException; |
| import javax.naming.directory.Attribute; |
| import javax.naming.directory.Attributes; |
| |
| import junit.framework.Assert; |
| import junit.framework.TestCase; |
| |
| import org.apache.directory.shared.ldap.name.Rdn; |
| import org.apache.directory.shared.ldap.name.RdnParser; |
| import org.apache.directory.shared.ldap.util.StringTools; |
| |
| |
| /** |
| * Test the class Rdn |
| * |
| * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> |
| */ |
| public class RdnTest extends TestCase |
| { |
| // ~ Methods |
| // ------------------------------------------------------------------------------------ |
| /** |
| * Test a null RDN |
| */ |
| public void testRdnNull() |
| { |
| Assert.assertEquals( "", new Rdn().toString() ); |
| } |
| |
| |
| /** |
| * test an empty RDN |
| */ |
| public void testRdnEmpty() throws InvalidNameException |
| { |
| Assert.assertEquals( "", new Rdn( "" ).toString() ); |
| } |
| |
| |
| /** |
| * test a simple RDN : a = b |
| */ |
| public void testRdnSimple() throws InvalidNameException |
| { |
| Assert.assertEquals( "a=b", new Rdn( "a = b" ).toString() ); |
| } |
| |
| |
| /** |
| * test a composite RDN : a = b, d = e |
| */ |
| public void testRdnComposite() throws InvalidNameException |
| { |
| Assert.assertEquals( "a=b+c=d", new Rdn( "a = b + c = d" ).toString() ); |
| } |
| |
| |
| /** |
| * test a composite RDN with or without spaces: a=b, a =b, a= b, a = b, a = |
| * b |
| */ |
| public void testRdnCompositeWithSpace() throws InvalidNameException |
| { |
| Assert.assertEquals( "a=b", new Rdn( "a=b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a=b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a =b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a= b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a=b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a =b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a= b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a=b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a = b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a =b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a= b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a = b" ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a =b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a= b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( "a = b " ).toString() ); |
| Assert.assertEquals( "a=b", new Rdn( " a = b " ).toString() ); |
| } |
| |
| |
| /** |
| * test a simple RDN with differents separators : a = b + c = d |
| */ |
| public void testRdnSimpleMultivaluedAttribute() throws InvalidNameException |
| { |
| String result = new Rdn( "a = b + c = d" ).toString(); |
| Assert.assertEquals( "a=b+c=d", result ); |
| } |
| |
| |
| /** |
| * test a composite RDN with differents separators : a=b+c=d, e=f + g=h + |
| * i=j |
| */ |
| public void testRdnCompositeMultivaluedAttribute() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( "a =b+c=d + e=f + g =h + i =j " ); |
| |
| // NameComponent are not ordered |
| Assert.assertEquals( "b", rdn.getValue( "a" ) ); |
| Assert.assertEquals( "d", rdn.getValue( "c" ) ); |
| Assert.assertEquals( "f", rdn.getValue( " E " ) ); |
| Assert.assertEquals( "h", rdn.getValue( "g" ) ); |
| Assert.assertEquals( "j", rdn.getValue( "i" ) ); |
| } |
| |
| |
| /** |
| * test a simple RDN with an oid prefix (uppercase) : OID.12.34.56 = azerty |
| */ |
| public void testRdnOidUpper() throws InvalidNameException |
| { |
| Assert.assertEquals( "oid.12.34.56=azerty", new Rdn( "OID.12.34.56 = azerty" ).toString() ); |
| } |
| |
| |
| /** |
| * test a simple RDN with an oid prefix (lowercase) : oid.12.34.56 = azerty |
| */ |
| public void testRdnOidLower() throws InvalidNameException |
| { |
| Assert.assertEquals( "oid.12.34.56=azerty", new Rdn( "oid.12.34.56 = azerty" ).toString() ); |
| } |
| |
| |
| /** |
| * test a simple RDN with an oid attribut wiithout oid prefix : 12.34.56 = |
| * azerty |
| */ |
| public void testRdnOidWithoutPrefix() throws InvalidNameException |
| { |
| Assert.assertEquals( "12.34.56=azerty", new Rdn( "12.34.56 = azerty" ).toString() ); |
| } |
| |
| |
| /** |
| * test a composite RDN with an oid attribut wiithout oid prefix : 12.34.56 = |
| * azerty; 7.8 = test |
| */ |
| public void testRdnCompositeOidWithoutPrefix() throws InvalidNameException |
| { |
| String result = new Rdn( "12.34.56 = azerty + 7.8 = test" ).toString(); |
| Assert.assertEquals( "12.34.56=azerty+7.8=test", result ); |
| } |
| |
| |
| /** |
| * test a simple RDN with pair char attribute value : a = \,\=\+\<\>\#\;\\\"\C3\A9" |
| */ |
| public void testRdnPairCharAttributeValue() throws InvalidNameException |
| { |
| String rdn = StringTools.utf8ToString( new byte[]{'a', '=', '\\', ',', '=', '\\', '+', '\\', '<', |
| '\\', '>', '#', '\\', ';', '\\', '\\', '\\', '"', '\\', 'C', '3', '\\', 'A', '9' }); |
| Assert.assertEquals( rdn, new Rdn( |
| "a = \\,=\\+\\<\\>#\\;\\\\\\\"\\C3\\A9" ).toString() ); |
| } |
| |
| |
| /** |
| * test a simple RDN with hexString attribute value : a = #0010A0AAFF |
| */ |
| public void testRdnHexStringAttributeValue() throws InvalidNameException |
| { |
| Assert.assertEquals( "a=#0010A0AAFF", new Rdn( "a = #0010A0AAFF" ).toString() ); |
| } |
| |
| |
| /** |
| * test a simple RDN with quoted attribute value : a = "quoted \"value" |
| */ |
| public void testRdnQuotedAttributeValue() throws InvalidNameException |
| { |
| Assert.assertEquals( "a=quoted \\\"value", new Rdn( "a = quoted \\\"value" ).toString() ); |
| } |
| |
| |
| /** |
| * Test the clone method for a RDN. |
| */ |
| public void testRDNCloningOneNameComponent() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( "a", "b" ); |
| |
| Rdn rdnClone = ( Rdn ) rdn.clone(); |
| |
| RdnParser.parse( "c=d", rdn ); |
| |
| Assert.assertEquals( "b", rdnClone.getValue( "a" ) ); |
| } |
| |
| |
| /** |
| * Test the clone method for a RDN. |
| */ |
| public void testRDNCloningTwoNameComponent() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( "a = b + aa = bb" ); |
| |
| Rdn rdnClone = ( Rdn ) rdn.clone(); |
| |
| rdn.clear(); |
| RdnParser.parse( "c=d", rdn ); |
| |
| Assert.assertEquals( "b", rdnClone.getValue( "a" ) ); |
| Assert.assertEquals( "bb", rdnClone.getValue( "aa" ) ); |
| Assert.assertEquals( "", rdnClone.getValue( "c" ) ); |
| } |
| |
| |
| /** |
| * Test the compareTo method for a RDN. |
| */ |
| public void testRDNCompareToNull() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b + c = d + a = f + g = h " ); |
| Rdn rdn2 = null; |
| Assert.assertEquals( 1, rdn1.compareTo( rdn2 ) ); |
| } |
| |
| |
| /** |
| * Compares a composite NC to a single NC. |
| */ |
| public void testRDNCompareToNCS2NC() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b + c = d + a = f + g = h " ); |
| Rdn rdn2 = new Rdn( " a = b " ); |
| Assert.assertTrue( rdn1.compareTo( rdn2 ) > 0 ); |
| } |
| |
| |
| /** |
| * Compares a single NC to a composite NC. |
| */ |
| public void testRDNCompareToNC2NCS() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b " ); |
| Rdn rdn2 = new Rdn( " a = b + c = d + a = f + g = h " ); |
| |
| Assert.assertTrue( rdn1.compareTo( rdn2 ) < 0 ); |
| } |
| |
| |
| /** |
| * Compares a composite NCS to a composite NCS in the same order. |
| */ |
| public void testRDNCompareToNCS2NCSOrdered() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b + c = d + a = f + g = h " ); |
| Rdn rdn2 = new Rdn( " a = b + c = d + a = f + g = h " ); |
| |
| Assert.assertEquals( 0, rdn1.compareTo( rdn2 ) ); |
| } |
| |
| |
| /** |
| * Compares a composite NCS to a composite NCS in a different order. |
| */ |
| public void testRDNCompareToNCS2NCSUnordered() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b + a = f + g = h + c = d " ); |
| Rdn rdn2 = new Rdn( " a = b + c = d + a = f + g = h " ); |
| |
| Assert.assertEquals( 0, rdn1.compareTo( rdn2 ) ); |
| } |
| |
| |
| /** |
| * Compares a composite NCS to a different composite NCS. |
| */ |
| public void testRDNCompareToNCS2NCSNotEquals() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = f + g = h + c = d " ); |
| Rdn rdn2 = new Rdn( " c = d + a = h + g = h " ); |
| |
| Assert.assertEquals( -1, rdn1.compareTo( rdn2 ) ); |
| } |
| |
| |
| /** |
| * Compares with a null RDN. |
| */ |
| public void testRDNCompareToNullRdn() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b " ); |
| |
| Assert.assertEquals( 1, rdn1.compareTo( null ) ); |
| } |
| |
| /** |
| * Compares with a bad object |
| */ |
| public void testRDNCompareToBadObject() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b " ); |
| |
| Assert.assertEquals( Rdn.UNDEFINED, rdn1.compareTo( "test" ) ); |
| } |
| |
| /** |
| * Compares a simple NC to a simple NC. |
| */ |
| public void testRDNCompareToNC2NC() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b " ); |
| Rdn rdn2 = new Rdn( " a = b " ); |
| |
| Assert.assertEquals( 0, rdn1.compareTo( rdn2 ) ); |
| } |
| |
| |
| /** |
| * Compares a simple NC to a simple NC in UperCase. |
| */ |
| public void testRDNCompareToNC2NCUperCase() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b " ); |
| Rdn rdn2 = new Rdn( " A = b " ); |
| |
| Assert.assertEquals( 0, rdn1.compareTo( rdn2 ) ); |
| Assert.assertEquals( true, rdn1.equals( rdn2 ) ); |
| } |
| |
| |
| /** |
| * Compares a simple NC to a different simple NC. |
| */ |
| public void testRDNCompareToNC2NCNotEquals() throws InvalidNameException |
| { |
| Rdn rdn1 = new Rdn( " a = b " ); |
| Rdn rdn2 = new Rdn( " A = d " ); |
| |
| Assert.assertTrue( rdn1.compareTo( rdn2 ) < 0 ); |
| } |
| |
| |
| public void testToAttributes() throws InvalidNameException, NamingException |
| { |
| Rdn rdn = new Rdn( " a = b + a = f + g = h + c = d " ); |
| |
| Attributes attributes = rdn.toAttributes(); |
| |
| Assert.assertNotNull( attributes.get( "a" ) ); |
| Assert.assertNotNull( attributes.get( "g" ) ); |
| Assert.assertNotNull( attributes.get( "c" ) ); |
| |
| Attribute attribute = attributes.get( "a" ); |
| |
| Assert.assertNotNull( attribute.get( 0 ) ); |
| Assert.assertEquals( "b", attribute.get( 0 ) ); |
| |
| Assert.assertNotNull( attribute.get( 1 ) ); |
| Assert.assertEquals( "f", attribute.get( 1 ) ); |
| |
| attribute = attributes.get( "g" ); |
| Assert.assertNotNull( attribute.get( 0 ) ); |
| Assert.assertEquals( "h", attribute.get( 0 ) ); |
| |
| attribute = attributes.get( "c" ); |
| Assert.assertNotNull( attribute.get( 0 ) ); |
| Assert.assertEquals( "d", attribute.get( 0 ) ); |
| } |
| |
| |
| public void testGetValue() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( " a = b + a = f + g = h + c = d " ); |
| |
| Assert.assertEquals( "b", rdn.getValue() ); |
| } |
| |
| |
| public void testGetType() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( " a = b + a = f + g = h + c = d " ); |
| |
| Assert.assertEquals( "a", rdn.getNormType() ); |
| } |
| |
| |
| public void testGetSize() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( " a = b + a = f + g = h + c = d " ); |
| |
| Assert.assertEquals( 4, rdn.size() ); |
| } |
| |
| |
| public void testGetSize0() |
| { |
| Rdn rdn = new Rdn(); |
| |
| Assert.assertEquals( 0, rdn.size() ); |
| } |
| |
| |
| public void testEquals() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( "a=b + c=d + a=f" ); |
| |
| Assert.assertFalse( rdn.equals( null ) ); |
| Assert.assertFalse( rdn.equals( "test" ) ); |
| Assert.assertFalse( rdn.equals( new Rdn( "a=c + c=d + a=f" ) ) ); |
| Assert.assertFalse( rdn.equals( new Rdn( "a=b" ) ) ); |
| Assert.assertTrue( rdn.equals( new Rdn( "a=b + c=d + a=f" ) ) ); |
| Assert.assertTrue( rdn.equals( new Rdn( "a=b + C=d + A=f" ) ) ); |
| Assert.assertTrue( rdn.equals( new Rdn( "c=d + a=f + a=b" ) ) ); |
| } |
| |
| |
| public void testUnescapeValueHexa() |
| { |
| byte[] res = ( byte[] ) Rdn.unescapeValue( "#fF" ); |
| |
| Assert.assertEquals( "0xFF ", StringTools.dumpBytes( res ) ); |
| |
| res = ( byte[] ) Rdn.unescapeValue( "#0123456789aBCDEF" ); |
| Assert.assertEquals( "0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF ", StringTools.dumpBytes( res ) ); |
| } |
| |
| |
| public void testUnescapeValueHexaWrong() |
| { |
| try |
| { |
| Rdn.unescapeValue( "#fF1" ); |
| Assert.fail(); // Should not happen |
| } |
| catch ( IllegalArgumentException iae ) |
| { |
| Assert.assertTrue( true ); |
| } |
| } |
| |
| |
| public void testUnescapeValueString() |
| { |
| String res = ( String ) Rdn.unescapeValue( "azerty" ); |
| |
| Assert.assertEquals( "azerty", res ); |
| } |
| |
| |
| public void testUnescapeValueStringSpecial() |
| { |
| String res = ( String ) Rdn.unescapeValue( "\\\\\\#\\,\\+\\;\\<\\>\\=\\\"\\ " ); |
| |
| Assert.assertEquals( "\\#,+;<>=\" ", res ); |
| } |
| |
| |
| public void testEscapeValueString() |
| { |
| String res = Rdn.escapeValue( StringTools.getBytesUtf8( "azerty" ) ); |
| |
| Assert.assertEquals( "azerty", res ); |
| } |
| |
| |
| public void testEscapeValueStringSpecial() |
| { |
| String res = Rdn.escapeValue( StringTools.getBytesUtf8( "\\#,+;<>=\" " ) ); |
| |
| Assert.assertEquals( "\\\\\\#\\,\\+\\;\\<\\>\\=\\\"\\ ", res ); |
| } |
| |
| |
| public void testEscapeValueNumeric() |
| { |
| String res = Rdn.escapeValue( new byte[] |
| { '-', 0x00, '-', 0x1F, '-', 0x7F, '-' } ); |
| |
| Assert.assertEquals( "-\\00-\\1F-\\7F-", res ); |
| } |
| |
| |
| public void testEscapeValueMix() |
| { |
| String res = Rdn.escapeValue( new byte[] |
| { '\\', 0x00, '-', '+', '#', 0x7F, '-' } ); |
| |
| Assert.assertEquals( "\\\\\\00-\\+\\#\\7F-", res ); |
| } |
| |
| public void testDIRSERVER_703() throws InvalidNameException |
| { |
| Rdn rdn = new Rdn( "cn=Kate Bush+sn=Bush" ); |
| assertEquals( "cn=Kate Bush+sn=Bush", rdn.getUpName() ); |
| } |
| } |