From d523e9fce2b053f186ab3bebbe57a2c499c7c831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com> Date: Thu, 18 Feb 2016 14:10:35 +0100 Subject: [PATCH] MeasurementResults can now be parsed from xml --- alib2measure/src/allocator/StealthTypes.cpp | 4 + alib2measure/src/allocator/StealthTypes.hpp | 3 +- .../src/measurements/MeasurementTypes.cpp | 10 + .../src/measurements/MeasurementTypes.hpp | 1 + .../measurements/MeasurementXmlFactory.cpp | 352 +++++++++++++++--- .../measurements/MeasurementXmlFactory.hpp | 19 +- .../measurements/frames/MemoryDataFrame.hpp | 13 +- .../src/measurements/frames/TimeDataFrame.hpp | 6 +- .../src/measurements/measurements.hpp | 1 + .../measurements/MeasurementsTest.cpp | 111 +++++- .../test-src/measurements/MeasurementsTest.h | 3 + 11 files changed, 434 insertions(+), 89 deletions(-) diff --git a/alib2measure/src/allocator/StealthTypes.cpp b/alib2measure/src/allocator/StealthTypes.cpp index 07d00967e3..66dfd0ac42 100644 --- a/alib2measure/src/allocator/StealthTypes.cpp +++ b/alib2measure/src/allocator/StealthTypes.cpp @@ -13,4 +13,8 @@ std::string to_string ( stealth_string & ss ) { return ss.c_str ( ); } +stealth_string stealth_string_from_string ( const std::string & str ) { + return stealth_string ( str.c_str ( ) ); +} + } diff --git a/alib2measure/src/allocator/StealthTypes.hpp b/alib2measure/src/allocator/StealthTypes.hpp index c389401fae..21061661c2 100644 --- a/alib2measure/src/allocator/StealthTypes.hpp +++ b/alib2measure/src/allocator/StealthTypes.hpp @@ -17,12 +17,13 @@ using stealth_string = std::basic_string < char, std::char_traits < char >, stea std::string to_string ( const stealth_string & ); std::string to_string ( stealth_string & ); +stealth_string stealth_string_from_string ( const std::string & ); + template < typename T > using stealth_vector = std::vector < T, stealth_allocator < T > >; template < class Key, class T, class Compare = std::less < Key > > using stealth_map = std::map < Key, T, Compare, stealth_allocator < std::pair < const Key, T > > >; - } #endif /* STEALTH_TYPES_HPP_ */ diff --git a/alib2measure/src/measurements/MeasurementTypes.cpp b/alib2measure/src/measurements/MeasurementTypes.cpp index 47f29c9038..c352ced01e 100644 --- a/alib2measure/src/measurements/MeasurementTypes.cpp +++ b/alib2measure/src/measurements/MeasurementTypes.cpp @@ -29,6 +29,16 @@ std::string to_string ( Type t ) { return "ERR"; } +Type measurement_type_from_string ( const std::string & ts ) { + if ( ts == "ROOT" ) return Type::ROOT; + if ( ts == "OVERALL" ) return Type::OVERALL; + if ( ts == "INIT" ) return Type::INIT; + if ( ts == "FINALIZE" ) return Type::FINALIZE; + if ( ts == "MAIN" ) return Type::MAIN; + if ( ts == "AUXILIARY" ) return Type::AUXILIARY; + return Type::ROOT; +} + std::ostream & operator <<( std::ostream & os, Type t ) { os << to_string ( t ); return os; diff --git a/alib2measure/src/measurements/MeasurementTypes.hpp b/alib2measure/src/measurements/MeasurementTypes.hpp index 38e3ed64e2..ba3d870aa7 100644 --- a/alib2measure/src/measurements/MeasurementTypes.hpp +++ b/alib2measure/src/measurements/MeasurementTypes.hpp @@ -18,6 +18,7 @@ enum class Type : unsigned { }; std::string to_string ( Type ); +Type measurement_type_from_string ( const std::string & ); std::ostream & operator <<( std::ostream &, Type ); } diff --git a/alib2measure/src/measurements/MeasurementXmlFactory.cpp b/alib2measure/src/measurements/MeasurementXmlFactory.cpp index 67ae1a6fe8..118e3bd28c 100644 --- a/alib2measure/src/measurements/MeasurementXmlFactory.cpp +++ b/alib2measure/src/measurements/MeasurementXmlFactory.cpp @@ -2,32 +2,37 @@ * Author: Radovan Cerveny */ +#include "sax/FromXMLParserHelper.h" #include "MeasurementXmlFactory.hpp" +#include "exception/AlibException.h" + +using namespace std; +using namespace sax; namespace measurements { -std::deque < sax::Token > MeasurementXmlFactory::composeMeasurementResults ( const MeasurementResults & mr ) { - std::deque < sax::Token > tokens; +deque < Token > MeasurementXmlFactory::composeMeasurementResults ( const MeasurementResults & mr ) { + deque < Token > tokens; - tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, Token::TokenType::START_ELEMENT ); MeasurementXmlFactory::composeMeasurementFrames ( tokens, 0, mr.frames ); - tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, Token::TokenType::END_ELEMENT ); return tokens; } -void MeasurementXmlFactory::composeMeasurementFrames ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) { +void MeasurementXmlFactory::composeMeasurementFrames ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) { const MeasurementFrame & frame = frames[idx]; - tokens.emplace_back ( MEASUREMENT_FRAME_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( measurements::to_string ( frame.name ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( measurements::to_string ( frame.type ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_FRAME_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( frame.name ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( frame.type ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, Token::TokenType::END_ELEMENT ); if ( frame.type != measurements::Type::ROOT ) { composeTimeDataFrame ( tokens, idx, frames ); @@ -35,85 +40,308 @@ void MeasurementXmlFactory::composeMeasurementFrames ( std::deque < sax::Token > composeCounterDataFrame ( tokens, idx, frames ); } - tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, Token::TokenType::START_ELEMENT ); for ( unsigned sub_idx : frame.sub_idxs ) composeMeasurementFrames ( tokens, sub_idx, frames ); - tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( MEASUREMENT_FRAME_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEASUREMENT_FRAME_TAG, Token::TokenType::END_ELEMENT ); } -void MeasurementXmlFactory::composeTimeDataFrame ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) { +void MeasurementXmlFactory::composeTimeDataFrame ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) { const TimeDataFrame & frame = frames[idx].time; - tokens.emplace_back ( TIME_DATA_FRAME_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( frame.duration.count ( ) ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( frame.real_duration.count ( ) ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( TIME_DATA_FRAME_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( TIME_DATA_FRAME_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( frame.duration.count ( ) ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( frame.real_duration.count ( ) ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( TIME_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT ); } -void MeasurementXmlFactory::composeMemoryDataFrame ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) { +void MeasurementXmlFactory::composeMemoryDataFrame ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) { const MemoryDataFrame & frame = frames[idx].memory; - tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( frame.start_heap_usage ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( frame.end_heap_usage ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( frame.high_watermark ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( frame.start_heap_usage ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( frame.end_heap_usage ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( frame.high_watermark ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT ); } -void MeasurementXmlFactory::composeCounterDataFrame ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) { +void MeasurementXmlFactory::composeCounterDataFrame ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) { const CounterDataFrame & cdf = frames[idx].counter; - tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, Token::TokenType::START_ELEMENT ); for ( const auto & elem : cdf.counters ) { - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( elem.first ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( elem.second ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::END_ELEMENT ); } - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::START_ELEMENT ); for ( const auto & elem : cdf.real_counters ) { - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::START_ELEMENT ); - tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::END_ELEMENT ); - tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( elem.first ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( elem.second ), Token::TokenType::CHARACTER ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::END_ELEMENT ); + } + + tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::END_ELEMENT ); + + tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT ); +} + +MeasurementResults MeasurementXmlFactory::parseMeasurementResults ( deque < Token > & tokens ) { + MeasurementResults mr; + + deque < Token >::iterator iter = tokens.begin ( ); + + if ( iter == tokens.end ( ) ) throw::exception::AlibException ( "Empty tokens list" ); + + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_RESULTS_TAG ); + + parseRootMeasurementFrame ( mr, iter ); + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_RESULTS_TAG ); + + if ( iter != tokens.end ( ) ) throw::exception::AlibException ( "Unexpeted tokens at the end of the xml" ); + + return mr; +} + +void MeasurementXmlFactory::parseRootMeasurementFrame ( MeasurementResults & mr, deque < Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TAG ); + + mr.frames.emplace_back ( "Root", measurements::Type::ROOT, 0 ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == MEASUREMENT_FRAME_NAME_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_NAME_TAG ); + FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_NAME_TAG ); + } else if ( data == MEASUREMENT_FRAME_TYPE_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG ); + FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG ); + } else if ( data == MEASUREMENT_SUBFRAMES_TAG ) { + + parseSubframes ( 0, mr, iter ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TAG ); +} + +void MeasurementXmlFactory::parseSubframes ( unsigned parentIdx, MeasurementResults & mr, deque < Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_SUBFRAMES_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == MEASUREMENT_FRAME_TAG ) + parseMeasurementFrame ( parentIdx, mr, iter ); + else + break; + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_SUBFRAMES_TAG ); +} + +void MeasurementXmlFactory::parseMeasurementFrame ( unsigned parentIdx, MeasurementResults & mr, deque < Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TAG ); + + unsigned mfIdx = mr.frames.size ( ); + + mr.frames.emplace_back ( "Root", measurements::Type::ROOT, parentIdx ); + MeasurementFrame & mf = mr.frames.back ( ); + + mr.frames[parentIdx].sub_idxs.push_back ( mfIdx ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == MEASUREMENT_FRAME_NAME_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_NAME_TAG ); + mf.name = measurements::stealth_string_from_string ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_NAME_TAG ); + } else if ( data == MEASUREMENT_FRAME_TYPE_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG ); + mf.type = measurements::measurement_type_from_string ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG ); + } else if ( data == TIME_DATA_FRAME_TAG ) { + parseTimeDataFrame ( mf, iter ); + } else if ( data == MEMORY_DATA_FRAME_TAG ) { + parseMemoryDataFrame ( mf, iter ); + } else if ( data == COUNTER_DATA_FRAME_TAG ) { + parseCounterDataFrame ( mf, iter ); + } else if ( data == MEASUREMENT_SUBFRAMES_TAG ) { + parseSubframes ( mfIdx, mr, iter ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TAG ); +} + +void MeasurementXmlFactory::parseTimeDataFrame ( MeasurementFrame & mf, deque < Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == TIME_DATA_FRAME_DURATION_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_DURATION_TAG ); + mf.time.duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_DURATION_TAG ); + } else if ( data == TIME_DATA_FRAME_REAL_DURATION_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG ); + mf.time.real_duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_TAG ); +} + +void MeasurementXmlFactory::parseMemoryDataFrame ( MeasurementFrame & mf, deque < Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG ); + mf.memory.start_heap_usage = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG ); + } else if ( data == MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG ); + mf.memory.end_heap_usage = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG ); + } else if ( data == MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG ); + mf.memory.high_watermark = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_TAG ); +} + +void MeasurementXmlFactory::parseCounterDataFrame ( MeasurementFrame & mf, deque < Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == COUNTER_DATA_FRAME_COUNTERS_TAG ) + parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_COUNTERS_TAG, mf.counter.counters, iter ); + else if ( data == COUNTER_DATA_FRAME_REAL_COUNTERS_TAG ) + parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, mf.counter.real_counters, iter ); + else + break; } - tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, sax::Token::TokenType::END_ELEMENT ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_TAG ); +} + +void MeasurementXmlFactory::parseCounterDataFrameCounters ( const std::string & tag, stealth_map < stealth_string, CounterHint::value_type > & counters, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, tag ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == COUNTER_DATA_FRAME_COUNTER_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_COUNTER_TAG ); + + stealth_string counterName; + CounterHint::value_type counterValue; + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; - tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, sax::Token::TokenType::END_ELEMENT ); + string counterData = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( counterData == COUNTER_DATA_FRAME_COUNTER_NAME_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_COUNTER_NAME_TAG ); + counterName = stealth_string_from_string ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_COUNTER_NAME_TAG ); + } else if ( counterData == COUNTER_DATA_FRAME_COUNTER_VALUE_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_COUNTER_VALUE_TAG ); + counterValue = valueTypeFromString < CounterHint::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_COUNTER_VALUE_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_COUNTER_TAG ); + + counters[counterName] = counterValue; + + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, tag ); } -MeasurementResults MeasurementXmlFactory::parseMeasurementResults ( std::deque < sax::Token > & ) { - return MeasurementResults ( ); +template < typename T > +T MeasurementXmlFactory::valueTypeFromString ( const std::string & str ) { + istringstream iss ( str ); + T val; + + iss >> val; + return val; } std::string MeasurementXmlFactory::MEASUREMENT_RESULTS_TAG = "MeasurementResults"; @@ -137,6 +365,6 @@ std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_TAG = "CounterData"; std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTERS_TAG = "Counters"; std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_REAL_COUNTERS_TAG = "RealCounters"; std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_TAG = "Counter"; -std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_NAME_TAG = "Name"; +std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_NAME_TAG = "Name"; std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_VALUE_TAG = "Value"; } diff --git a/alib2measure/src/measurements/MeasurementXmlFactory.hpp b/alib2measure/src/measurements/MeasurementXmlFactory.hpp index 04ad1ebc49..11bfa88586 100644 --- a/alib2measure/src/measurements/MeasurementXmlFactory.hpp +++ b/alib2measure/src/measurements/MeasurementXmlFactory.hpp @@ -40,10 +40,21 @@ class MeasurementXmlFactory { static std::string COUNTER_DATA_FRAME_COUNTER_NAME_TAG; static std::string COUNTER_DATA_FRAME_COUNTER_VALUE_TAG; - static void composeMeasurementFrames ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); - static void composeTimeDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); - static void composeMemoryDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); - static void composeCounterDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); + static void composeMeasurementFrames ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & ); + static void composeTimeDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & ); + static void composeMemoryDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & ); + static void composeCounterDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & ); + + static void parseRootMeasurementFrame ( MeasurementResults &, std::deque < sax::Token >::iterator & ); + static void parseSubframes ( unsigned, MeasurementResults &, std::deque < sax::Token >::iterator & ); + static void parseMeasurementFrame ( unsigned, MeasurementResults &, std::deque < sax::Token >::iterator & ); + static void parseTimeDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & ); + static void parseMemoryDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & ); + static void parseCounterDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & ); + static void parseCounterDataFrameCounters ( const std::string &, stealth_map < stealth_string, CounterHint::value_type > &, std::deque < sax::Token >::iterator & ); + + template < typename T > + static T valueTypeFromString ( const std::string & ); public: static std::deque < sax::Token > composeMeasurementResults ( const MeasurementResults & ); diff --git a/alib2measure/src/measurements/frames/MemoryDataFrame.hpp b/alib2measure/src/measurements/frames/MemoryDataFrame.hpp index 989d35784c..f5fc335966 100644 --- a/alib2measure/src/measurements/frames/MemoryDataFrame.hpp +++ b/alib2measure/src/measurements/frames/MemoryDataFrame.hpp @@ -16,20 +16,23 @@ struct MemoryDataFrame; struct MemoryHint { using frame_type = MemoryDataFrame; + using value_type = size_t; enum class Type { NEW, DELETE }; Type type; - size_t size; + value_type size; }; struct MemoryDataFrame { - size_t start_heap_usage; - size_t end_heap_usage; - size_t high_watermark; + using value_type = size_t; - size_t current_heap_usage; + value_type start_heap_usage; + value_type end_heap_usage; + value_type high_watermark; + + value_type current_heap_usage; static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); diff --git a/alib2measure/src/measurements/frames/TimeDataFrame.hpp b/alib2measure/src/measurements/frames/TimeDataFrame.hpp index f5ebcec7f3..a4c717a7fc 100644 --- a/alib2measure/src/measurements/frames/TimeDataFrame.hpp +++ b/alib2measure/src/measurements/frames/TimeDataFrame.hpp @@ -15,10 +15,12 @@ namespace measurements { struct MeasurementFrame; struct TimeDataFrame { + using value_type = std::chrono::microseconds; + std::chrono::time_point < std::chrono::high_resolution_clock > start; - std::chrono::microseconds duration; - std::chrono::microseconds real_duration; + value_type duration; + value_type real_duration; static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); diff --git a/alib2measure/src/measurements/measurements.hpp b/alib2measure/src/measurements/measurements.hpp index e2de451428..0cd6c04c37 100644 --- a/alib2measure/src/measurements/measurements.hpp +++ b/alib2measure/src/measurements/measurements.hpp @@ -6,6 +6,7 @@ #define MEASUREMENTS_HPP_ #include "MeasurementEngine.hpp" +#include "MeasurementXmlFactory.hpp" namespace measurements { diff --git a/alib2measure/test-src/measurements/MeasurementsTest.cpp b/alib2measure/test-src/measurements/MeasurementsTest.cpp index c043485c55..d714157573 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.cpp +++ b/alib2measure/test-src/measurements/MeasurementsTest.cpp @@ -1,5 +1,6 @@ #include "MeasurementsTest.h" #include "sax/SaxComposeInterface.h" +#include <sstream> #include <thread> #include <cmath> #include <measure> @@ -15,7 +16,6 @@ void MeasurementsTest::tearDown ( ) { } void MeasurementsTest::testConstructMeasurements ( ) { - } void MeasurementsTest::testTimeMeasurements ( ) { @@ -72,11 +72,12 @@ void MeasurementsTest::testMemoryMeasurements ( ) { measurements::start ( "chunk1", measurements::Type::MAIN ); int * baz = new int[500]; - delete[] baz; measurements::end ( ); - measurements::start ( "chunk2", measurements::Type::MAIN ); + delete[] baz; + int * foo = new int[1000]; + measurements::start ( "chunk2", measurements::Type::MAIN ); measurements::start ( "chunk21", measurements::Type::MAIN ); int * bar = new int[2000]; measurements::end ( ); @@ -92,21 +93,21 @@ void MeasurementsTest::testMemoryMeasurements ( ) { void MeasurementsTest::testCounterMeasurements ( ) { measurements::start ( "chunk1", measurements::Type::MAIN ); - measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } ); - measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } ); + measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } ); + measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } ); measurements::start ( "chunk11", measurements::Type::MAIN ); - measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); + measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } ); measurements::start ( "chunk111", measurements::Type::MAIN ); - measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); - measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); - measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); - measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} ); + measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); + measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); + measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } ); + measurements::hint ( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0 } ); measurements::end ( ); measurements::start ( "chunk112", measurements::Type::MAIN ); - measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); - measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); - measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); - measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} ); + measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); + measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); + measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } ); + measurements::hint ( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0 } ); measurements::end ( ); measurements::end ( ); measurements::end ( ); @@ -114,4 +115,84 @@ void MeasurementsTest::testCounterMeasurements ( ) { std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl; -} \ No newline at end of file +} + +void MeasurementsTest::testMeasurementXmlFactory ( ) { + measurements::start ( "global", measurements::Type::OVERALL ); + measurements::start ( "init", measurements::Type::INIT ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); + measurements::end ( ); + measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } ); + + measurements::start ( "main", measurements::Type::MAIN ); + int * foo = new int[1000]; + + std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } ); + + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::end ( ); + measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } ); + + measurements::start ( "fin", measurements::Type::FINALIZE ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + int * bar = new int[2000]; + + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::end ( ); + measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } ); + + measurements::end ( ); + measurements::start ( "global2", measurements::Type::OVERALL ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); + measurements::end ( ); + + delete[] foo; + measurements::start ( "global3", measurements::Type::OVERALL ); + measurements::start ( "init", measurements::Type::INIT ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); + measurements::end ( ); + measurements::start ( "main", measurements::Type::MAIN ); + delete[] bar; + std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } ); + + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } ); + + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::end ( ); + measurements::end ( ); + + std::deque < sax::Token > tokens = measurements::MeasurementXmlFactory::composeMeasurementResults ( measurements::results ( ) ); + + measurements::MeasurementResults convertedResults = measurements::MeasurementXmlFactory::parseMeasurementResults ( tokens ); + + std::ostringstream ossoriginal; + + ossoriginal << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; + + std::ostringstream ossconverted; + + ossconverted << measurements::MeasurementFormat::LIST << convertedResults << std::endl; + + std::cout << ossoriginal.str ( ) << std::endl << ossconverted.str ( ) << std::endl; + + CPPUNIT_ASSERT ( ossoriginal.str ( ) == ossconverted.str ( ) ); +} diff --git a/alib2measure/test-src/measurements/MeasurementsTest.h b/alib2measure/test-src/measurements/MeasurementsTest.h index 4afc116c16..25a10d4897 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.h +++ b/alib2measure/test-src/measurements/MeasurementsTest.h @@ -9,6 +9,7 @@ class MeasurementsTest : public CppUnit::TestFixture { CPPUNIT_TEST ( testTimeMeasurements ); CPPUNIT_TEST ( testMemoryMeasurements ); CPPUNIT_TEST ( testCounterMeasurements ); + CPPUNIT_TEST ( testMeasurementXmlFactory ); CPPUNIT_TEST_SUITE_END ( ); public: @@ -19,6 +20,8 @@ public: void testTimeMeasurements ( ); void testMemoryMeasurements ( ); void testCounterMeasurements ( ); + + void testMeasurementXmlFactory ( ); }; #endif // MEASUREMENTS_TEST_H_ -- GitLab