/*
 *  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.harmony.tests.javax.security.auth.x500;

import javax.security.auth.x500.X500Principal;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.harmony.testframework.serialization.SerializationTest;
import org.apache.harmony.security.tests.support.cert.TestUtils;
import tests.support.resource.Support_Resources;


/**
 * Tests for <code>X500Principal</code> class constructors and methods.
 *
 */
public class X500PrincipalTest extends TestCase {

    /**
     * javax.security.auth.x500.X500Principal#X500Principal(String name)
     */
    public void test_X500Principal_01() {
        String name = "CN=Duke,OU=JavaSoft,O=Sun Microsystems,C=US";

        try {
            X500Principal xpr = new X500Principal(name);
            assertNotNull("Null object returned", xpr);
            String resName = xpr.getName();
            assertEquals(name, resName);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }

        try {
            X500Principal xpr = new X500Principal((String)null);
            fail("NullPointerException wasn't thrown");
        } catch (NullPointerException npe) {
        } catch (Exception e) {
            fail(e + " was thrown instead of NullPointerException");
        }

        try {
            X500Principal xpr = new X500Principal("X500PrincipalName");
            fail("IllegalArgumentException wasn't thrown");
        } catch (IllegalArgumentException npe) {
        } catch (Exception e) {
            fail(e + " was thrown instead of IllegalArgumentException");
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#X500Principal(InputStream is)
     */
    public void test_X500Principal_02() {
        String name = "CN=Duke,OU=JavaSoft,O=Sun Microsystems,C=US";
        byte[] ba = getByteArray(TestUtils.getX509Certificate_v1());
        ByteArrayInputStream is = new ByteArrayInputStream(ba);
        InputStream isNull = null;

        try {
            X500Principal xpr = new X500Principal(is);
            assertNotNull("Null object returned", xpr);
            byte[] resArray = xpr.getEncoded();
            assertEquals(ba.length, resArray.length);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }

        try {
            X500Principal xpr = new X500Principal(isNull);
            fail("NullPointerException wasn't thrown");
        } catch (NullPointerException npe) {
        } catch (Exception e) {
            fail(e + " was thrown instead of NullPointerException");
        }

        is = new ByteArrayInputStream(name.getBytes());
        try {
            X500Principal xpr = new X500Principal(is);
            fail("IllegalArgumentException wasn't thrown");
        } catch (IllegalArgumentException npe) {
        } catch (Exception e) {
            fail(e + " was thrown instead of IllegalArgumentException");
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#X500Principal(byte[] name)
     */
    public void test_X500Principal_03() {
        String name = "CN=Duke,OU=JavaSoft,O=Sun Microsystems,C=US";
        byte[] ba = getByteArray(TestUtils.getX509Certificate_v1());
        byte[] baNull = null;

        try {
            X500Principal xpr = new X500Principal(ba);
            assertNotNull("Null object returned", xpr);
            byte[] resArray = xpr.getEncoded();
            assertEquals(ba.length, resArray.length);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }

        try {
            X500Principal xpr = new X500Principal(baNull);
            fail("IllegalArgumentException wasn't thrown");
        } catch (IllegalArgumentException npe) {
        } catch (Exception e) {
            fail(e + " was thrown instead of IllegalArgumentException");
        }

        ba = name.getBytes();
        try {
            X500Principal xpr = new X500Principal(ba);
            fail("IllegalArgumentException wasn't thrown");
        } catch (IllegalArgumentException npe) {
        } catch (Exception e) {
            fail(e + " was thrown instead of IllegalArgumentException");
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#getName()
     */
    public void test_getName() {
        String name = "CN=Duke,OU=JavaSoft,O=Sun Microsystems,C=US";
        X500Principal xpr = new X500Principal(name);
        try {
            String resName = xpr.getName();
            assertEquals(name, resName);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#getName(String format)
     */
    public void test_getName_Format() {
        String name = "CN=Duke,OU=JavaSoft,O=Sun Microsystems,C=US";
        String expectedName = "cn=duke,ou=javasoft,o=sun microsystems,c=us";
        X500Principal xpr = new X500Principal(name);
        try {
            String resName = xpr.getName(X500Principal.CANONICAL);
            assertEquals(expectedName, resName);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }

        expectedName = "CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US";
        try {
            String resName = xpr.getName(X500Principal.RFC1779);
            assertEquals(expectedName, resName);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }

        try {
            String resName = xpr.getName(X500Principal.RFC2253);
            assertEquals(name, resName);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }

        try {
            String resName = xpr.getName(null);
            fail("IllegalArgumentException  wasn't thrown");
        } catch (IllegalArgumentException  iae) {
        }
        try {
            String resName = xpr.getName("RFC2254");
            fail("IllegalArgumentException  wasn't thrown");
        } catch (IllegalArgumentException  iae) {
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#hashCode()
     */
    public void test_hashCode() {
        String name = "CN=Duke,OU=JavaSoft,O=Sun Microsystems,C=US";
        X500Principal xpr = new X500Principal(name);
        try {
            int res = xpr.hashCode();
            assertNotNull(res);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#toString()
     */
    public void test_toString() {
        String name = "CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US";
        X500Principal xpr = new X500Principal(name);
        try {
            String res = xpr.toString();
            assertNotNull(res);
            assertEquals(name, res);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#getEncoded()
     */
    public void test_getEncoded() {
        byte[] ba = getByteArray(TestUtils.getX509Certificate_v1());
        X500Principal xpr = new X500Principal(ba);
        try {
            byte[] res = xpr.getEncoded();
            assertNotNull(res);
            assertEquals(ba.length, res.length);
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }
    }

    /**
     * javax.security.auth.x500.X500Principal#equals(Object o)
     */
    public void test_equals() {
        String name1 = "CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US";
        String name2 = "cn=duke,ou=javasoft,o=sun microsystems,c=us";
        String name3 = "CN=Alex Astapchuk, OU=SSG, O=Intel ZAO, C=RU";
        X500Principal xpr1 = new X500Principal(name1);
        X500Principal xpr2 = new X500Principal(name2);
        X500Principal xpr3 = new X500Principal(name3);
        try {
            assertTrue("False returned", xpr1.equals(xpr2));
            assertFalse("True returned", xpr1.equals(xpr3));
        } catch (Exception e) {
            fail("Unexpected exception: " + e);
        }
    }

    private byte[] getByteArray(byte[] array) {
        byte[] x = null;
        try {
            ByteArrayInputStream is = new ByteArrayInputStream(array);
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            X509Certificate cert = (X509Certificate)cf.generateCertificate(is);
            X500Principal xx = cert.getIssuerX500Principal();
            x = xx.getEncoded();
        } catch (Exception e) {
            return null;
        }
        return x;
    }

        /**
     * @tests javax.security.auth.x500.X500Principal#X500Principal(java.lang.String)
     */
    public void test_ConstructorLjava_lang_String() {
        X500Principal principal = new X500Principal(
                "CN=Hermione Granger, O=Apache Software Foundation, OU=Harmony, L=Hogwarts, ST=Hants, C=GB");
        String name = principal.getName();
        String expectedOuput = "CN=Hermione Granger,O=Apache Software Foundation,OU=Harmony,L=Hogwarts,ST=Hants,C=GB";
        assertEquals("Output order precedence problem", expectedOuput, name);
    }

    /**
     * @tests javax.security.auth.x500.X500Principal#X500Principal(java.lang.String, java.util.Map)
     */
    public void test_ConstructorLjava_lang_String_java_util_Map() {
        Map<String, String> keyword = new HashMap<String, String>();
        keyword.put("CN", "2.19");
        keyword.put("OU", "1.2.5.19");
        keyword.put("O", "1.2.5");
        X500Principal X500p = new X500Principal("CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US ,CN=DD", keyword);
        String name = X500p.getName();
        String expectedOut = "2.19=#130444756b65,1.2.5.19=#13084a617661536f6674,1.2.5=#131053756e204d6963726f73797374656d73,C=US,2.19=#13024444";
        assertEquals("Output order precedence problem", expectedOut, name);
    }

    /**
     * @tests javax.security.auth.x500.X500Principal#getName(java.lang.String)
     */
    public void test_getNameLjava_lang_String() {
        X500Principal principal = new X500Principal(
                "CN=Dumbledore, OU=Administration, O=Hogwarts School, C=GB");
        String canonical = principal.getName(X500Principal.CANONICAL);
        String expected = "cn=dumbledore,ou=administration,o=hogwarts school,c=gb";
        assertEquals("CANONICAL output differs from expected result", expected,
                canonical);
    }

    /**
     * @tests javax.security.auth.x500.X500Principal#getName(java.lang.String, java.util.Map)
     */
    public void test_getNameLjava_lang_String_java_util_Map() {
        Map<String, String> keyword = new HashMap<String, String>();
        keyword.put("CN", "2.19");
        keyword.put("OU", "1.2.5.19");
        keyword.put("O", "1.2.5");
        X500Principal X500p = new X500Principal("CN=Duke, OU=JavaSoft, O=Sun Microsystems, C=US ,CN=DD", keyword);
        keyword = new HashMap<String, String>();
        keyword.put("2.19", "mystring");
        String rfc1779Name = X500p.getName("RFC1779", keyword);
        String rfc2253Name = X500p.getName("RFC2253", keyword);
        String expected1779Out = "mystring=Duke, OID.1.2.5.19=JavaSoft, OID.1.2.5=Sun Microsystems, C=US, mystring=DD";
        String expected2253Out = "mystring=Duke,1.2.5.19=#13084a617661536f6674,1.2.5=#131053756e204d6963726f73797374656d73,C=US,mystring=DD";
        assertEquals("Output order precedence problem", expected1779Out, rfc1779Name);
        assertEquals("Output order precedence problem", expected2253Out, rfc2253Name);
        try {
            X500p.getName("CANONICAL", keyword);
            fail("Should throw IllegalArgumentException exception here");
        } catch (IllegalArgumentException e) {
            //expected IllegalArgumentException here
        }
    }

      private boolean testing = false;

    public void testStreamPosition() throws Exception {
        //this encoding is read from the file
        /*byte [] mess = {0x30, 0x30,
         0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
         0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
         1, 2, 3//extra bytes
         };
         */

        InputStream is = Support_Resources
                .getResourceStream("X500PrincipalTest.0.dat");
        X500Principal principal = new X500Principal(is);
        String s = principal.toString();
        assertEquals("CN=A, CN=B, CN=A, CN=B", s);
        byte[] restBytes = new byte[] { 0, 0, 0 };
        is.read(restBytes);
        assertEquals(restBytes[0], 1);
        assertEquals(restBytes[1], 2);
        assertEquals(restBytes[2], 3);
        is.close();
    }

    public void testStreamPosition_0() throws Exception {
        //this encoding is read from the file
        /*byte [] mess = {0x30, 0x30,
         0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
         0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
         };
         */

        InputStream is = Support_Resources
                .getResourceStream("X500PrincipalTest.1.dat");
        X500Principal principal = new X500Principal(is);
        String s = principal.toString();
        assertEquals("CN=A, CN=B, CN=A, CN=B", s);
        assertEquals(0, is.available());
        is.close();
    }

    public void testStreamPosition_1() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 2,
                3, 4 };

        ByteArrayInputStream is = new ByteArrayInputStream(mess);
        X500Principal principal = new X500Principal(is);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals(
                "CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=Z",
                s);
        assertEquals(3, is.available());
        assertEquals(2, is.read());
        assertEquals(3, is.read());
        assertEquals(4, is.read());
    }

    public void testStreamPosition_2() throws Exception {
        byte[] mess = { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x41, 2 };
        ByteArrayInputStream is = new ByteArrayInputStream(mess);
        X500Principal principal = new X500Principal(is);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=A", s);
        assertEquals(1, is.available());
        assertEquals(2, is.read());
    }

    public void testEncodingFromFile() throws Exception {
        //this encoding is read from the file
        /*byte [] mess = {0x30, 0x30,
         0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41,
         0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41
         };
         */
        InputStream is = Support_Resources
                .getResourceStream("X500PrincipalTest.1.dat");
        X500Principal principal = new X500Principal(is);
        String s = principal.toString();
        assertEquals("CN=A, CN=B, CN=A, CN=B", s);
        is.close();
    }

    public void testEncodingFromEncoding() {
        byte[] arr1 = new X500Principal("O=Org.").getEncoded();
        byte[] arr2 = new X500Principal(new X500Principal("O=Org.")
                .getEncoded()).getEncoded();
        assertTrue(Arrays.equals(arr1, arr2));
    }

    /**
     * tests if the encoding is backed
     */
    public void testSafeEncoding() {
        byte[] mess = { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x41 };
        X500Principal principal = new X500Principal(mess);
        mess[mess.length - 1] = (byte) 0xFF;
        byte[] enc = principal.getEncoded();
        assertEquals(enc[mess.length - 1], 0x41);
    }

    /**
     * Inits X500Principal with byte array
     * gets toString
     * checks the result
     */
    public void testToString() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        X500Principal principal = new X500Principal(mess);
        String s = principal.toString();
        assertNotNull(s);
    }

    /**
     * Inits X500Principal with byte array
     * gets hashCode
     * compares with expected value
     */
    public void testHashCode() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        X500Principal principal = new X500Principal(mess);
        int hash = principal.hashCode();
        assertEquals(principal.getName(X500Principal.CANONICAL).hashCode(),
                hash);
    }

    /**
     * Inits X500Principal with byte array
     * Inits other X500Principal with equivalent string
     * checks if <code>equals</code> returns true for first against second one
     */
    public void testEquals() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        X500Principal principal = new X500Principal(mess);
        X500Principal principal2 = new X500Principal("CN=A, CN=B");
        assertTrue(principal.equals(principal2));
    }

    /**
     * @tests javax.security.auth.x500.X500Principal#equals(Object)
     */
    public void test_equalsLjava_lang_Object() {
        X500Principal xp1 = new X500Principal(
                "C=US, ST=California, L=San Diego, O=Apache, OU=Project Harmony, CN=Test cert");
        assertEquals(
                "C=US,ST=California,L=San Diego,O=Apache,OU=Project Harmony,CN=Test cert",
                xp1.getName());
    }

    /**
     * Inits X500Principal with byte array, where Oid does fall into any keyword, but not given as a keyword
     * Value is given as hex value
     * (extra spaces are given)
     * gets Name in RFC1779 format
     * compares with expected value of name
     */
    public void testKWAsOid_RFC1779() throws Exception {
        String dn = "CN=A, OID.2.5.4.3  =    #130142";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=A, CN=B", s);
    }

    /**
     * Inits X500Principal with byte array, where Oid does fall into any keyword, but not given as a keyword
     * Value is given as hex value
     * (extra spaces are given)
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testKWAsOid_RFC2253() throws Exception {
        String dn = "CN=A, OID.2.5.4.3 =  #130142";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A,CN=B", s);
    }

    /**
     * Inits X500Principal with byte array, where Oid does fall into any keyword, but not given as a keyword
     * Value is given as hex value
     * (extra spaces are given)
     * gets Name in CANONICAL format
     * compares with expected value of name
     */
    public void testKWAsOid_CANONICAL() throws Exception {
        String dn = "CN=A, OID.2.5.4.3 =  #130142";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a,cn=b", s);
    }

    /**
     * Inits X500Principal with byte array, where Oid does not fall into any keyword
     * gets Name in RFC1779 format
     * compares with expected value of name
     */
    public void testOid_RFC1779() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        mess[8] = 0x60;
        X500Principal principal = new X500Principal(mess);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=A, OID.2.16.4.3=B", s);
    }

    /**
     * Inits X500Principal with byte array, where Oid does not fall into any keyword
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testOid_RFC2253() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x4F, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        mess[8] = 0x60;
        X500Principal principal = new X500Principal(mess);

        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A,2.16.4.3=#13014f", s);
    }

    /**
     * Inits X500Principal with byte array, where Oid does not fall into any keyword
     * gets Name in CANONICAL format
     * compares with expected value of name
     */
    public void testOid_CANONICAL() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x4F, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        mess[8] = 0x60;
        X500Principal principal = new X500Principal(mess);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a,2.16.4.3=#13014f", s);
    }

    /**
     * Inits X500Principal with a string
     * gets encoded form
     * compares with expected byte array
     */
    public void testNameGetEncoding() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        String dn = "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z";
        X500Principal principal = new X500Principal(dn);
        byte[] s = principal.getEncoded();

        assertTrue(Arrays.equals(mess, s));
    }

    /**
     * Inits X500Principal with a string
     * gets encoded form
     * compares with expected byte array
     */
    public void testNameGetEncoding_01() throws Exception {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        String dn = "CN=A,CN=B";
        X500Principal principal = new X500Principal(dn);
        byte[] s = principal.getEncoded();

        assertTrue(Arrays.equals(mess, s));
    }

    /**
     * Inits X500Principal with byte array
     * gets Name in RFC1779 format
     * compares with expected value of name
     */
    public void testGetName_RFC1779() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        X500Principal principal = new X500Principal(mess);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals(
                "CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=Z",
                s);

    }

    /**
     * Inits X500Principal with byte array
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testGetName_RFC2253() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        X500Principal principal = new X500Principal(mess);

        String s = principal.getName(X500Principal.RFC2253);
        assertEquals(
                "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z",
                s);
    }

    /**
     * Inits X500Principal with byte array
     * gets Name in CANONICAL format
     * compares with expected value of name
     */
    public void testGetName_CANONICAL() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        X500Principal principal = new X500Principal(mess);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals(
                "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z"
                        .toLowerCase(Locale.US), s);
    }

    /**
     * Inits X500Principal with byte array
     * gets Name in RFC1779 format
     * compares with expected value of name
     */
    public void testStreamGetName_RFC1779() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        ByteArrayInputStream is = new ByteArrayInputStream(mess);
        X500Principal principal = new X500Principal(is);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals(
                "CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=A + ST=CA, O=B, L=C, C=D, OU=E, CN=Z",
                s);
    }

    /**
     * Inits X500Principal with byte array
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testStreamGetName_RFC2253() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        ByteArrayInputStream is = new ByteArrayInputStream(mess);
        X500Principal principal = new X500Principal(is);

        String s = principal.getName(X500Principal.RFC2253);
        assertEquals(
                "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z",
                s);
    }

    /**
     * Inits X500Principal with byte array
     * gets Name in CANONICAL format
     * compares with expected value of name
     */
    public void testStreamGetName_CANONICAL() throws Exception {
        byte[] mess = { 0x30, (byte) 0x81, (byte) 0x9A, 0x31, 0x0A, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x5A, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01, 0x45,
                0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
                0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
                0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30, 0x08,
                0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30, 0x09,
                0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41, 0x31,
                0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x01,
                0x45, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x06,
                0x13, 0x01, 0x44, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x07, 0x13, 0x01, 0x43, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x0A, 0x13, 0x01, 0x42, 0x31, 0x15, 0x30,
                0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x02, 0x43, 0x41 };
        ByteArrayInputStream is = new ByteArrayInputStream(mess);
        X500Principal principal = new X500Principal(is);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals(
                "CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=A+ST=CA,O=B,L=C,C=D,OU=E,CN=Z"
                        .toLowerCase(Locale.US), s);
    }

    /**
     * Inits X500Principal with a string, where OID does not fall into any keyword
     * gets encoded form
     * inits new X500Principal with the encoding
     * gets string in RFC1779 format
     * compares with expected value
     */
    public void testGetName_EncodingWithWrongOidButGoodName_SeveralRDNs_RFC1779()
            throws Exception {
        String dn = "OID.2.16.4.3=B; CN=A";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        X500Principal principal2 = new X500Principal(enc);
        String s = principal2.getName(X500Principal.RFC1779);
        assertEquals("OID.2.16.4.3=B, CN=A", s);

    }

    /**
     * Inits X500Principal with a string, where OID does not fall into any keyword
     * gets encoded form
     * inits new X500Principal with the encoding
     * gets string in RFC2253 format
     * compares with expected value
     */
    public void testGetName_EncodingWithWrongOidButGoodName_SeveralRDNs_RFC2253()
            throws Exception {
        String dn = "OID.2.16.4.3=B; CN=A";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        X500Principal principal2 = new X500Principal(enc);
        String s = principal2.getName(X500Principal.RFC2253);
        assertEquals("2.16.4.3=#130142,CN=A", s);

    }

    /**
     * Inits X500Principal with a string, where OID does not fall into any keyword
     * gets encoded form
     * inits new X500Principal with the encoding
     * gets string in CANONICAL format
     * compares with expected value
     */
    public void testGetName_EncodingWithWrongOidButGoodName_SeveralRDNs_CANONICAL()
            throws Exception {
        String dn = "OID.2.16.4.3=B; CN=A";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        X500Principal principal2 = new X500Principal(enc);
        String s = principal2.getName(X500Principal.CANONICAL);
        assertEquals("2.16.4.3=#130142,cn=a", s);

    }

    /**
     * Inits X500Principal with a string, where OID does not fall into any keyword
     * gets string in RFC1779 format
     * compares with expected value
     */
    public void testGetName_wrongOidButGoodName_RFC1779() throws Exception {
        String dn = "OID.2.16.4.3=B + CN=A";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("OID.2.16.4.3=B + CN=A", s);
    }

    /**
     * Inits X500Principal with a string, where OID does not fall into any keyword
     * gets string in RFC2253 format
     * compares with expected value
     */
    public void testGetName_wrongOidButGoodName_RFC2253() throws Exception {
        String dn = "OID.2.16.4.3=B + CN=A";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("2.16.4.3=#130142+CN=A", s);
    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder() throws Exception {
        String dn = "ST=C + CN=A; OU=B + CN=D";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a+st=c,cn=d+ou=b", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_01() throws Exception {
        String dn = "OID.2.16.4.3=B + CN=A";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a+2.16.4.3=#130142", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword, and value given in hex format
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_02() throws Exception {
        String dn = "OID.2.16.4.3=#13024220+ CN=A";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a+2.16.4.3=#13024220", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_03() throws Exception {
        String dn = "OID.2.16.4.9=A + OID.2.16.4.3=B";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("2.16.4.3=#130142+2.16.4.9=#130141", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_04() throws Exception {
        String dn = "OID.2.2.2.2=A + OID.1.1.1.1=B";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("1.1.1.1=#130142+2.2.2.2=#130141", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_05() throws Exception {
        String dn = "OID.2.16.4.9=A + OID.2.16.4=B";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("2.16.4=#130142+2.16.4.9=#130141", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_06() throws Exception {
        String dn = "OID.1.1.2=A + OID.1.2=B";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("1.1.2=#130141+1.2=#130142", s);

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and 2 Oids which do not fall into any keyword
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_CANONICAL_SortOrder_07() throws Exception {
        String dn = "OID.1.1.1=A + OID.1.1=B";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("1.1=#130142+1.1.1=#130141", s);

    }

    /**
     * FIXME test is failed - implement unicode normalization
     *
     * @throws Exception
     */
    public void testGetNameUnicodeNormalized() throws Exception {
        String unicodeStr = "CN= \u0401\u0410";
        X500Principal principal = new X500Principal(unicodeStr);
        principal.getName(X500Principal.CANONICAL);
    }

    /**
     * Inits X500Principal with empty string
     * gets encoding
     * compares with expected encoding
     */
    public void testEmptyInputName() {
        String dn = "CN=\"\"";
        byte[] mess = { 0x30, 0x0B, 0x31, 0x09, 0x30, 0x07, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x00 };
        X500Principal principal = new X500Principal(dn);
        assertTrue(Arrays.equals(mess, principal.getEncoded()));
    }

    /**
     * Inits X500Principal with string as single escaped space
     * gets encoding
     * compares with expected encoding
     */
    public void testNameSingleEscapedSpace() {
        String dn = "CN=\\ ";
        byte[] mess = { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x20 };
        X500Principal principal = new X500Principal(dn);
        assertTrue(Arrays.equals(mess, principal.getEncoded()));
    }

    /**
     * Inits X500Principal with string with spaces
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testNameOnlySpaces_RFC1779() {
        String dn = "CN=\"  \"";
        X500Principal principal = new X500Principal(dn);
        assertEquals("CN=\"  \"", principal.getName(X500Principal.RFC1779));
    }

    /**
     * Inits X500Principal with string with spaces
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testNameOnlySpaces_RFC2253() {
        String dn = "CN=\"  \"";
        X500Principal principal = new X500Principal(dn);
        assertEquals("CN=\\ \\ ", principal.getName(X500Principal.RFC2253));
    }

    /**
     * Inits X500Principal with string with only spaces,
     * gets Name in CANONICAL format:leading and trailing white space
     * chars are removed even string doesn't have other chars (bug???)
     */
    public void testNameOnlySpaces_CANONICAL() {
        String dn = "CN=\"  \"";
        X500Principal principal = new X500Principal(dn);
        assertEquals("cn=", principal.getName(X500Principal.CANONICAL));
    }

    ///*** Negative Tests ***///

    /**
     * Inits X500Principal with string, where DN name is improper "CNN"
     * checks if proper exception is thrown
     */
    public void testIllegalInputName() {
        try {
            String dn = "CNN=A";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper input name \"CNN\"");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where there is leading ';'
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_01() {
        try {
            String dn = ";CN=A";
            new X500Principal(dn);
            fail("No IllegalArgumentException on leading ';' in input name");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where there is leading '='
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_02() {
        try {
            String dn = "=CN=A";
            new X500Principal(dn);
            fail("No IllegalArgumentException on leading '=' in input name");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where there is no value
     * checks if proper exception is thrown
     */
    public void testEmptyInputName_0() {
        String dn = "CN=";
        byte[] mess = { 0x30, 0x0B, 0x31, 0x09, 0x30, 0x07, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x00 };
        X500Principal principal = new X500Principal(dn);
        assertTrue(Arrays.equals(mess, principal.getEncoded()));
    }

    public void testEmptyInputName_1() {
        String dn = "CN=\"\", C=\"\"";
        X500Principal principal = new X500Principal(dn);
        dn = "CN=, C=";
        X500Principal principal2 = new X500Principal(dn);
        assertTrue(Arrays.equals(principal.getEncoded(), principal2
                .getEncoded()));

    }

    public void testEmptyInputName_2() {
        String dn = "CN=\"\" + OU=A, C=\"\"";
        X500Principal principal = new X500Principal(dn);
        dn = "CN=+OU=A, C=";
        X500Principal principal2 = new X500Principal(dn);
        assertTrue(Arrays.equals(principal.getEncoded(), principal2
                .getEncoded()));

    }

    public void testIllegalInputName_15() {
        try {
            String dn = "CN=,C";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute value");
        } catch (IllegalArgumentException e) {
        }
    }

    public void testIllegalInputName_16() {
        try {
            String dn = "CN=,C=+";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where value is given in wrong hex format
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_04() {
        try {
            String dn = "CN=#XYZ";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper hex value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_05() {
        try {
            String dn = "CN=X+YZ";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * Compatibility issue: according RFC 2253 such string is invalid
     * but we accept it, not string char is escaped
     */
    public void testIllegalInputName_06() {
        String dn = "CN=X=YZ";
        X500Principal p = new X500Principal(dn);
        assertEquals("CN=X\\=YZ", p.getName(X500Principal.RFC2253));
    }

    /**
     * Inits X500Principal with string, where value is given with not string chars
     * Compatibility issue: according RFC 2253 such string is invalid
     * but we accept it, not string char is escaped
     */
    public void testIllegalInputName_07() {
        String dn = "CN=X\"YZ";
        X500Principal p = new X500Principal(dn);
        assertEquals("CN=X\\\"YZ", p.getName(X500Principal.RFC2253));
    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * Compatibility issue: according RFC 2253 such string is invalid
     * but we accept it, special char is escaped
     */
    public void testIllegalInputName_08() {
        String dn = "CN=X<YZ";
        X500Principal p = new X500Principal(dn);
        assertEquals("CN=X\\<YZ", p.getName(X500Principal.RFC2253));
    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_09() {
        try {
            String dn = "CN=#";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute hex value");
        } catch (IllegalArgumentException e) {
            //ignore
        }

    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_10() {
        try {
            String dn = "CN=#13";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute hex value");
        } catch (IllegalArgumentException e) {
            //ignore
        }

    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_11() {
        try {
            String dn = "CN=#1301";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute hex value");
        } catch (IllegalArgumentException e) {
            //ignore
        }

    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_12() {
        try {
            String dn = "CN=#13010101";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute hex value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where value is given with special chars
     * checks if proper exception is thrown
     */
    public void testIllegalInputName_13() {
        try {
            String dn = "CN=# 0";
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper attribute hex value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string, where value is given in hex format, but improper tag
     * checks if it is ignored
     */
    public void testSemiIllegalInputName_14() {
        String dn = "CN=#7E0142";
        new X500Principal(dn);
    }

    public void testInitClause() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[3] = 0x12;//length field
            new X500Principal(mess);

            fail("No IllegalArgumentException on input array with improper length field");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with byte array = null
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_0() {
        try {
            byte[] mess = null;
            new X500Principal(mess);
            fail("No IllegalArgumentException on input array with improper length field");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with byte array with wrong length field
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[3] = 0x12;//length field
            new X500Principal(mess);

            fail("No IllegalArgumentException on input array with improper length field");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with input stream with wrong length field
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_is() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[3] = 0x12;//length field
            ByteArrayInputStream is = new ByteArrayInputStream(mess);
            new X500Principal(is);

            fail("No IllegalArgumentException on input array with improper length field");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with byte array with wrong inner Sequence tag field
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_01() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[4] = 0x12;//inner Sequence tag field
            new X500Principal(mess);

            fail("No IllegalArgumentException on input array with improper inner Sequence tag field");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with byte array with wrong last byte of OID
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_02() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[10] = (byte) 0xFE;//last byte of OID
            new X500Principal(mess);

            fail("No IllegalArgumentException on input array with improper last byte of OID");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with byte array with wrong length of OID
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_03() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[7] = 2;//length of OID
            new X500Principal(mess);

            fail("No IllegalArgumentException on input array with improper length of OID");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with byte array with wrong tag of value
     * checks if it is ignored
     */
    public void testSemiIllegalInputArray_04() {
        byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08, 0x06,
                0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
        mess[11] = (byte) 0x0F;//tag of value
        new X500Principal(mess);
    }

    /**
     * Inits X500Principal with byte array with wrong length of value
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_05() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[12] = 2;//length of value
            new X500Principal(mess);

            fail("No IllegalArgumentException on input array with improper length of value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with input stream with wrong length of value
     * checks if proper exception is thrown
     */
    public void testIllegalInputArray_05_is() {
        try {
            byte[] mess = { 0x30, 0x18, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                    0x55, 0x04, 0x03, 0x13, 0x01, 0x42, 0x31, 0x0A, 0x30, 0x08,
                    0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x01, 0x41 };
            mess[12] = 2;//length of value
            ByteArrayInputStream is = new ByteArrayInputStream(mess);
            new X500Principal(is);

            fail("No IllegalArgumentException on input array with improper length of value");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with string
     * Calls getName with improper parameter as format
     * checks if proper exception is thrown
     */
    public void testIllegalFormat() {
        try {
            String dn = "CN=A";
            X500Principal principal = new X500Principal(dn);
            principal.getName("WRONG FORMAT");
            fail("No IllegalArgumentException on improper parameter as format");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
     * Gets encoding
     * Inits other X500Principal with the encoding
     * gets string in RFC1779 format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_EncodingWithWrongOidButGoodName_MultAVA_RFC1779()
            throws Exception {
        String dn = "OID.2.16.4.3=B + CN=A";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        X500Principal principal2 = new X500Principal(enc);
        String s = principal2.getName(X500Principal.RFC1779);
        assertTrue("OID.2.16.4.3=B + CN=A".equals(s) ||
            "CN=A + OID.2.16.4.3=B".equals(s));

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
     * Gets encoding
     * Inits other X500Principal with the encoding
     * gets string in RFC2253 format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_EncodingWithWrongOidButGoodName_MultAVA_RFC2253()
            throws Exception {
        String dn = "OID.2.16.4.3=B + CN=A";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        X500Principal principal2 = new X500Principal(enc);
        String s = principal2.getName(X500Principal.RFC2253);
        assertTrue("2.16.4.3=#130142+CN=A".equals(s) ||
            "CN=A+2.16.4.3=#130142".equals(s));

    }

    /**
     * Inits X500Principal with a string, there are multiple AVAs and Oid which does not fall into any keyword
     * Gets encoding
     * Inits other X500Principal with the encoding
     * gets string in CANONICAL format
     * compares with expected value paying attention on sorting order of AVAs
     */
    public void testGetName_EncodingWithWrongOidButGoodName_MultAVA_CANONICAL()
            throws Exception {
        String dn = "OID.2.16.4.3=B + CN=A";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        X500Principal principal2 = new X500Principal(enc);
        String s = principal2.getName(X500Principal.CANONICAL);
        assertEquals("cn=a+2.16.4.3=#130142", s);

    }

    /**
     * Inits X500Principal with byte array, where there are leading and tailing spaces
     * gets Name in RFC1779 format
     * compares with expected value of name
     */
    public void testNameSpaceFromEncoding_RFC1779() throws Exception {
        byte[] mess = { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x03, 0x20, 0x41, 0x20, };
        X500Principal principal = new X500Principal(mess);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\" A \"", s);

    }

    /**
     * Inits X500Principal with byte array, where there are leading and tailing spaces
     * gets Name in RFC2253 format
     * compares with expected value of name
     */
    public void testNameSpaceFromEncoding_RFC2253() throws Exception {
        byte[] mess = { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x03, 0x20, 0x41, 0x20, };
        X500Principal principal = new X500Principal(mess);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=\\ A\\ ", s);

    }

    /**
     * Inits X500Principal with byte array, where there are leading and tailing spaces
     * gets Name in CANONICAL format
     * compares with expected value of name
     */
    public void testNameSpaceFromEncoding_CANONICAL() throws Exception {
        byte[] mess = { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x13, 0x03, 0x20, 0x41, 0x20, };
        X500Principal principal = new X500Principal(mess);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a", s);

    }

    /**
     * Inits X500Principal with byte array, where there are special characters
     * gets Name in RFC1779 format
     * compares with expected value of name, checks if the string is in quotes
     */
    public void testNameSpecialCharsFromEncoding_RFC1779() throws Exception {
        byte[] mess = { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x0C, 0x02, 0x3B, 0x2C };
        X500Principal principal = new X500Principal(mess);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\";,\"", s);

    }

    /**
     * Inits X500Principal with byte array, where there are special characters
     * gets Name in RFC1779 format
     * compares with expected value of name, checks if the characters are escaped
     */
    public void testNameSpecialCharsFromEncoding_RFC2253() throws Exception {
        byte[] mess = { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x0C, 0x02, 0x3B, 0x2C };
        X500Principal principal = new X500Principal(mess);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=\\;\\,", s);

    }

    /**
     * Inits X500Principal with byte array, where there are special characters
     * gets Name in CANONICAL format
     * compares with expected value of name, checks if the characters are escaped
     */
    public void testNameSpecialCharsFromEncoding_CANONICAL() throws Exception {
        byte[] mess = { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
                0x04, 0x03, 0x0C, 0x02, 0x3B, 0x2C };
        X500Principal principal = new X500Principal(mess);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=\\;\\,", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \"B
     * gets Name in RFC1779 format
     * compares with expected value of name - "\B"
     */
    public void testNameSpecialChars_RFC1779() throws Exception {
        String dn = "CN=A,CN=\\\"B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=A, CN=\"\\\"B\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \"B
     * gets Name in RFC2253 format
     * compares with expected value of name - "\B"
     */
    public void testNameSpecialChars_RFC2253() throws Exception {
        String dn = "CN=A,CN=\\\"B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A,CN=\\\"B", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \"B
     * gets Name in CANONICAL format
     * compares with expected value of name - "\b"
     */
    public void testNameSpecialChars_CANONICAL() throws Exception {
        String dn = "CN=A,CN=\\\"B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a,cn=\\\"b", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\nB
     * gets Name in RFC1779 format
     * compares with expected value of name - "\nB"
     */
    public void testNameSpecialChars_RFC1779_01() throws Exception {
        //FIXME see testNameSpecialChars_RFC2253_01
        //        String dn = "CN=\\\nB";
        //        X500Principal principal = new X500Principal(dn);
        //        String s = principal.getName(X500Principal.RFC1779);
        //        assertEquals("CN=\"\nB\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\nB
     * gets Name in RFC2253 format
     * compares with expected value of name - \nB
     */
    public void testNameSpecialChars_RFC2253_01() throws Exception {
        X500Principal p = new X500Principal("CN=\\\nB");
        assertEquals("CN=\nB", p.getName(X500Principal.RFC2253));
    }

    /**
     * Inits X500Principal with the string with special characters - \\nB
     * gets Name in CANONICAL format
     * compares with expected value of name - \\nb
     */
    public void testNameSpecialChars_CANONICAL_01() throws Exception {
        //FIXME testNameSpecialChars_RFC2253_01
        //        String dn = "CN=\\\nB";
        //        X500Principal principal = new X500Principal(dn);
        //        String s = principal.getName(X500Principal.CANONICAL);
        //        assertEquals("cn=b", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\B
     * gets Name in RFC1779 format
     * compares with expected value of name - "\B"
     */
    public void testNameSpecialChars_RFC1779_02() throws Exception {
        String dn = "CN=\\\\B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"\\\\B\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\B
     * gets Name in RFC2253 format
     * compares with expected value of name - \\B
     */
    public void testNameSpecialChars_RFC2253_02() throws Exception {
        String dn = "CN=\\\\B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=\\\\B", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\B
     * gets Name in CANONICAL format
     * compares with expected value of name - \\b
     */
    public void testNameSpecialChars_CANONICAL_02() throws Exception {
        String dn = "CN=\\\\B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=\\\\b", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ABC"DEF"
     * gets encoding
     * compares with expected encoding
     */
    public void testNameWithQuotation() throws Exception {
        String dn = "CN=\"ABCDEF\"";

        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        assertTrue(Arrays.equals(new byte[] { 0x30, 0x11, 0x31, 0x0F, 0x30,
                0x0D, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x06, 0x41, 0x42,
                0x43, 0x44, 0x45, 0x46 }, enc));

    }

    /**
     * Inits X500Principal with the string with special characters - "ABCDEF
     * checks if the proper exception is thrown
     */
    public void testNameWithQuotation_01() throws Exception {
        String dn = "CN=\"ABCDEF";
        try {
            new X500Principal(dn);
            fail("No IllegalArgumentException on string with no closing quotations");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with the string with special characters - ABC"D#EF"
     * gets encoding
     * compares with expected encoding
     */
    public void testNameWithQuotation_02() throws Exception {
        String dn = "CN=\"ABCD#EF\"";
        X500Principal principal = new X500Principal(dn);
        byte[] enc = principal.getEncoded();
        assertTrue(Arrays.equals(new byte[] { 0x30, 0x12, 0x31, 0x10, 0x30,
                0x0E, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x07, 0x41, 0x42,
                0x43, 0x44, 0x23, 0x45, 0x46 }, enc));
    }

    /**
     * Inits X500Principal with the string with special characters - ABC"DEF"
     * Compatibility issue: according RFC 2253 such string is invalid
     * but we accept it, not string char is escaped
     */
    public void testNameWithQuotation_03() throws Exception {
        String dn = "CN=ABC\"DEF\"";
        X500Principal principal = new X500Principal(dn);
        assertEquals("CN=ABC\\\"DEF\\\"", principal
                .getName(X500Principal.RFC2253));
    }

    /**
     * Inits X500Principal with the string with special characters - ABC"DEF"
     * gets Name in RFC1779 format
     * compares with expected value of name - "ABCDEF"
     */
    public void testNameSpecialChars_RFC1779_03() throws Exception {
        String dn = "CN=\"ABCDEF\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=ABCDEF", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ABC"DEF"
     * gets Name in RFC2253 format
     * compares with expected value of name - ABC"DEF"
     */
    public void testNameSpecialChars_RFC2253_03() throws Exception {
        String dn = "CN=\"ABCDEF\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=ABCDEF", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ABC"DEF"
     * gets Name in CANONICAL format
     * compares with expected value of name - abc"def"
     */
    public void testNameSpecialChars_CANONICAL_03() throws Exception {
        String dn = "CN=\"ABCDEF\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=abcdef", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ABC"D#EF"
     * gets Name in RFC1779 format
     * compares with expected value of name - "ABCD#EF"
     */
    public void testNameSpecialChars_RFC1779_04() throws Exception {
        String dn = "CN=\"ABCD#EF\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"ABCD#EF\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ABC"D#EF"
     * gets Name in RFC1779 format
     * compares with expected value of name - ABCD\#EF
     */
    public void testNameSpecialChars_RFC2253_04() throws Exception {
        String dn = "CN=\"ABCD#EF\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=ABCD\\#EF", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ABC"D#EF"
     * gets Name in RFC1779 format
     * compares with expected value of name - abc"d#ef"
     */
    public void testNameSpecialChars_CANONICAL_04() throws Exception {
        String dn = "CN=\"ABCD#EF\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=abcd#ef", s);

    }

    /**
     * Inits X500Principal with the string with special characters - X#YZ
     * gets Name in RFC1779 format
     * compares with expected value of name - "X#YZ"
     */
    public void testNameSpecialChars_RFC1779_05() {
        String dn = "CN=X#YZ";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"X#YZ\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - X#YZ
     * gets Name in RFC2253 format
     * compares with expected value of name - X\#YZ
     */
    public void testNameSpecialChars_RFC2253_05() {
        String dn = "CN=X#YZ";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.RFC2253);

        assertEquals("CN=X\\#YZ", s);

    }

    /**
     * Inits X500Principal with the string with special characters - X#YZ
     * gets Name in CANONICAL format
     * compares with expected value of name - x#yz
     */
    public void testNameSpecialChars_CANONICAL_05() {
        String dn = "CN=X#YZ";
        X500Principal principal = new X500Principal(dn);

        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=x#yz", s);

    }

    /**
     * Inits X500Principal with the string with special characters - CN=\#XYZ
     * gets Name in RFC1779 format
     * compares with expected value of name - CN="#XYZ"
     */
    public void testNameSpecialChars_RFC1779_6() throws Exception {
        String dn = "CN=\\#XYZ";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"#XYZ\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - CN=\#XYZ
     * gets Name in RFC2253 format
     * compares with expected value of name - CN=\#XYZ
     */
    public void testNameSpecialChars_RFC2253_6() throws Exception {
        String dn = "CN=\\#XYZ";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=\\#XYZ", s);
    }

    /**
     * Inits X500Principal with the string with special characters - CN=\#XYZ
     * gets Name in CANONICAL format
     * compares with expected value of name - cn=\#xyz
     */
    public void testNameSpecialChars_CANONICAL_6() throws Exception {
        String dn = "CN=\\#XYZ";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=\\#xyz", s);
    }

    /**
     * Inits X500Principal with the string with special characters - B\'space'
     * gets Name in RFC1779 format
     * compares with expected value of name - "B "
     */
    public void testNameSpaces_RFC1779() throws Exception {
        String dn = "CN=A,CN=B\\ ";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=A, CN=\"B \"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - B\'space'
     * gets Name in RFC2253 format
     * compares with expected value of name - B\'space'
     */
    public void testNameSpaces_RFC2253() throws Exception {
        String dn = "CN=A,CN=B\\ ";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A,CN=B\\ ", s);

    }

    /**
     * Inits X500Principal with the string with special characters - B\'space'
     * gets Name in CANONICAL format
     * compares with expected value of name - B\
     */
    public void testNameSpaces_CANONICAL() throws Exception {
        String dn = "CN=A,CN=B\\ ";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a,cn=b", s);

    }

    /**
     * Inits X500Principal with the string with special characters - "B'space''space''space'A"
     * gets Name in RFC1779 format
     * compares with expected value of name - "B   A"
     */
    public void testNameSpaces_RFC1779_01() throws Exception {
        String dn = "CN=\"B   A\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"B   A\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - "B'space''space''space'A"
     * gets Name in 2253 format
     * compares with expected value of name - B'space''space''space'A
     */
    public void testNameSpaces_RFC2253_01() throws Exception {
        String dn = "CN=\"B   A\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=B   A", s);

    }

    /**
     * Inits X500Principal with the string with special characters - "B'space''space''space'A"
     * gets Name in CANONICAL format
     * compares with expected value of name - b'space'a
     */
    public void testNameSpaces_CANONICAL_01() throws Exception {
        String dn = "CN=\"B   A\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=b a", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\'space''space'B
     * gets Name in RFC1779 format
     * compares with expected value of name - "  B"
     */
    public void testNameSpaces_RFC1779_02() throws Exception {
        String dn = "CN=\\  B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"  B\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\'space''space'B
     * gets Name in RFC1779 format
     * compares with expected value of name - \'space''space'B
     */
    public void testNameSpaces_RFC2253_02() throws Exception {
        String dn = "CN=\\  B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=\\ \\ B", s);

    }

    /**
     * Inits X500Principal with the string with special characters - \\'space''space'B
     * gets Name in CANONICAL format
     * compares with expected value of name - \'space''space'b
     */
    public void testNameSpaces_CANONICAL_02() throws Exception {
        String dn = "CN=\\  B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=b", s);

    }

    /**
     * Inits X500Principal with the string with special characters - ""B
     * checks if the proper exception is thrown
     */
    public void testNameQu() throws Exception {
        String dn = "CN=\"\"B";
        try {
            new X500Principal(dn);
            fail("No IllegalArgumentException on improper string");
        } catch (IllegalArgumentException e) {
        }
    }

    /**
     * Inits X500Principal with the string with special characters - "A\"B"
     * gets Name in RFC1779 format
     * compares with expected value of name - "A\"B"
     */
    public void testNameQu_RFC1779_2() throws Exception {
        String dn = "CN=\"A\\\"B\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"A\\\"B\"", s);
    }

    /**
     * Inits X500Principal with the string with special characters - "A\"B"
     * gets Name in RFC2253 format
     * compares with expected value of name - A\"B
     */
    public void testNameQu_RFC2253_2() throws Exception {
        String dn = "CN=\"A\\\"B\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A\\\"B", s);
    }

    /**
     * Inits X500Principal with the string with special characters - "A\"B"
     * gets Name in CANONICAL format
     * compares with expected value of name - a\"b
     */
    public void testNameQu_CANONICAL_2() throws Exception {
        String dn = "CN=\"A\\\"B\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a\\\"b", s);

    }

    /**
     * Inits X500Principal with the string with special characters - "A\""
     * gets Name in RFC1779 format
     * compares with expected value of name - "A\""
     */
    public void testNameQu_RFC1779_3() throws Exception {
        String dn = "CN=\"A\\\"\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"A\\\"\"", s);
    }

    /**
     * Inits X500Principal with the string with special characters - "A\""
     * gets Name in RFC2253 format
     * compares with expected value of name - A\"
     */
    public void testNameQu_RFC2253_3() throws Exception {
        String dn = "CN=\"A\\\"\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A\\\"", s);
    }

    /**
     * Inits X500Principal with the string with special characters - "A\""
     * gets Name in CANONICAL format
     * compares with expected value of name - A\"
     */
    public void testNameQu_CANONICAL_3() throws Exception {
        String dn = "CN=\"A\\\"\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a\\\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - "A\", C=B"
     * gets Name in RFC1779 format
     * compares with expected value of name - "A\", C=B"
     */
    public void testNameQu_4() throws Exception {
        String dn = "CN=\"A\\\", C=B\"";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"A\\\", C=B\"", s);

    }

    /**
     * Inits X500Principal with the string with special characters - CN="A\\", C=B
     * gets Name in RFC1779 format
     * compares with expected value of name - CN="A\\", C=B
     */
    public void testNameQu_5() throws Exception {
        String dn = "CN=\"A\\\\\", C=B";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"A\\\\\", C=B", s);

    }

    /**
     * Inits X500Principal with the string with special characters - CN=A\nB
     * gets Name in RFC1779 format
     * compares with expected value of name - CN="A\nB"
     */
    public void testNameCR_RFC1779() throws Exception {
        String dn = "CN=A\nB";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC1779);
        assertEquals("CN=\"A\nB\"", s);
    }

    /**
     * Inits X500Principal with the string with special characters - CN=A\nB
     * gets Name in RFC2253 format
     * compares with expected value of name - CN=A\nB
     */
    public void testNameCR_RFC2253() throws Exception {
        String dn = "CN=A\nB";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.RFC2253);
        assertEquals("CN=A\nB", s);
    }

    /**
     * Inits X500Principal with the string with special characters - CN=A\nB
     * gets Name in CANONICAL format
     * compares with expected value of name - cn=a\nb
     */
    public void testNameCR_CANONICAL() throws Exception {
        String dn = "CN=A\nB";
        X500Principal principal = new X500Principal(dn);
        String s = principal.getName(X500Principal.CANONICAL);
        assertEquals("cn=a\nb", s);
    }

    public static final String[] RFC2253_SPECIAL = new String[] { ",", "=",
            "+", "<", ">", "#", ";" };

    public void testValidDN() throws Exception {

        TestList list = new TestList();

        list.add("", "", "", "", new byte[] { 0x30, 0x00 }); // empty RDN sequence

        // sequence of RDN: RDN *("," RDN)
        list.add("CN=A,C=B", "CN=A,C=B", "CN=A, C=B", "cn=a,c=b");
        list.add("C=B,CN=A", "C=B,CN=A", "C=B, CN=A", "c=b,cn=a");
        list.add("CN=A,CN=A", "CN=A,CN=A", "CN=A, CN=A", "cn=a,cn=a"); // duplicate RDNs

        // sequence of RDN: RFC 1779 compatibility
        list.add("CN=A , C=B", "CN=A,C=B", "CN=A, C=B");
        list.add("CN=A  ,  C=B", "CN=A,C=B", "CN=A, C=B");
        list.add("CN=A;C=B", "CN=A,C=B", "CN=A, C=B");
        list.add("CN=A ; C=B", "CN=A,C=B", "CN=A, C=B");
        //FIXME list.add("CN=A\r,\rC=B", "CN=A,C=B"); // <CR> & comma => comma
        list.add("  CN=A,C=B  ", "CN=A,C=B", "CN=A, C=B"); // spaces at beg&end
        list.add("  CN=A,C=\"B\"  ", "CN=A,C=B", "CN=A, C=B"); // spaces at beg&end

        // set of ATAV: ATAV *("+" ATAV)
        list.add("CN=A+ST=CA", "CN=A+ST=CA", "CN=A + ST=CA", "cn=a+st=ca");
        list.add("CN=A+CN=A", "CN=A+CN=A", "CN=A + CN=A", "cn=a+cn=a"); // duplicate AT
        list
                .add("2.5.4.3=A+2.5.4.3=A", "CN=A+CN=A", "CN=A + CN=A",
                        "cn=a+cn=a"); // duplicate AT

        // set of ATAV: RFC 1779 compatibility
        list.add("CN=A + ST=CA", "CN=A+ST=CA", "CN=A + ST=CA");
        list.add("CN=A  +  ST=CA", "CN=A+ST=CA", "CN=A + ST=CA");
        //FIXME list.add("CN=A\r+\rST=CA", "CN=A+ST=CA"); // <CR> & '+' => '+'

        // ATAV = AttributeType "=" AttributeValue
        list.add("CN=A", "CN=A", "CN=A");
        list.add("cn=A", "CN=A", "CN=A"); // AT case insensitive
        list.add("cN=A", "CN=A", "CN=A"); // AT case insensitive
        list.add("cn=a", "CN=a", "CN=a"); // AT case insensitive

        // ATAV : RFC 1779 compatibility
        list.add("CN = A", "CN=A", "CN=A");
        list.add("CN  =  A", "CN=A", "CN=A");
        // FIXME list.add("CN\r=\rA", "CN=A"); // <CR> & '=' => '='

        // AttributeType = <name string> | <OID>
        // testing OID case :  OID => <name string>
        // tested all OIDs from RFC 2253 (2.3) and RFC 1779 (Table 1)

        // different variants of 2.5.4.3 (CN) OID
        list.add("OID.2.5.4.3=A", "CN=A", "CN=A");
        list.add("oid.2.5.4.3=A", "CN=A", "CN=A");
        list.add("2.5.4.3=A", "CN=A", "CN=A");
        list.add("02.5.4.3=A", "CN=A", "CN=A"); // first: 02 => 2
        list.add("2.5.4.0003=A", "CN=A", "CN=A"); // last: 0003 => 3

        // the rest of OIDs
        list.add("2.5.4.7=A", "L=A", "L=A", "l=a");
        list.add("2.5.4.8=A", "ST=A", "ST=A", "st=a");
        list.add("2.5.4.10=A", "O=A", "O=A", "o=a");
        list.add("2.5.4.11=A", "OU=A", "OU=A", "ou=a");
        list.add("2.5.4.6=A", "C=A", "C=A", "c=a");
        list.add("2.5.4.9=A", "STREET=A", "STREET=A", "street=a");
        list.add("0.9.2342.19200300.100.1.25=A", "DC=A",
                "OID.0.9.2342.19200300.100.1.25=A", "dc=#160141");
        list.add("0.9.2342.19200300.100.1.1=A", "UID=A",
                "OID.0.9.2342.19200300.100.1.1=A", "uid=a");

        // attribute types from RFC 2459 (see Appendix A)
        // keywords are from the API spec
        list.add("T=A", "2.5.4.12=#130141", "OID.2.5.4.12=A",
                "2.5.4.12=#130141");
        list.add("DNQ=A", "2.5.4.46=#130141", "OID.2.5.4.46=A",
                "2.5.4.46=#130141");
        list.add("DNQUALIFIER=A", "2.5.4.46=#130141", "OID.2.5.4.46=A",
                "2.5.4.46=#130141");
        list.add("SURNAME=A", "2.5.4.4=#130141", "OID.2.5.4.4=A",
                "2.5.4.4=#130141");
        list.add("GIVENNAME=A", "2.5.4.42=#130141", "OID.2.5.4.42=A",
                "2.5.4.42=#130141");
        list.add("INITIALS=A", "2.5.4.43=#130141", "OID.2.5.4.43=A",
                "2.5.4.43=#130141");
        list.add("GENERATION=A", "2.5.4.44=#130141", "OID.2.5.4.44=A",
                "2.5.4.44=#130141");
        list.add("EMAILADDRESS=A", "1.2.840.113549.1.9.1=#160141",
                "OID.1.2.840.113549.1.9.1=A", "1.2.840.113549.1.9.1=#160141",
                null, (byte) 0x05); //FIXME bug???
        list.add("SERIALNUMBER=A", "2.5.4.5=#130141", "OID.2.5.4.5=A",
                "2.5.4.5=#130141");

        // AttributeValue => BER encoding (if OID in dotted-decimal form)
        // see RFC 2253 (2.4)
        list.add("OID.2.5.4.12=A", "2.5.4.12=#130141", "OID.2.5.4.12=A");
        list.add("oid.2.5.4.12=A", "2.5.4.12=#130141", "OID.2.5.4.12=A");
        list.add("2.5.4.12=A", "2.5.4.12=#130141", "OID.2.5.4.12=A");
        list.add("1.1=A", "1.1=#130141", "OID.1.1=A");

        //
        // AttributeValue first alternative : *( stringchar / pair )
        // testing pair characters.
        //
        // Note: for RFC1779 quoted string is returned (unspecified)
        //
        list.add("CN=", "CN=", "CN="); // zero string chars
        list.add("CN= ", "CN=", "CN="); // zero string chars
        list.add("CN=A+ST=", "CN=A+ST=", "CN=A + ST="); // zero string chars
        list.add("CN=+ST=A", "CN=+ST=A", "CN= + ST=A"); // empty value for 1 RDN
        list.add("CN=A+ST= ", "CN=A+ST=", "CN=A + ST="); // empty value for 1 RDN
        list.add("CN=+ST=", "CN=+ST=", "CN= + ST="); // empty value for both RDNs
        list.add("CN=,ST=B", "CN=,ST=B", "CN=, ST=B"); // empty value for 1 RDN
        list.add("CN=,ST=", "CN=,ST=", "CN=, ST="); // empty value for both RDNs
        list.add("CN=;ST=B", "CN=,ST=B", "CN=, ST=B"); // empty value for 1 RDN
        list.add("CN=;ST=", "CN=,ST=", "CN=, ST="); // empty value for both RDNs
        for (String element : RFC2253_SPECIAL) {
            // \special
            list.add("CN=\\" + element,
                    "CN=\\" + element, "CN=\"" + element
                    + "\"");

            // A + \special + B
            list.add("CN=A\\" + element + "B", "CN=A\\"
                    + element + "B", "CN=\"A" + element
                    + "B\"");
        }

        // pair = \"
        list.add("CN=\\\"", "CN=\\\"", "CN=\"\\\"\"", null, (byte) 0x02);
        list.add("CN=\\\"A", "CN=\\\"A", "CN=\"\\\"A\"", null, (byte) 0x02);
        list.add("CN=\\\",C=\\\"", "CN=\\\",C=\\\"", "CN=\"\\\"\", C=\"\\\"\"",
                null, (byte) 0x02); // 2 RDN
        list.add("CN=A\\\"B", "CN=A\\\"B", "CN=\"A\\\"B\"", null, (byte) 0x02); // A\"B
        list.add("CN=A ST=B", "CN=A ST\\=B", "CN=\"A ST=B\""); // no RDN separator

        // pair = \space
        list.add("CN=\\ ", "CN=\\ ", "CN=\" \"", "cn=");

        // pair = \hexpair
        list.add("CN=\\41", "CN=A", "CN=A"); // 0x41=='A'
        list.add("CN=\\41\\2C", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2C=','
        list.add("CN=\\41\\2c", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2c=','
        list.add("CN=\\D0\\AF", "CN=" + ((char) 1071), "CN=" + ((char) 1071),
                new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                        0x55, 0x04, 0x03,
                        // UTF8 String
                        0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // 0xD0AF == the last letter(capital) of Russian alphabet
        list.add("CN=\\D0\\AFA\\41", "CN=" + ((char) 1071) + "AA", "CN="
                + ((char) 1071) + "AA", new byte[] { 0x30, 0x0F, 0x31, 0x0D,
                0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, 0x03,
                // UTF8 String
                0x0C, 0x04, (byte) 0xD0, (byte) 0xAF, 0x41, 0x41 }); // 0xD0AF == the last letter(capital) of Russian alphabet
        // UTF-8(0xE090AF) is non-shortest form of UTF-8(0xD0AF)
        //FIXME list.add("CN=\\E0\\90\\AF", "CN=" + ((char) 1071), "CN="
        //        + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
        //        0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
        //        // UTF8 String
        //        0x0C, 0x02, (byte) 0xD0, (byte) 0xAF });
        // UTF-8(0xF08090AF) is non-shortest form of UTF-8(0xD0AF)
        //FIXME list.add("CN=\\F0\\80\\90\\AF", "CN=" + ((char) 1071), "CN="
        //        + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
        //        0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
        //        // UTF8 String
        //        0x0C, 0x02, (byte) 0xD0, (byte) 0xAF });
        //FIXME        list.add("CN=\\D0", "CN=" + ((char) 65533), "CN=" + ((char) 65533),
        //                new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
        //                        0x55, 0x04, 0x03,
        //                        // UTF8 String
        //                        0x0C, 0x01, 0x3F }); // 0xD0 is not correct UTF8 char => '?'
        list.add("CN=\\41+ST=A", "CN=A+ST=A", "CN=A + ST=A"); // 0x41=='A'
        list.add("CN=\\41\\2C+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2C=','
        list.add("CN=\\41\\2c+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2c=','

        // stringchar '=' or not leading '#'
        //FIXME RFC 2253 grammar violation: '=' and '#' is a special char
        list.add("CN==", "CN=\\=", "CN=\"=\"");
        list.add("CN=A=", "CN=A\\=", "CN=\"A=\"");
        list.add("CN=A#", "CN=A\\#", "CN=\"A#\"");

        // not leading or trailing spaces
        list.add("CN=A B", "CN=A B", "CN=A B", "cn=a b");
        list.add("CN=A\\ B", "CN=A B", "CN=A B", "cn=a b");
        list.add("CN=A \\,B", "CN=A \\,B", "CN=\"A ,B\"", "cn=a \\,b");

        //not alphabet chars
        list.add("CN=$", "CN=$", "CN=$", new byte[] { 0x30, 0x0C, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
                //UTF-8 String: "$"
                0x0C, 0x01, 0x24 });
        list.add("CN=(", "CN=(", "CN=(", new byte[] { 0x30, 0x0C, 0x31, 0x0A,
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
                //PrintableString: "("
                0x13, 0x01, 0x28 });

        //
        //
        // AttributeValue second alternative : "#" hexstring
        //
        //
        list.add("CN=#130141", "CN=A", "CN=A", "cn=a"); // ASN1 Printable hex string = 'A'
        list.add("CN=#140141", "CN=A", "CN=A", "cn=a", new byte[] { 0x30,
                0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
                0x14, 0x01, 0x41 }); // ASN1 Teletex hex string = 'A'

        list.add("CN=#010100", "CN=#010100", "CN=#010100", "cn=#010100"); // ASN1 Boolean = FALSE
        list.add("CN=#0101fF", "CN=#0101ff", "CN=#0101FF", "cn=#0101ff"); // ASN1 Boolean = TRUE
        //FIXME list.add("CN=#3000", "CN=#3000", "CN=#3000"); // ASN1 Sequence
        //FIXME list.add("CN=#0500", "CN=A", "CN=A"); // ASN1 Null
        list.add("CN= #0101fF", "CN=#0101ff", "CN=#0101FF", // space at beginning
                new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                        0x55, 0x04, 0x03, 0x01, 0x01, (byte) 0xFF } // ASN.1 Boolean = TRUE
        );
        list.add("CN= #0101fF+ST=A", "CN=#0101ff+ST=A", "CN=#0101FF + ST=A",
                "cn=#0101ff+st=a"); //space
        list.add("CN= #0101fF ", "CN=#0101ff", "CN=#0101FF", // space at the end
                new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                        0x55, 0x04, 0x03, 0x01, 0x01, (byte) 0xFF } // ASN.1 Boolean = TRUE
                , (byte) 0x00);

        //FIXME unspecified output for RFC1779
        //FIXME list.add("CN=#1C0141", "CN=A", "CN=A"); // ASN1 Universal hex string = 'A'
        //FIXME list.add("CN=#1E0141", "CN=A", "CN=A"); // ASN1 Bmp hex string = 'A'

        //
        // AttributeValue third alternative : " *( quotechar / pair ) "
        // quotechar = <any character except '\' or '"' >
        //
        // Note:
        // RFC2253: passed quoted AV string is unquoted, special chars are escaped
        // RFC1779: escaped quoted chars are unescaped
        //
        list.add("CN=\"\"", "CN=", "CN="); // empty quoted string
        list.add("CN=\"A\"", "CN=A", "CN=A"); // "A"
        for (String element : RFC2253_SPECIAL) {
            // "special" => \special
            list.add("CN=\"" + element + "\"", "CN=\\"
                    + element, "CN=\"" + element + "\"");

            // "A + special + B" => A + \special + B
            list.add("CN=\"A" + element + "B\"", "CN=A\\"
                    + element + "B", "CN=\"A" + element
                    + "B\"");
        }
        for (String element : RFC2253_SPECIAL) {
            // "\special" => \special
            list.add("CN=\"\\" + element + "\"", "CN=\\"
                    + element, "CN=\"" + element + "\"");

            // "A + \special + B" => A + \special + B
            list.add("CN=\"A\\" + element + "B\"", "CN=A\\"
                    + element + "B", "CN=\"A" + element
                    + "B\"");
        }
        list.add("CN=\"\\\"\"", "CN=\\\"", "CN=\"\\\"\"", null, (byte) 0x02); // "\""
        list.add("CN=\"A\\\"B\"", "CN=A\\\"B", "CN=\"A\\\"B\"", null,
                (byte) 0x02); // "A\"B"

        // pair = \hexpair (test cases are the same as for the first alternative)
        list.add("CN=\"\\41\"", "CN=A", "CN=A"); // 0x41=='A'
        list.add("CN=\"\\41\\2C\"", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2C=','
        list.add("CN=\"\\41\\2c\"", "CN=A\\,", "CN=\"A,\""); // 0x41=='A', 0x2c=','
        list.add("CN=\"\\D0\\AF\"", "CN=" + ((char) 1071), "CN="
                + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
                // UTF8 String
                0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // 0xD0AF == the last letter(capital) of Russian alphabet
        list.add("CN=\"\\D0\\AFA\\41\"", "CN=" + ((char) 1071) + "AA", "CN="
                + ((char) 1071) + "AA", new byte[] { 0x30, 0x0F, 0x31, 0x0D,
                0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, 0x03,
                // UTF8 String
                0x0C, 0x04, (byte) 0xD0, (byte) 0xAF, 0x41, 0x41 }); // 0xD0AF == the last letter(capital) of Russian alphabet
        list.add("CN=\"\\E0\\90\\AF\"", "CN=" + ((char) 1071), "CN="
                + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
                // UTF8 String
                0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // UTF8(0xE090AF that is not quite correct)== UTF8(0xD0AF) == the last letter(capital) of Russian alphabet
        list.add("CN=\"\\F0\\80\\90\\AF\"", "CN=" + ((char) 1071), "CN="
                + ((char) 1071), new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30,
                0x09, 0x06, 0x03, 0x55, 0x04, 0x03,
                // UTF8 String
                0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }); // UTF8(0xF08090AF that is not quite correct)== UTF8(0xD0AF) == the last letter(capital) of Russian alphabet

        list.add("CN=\"\\41\"+ST=A", "CN=A+ST=A", "CN=A + ST=A"); // 0x41=='A'
        list.add("CN=\"\\41\\2C\"+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2C=','
        list.add("CN=\"\\41\\2c\"+ST=A", "CN=A\\,+ST=A", "CN=\"A,\" + ST=A"); // 0x41=='A', 0x2c=','

        // AttributeValue third alternative : RFC 1779 compatibility
        //FIXME list.add("CN=\"\r\"", "CN=\"\r\""); // "<CR>"
        //FIXME list.add("CN=\"\\\r\"", "CN=\"\\\r\""); // "\<CR>"

        // AttributeValue : RFC 1779 compatibility
        list.add("CN=  A  ", "CN=A", "CN=A", "cn=a"); // leading & trailing spaces
        list.add("CN=\\  A  ", "CN=\\ \\ A", "CN=\"  A\"", "cn=a", null,
                (byte) 0x01); // escaped leading space
        list.add("CN=  A \\ ", "CN=A\\ \\ ", "CN=\"A  \"", "cn=a", null,
                (byte) 0x01); // escaped trailing space

        list.add("CN=  \"A\"  ", "CN=A", "CN=A", "cn=a"); // leading & trailing spaces

        StringBuffer errorMsg = new StringBuffer();
        for (int i = 0; i < list.size(); i++) {

            Object[] obj = list.get(i);

            String dn = (String) obj[0];
            String rfc2253 = (String) obj[1];
            String rfc1779 = (String) obj[2];
            String canonical = (String) obj[3];
            byte[] encoded = (byte[]) obj[4];
            byte mask = ((byte[]) obj[5])[0];

            try {
                X500Principal p = new X500Principal(dn);
                if (!rfc2253.equals(p.getName(X500Principal.RFC2253))) {
                    if (!testing || ((mask & 0x01) == 0)) {

                        errorMsg.append("\nRFC2253: " + i);
                        errorMsg.append(" \tparm: '" + dn + "'");
                        errorMsg.append("\t\texpected: '" + rfc2253 + "'");
                        errorMsg.append("\treturned: '"
                                + p.getName(X500Principal.RFC2253) + "'");
                    }
                }

                if (!rfc1779.equals(p.getName(X500Principal.RFC1779))) {
                    if (!testing || ((mask & 0x02) == 0)) {

                        errorMsg.append("\nRFC1779: " + i);
                        errorMsg.append(" \tparm: '" + dn + "'");
                        errorMsg.append("\t\texpected: '" + rfc1779 + "'");
                        errorMsg.append("\treturned: '"
                                + p.getName(X500Principal.RFC1779) + "'");
                    }
                }

                if (canonical != null) {
                    if (!canonical.equals(p.getName(X500Principal.CANONICAL))) {
                        if (!testing || ((mask & 0x04) == 0)) {

                            errorMsg.append("\nCANONICAL: " + i);
                            errorMsg.append("\tparm: '" + dn + "'");
                            errorMsg.append("\t\texpected: '" + canonical + "'");
                            errorMsg.append("\treturned: '"
                                    + p.getName(X500Principal.CANONICAL) + "'");
                        }
                    }
                }

                if (encoded != null) {
                    if (!Arrays.equals(encoded, p.getEncoded())) {
                        if (!testing || ((mask & 0x08) == 0)) {

                            errorMsg.append("\nUnexpected encoding for: " + i
                                    + ", dn= '" + dn + "'");

                            System.out.println("\nI " + i);
                            byte[] enc = p.getEncoded();
                            for (byte element : enc) {
                                System.out.print(", 0x"
                                        + Integer.toHexString(element));
                            }
                        }
                    }
                }
            } catch (IllegalArgumentException e) {
                errorMsg.append("\nIllegalArgumentException: " + i);
                errorMsg.append("\tparm: '" + dn + "'");
            } catch (Exception e) {
                errorMsg.append("\nException: " + i);
                errorMsg.append("\tparm: '" + dn + "'");
                errorMsg.append("\texcep: " + e.getClass().getName());
            }
        }

        if (errorMsg.length() != 0) {
            fail(errorMsg.toString());
        }

    }

    public void testInvalidDN() {
        String[] illegalDN = new String[] {
                // RDN
                //FIXME " ", // space only
                "CN", // attribute type only
                "CN=A;", // RFC 1779: BNF allows this, but ...
                "CN=A,", // RFC 1779: BNF allows this, but ...
                ",CN=A", // no AttributeType for first RDN
                "CN=,A", // no AttributeType for second RDN
                "CN=A+", // no AttributeTypeAndValue for second RDN
                "CN=#130141 ST=B", // no RDN separator

                // AttributeType = <name string> | <OID>
                "AAA=A", // no such <name string>
                "1..1=A", // wrong OID
                ".1.1=A", // wrong OID
                "11=A", // wrong OID
                "1=A", // wrong OID
                "AID.1.1=A", // wrong OID
                "1.50=A", // wrong OID
                "5.1.0=A", // wrong OID
                "2.-5.4.3=A", // wrong OID
                "2.5.-4.3=A", // wrong OID
                "2.5.4-.3=A", // wrong OID
                //FIXME "2.5.4.-3=A", // wrong OID

                // AttributeValue first alternative : *( stringchar / pair )
                "CN=,", // stringchar = ','
                //FIXME "CN==",
                "CN=+", // stringchar = '+'
                //FIXME "CN=<", // stringchar = '<'
                //FIXME "CN=>", // stringchar = '>'
                "CN=#", // stringchar = '#'
                //FIXME "CN=Z#", // stringchar = '#'
                "CN=;", // stringchar = ';'
                "CN=\"", // stringchar = "
                //FIXME "CN=A\"B", // stringchar = "
                "CN=\\", // stringchar = \
                "CN=A\\", // stringchar = \
                "CN=A\\B", // stringchar = \
                "CN=\\z", // invalid pair = \z
                "CN=\\4", // invalid pair = \4
                "CN=\\4Z", // invalid pair = \4Z
                "CN=\\4\\2c", // invalid pair = \4\2c

                // AttributeValue second alternative : "#" hexstring
                "CN=#", // no hex string
                "CN=#2", // no hex pair
                "CN=#22", // hexpair is not BER encoding
                "CN=#0001", // invalid BER encoding (missed content)
                "CN=#000201", // invalid BER encoding (wrong length)
                "CN=#0002010101", // invalid BER encoding (wrong length)
                "CN=#00FF", // invalid BER encoding (wrong length)
                "CN=#ZZ", // not hex pair

                // FIXME boolean with indefinite length
                //"CN=#0100010000", // invalid BER encoding (wrong length)

                // AttributeValue third alternative : " *( quotechar / pair ) "
                "CN=\"A\" B", // TODO comment me
                "CN=\"A\\", // TODO comment me
                "CN=\"\\4\"", // invalid pair = \4
                "CN=\"\\4Z\"", // invalid pair = \4Z
                "CN=\"\\4\\2c\"", // invalid pair = \4\2c
        };

        StringBuffer errorMsg = new StringBuffer();
        for (String element : illegalDN) {

            try {
                new X500Principal(element);
                errorMsg.append("No IllegalArgumentException: '" + element
                        + "'\n");
            } catch (IllegalArgumentException e) {
            }
        }

        if (errorMsg.length() != 0) {
            fail(errorMsg.toString());
        }
    }

    public void testValidEncoding() {
        TestList list = new TestList();

        //
        // Empty
        //
        list.add(new byte[] { 0x30, 0x00 }, "", "", "");
        list.add(new byte[] { 0x30, 0x02, 0x31, 0x00 }, "", "", ""); //??? invalid size constraints

        //
        // Known OID + string with different tags(all string)
        //
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // PrintableString
                0x13, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // TeletexString
                0x14, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
        //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
        //                0x55, 0x04, 0x03,
        //                // UniversalString
        //                0x1C, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String
                0x0C, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");
        //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
        //                0x55, 0x04, 0x03,
        //                // BMPString
        //                0x1E, 0x01, 0x5A }, "CN=Z", "CN=Z", "cn=z");

        //
        // Unknown OID + string with different tags(all string)
        //
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // PrintableString
                0x13, 0x01, 0x5A }, "0.0=#13015a", "OID.0.0=Z", "0.0=#13015a");
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // TeletexString
                0x14, 0x01, 0x5A }, "0.0=#14015a", "OID.0.0=Z", "0.0=#14015a");
        //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
        //                0x00,
        //                // UniversalString
        //                0x1C, 0x01, 0x5A }, "0.0=#1c015a", "OID.0.0=Z", "cn=z");
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // UTF8String
                0x0C, 0x01, 0x5A }, "0.0=#0c015a", "OID.0.0=Z", "0.0=#0c015a");
        //FIXME:compatibility        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
        //                0x00,
        //                // BMPString
        //                0x1E, 0x01, 0x5A }, "0.0=#1e015a", "OID.0.0=Z", "cn=z");

        //
        // Known OID + not a string value
        //
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // Boolean
                0x01, 0x01, (byte) 0xFF }, "CN=#0101ff", "CN=#0101FF",
                "cn=#0101ff");
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // Integer
                0x02, 0x01, 0x0F }, "CN=#02010f", "CN=#02010F", "cn=#02010f");
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // BitString
                0x03, 0x01, 0x00 }, "CN=#030100", "CN=#030100", "cn=#030100");
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // SEQUENCE
                0x30, 0x01, 0x0A }, "CN=#30010a", "CN=#30010A", "cn=#30010a");

        //
        // unknown OID + not a string value
        //
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // Boolean
                0x01, 0x01, (byte) 0xFF }, "0.0=#0101ff", "OID.0.0=#0101FF",
                "0.0=#0101ff");
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // Integer
                0x02, 0x01, 0x0F }, "0.0=#02010f", "OID.0.0=#02010F",
                "0.0=#02010f");
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // BitString
                0x03, 0x01, 0x00 }, "0.0=#030100", "OID.0.0=#030100",
                "0.0=#030100");
        list.add(new byte[] { 0x30, 0x0A, 0x31, 0x08, 0x30, 0x06, 0x06, 0x01,
                0x00,
                // SEQUENCE
                0x30, 0x01, 0x0A }, "0.0=#30010a", "OID.0.0=#30010A",
                "0.0=#30010a");

        //
        // Known OID + UTF-8 string with chars to be escaped
        //

        // spaces
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: a single space char
                0x0C, 0x01, 0x20 }, "CN=\\ ", "CN=\" \"", "cn=");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: a space char at the beginning
                0x0C, 0x02, 0x20, 0x5A }, "CN=\\ Z", "CN=\" Z\"", "cn=z");
        list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: two space chars at the beginning
                0x0C, 0x03, 0x20, 0x20, 0x5A }, "CN=\\ \\ Z", "CN=\"  Z\"",
                "cn=z", (byte) 0x01);
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: a space char at the end
                0x0C, 0x02, 0x5A, 0x20 }, "CN=Z\\ ", "CN=\"Z \"", "cn=z");
        list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: two space chars at the end
                0x0C, 0x03, 0x5A, 0x20, 0x20 }, "CN=Z\\ \\ ", "CN=\"Z  \"",
                "cn=z", (byte) 0x01);

        // special chars
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: a '#' char at the beginning
                0x0C, 0x02, 0x23, 0x5A }, "CN=\\#Z", "CN=\"#Z\"", "cn=\\#z");
        list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: two '#' chars
                0x0C, 0x03, 0x23, 0x5A, 0x23 }, "CN=\\#Z\\#", "CN=\"#Z#\"",
                "cn=\\#z#");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: ','
                0x0C, 0x02, 0x5A, 0x2C }, "CN=Z\\,", "CN=\"Z,\"", "cn=z\\,");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '+'
                0x0C, 0x02, 0x5A, 0x2B }, "CN=Z\\+", "CN=\"Z+\"", "cn=z\\+");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '"'
                0x0C, 0x02, 0x5A, 0x22 }, "CN=Z\\\"", "CN=\"Z\\\"\"",
                "cn=z\\\"", (byte) 0x02);
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '\'
                0x0C, 0x02, 0x5A, 0x5C }, "CN=Z\\\\", "CN=\"Z\\\\\"",
                "cn=z\\\\", (byte) 0x02);
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '<'
                0x0C, 0x02, 0x5A, 0x3C }, "CN=Z\\<", "CN=\"Z<\"", "cn=z\\<");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '>'
                0x0C, 0x02, 0x5A, 0x3E }, "CN=Z\\>", "CN=\"Z>\"", "cn=z\\>");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: ';'
                0x0C, 0x02, 0x5A, 0x3B }, "CN=Z\\;", "CN=\"Z;\"", "cn=z\\;");
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '='
                0x0C, 0x02, 0x5A, 0x3D }, "CN=Z\\=", "CN=\"Z=\"", "cn=z=");
        //FIXME        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
        //                0x55, 0x04, 0x03,
        //                // UTF8String: ';'
        //                0x0C, 0x02, 0x5A, 0x0D }, "CN=Z\\\r", "CN=\"Z\r\"", "cn=z");

        // combinations
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: '\ '
                0x0C, 0x02, 0x5C, 0x20 }, "CN=\\\\\\ ", "CN=\"\\\\ \"",
                "cn=\\\\", (byte) 0x02);
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: ' \'
                0x0C, 0x02, 0x20, 0x5C }, "CN=\\ \\\\", "CN=\" \\\\\"",
                "cn=\\\\", (byte) 0x02);
        list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: ' \ '
                0x0C, 0x03, 0x20, 0x5C, 0x20 }, "CN=\\ \\\\\\ ",
                "CN=\" \\\\ \"", "cn=\\\\", (byte) 0x02);
        list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: 'Z Z' no escaping
                0x0C, 0x03, 0x5A, 0x20, 0x5A }, "CN=Z Z", "CN=Z Z", "cn=z z");
        list.add(new byte[] { 0x30, 0x0F, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: 'Z  Z' no escaping
                0x0C, 0x04, 0x5A, 0x20, 0x20, 0x5A }, "CN=Z  Z", "CN=\"Z  Z\"",
                "cn=z z", (byte) 0x02);
        list.add(new byte[] { 0x30, 0x0F, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: ' #Z ' no escaping
                0x0C, 0x04, 0x20, 0x23, 0x5A, 0x20 }, "CN=\\ \\#Z\\ ",
                "CN=\" #Z \"", "cn=#z");

        //
        // Special cases
        //
        //        list.add(new byte[] {
        //        // Name
        //                0x30, 0x13, 0x31, 0x11, 0x30, 0x0F,
        //                // OID
        //                0x06, 0x0A, 0x09, (byte) 0x92, 0x26, (byte) 0x89, (byte) 0x93,
        //                (byte) 0xF2, 0x2C, 0x64, 0x01, 0x01,
        //                // ANY
        //                0x13, 0x01, 0x41 }, "UID=A", "OID.0.9.2342.19200300.100.1.1=A",
        //                "uid=a");
        //
        //        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
        //                0x55, 0x04, 0x03, 0x1E, 0x01, 0x5A }, "CN=Z", "CN=Z",
        //                "cn=#1e015a");

        //
        // Multi-valued DN
        //
        list.add(new byte[] { 0x30, 0x14, 0x31, 0x12,
                // 1
                0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
                // UTF8String: 'Z'
                0x0C, 0x01, 0x5A,
                //2
                0x30, 0x06, 0x06, 0x01, 0x01,
                // UTF8String: 'A'
                0x0C, 0x01, 0x41 }, "CN=Z+0.1=#0c0141", "CN=Z + OID.0.1=A",
                "cn=z+0.1=#0c0141");

        //
        //
        //
        list.add(new byte[] { 0x30, 0x0D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // UTF8String: the last letter(capital) of Russian alphabet
                0x0C, 0x02, (byte) 0xD0, (byte) 0xAF }, "CN=" + ((char) 1071),
                "CN=" + ((char) 1071), "cn=" + ((char) 1103));
        // FIXME list.add(new byte[] { 0x30, 0x0E, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03,
        //        0x55, 0x04, 0x03,
        //        // UTF8String: the last letter(capital) of Russian alphabet
        //        0x0C, 0x03, (byte) 0xE0, (byte) 0x90, (byte) 0xAF }, "CN="
        //        + ((char) 1071), "CN=" + ((char) 1071), "cn=" + ((char) 1103));
        // FIXME list.add(
        //        new byte[] { 0x30, 0x0F, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03,
        //                0x55, 0x04, 0x03,
        //                // UTF8String: the last letter(capital) of Russian alphabet
        //                0x0C, 0x04, (byte) 0xF0, (byte) 0x80, (byte) 0x90,
        //                (byte) 0xAF }, "CN=" + ((char) 1071), "CN="
        //                + ((char) 1071), "cn=" + ((char) 1103));
        list.add(new byte[] { 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03,
                0x55, 0x04, 0x03,
                // PrintableString: char '$' is not in table 8 (X.680)
                0x13, 0x01, 0x24 }, "CN=$", "CN=$", "cn=$");

        StringBuffer errorMsg = new StringBuffer();
        for (int i = 0; i < list.size(); i++) {

            Object[] values = list.get(i);
            byte[] encoded = (byte[]) values[0];
            String rfc2253 = (String) values[1];
            String rfc1179 = (String) values[2];
            String canonical = (String) values[3];
            byte mask = ((byte[]) values[4])[0];

            X500Principal p;
            try {
                p = new X500Principal(encoded);

                if (!rfc2253.equals(p.getName(X500Principal.RFC2253))) {
                    if (!testing || ((mask & 0x01) == 0)) {
                        errorMsg.append("RFC2253: " + i);
                        errorMsg.append("\t\texpected: '" + rfc2253 + "'");
                        errorMsg.append("\treturned: '"
                                + p.getName(X500Principal.RFC2253) + "'\n");
                    }
                }

                if (!rfc1179.equals(p.getName(X500Principal.RFC1779))) {
                    if (!testing || ((mask & 0x02) == 0)) {
                        errorMsg.append("RFC1779: " + i);
                        errorMsg.append("\t\texpected: '" + rfc1179 + "'");
                        errorMsg.append("\treturned: '"
                                + p.getName(X500Principal.RFC1779) + "'\n");
                    }
                }

                if (!canonical.equals(p.getName(X500Principal.CANONICAL))) {
                    if (!testing || ((mask & 0x04) == 0)) {
                        errorMsg.append("CANONICAL: " + i);
                        errorMsg.append("\t\texpected: " + canonical + "'");
                        errorMsg.append("\treturned: '"
                                + p.getName(X500Principal.CANONICAL) + "'\n");
                    }
                }

            } catch (IllegalArgumentException e) {
                errorMsg.append("\nIllegalArgumentException: " + i + ", for "
                        + rfc2253);
                continue;
            } catch (Exception e) {
                errorMsg.append("Exception: " + i + ", for " + rfc2253);
                errorMsg.append("\texcep: " + e.getClass().getName() + "\n");
                continue;
            }

        }

        if (errorMsg.length() != 0) {
            fail(errorMsg.toString());
        }
    }

    @SuppressWarnings("serial")
    public static class TestList extends ArrayList<Object[]> {
        //
        // TODO comment me
        //
        public void add(String param, String rfc2253, String rfc1779) {
            add(param, rfc2253, rfc1779, (byte[]) null);
        }

        public void add(String param, String rfc2253, String rfc1779,
                String canonical) {
            add(param, rfc2253, rfc1779, canonical, null);
        }

        public void add(String param, String rfc2253, String rfc1779,
                byte[] encoded) {
            add(new Object[] { param, rfc2253, rfc1779, null, encoded,
                    emptyMask });
        }

        public void add(String param, String rfc2253, String rfc1779,
                byte[] encoded, byte mask) {
            add(new Object[] { param, rfc2253, rfc1779, null, encoded,
                    new byte[] { mask } });
        }

        public void add(String param, String rfc2253, String rfc1779,
                String canonical, byte[] encoded) {
            add(new Object[] { param, rfc2253, rfc1779, canonical, encoded,
                    emptyMask });
        }

        public void add(String param, String rfc2253, String rfc1779,
                String canonical, byte[] encoded, byte mask) {
            add(new Object[] { param, rfc2253, rfc1779, canonical, encoded,
                    new byte[] { mask } });
        }

        //
        // TODO comment me
        //

        private static final byte[] emptyMask = new byte[] { 0x00 };

        public void add(byte[] encoding, String rfc2253, String rfc1779,
                String canonical) {
            add(new Object[] { encoding, rfc2253, rfc1779, canonical, emptyMask });
        }

        public void add(byte[] encoding, String rfc2253, String rfc1779,
                String canonical, byte mask) {
            add(new Object[] { encoding, rfc2253, rfc1779, canonical,
                    new byte[] { mask } });
        }
    }


    public void testSerializationSelf() throws Exception {
        SerializationTest.verifySelf(getSerializationData());
    }

    public void testSerializationGolden() throws Exception {
        SerializationTest.verifyGolden(this, getSerializationData());
    }

    private Object[] getSerializationData() {
        return new Object[] { new X500Principal("CN=A"),
                new X500Principal("CN=A, C=B"),
                new X500Principal("CN=A, CN=B + C=C") };
    }
}

