From a64a5b2692118f554f5d1310534a5276ba62953e Mon Sep 17 00:00:00 2001 From: Zbigniew Kostrzewa Date: Mon, 14 Jan 2013 10:40:13 +0100 Subject: [PATCH] Improve XML test results collector. [Issue#] N/A [Bug] testsuite tag attributes are not filled out when segmentation fault occurs [Cause] values of those attributes are filled out at the end of a successful run of a test binary [Solution] update attributes values after each test case [Verification] 1. Build repository 2. Run wrt-tests-misc test suite with output set to xml and text `wrt-tests-misc --output=xml --output=text` 3. Compare results 4. Check whether file results.xml is a valid XML document. Change-Id: Ic3c5fa0b3ce6b943cf1ac949b3313d436ed4f8b0 --- modules/test/src/test_results_collector.cpp | 249 ++++++++++++++++++++-------- 1 file changed, 177 insertions(+), 72 deletions(-) diff --git a/modules/test/src/test_results_collector.cpp b/modules/test/src/test_results_collector.cpp index d481aa5..c9c6ea4 100644 --- a/modules/test/src/test_results_collector.cpp +++ b/modules/test/src/test_results_collector.cpp @@ -19,12 +19,14 @@ * @version 1.0 * @brief Implementation file some concrete TestResulstsCollector */ -#include +#include #include #include #include #include #include +#include +#include #include #include @@ -80,11 +82,11 @@ class Statistic } } - size_t GetTotal() const { return m_count; } - size_t GetPassed() const { return m_passed; } - size_t GetSuccesed() const { return m_passed; } - size_t GetFailed() const { return m_failed; } - size_t GetIgnored() const { return m_ignored; } + std::size_t GetTotal() const { return m_count; } + std::size_t GetPassed() const { return m_passed; } + std::size_t GetSuccesed() const { return m_passed; } + std::size_t GetFailed() const { return m_failed; } + std::size_t GetIgnored() const { return m_ignored; } float GetPassedOrIgnoredPercend() const { float passIgnoredPercent = @@ -95,10 +97,10 @@ class Statistic } private: - size_t m_failed; - size_t m_ignored; - size_t m_passed; - size_t m_count; + std::size_t m_failed; + std::size_t m_ignored; + std::size_t m_passed; + std::size_t m_count; }; class ConsoleCollector @@ -387,19 +389,39 @@ class XmlCollector virtual void CollectCurrentTestGroupName(const std::string& name) { - std::string groupHeader; - groupHeader.append("\n\t\n\t\t\n"); - groupHeader.append("\t\t\t\n"); - groupHeader.append("\t\t\n\t"); - size_t pos = m_outputBuffer.find(""); - m_outputBuffer.insert(pos - 1, groupHeader); - m_currentGroup = name; - fseek(m_fp.Get(), 0L, SEEK_SET); - fprintf(m_fp.Get(), "%s", m_outputBuffer.c_str()); - fflush(m_fp.Get()); + std::size_t pos = GetCurrentGroupPosition(); + if (std::string::npos != pos) + { + GroupFinish(pos); + FlushOutput(); + m_stats = Statistic(); + } + + pos = m_outputBuffer.find(""); + if (std::string::npos == pos) + { + ThrowMsg(DPL::Exception, "Could not find test suites closing tag"); + } + GroupStart(pos, name); + } + + void GroupStart(const std::size_t pos, const std::string& name) + { + std::stringstream groupHeader; + groupHeader << "\n\t"; + + groupHeader << "\n\t\t"; + groupHeader << "\n\t\t\t"; + groupHeader << "\n\t\t"; + + groupHeader << "\n\t"; + m_outputBuffer.insert(pos - 1, groupHeader.str()); } virtual bool Configure() @@ -423,31 +445,17 @@ class XmlCollector Assert(!!m_fp && "File handle must not be null"); m_outputBuffer.append("\n"); m_outputBuffer.append("\n"); - fseek(m_fp.Get(), 0L, SEEK_SET); - fprintf(m_fp.Get(), "%s", m_outputBuffer.c_str()); - fflush(m_fp.Get()); - + FlushOutput(); } virtual void Finish() { - // Show result - FOREACH(group, m_groupsStats) { - PrintStats(group->first, group->second); - size_t posBegin = m_outputBuffer.find("", posBegin); - m_outputBuffer.erase(posBegin - 3, posEnd - posBegin + sizeof("") + 2); + std::size_t pos = GetCurrentGroupPosition(); + if (std::string::npos != pos) + { + GroupFinish(pos); + FlushOutput(); } - - if(remove(m_filename.c_str())!=0){ - LogError("Can't remove file. Error: " << strerror(errno)); - } - - m_fp.Reset(fopen (m_filename.c_str(), "w")); - Assert(!!m_fp && "File handle must not be null"); - fseek(m_fp.Get(), 0L, SEEK_SET); - fprintf(m_fp.Get(),"%s", m_outputBuffer.c_str()); - fflush(m_fp.Get()); } virtual bool ParseCollectorSpecificArg(const std::string& arg) @@ -469,7 +477,7 @@ class XmlCollector m_resultBuffer.append(" status=\"OK\"/>\n"); break; case TestResultsCollectorBase::FailStatus::FAILED: - m_resultBuffer.append(" status=\"FAILED\">\n\t\t\t\n"); PrintfErrorMessage("FAILED", EscapeSpecialCharacters(reason), true); m_resultBuffer.append("\t\t\n"); break; @@ -479,22 +487,138 @@ class XmlCollector m_resultBuffer.append("\t\t\n"); break; case TestResultsCollectorBase::FailStatus::INTERNAL: - m_resultBuffer.append(" status=\"INTERNAL\">\n\t\t\t\n"); PrintfErrorMessage("INTERNAL", EscapeSpecialCharacters(reason), true); m_resultBuffer.append("\t\t"); break; default: Assert(false && "Bad status"); } - size_t group_pos = m_outputBuffer.find(m_currentGroup); - size_t last_case_pos = m_outputBuffer.find(" fprintf(m_fp.Get(), m_outputBuffer.c_str())) + { + int error = errno; + ThrowMsg(DPL::Exception, DPL::GetErrnoString(error)); + } + + if (-1 == TEMP_FAILURE_RETRY(fflush(m_fp.Get()))) + { + int error = errno; + ThrowMsg(DPL::Exception, DPL::GetErrnoString(error)); + } } void PrintfErrorMessage(const char* type, @@ -502,7 +626,7 @@ class XmlCollector bool verbosity) { if (verbosity) { - m_resultBuffer.append(" type=\""); + m_resultBuffer.append("\t\t\t\n"); } @@ -534,26 +658,9 @@ class XmlCollector } } - void PrintStats(const std::string& name, const Statistic& stats) - { - std::stringstream totalStats; - totalStats << " tests=\""; - totalStats << stats.GetTotal(); - totalStats << "\" failures=\""; - totalStats << stats.GetFailed(); - totalStats << "\" skipped=\""; - totalStats << stats.GetIgnored(); - totalStats << "\""; - std::string suiteHeader; - suiteHeader.append(" m_groupsStats; std::string m_outputBuffer; std::string m_resultBuffer; }; -- 2.7.4