All Downloads are FREE. Search and download functionalities are using the official Maven repository.

test.torture.Torture Maven / Gradle / Ivy

There is a newer version: 1.3.0-91
Show newest version
/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), and others.
* This software is has been contributed to the public domain.
* As a result, a formal license is not needed to use the software.
*
* This software is provided "AS IS."
* NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY.  NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
*
*/
/*******************************************************************************
 * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
 * Author: M. Ranganathan ([email protected])                                     *
 *******************************************************************************/
/**
 * Implements  Parser torture tests.
 *
 *@author  M. Ranganathan < [email protected] >
 *
 */

package test.torture;

import gov.nist.javax.sip.address.*;
import gov.nist.javax.sip.parser.*;
import gov.nist.javax.sip.header.*;
import gov.nist.javax.sip.message.*;
import java.io.*;
import java.util.Hashtable;
import java.util.Enumeration;
// ifdef J2SDK1.4
import javax.xml.parsers.SAXParserFactory;
// endif
import org.xml.sax.Attributes;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import java.text.ParseException;

public class Torture extends DefaultHandler implements ParseExceptionListener,
        TagNames, TokenValues, ConfigurationSwitches {

    // variables that I read from the xml file header.
    protected static boolean debug = true;

    protected static long startTime;

    protected static int counter = 0;

    protected String testMessage;

    protected String encodedMessage;

    protected String testDescription;

    protected boolean debugFlag;

    protected boolean abortOnFail;

    protected String failureReason;

    protected String statusMessage;

    protected String exceptionHeader;

    protected String exceptionMessage;

    protected String exceptionClassName;

    protected boolean failureFlag;

    protected boolean successFlag;

    protected boolean outputParsedStructures;

    protected static boolean outputResults;

    private PrintStream testLogWriter;

    private Hashtable exceptionTable;

    private StringMsgParser stringParser;

    // These track which context the parser is currently parsing.
    private boolean messageContext;

    private boolean exceptionTextContext;

    private boolean sipHeaderContext;

    private boolean sipURLContext;

    private boolean testCaseContext;

    private boolean descriptionContext;

    private boolean expectExceptionContext;

    private boolean expectExtensionContext;

    private boolean exceptionMessageContext;

    private String testMessageType;

    private static final String XML_DOCTYPE_IDENTIFIER = "";

    class MyEntityResolver implements  EntityResolver {

        public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {

            return new InputSource( Torture.class.getResourceAsStream("torture.dtd"));
        }

    }

    class TestLogWriter extends PrintStream {
        public void println(String stuff) {
            if (outputResults)
                super.println();
        }

        public TestLogWriter(FileOutputStream fos) {
            super(fos);
        }

    }

    class ExpectedException {
        protected boolean fired;

        protected String exceptionHeader;

        protected String exceptionMessage;

        protected Class exceptionClass;

        protected ExpectedException(String className, String headerString) {
            try {
                exceptionClass = Class.forName(className);
                exceptionHeader = headerString;
                fired = false;
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
                System.err.println(ex.getMessage());
                testLogWriter.close();
                System.exit(0);
            }
        }
    }

    private void setFailure() {
        failureFlag = true;
    }

    public void handleException(ParseException ex, SIPMessage sipMessage,
            Class headerClass, String headerText, String messageText)
            throws ParseException {
        String exceptionString = headerText;
        if (debugFlag) {
            System.out.println(exceptionString);
        }

        if (exceptionTable == null) {
            formatFailureDiagnostic(ex,
                    "unexpected exception (no exceptions expected)");
            setFailure();
            if (debugFlag)
                throw ex;
        } else {
            ExpectedException e = (ExpectedException) exceptionTable
                    .get(headerText.trim());
            if (e == null) {
                // Check if there is an exception handler for
                // wildcard match.
                e = (ExpectedException) exceptionTable.get(messageText.trim());
            }
            if (e == null) {
                formatFailureDiagnostic(ex, "unexpected exception "
                        + ex.getMessage());
                setFailure();
                if (debugFlag)
                    throw ex;
            } else if (!ex.getClass().equals(e.exceptionClass)) {
                setFailure();
                formatFailureDiagnostic(ex, " got " + ex.getClass()
                        + " expecting " + e.exceptionClass.getName());
                if (debugFlag)
                    throw ex;
            } else {
                e.exceptionMessage = headerText;
                e.fired = true;
                successFlag = true;
            }
        }
    }

    public void characters(char[] ch, int start, int length) {
        String str = new String(ch, start, length);
        if (str.trim() == "")
            return;
        if (messageContext) {
            if (testMessage == null)
                testMessage = str;
            else
                testMessage += str;
        } else if (descriptionContext) {
            if (testDescription == null)
                testDescription = str;
            else
                testDescription += str;
        } else if (exceptionTextContext) {
            if (exceptionHeader == null)
                exceptionHeader = str;
            else
                exceptionHeader += str;
        } else if (sipHeaderContext) {
            if (testMessage == null)
                testMessage = str;
            else
                testMessage += str;
        } else if (sipURLContext) {
            if (testMessage == null)
                testMessage = str;
            else
                testMessage += str;
        } else if (exceptionMessageContext) {
            if (exceptionMessage == null)
                exceptionMessage = str;
            else
                exceptionMessage += str;
        }
    }

    public void startElement(String namespaceURI, String local, String name,
            Attributes attrs) throws SAXException {
        if (name.compareTo(TORTURE) == 0) {
            outputParsedStructures = false;
            outputResults = false;
            failureFlag = false;
            debugFlag = false;

            String outputParsedString = attrs.getValue(OUTPUT_PARSED_STRUCTURE);
            if (outputParsedString != null
                    && outputParsedString.toLowerCase().compareTo(TRUE) == 0) {
                outputParsedStructures = true;
            }
            String debugString = attrs.getValue(DEBUG);
            if (debugString != null
                    && debugString.toLowerCase().compareTo(TRUE) == 0) {
                debugFlag = true;
            }
            String abortString = attrs.getValue(ABORT_ON_FAIL);
            if (abortString != null && abortString.compareTo(TRUE) == 0) {
                abortOnFail = true;
            } else
                abortOnFail = false;

            outputResults = false;
            String outputResultsString = attrs.getValue(OUTPUT_RESULTS);
            if (outputResultsString != null
                    && outputResultsString.compareTo(TRUE) == 0) {
                outputResults = true;
            } else
                outputResults = false;

            if (outputResults) {

                String testlog = attrs.getValue(TESTLOG);
                if (testlog != null) {
                    try {
                        if (outputResults)
                            testLogWriter = new TestLogWriter(
                                    new FileOutputStream(testlog, true));
                    } catch (IOException ex) {
                        System.err.println("Cannot open " + testlog
                                + " for write");
                        System.exit(0);
                    }
                } else {
                    testLogWriter = System.out;
                }
            }

            emitString(XML_DOCTYPE_IDENTIFIER);

            emitTag(TEST_OUTPUT);
            startTime = System.currentTimeMillis();

        } else if (name.compareTo(TESTCASE) == 0) {
            // Starting a new test
            counter++;
            failureReason = "";
            statusMessage = "";
            failureFlag = false;
            successFlag = false;
            messageContext = false;
            testCaseContext = false;
            messageContext = false;
            descriptionContext = false;
            expectExtensionContext = false;
            sipHeaderContext = false;
            sipURLContext = false;
            testDescription = null;
            testMessage = null;
            encodedMessage = null;
            exceptionMessage = null;
            exceptionTable = new Hashtable();
        } else if (name.compareTo(MESSAGE) == 0) {
            testMessageType = MESSAGE;
            messageContext = true;
        } else if (name.compareTo(SIP_HEADER) == 0) {
            testMessageType = SIP_HEADER;
            sipHeaderContext = true;
        } else if (name.compareTo(SIP_URL) == 0) {
            testMessageType = SIP_URL;
            sipURLContext = true;
        } else if (name.compareTo(DESCRIPTION) == 0) {
            descriptionContext = true;
        } else if (name.compareTo(EXPECT_EXCEPTION) == 0) {
            expectExceptionContext = true;
            exceptionClassName = attrs.getValue(EXCEPTION_CLASS);
        } else if (name.compareTo(EXCEPTION_MESSAGE) == 0) {
            exceptionMessageContext = true;
        } else if (name.compareTo(EXCEPTION_TEXT) == 0) {
            exceptionTextContext = true;
        } else
            throw new SAXException("Unrecognized tag " + name);

    }

    public void error(SAXParseException e) throws SAXParseException {
        throw e;
    }

    public void ignorableWhitespace(char buf[], int offset, int len)
            throws SAXException {
        // Ignore it
    }

    public void endElement(String namespaceURI, String local, String name)
            throws SAXException {
        if (name.compareTo(TESTCASE) == 0) {
            testCaseContext = false;
            stringParser = new StringMsgParser();
            // stringParser.disableInputTracking();

//            stringParser.setParseExceptionListener(this);
            SIPMessage sipMessage = null;
            SIPHeader sipHeader = null;
            SipUri sipURL = null;
            try {
                if (testMessageType.equals(MESSAGE)) {
                    sipMessage = stringParser.parseSIPMessage(testMessage.getBytes(), true, false, (ParseExceptionListener) this);
                    encodedMessage = sipMessage.encode();
                } else if (testMessageType.equals(SIP_HEADER)) {
                    sipHeader = stringParser.parseSIPHeader(testMessage);
                    encodedMessage = sipHeader.encode();
                } else if (testMessageType.equals(SIP_URL)) {
                    sipURL = stringParser.parseSIPUrl(testMessage.trim());
                    encodedMessage = sipURL.encode();
                } else
                    throw new SAXException("Torture: Internal error");
            } catch (ParseException ex) {
                ex.printStackTrace();
                try {
                    handleException(ex, null, new SipUri().getClass(),
                            testMessage, null);
                } catch (ParseException ex1) {
                    ex1.printStackTrace();
                    System.out.println("Unexpected excception!");
                    System.exit(0);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                System.out.println("Unexpected excception!");
                System.exit(0);

            }
            Enumeration e = exceptionTable.elements();
            while (e.hasMoreElements()) {
                ExpectedException ex = (ExpectedException) e.nextElement();
                if (!ex.fired) {
                    formatFailureDiagnostic(ex,
                            "Expected Exception not trapped ");
                } else {
                    formatStatusMessage(ex, "Expected exception generated ");
                }
            }

            emitBeginTag(TESTCASE);
            if (!failureFlag) {
                emitAttribute(STATUS, "PASSED");
            } else {
                emitAttribute(STATUS, "FAILED");
            }
            emitEndTag();
            emitTaggedCData(DESCRIPTION, testDescription);
            if (encodedMessage != null)
                emitTaggedCData(MESSAGE, encodedMessage);
            else
                emitTaggedCData(MESSAGE, testMessage);
            if (failureFlag) {
                emitTaggedData(DIAGNOSTIC_MESSAGES, failureReason);
            }
            if (successFlag) {
                emitTaggedData(DIAGNOSTIC_MESSAGES, statusMessage);
            }
            if (outputParsedStructures) {
                if (sipMessage != null) {
                    emitTaggedCData(PARSED_OUTPUT, sipMessage.toString());
                } else if (sipHeader != null) {
                    emitTaggedCData(PARSED_OUTPUT, sipHeader.toString());
                } else if (sipURL != null) {
                    emitTaggedCData(PARSED_OUTPUT, sipURL.toString());
                }
            }
            emitEndTag(TESTCASE);
            if (failureFlag && abortOnFail) {
                if (testLogWriter != null)
                    testLogWriter.close();
                System.out.println("Failed -- bailing out!");
                System.exit(0);
            }

        } else if (name.compareTo(DESCRIPTION) == 0) {
            descriptionContext = false;
        } else if (name.compareTo(MESSAGE) == 0) {
            messageContext = false;
        } else if (name.compareTo(EXCEPTION_TEXT) == 0) {
            exceptionTextContext = false;
        } else if (name.compareTo(EXPECT_EXCEPTION) == 0) {
            expectExceptionContext = false;
            ExpectedException ex = new ExpectedException(exceptionClassName,
                    exceptionHeader);
            if (exceptionHeader != null) {
                this.exceptionTable.put(exceptionHeader.trim(), ex);
            } else {
                this.exceptionTable.put(testMessage.trim(), ex);
            }
            exceptionHeader = null;
        } else if (name.compareTo(EXCEPTION_MESSAGE) == 0) {
            exceptionMessageContext = false;
            exceptionMessage = null;
        } else if (name.compareTo(SIP_HEADER) == 0) {
            sipHeaderContext = false;
        } else if (name.compareTo(SIP_URL) == 0) {
            sipURLContext = false;
        } else if (name.compareTo(TORTURE) == 0) {
            emitEndTag(TEST_OUTPUT);
            if (outputResults)
                testLogWriter.close();
        }

    }

    protected void emitBeginTag(String tagName) {
        if (outputResults)
            testLogWriter.println(LESS_THAN + tagName);
    }

    protected void emitTag(String tagName) {
        if (outputResults)
            testLogWriter.println(LESS_THAN + tagName + GREATER_THAN);
    }

    protected void emitTaggedData(String tag, String data) {
        if (outputResults) {
            emitTag(tag);
            testLogWriter.println(data);
            emitEndTag(tag);
        }
    }

    /* A stand alone tag */
    protected void emitBeginEndTag(String tagName) {
        if (outputResults) {
            testLogWriter.println(LESS_THAN + tagName + SLASH + GREATER_THAN);
        }
    }

    protected void emitEndTag() {
        if (outputResults)
            testLogWriter.println(GREATER_THAN);
    }

    protected void emitEndTag(String tagName) {
        if (outputResults)
            testLogWriter.println(LESS_THAN + SLASH + tagName + GREATER_THAN);
    }

    protected void emitTaggedCData(String str) {
        if (outputResults)
            testLogWriter.println("");

    }

    protected void emitTaggedCData(String tag, String str) {
        if (outputResults) {
            emitTag(tag);
            testLogWriter.println("");
            emitEndTag(tag);
        }

    }

    protected void emitString(String str) {
        if (outputResults)
            testLogWriter.println(str);
    }

    protected void emitAttribute(String attrName, String attrval) {
        if (outputResults)
            testLogWriter.println(attrName + EQUALS + "\"" + attrval + "\"");
    }

    protected String emitStringAttribute(String attrName, String attrval) {
        return attrName + EQUALS + "\"" + attrval + "\"" + "\n";
    }

    protected String emitStringTag(String tag) {
        return "<" + tag + ">" + "\n";
    }

    protected String emitStringBeginTag(String tag) {
        return "<" + tag + "\n";
    }

    protected String emitStringEndTag() {
        return ">" + "\n";
    }

    protected String emitStringEndTag(String tag) {
        return "\n";
    }

    protected String emitStringCData(String msg) {
        return "\n";
    }

    protected String emitStringCData(String tag, String msg) {
        return emitStringTag(tag) + emitStringCData(msg)
                + emitStringEndTag(tag);
    }

    protected void formatFailureDiagnostic(ParseException ex, String message) {

        failureReason += emitStringBeginTag(DIAGNOSTIC);
        failureReason += emitStringAttribute(REASON, message);
        failureReason += emitStringEndTag();

        failureReason += emitStringAttribute(EXCEPTION_CLASS, ex.getClass()
                .getName());

        failureReason += emitStringCData(EXCEPTION_TEXT, ex.getMessage());

        // DataOutputStream dos = new DataOutputStream(bos);
        ByteArrayOutputStream bos = new ByteArrayOutputStream(4096);
        ex.printStackTrace(new PrintStream(bos, true));
        failureReason += emitStringCData(STACK_TRACE, bos.toString());
        failureReason += emitStringCData(MESSAGE, ex.getMessage());
        failureReason += emitStringEndTag(DIAGNOSTIC);
    }

    protected void formatFailureDiagnostic(String hdr, String reason) {
        failureReason += emitStringBeginTag(DIAGNOSTIC);
        failureReason += emitStringAttribute(STATUS, "BAD");
        failureReason += emitStringAttribute(REASON, reason);
        failureReason += emitStringEndTag();
        failureReason += emitStringCData(EXCEPTION_TEXT, hdr);
        failureReason += emitStringEndTag(DIAGNOSTIC);
    }

    protected void formatFailureDiagnostic(ExpectedException ex, String reason) {
        failureReason += emitStringBeginTag(DIAGNOSTIC);
        failureReason += emitStringAttribute(STATUS, "BAD");
        failureReason += emitStringAttribute(REASON, reason);
        failureReason += emitStringAttribute(EXCEPTION_CLASS, ex.exceptionClass
                .getName());
        failureReason += emitStringEndTag();
        failureReason += emitStringCData(EXCEPTION_TEXT, ex.exceptionHeader);
        failureReason += emitStringEndTag(DIAGNOSTIC);
    }

    protected void formatStatusMessage(String hdr, String reason) {
        statusMessage += emitStringBeginTag(DIAGNOSTIC);
        statusMessage += emitStringAttribute(STATUS, "OK");
        statusMessage += emitStringAttribute(REASON, reason);
        statusMessage += emitStringEndTag();
        statusMessage += emitStringCData(EXCEPTION_TEXT, hdr);
        statusMessage += emitStringEndTag(DIAGNOSTIC);
    }

    protected void formatStatusMessage(ExpectedException ex, String reason) {
        statusMessage += emitStringBeginTag(DIAGNOSTIC);
        statusMessage += emitStringAttribute(STATUS, "OK");
        statusMessage += emitStringAttribute(REASON, reason);
        statusMessage += emitStringAttribute(EXCEPTION_CLASS, ex.exceptionClass
                .getName());
        statusMessage += emitStringEndTag();
        statusMessage += emitStringCData(EXCEPTION_TEXT, ex.exceptionHeader);
        statusMessage += emitStringEndTag(DIAGNOSTIC);
    }

    public Torture () {

    }
    public void doTests() throws Exception {
        String fileName ;
        fileName = "torture.xml";

        /* The tests do not check for content length */
        StringMsgParser.setComputeContentLengthFromMessage(true);

        try {
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            XMLReader saxParser = saxParserFactory.newSAXParser()
                    .getXMLReader();

            saxParser.setEntityResolver(new MyEntityResolver());
            saxParser.setContentHandler(this);
            saxParser
                    .setFeature("http://xml.org/sax/features/validation", true);
            saxParser.parse(new InputSource ( Torture.class.getResourceAsStream(fileName)));
            System.out.println("Elapsed time = "
                    + (System.currentTimeMillis() - startTime) / counter);

        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }

    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy