/*
 *   
 *
 * Copyright  1990-2006 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation. 
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt). 
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA 
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions. 
 */

package com.sun.satsa.utils;

import com.sun.midp.i3test.TestCase;

import com.sun.satsa.pki.RFC2253Name;
import com.sun.satsa.util.TLV;
import com.sun.satsa.util.TLVException;
import com.sun.satsa.util.Utils;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

/**
 * This test case tests DomainComponent encoding 
 * made by RFC2253 class.
 */
public class TestIA5 extends TestCase {
    static byte[] testOneResult = {
        0x30,0x55,
            0x31,0x13,
                0x30,0x11,
                    0x06,0x0a,0x09,(byte)0x92,0x26,(byte)0x89,(byte)0x93,
                                          (byte)0xf2,0x2c,0x64,0x01,0x19,
                    0x16,0x03,0x63,0x6f,0x6d,
            0x31,0x13,
                0x30,0x11,
                    0x06,0x0a,0x09,(byte)0x92,0x26,(byte)0x89,(byte)0x93,
                                          (byte)0xf2,0x2c,0x64,0x01,0x19,
                    0x16,0x03,0x73,0x75,0x6e,
            0x31,0x13,
                0x30,0x11,
                    0x06,0x0a,0x09,(byte)0x92,0x26,(byte)0x89,(byte)0x93,
                                          (byte)0xf2,0x2c,0x64,0x01,0x19,
                    0x16,0x03,0x77,0x77,0x77,
            0x31,0x14,
                0x30,0x12,
                    0x06,0x03,0x55,0x04,0x03,
                    0x0c,0x0b,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
                                                       0x61,0x74,0x65
    };
    static byte[] testTwoResult = {
        0x30,0x29,
            0x31,0x10,
                0x30,0x0e,
                    0x06,0x0a,0x09,(byte)0x92,0x26,(byte)0x89,(byte)0x93,
                                          (byte)0xf2,0x2c,0x64,0x01,0x19,
                    0x16,0x00,
            0x31,0x15,
                0x30,0x13,
                    0x06,0x03,0x55,0x04,0x03,
                    0x0c,0x0c,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
                                                            0x74,0x65,0x31
    };

    /**
     * Tests DER encoding of DomainComponent.
     */
    private void testOne() {
        String nameInfo = 
            "cn=Certificate, dc=www, Dc=sun, dC=com";
        TLV name;
        boolean ok = true;

        try {
            name = new TLV(RFC2253Name.toDER(nameInfo), 0);
        } catch (TLVException e) {
            name = null;
            ok = false;
        }
        assertTrue("Invalid name", ok);
        assertTrue("Bad DER result", name != null && 
                    equal(name.getDERData(), testOneResult));
    }
    
    private void testTwo() {
        String nameInfo = 
            "cn=Certificate1, dc=";
        TLV name;
        boolean ok = true;

        try {
            name = new TLV(RFC2253Name.toDER(nameInfo), 0);
        } catch (TLVException e) {
            name = null;
            ok = false;
        }
        assertTrue("Invalid name", ok);
        assertTrue("Bad DER result", name != null && 
                    equal(name.getDERData(), testTwoResult));
    }
    
    private void testThree() {
        String nameInfo = 
         "cn=Certificate, OID.0.9.2342.19200300.100.1.25=www, dc=sun, dc=com";
        TLV name;
        boolean ok = true;

        try {
            name = new TLV(RFC2253Name.toDER(nameInfo), 0);
        } catch (TLVException e) {
            name = null;
            ok = false;
        }
        assertTrue("Invalid name", ok);
        assertTrue("Bad DER result", name != null && 
                    equal(name.getDERData(), testOneResult));
    }
    
    /**
     * Run tests.
     */
    public void runTests() {
        try {
            declare("testOne");
            testOne();
            
            declare("testTwo");
            testTwo();
            
            declare("testThree");
            testThree();
        }
        catch (Throwable t) {
            fail("" + t);
        }
    }
    
    /**
     * Compare two byte arrays.
     * @param one the first array
     * @param two the second array
     * @return true if arrays are equal, false otherwise
    */
    private boolean equal(byte[] one, byte[] two) {
        if (one.length != two.length) {
            return false;
        }
        for (int i = 0; i < one.length; i++) {
            if (one[i] != two[i]) {
                return false;
            }
        }
        return true;
    }

}

