/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Portions Copyright 2006 Sun Microsystems, Inc. */ package org.opends.server.protocols.asn1; import java.io.*; import java.util.*; import junit.framework.*; import org.opends.server.*; import static org.opends.server.util.StaticUtils.*; /** * This class defines a set of JUnit tests for the * org.opends.server.protocols.asn1.ASN1Reader and * org.opends.server.protocols.asn1.ASN1Writer classes. * * * @author Neil A. Wilson */ public class TestASN1ReaderAndWriter extends DirectoryServerTestCase { // The set of ASN.1 Boolean elements that will be written and read. private ArrayList booleanElements; // The set of ASN.1 enumerated elements that will be written and read. private ArrayList enumeratedElements; // The set of generic ASN.1 elements that will be written and read. private ArrayList genericElements; // The set of ASN.1 integer elements that will be written and read. private ArrayList integerElements; // The set of ASN.1 null elements that will be written and read. private ArrayList nullElements; // The set of ASN.1 octet string elements that will be written and read. private ArrayList octetStringElements; // The set of ASN.1 sequence elements that will be written and read. private ArrayList sequenceElements; // The set of ASN.1 enumerated elements that will be written and read. private ArrayList setElements; // The data file to which data will be written and read back. private File dataFile; /** * Creates a new instance of this JUnit test case with the provided name. * * @param name The name to use for this JUnit test case. */ public TestASN1ReaderAndWriter(String name) { super(name); } /** * Performs any necessary initialization for this test case. * * @throws Exception If a problem occurs during initialization. */ public void setUp() throws Exception { // Create the temporary file that we will write to and read from. dataFile = File.createTempFile("TestASN1ReaderAndWriter-", ".data"); // Create the set of generic elements that will be written and read. genericElements = new ArrayList(); genericElements.add(new ASN1Element((byte) 0x00)); genericElements.add(new ASN1Element((byte) 0x00, null)); genericElements.add(new ASN1Element((byte) 0x00, new byte[0])); genericElements.add(new ASN1Element((byte) 0x00, new byte[1])); genericElements.add(new ASN1Element((byte) 0x00, new byte[127])); genericElements.add(new ASN1Element((byte) 0x00, new byte[128])); genericElements.add(new ASN1Element((byte) 0x00, new byte[255])); genericElements.add(new ASN1Element((byte) 0x00, new byte[256])); genericElements.add(new ASN1Element((byte) 0x00, new byte[32767])); genericElements.add(new ASN1Element((byte) 0x00, new byte[32768])); genericElements.add(new ASN1Element((byte) 0x00, new byte[65535])); genericElements.add(new ASN1Element((byte) 0x00, new byte[65536])); // Create the set of Boolean elements that will be written and read. booleanElements = new ArrayList(); booleanElements.add(new ASN1Boolean(false)); booleanElements.add(new ASN1Boolean(true)); booleanElements.add(new ASN1Boolean((byte) 0x00, false)); booleanElements.add(new ASN1Boolean((byte) 0x00, true)); // Create the set of enumerated elements that will be written and read. enumeratedElements = new ArrayList(); enumeratedElements.add(new ASN1Enumerated(0)); enumeratedElements.add(new ASN1Enumerated(1)); enumeratedElements.add(new ASN1Enumerated(127)); enumeratedElements.add(new ASN1Enumerated(128)); enumeratedElements.add(new ASN1Enumerated(255)); enumeratedElements.add(new ASN1Enumerated(256)); enumeratedElements.add(new ASN1Enumerated(32767)); enumeratedElements.add(new ASN1Enumerated(32768)); enumeratedElements.add(new ASN1Enumerated(65535)); enumeratedElements.add(new ASN1Enumerated(65536)); // Create the set of integer elements that will be written and read. integerElements = new ArrayList(); integerElements.add(new ASN1Integer(0)); integerElements.add(new ASN1Integer(1)); integerElements.add(new ASN1Integer(127)); integerElements.add(new ASN1Integer(128)); integerElements.add(new ASN1Integer(255)); integerElements.add(new ASN1Integer(256)); integerElements.add(new ASN1Integer(32767)); integerElements.add(new ASN1Integer(32768)); integerElements.add(new ASN1Integer(65535)); integerElements.add(new ASN1Integer(65536)); // Create the set of null elements that will be written and read. nullElements = new ArrayList(); nullElements.add(new ASN1Null()); for (int i=0; i < 256; i++) { byte type = (byte) (i & 0xFF); nullElements.add(new ASN1Null(type)); } // Create the set of octet string elements that will be written and read. octetStringElements = new ArrayList(); octetStringElements.add(new ASN1OctetString()); octetStringElements.add(new ASN1OctetString((byte[]) null)); octetStringElements.add(new ASN1OctetString((String) null)); octetStringElements.add(new ASN1OctetString(new byte[0])); octetStringElements.add(new ASN1OctetString(new byte[1])); octetStringElements.add(new ASN1OctetString(new byte[127])); octetStringElements.add(new ASN1OctetString(new byte[128])); octetStringElements.add(new ASN1OctetString(new byte[255])); octetStringElements.add(new ASN1OctetString(new byte[256])); octetStringElements.add(new ASN1OctetString(new byte[32767])); octetStringElements.add(new ASN1OctetString(new byte[32768])); octetStringElements.add(new ASN1OctetString(new byte[65535])); octetStringElements.add(new ASN1OctetString(new byte[65536])); octetStringElements.add(new ASN1OctetString("")); octetStringElements.add(new ASN1OctetString("a")); char[] chars127 = new char[127]; Arrays.fill(chars127, 'a'); octetStringElements.add(new ASN1OctetString(new String(chars127))); char[] chars128 = new char[128]; Arrays.fill(chars128, 'a'); octetStringElements.add(new ASN1OctetString(new String(chars128))); // Create the set of sequence elements that will be written and read. sequenceElements = new ArrayList(); sequenceElements.add(new ASN1Sequence()); sequenceElements.add(new ASN1Sequence(null)); sequenceElements.add(new ASN1Sequence(new ArrayList(0))); sequenceElements.add(new ASN1Sequence(genericElements)); sequenceElements.add(new ASN1Sequence( new ArrayList(booleanElements))); sequenceElements.add(new ASN1Sequence( new ArrayList(enumeratedElements))); sequenceElements.add(new ASN1Sequence( new ArrayList(integerElements))); sequenceElements.add(new ASN1Sequence( new ArrayList(nullElements))); sequenceElements.add(new ASN1Sequence( new ArrayList(octetStringElements))); // Create the set of set elements that will be written and read. setElements = new ArrayList(); setElements.add(new ASN1Set()); setElements.add(new ASN1Set(null)); setElements.add(new ASN1Set(new ArrayList(0))); setElements.add(new ASN1Set(genericElements)); setElements.add(new ASN1Set(new ArrayList(booleanElements))); setElements.add(new ASN1Set( new ArrayList(enumeratedElements))); setElements.add(new ASN1Set(new ArrayList(integerElements))); setElements.add(new ASN1Set(new ArrayList(nullElements))); setElements.add(new ASN1Set( new ArrayList(octetStringElements))); setElements.add(new ASN1Set(new ArrayList(sequenceElements))); } /** * Performs any necessary cleanup for this test case. * * @throws Exception If a problem occurs during cleanup. */ public void tearDown() throws Exception { // Delete the temporary data file. dataFile.delete(); } /** * Tests the ASN1Writer.writeElement and the * ASN1Reader.readElement methods. */ public void testWriteAndRead() { // Create the ASN.1 writer that will be used to write the elements. ASN1Writer asn1Writer; try { asn1Writer = new ASN1Writer(new FileOutputStream(dataFile, false)); } catch (IOException ioe) { String message = "Unable to create output file " + dataFile.getAbsolutePath() + " for writing"; printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } // Write the set of generic elements. for (ASN1Element element : genericElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write generic ASN.1 " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of Boolean elements. for (ASN1Boolean element : booleanElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 Boolean " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of enumerated elements. for (ASN1Enumerated element : enumeratedElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 enumerated " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of integer elements. for (ASN1Integer element : integerElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 integer " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of null elements. for (ASN1Null element : nullElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 null " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of octet string elements. for (ASN1OctetString element : octetStringElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 octet " + "string element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of sequence elements. for (ASN1Sequence element : sequenceElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 sequence " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Write the set of set elements. for (ASN1Set element : setElements) { try { asn1Writer.writeElement(element); } catch (IOException ioe) { String message = "I/O exception attempting to write ASN.1 set " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } } // Always remember to close the output file. asn1Writer.close(); // Create the ASN.1 reader that will be used to read the elements back. ASN1Reader asn1Reader; try { asn1Reader = new ASN1Reader(new FileInputStream(dataFile)); } catch (IOException ioe) { String message = "Unable to open data file " + dataFile.getAbsolutePath() + " for reading"; printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } // Read back the set of generic elements. for (ASN1Element element : genericElements) { try { assertEquals(element, asn1Reader.readElement()); } catch (IOException ioe) { String message = "I/O exception attempting to read generic element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode generic " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read generic element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of Boolean elements. for (ASN1Boolean element : booleanElements) { try { assertEquals(element.booleanValue(), asn1Reader.readElement().decodeAsBoolean().booleanValue()); } catch (IOException ioe) { String message = "I/O exception attempting to read Boolean element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode Boolean " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read Boolean element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of enumerated elements. for (ASN1Enumerated element : enumeratedElements) { try { assertEquals(element.intValue(), asn1Reader.readElement().decodeAsEnumerated().intValue()); } catch (IOException ioe) { String message = "I/O exception attempting to read enumerated " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode enumerated " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read enumerated element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of integer elements. for (ASN1Integer element : integerElements) { try { assertEquals(element.intValue(), asn1Reader.readElement().decodeAsInteger().intValue()); } catch (IOException ioe) { String message = "I/O exception attempting to read integer element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode integer " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read integer element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of null elements. for (ASN1Null element : nullElements) { try { assertEquals(element, asn1Reader.readElement().decodeAsNull()); } catch (IOException ioe) { String message = "I/O exception attempting to read null element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode null " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read null element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of octet string elements. for (ASN1OctetString element : octetStringElements) { try { assertEquals(element, asn1Reader.readElement().decodeAsOctetString()); } catch (IOException ioe) { String message = "I/O exception attempting to read octet string " + "element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode octet string " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read octet string element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of sequence elements. for (ASN1Sequence element : sequenceElements) { try { assertTrue(listsAreEqual(element.elements(), asn1Reader.readElement().decodeAsSequence().elements())); } catch (IOException ioe) { String message = "I/O exception attempting to read sequence element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode sequence " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read sequence element equal to " + String.valueOf(element)); throw afe; } } // Read back the set of set elements. for (ASN1Set element : setElements) { try { assertTrue(listsAreEqual(element.elements(), asn1Reader.readElement().decodeAsSet().elements())); } catch (IOException ioe) { String message = "I/O exception attempting to read set element " + String.valueOf(element); printError(message); printException(ioe); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ioe)); } catch (ASN1Exception ae) { String message = "ASN.1 exception attempting to decode set " + "element " + String.valueOf(element); printError(message); printException(ae); throw new AssertionFailedError(message + " -- " + stackTraceToSingleLineString(ae)); } catch (AssertionFailedError afe) { printError("readElement failed to read set element equal to " + String.valueOf(element)); throw afe; } } // Always remember to close the input file. asn1Reader.close(); } }