| /* |
| * Copyright 1999-2004 The Apache Software Foundation. |
| * |
| * Licensed 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. |
| */ |
| #if !defined(HARNESS_HEADER_GUARD_1357924680) |
| #define HARNESS_HEADER_GUARD_1357924680 |
| |
| |
| |
| #include "xalanc/Harness/XalanHarnessDefinitions.hpp" |
| |
| |
| |
| #include <cstdio> |
| |
| |
| |
| #include "xalanc/Include/XalanMap.hpp" |
| |
| |
| |
| #include "xalanc/PlatformSupport/DOMStringHelper.hpp" |
| |
| |
| |
| #include "xalanc/XalanDOM/XalanDOMString.hpp" |
| |
| |
| |
| XALAN_CPP_NAMESPACE_BEGIN |
| |
| |
| |
| // This class is exported from the Harness.dll |
| class XALAN_HARNESS_EXPORT XalanXMLFileReporter |
| { |
| public: |
| |
| typedef XalanMap<XalanDOMString, XalanDOMString> Hashtable; |
| |
| #if defined(XALAN_STRICT_ANSI_HEADERS) |
| typedef std::FILE FileHandleType; |
| #else |
| typedef FILE FileHandleType; |
| #endif |
| |
| public: |
| |
| |
| // Construct and initialize this reporter with specified filename, if |
| // the filename is not empty. |
| XalanXMLFileReporter(const XalanDOMString& fileName = XalanDOMString()); |
| |
| // Initialize this XalanXMLFileReporter. Must be called before attempting to log anything. |
| bool initialize(); |
| |
| // Accessor for flushing; is set from properties. |
| bool getFlushOnCaseClose(); |
| |
| // Accessor methods for our properties block. |
| const XalanDOMString& getFileName() const; |
| |
| // Accessor methods for our properties block. |
| void setFileName(const XalanDOMString& fileName); |
| |
| // Accessor methods for our properties block. |
| void setFileName(const char* fileName) |
| { |
| setFileName(XalanDOMString(fileName)); |
| } |
| |
| // |
| // Is this Reporter still running OK? |
| // @returns status - true if an error has occoured, false if it's still working fine |
| bool checkError(); |
| |
| |
| // |
| // Is this Reporter ready to log results? |
| // @returns status - true if it's ready to report, false otherwise |
| bool isReady(); |
| |
| // Flush this reporter - ensure our File is flushed. |
| void flush(); |
| |
| |
| // Close this reporter - ensure our File, etc. are closed. |
| void close(); |
| |
| //----------------------------------------------------- |
| //-------- Testfile / Testcase start and stop routines -------- |
| //----------------------------------------------------- |
| |
| /** |
| * Report that a testfile has started. |
| * @param msg message to log out |
| */ |
| void logTestFileInit(const XalanDOMString& msg); |
| |
| void logTestFileInit(const char* msg) |
| { |
| logTestFileInit(XalanDOMString(msg)); |
| } |
| |
| /** |
| * Report that a testfile has finished, and report it's result. |
| * @param msg message to log out |
| * @param result result of testfile |
| */ |
| void logTestFileClose(const XalanDOMString& msg, const XalanDOMString& result); |
| |
| void logTestFileClose(const char* msg, const char* result) |
| { |
| logTestFileClose(XalanDOMString(msg), XalanDOMString(result)); |
| } |
| |
| void logTestCaseInit(const XalanDOMString& msg); |
| |
| void logTestCaseInit(const char* msg) |
| { |
| logTestCaseInit(XalanDOMString(msg)); |
| } |
| |
| /** |
| * Report that a testcase has finished, and report it's result. |
| * @param msg message to log out |
| * @param result result of testfile |
| */ |
| void logTestCaseClose(const XalanDOMString& msg, const XalanDOMString& result); |
| |
| void logTestCaseClose(const char* msg, const char* result) |
| { |
| logTestCaseClose(XalanDOMString(msg), XalanDOMString(result)); |
| } |
| //----------------------------------------------------- |
| //-------- Test results reporting and logging routines -------- |
| //----------------------------------------------------- |
| |
| |
| /** |
| * Report a comment to result file with specified severity. |
| * <P>Record format: <message level="##">msg</message></P> |
| * @param level severity or class of message. |
| * @param msg comment to log out. |
| */ |
| void logMessage(int level, const XalanDOMString& msg); |
| |
| /** |
| * Logs out statistics to result file with specified severity. |
| * <P>Record format: <statistic level="##" desc="msg"><longval>1234</longval><doubleval>1.234</doubleval></statistic></P> |
| * @param level severity of message. |
| * @param lVal statistic in long format. |
| * @param dVal statistic in double format. |
| * @param msg comment to log out. |
| */ |
| void logStatistic (int level, long lVal, double dVal, const XalanDOMString& msg); |
| |
| void logStatistic (int level, long lVal, double dVal, const char* msg) |
| { |
| logStatistic(level, lVal, dVal, XalanDOMString(msg)); |
| } |
| |
| // This routine will add an attribute to the attribute list. |
| void addMetricToAttrs(char* desc, double theMetric, Hashtable& attrs); |
| |
| /** |
| * Logs out a element to results with specified severity. |
| * Uses user-supplied element name and attribute list. Currently |
| * attribute values and msg are forced .toString(). Also, |
| * 'level' is forced to be the first attribute of the element. |
| * @param level severity of message. |
| * @param element name of enclosing element |
| * @param attrs hash of name=value attributes; note that the |
| * caller must ensure they're legal XML |
| * @param msg comment to log out. |
| */ |
| void logElementWAttrs(int level, const XalanDOMString& element, Hashtable attrs, const XalanDOMString& msg); |
| |
| void logElementWAttrs(int level, const char* element, Hashtable attrs, const char* msg) |
| { |
| logElementWAttrs(level, XalanDOMString(element), attrs, XalanDOMString(msg)); |
| } |
| |
| void logElement(int level, const XalanDOMString& element, const XalanDOMString& msg); |
| |
| void logElement(const XalanDOMString& element, const XalanDOMString& msg); |
| /** |
| * Report an arbitrary XalanDOMString to result file with specified severity. |
| * <P>Appends and prepends \\n newline characters at the start and |
| * end of the message to separate it from the tags.</P> |
| * <P>Record format: <arbitrary level="##"><BR/> |
| * msg<BR/> |
| * </arbitrary> |
| * </P> |
| * @param level severity or class of message. |
| * @param msg arbitrary XalanDOMString to log out. |
| */ |
| void logArbitraryMessage (int level, const XalanDOMString& msg); |
| |
| /** |
| * Report a complete Hashtable to result file with specified severity. |
| * <P>Indents each hashitem within the table.</P> |
| * <P>Record format: <hashtable level="##" desc="msg"/><BR/> |
| * <hashitem key="key1">value1</hashitem><BR/> |
| * <hashitem key="key2">value2</hashitem><BR/> |
| * </hashtable> |
| * </P> |
| * @param level severity or class of message. |
| * @param hash Hashtable to log the contents of. |
| * @param msg decription of the Hashtable. |
| */ |
| /* |
| void logHashtable (int level, Hashtable hash, const XalanDOMString& msg); |
| */ |
| |
| /** |
| * Writes out a Pass record with comment. |
| * <P>Record format: <checkresult result="PASS" desc="comment"/></P> |
| * @param comment comment to log with the pass record. |
| */ |
| void logCheckPass(const XalanDOMString& comment); |
| |
| /** |
| * Writes out an ambiguous record with comment. |
| * <P>Record format: <checkresult result="AMBG" desc="comment"/></P> |
| * @param comment comment to log with the ambg record. |
| */ |
| void logCheckAmbiguous(const XalanDOMString& comment); |
| |
| /** |
| * Writes out a Fail record with comment. |
| * <P>Record format: <checkresult result="FAIL" desc="comment"/></P> |
| * @param comment comment to log with the fail record. |
| */ |
| void logCheckFail(const XalanDOMString& comment); |
| |
| void logCheckFail(const XalanDOMString& test, Hashtable faildata, Hashtable actexp); |
| |
| void logCheckFail(const XalanDOMString& test, Hashtable actexp); |
| |
| void logErrorResult(const XalanDOMString& test, const XalanDOMString& reason); |
| |
| /** |
| * Writes out a Error record with comment. |
| * <P>Record format: <checkresult result="ERRR" desc="comment"/></P> |
| * @param comment comment to log with the error record. |
| */ |
| void logCheckErr(const XalanDOMString& comment); |
| |
| /** |
| * Escapes a XalanDOMString to remove <, >, ', &, and " so it's valid XML. |
| * <P>Stolen mostly from Xalan applet sample.</P> |
| * @param s XalanDOMString to escape. |
| * @return XalanDOMString that has been escaped. |
| */ |
| XalanDOMString escapestring(const XalanDOMString& s); |
| |
| |
| private: |
| |
| /** |
| * worker method to dump the xml header and open the resultsfile element. |
| */ |
| bool startResultsFile(); |
| |
| /** |
| * worker method to close the resultsfile element. |
| */ |
| bool closeResultsFile(); |
| |
| /** |
| * worker method to prints to the resultsfile. |
| */ |
| bool printToFile(const XalanDOMString& output); |
| |
| void |
| initStrings(); |
| |
| /** |
| * worker method to prints to the resultsfile. |
| */ |
| XalanDOMString getDateTimeString(); |
| |
| /** Key for Properties block that denotes our output filename. */ |
| XalanDOMString OPT_FILENAME; |
| |
| /** XML tagnames for results file structure. */ |
| XalanDOMString ELEM_RESULTSFILE; |
| XalanDOMString ELEM_TESTFILE; |
| XalanDOMString ELEM_FILERESULT; |
| XalanDOMString ELEM_TESTCASE; |
| XalanDOMString ELEM_CASERESULT; |
| XalanDOMString ELEM_CHECKRESULT; |
| XalanDOMString ELEM_STATISTIC; |
| XalanDOMString ELEM_LONGVAL; |
| XalanDOMString ELEM_DOUBLEVAL; |
| XalanDOMString ELEM_MESSAGE; |
| XalanDOMString ELEM_ARBITRARY; |
| XalanDOMString ELEM_HASHTABLE; |
| XalanDOMString ELEM_HASHITEM; |
| |
| /** XML attribute names for results file structure. */ |
| XalanDOMString ATTR_LEVEL; |
| XalanDOMString ATTR_DESC; |
| XalanDOMString ATTR_TIME; |
| XalanDOMString ATTR_RESULT; |
| XalanDOMString ATTR_KEY; |
| XalanDOMString ATTR_FILENAME; |
| XalanDOMString LESS_THAN; |
| XalanDOMString GREATER_THAN; |
| XalanDOMString EQUALS_QUOTE; |
| XalanDOMString SPACE; |
| XalanDOMString QUOTE; |
| XalanDOMString QUOTE_SPACE; |
| XalanDOMString QUOTE_GREATER_THAN; |
| XalanDOMString QUOTE_SOLIDUS_GREATER_THAN; |
| XalanDOMString PASS; |
| XalanDOMString AMBG; |
| XalanDOMString ERRR; |
| XalanDOMString FAIL; |
| XalanDOMString LESS_THAN_SOLIDUS; |
| XalanDOMString XML_HEADER; |
| XalanDOMString REASON_EQUALS_QUOTE; |
| |
| /** |
| * Optimization: for heavy use methods, form pre-defined constants to save on XalanDOMString concatenation. |
| * <P>Note the indent; must be updated if we ever switch to another indenting method.</P> |
| */ |
| XalanDOMString TESTCASEINIT_HDR; |
| XalanDOMString TESTCASECLOSE_HDR; |
| XalanDOMString MESSAGE_HDR; |
| XalanDOMString STATISTIC_HDR; |
| XalanDOMString ARBITRARY_HDR; |
| XalanDOMString HASHTABLE_HDR; |
| XalanDOMString HASHITEM_HDR; |
| XalanDOMString CHECKPASS_HDR; |
| XalanDOMString CHECKAMBG_HDR; |
| XalanDOMString CHECKERRR_HDR; |
| XalanDOMString CHECKFAIL_HDR; |
| XalanDOMString CHECKFAIL_FTR; |
| |
| /** If we have output anything yet. */ |
| bool m_anyOutput; |
| |
| /** Name of the file we're outputing to. */ |
| XalanDOMString m_fileName; |
| |
| /** File reference and other internal convenience variables. */ |
| FileHandleType* m_fileHandle; |
| |
| /** If we're ready to start outputting yet. */ |
| bool m_ready; |
| |
| /** If an error has occoured in this Reporter. */ |
| bool m_error; |
| |
| /** If we should flush after every logTestCaseClose. */ |
| bool m_flushOnCaseClose; |
| |
| }; // end of class XalanXMLFileReporter |
| |
| |
| |
| XALAN_CPP_NAMESPACE_END |
| |
| |
| |
| #endif |