From 77c6ab5374a563f72b3e118bc7c6e90a2b908099 Mon Sep 17 00:00:00 2001 From: Tomas Pecka <peckato1@fit.cvut.cz> Date: Sun, 24 Feb 2019 15:38:21 +0100 Subject: [PATCH] Unit tests: CPPUNIT -> Catch2: measure --- alib2measure/test-src/main.cpp | 168 +--------- .../measurements/MeasurementsTest.cpp | 305 +++++++++--------- .../test-src/measurements/MeasurementsTest.h | 24 -- 3 files changed, 153 insertions(+), 344 deletions(-) delete mode 100644 alib2measure/test-src/measurements/MeasurementsTest.h diff --git a/alib2measure/test-src/main.cpp b/alib2measure/test-src/main.cpp index 84ddf47856..4ed06df1f7 100644 --- a/alib2measure/test-src/main.cpp +++ b/alib2measure/test-src/main.cpp @@ -1,166 +1,2 @@ -#include <version.hpp> - -#include <tclap/CmdLine.h> - -#include <cppunit/CompilerOutputter.h> -#include <cppunit/extensions/TestFactoryRegistry.h> -#include <cppunit/ui/text/TestRunner.h> -#include <cppunit/TestResultCollector.h> -#include <cppunit/TestResult.h> -#include <cppunit/XmlOutputter.h> - -#include <cppunit/Test.h> -#include <cppunit/TestFailure.h> -#include <cppunit/portability/Stream.h> -#include <cppunit/TestListener.h> -#include <cppunit/SourceLine.h> -#include <cppunit/Exception.h> - -//#include <exception/CommonException.h> - -CPPUNIT_NS_BEGIN - -class CPPUNIT_API TestProgressListener : public TestListener -{ -public: - TestProgressListener(); - - virtual ~TestProgressListener(); - - void startTest( Test *test ); - - void addFailure( const TestFailure &failure ); - - void endTest( Test *test ); - - int getResult() const; - - void printResults() const; - -private: - TestProgressListener( const TestProgressListener © ); - - void operator =( const TestProgressListener © ); - -private: - int m_Failures; - int m_Tests; - int m_Assertions; - bool m_lastTestFailed; -}; - -TestProgressListener::TestProgressListener() : m_Failures( 0 ), m_Tests(0), m_Assertions(0), m_lastTestFailed( false ) -{ -} - -TestProgressListener::~TestProgressListener() -{ -} - -void TestProgressListener::startTest( Test * test ) -{ - stdCOut() << test->getName() << ":" << "\n"; - stdCOut().flush(); - - m_lastTestFailed = false; - m_Tests++; -} - -void TestProgressListener::addFailure( const TestFailure &failure ) -{ - stdCOut() << (failure.isError() ? "error" : "assertion") << " : " << failure.failedTestName() << " : " << failure.sourceLine().lineNumber() << "\n"; - stdCOut() << "Exception " << failure.thrownException()->message().details(); - - m_lastTestFailed = true; - if(failure.isError()) m_Failures++; else m_Assertions++; -} - -void TestProgressListener::endTest( Test * test) -{ - stdCOut() << "Result (" << test->getName() << ")"; - stdCOut().flush(); - - if ( !m_lastTestFailed ) - stdCOut() << " : OK"; - else - stdCOut() << " : Fail"; - stdCOut() << "\n\n"; -} - -int TestProgressListener::getResult() const { - return m_Failures + m_Assertions; -} - -void TestProgressListener::printResults() const { - stdCOut() << "Overal result: Tests: " << m_Tests << " Assertions: " << m_Assertions << " Failures: " << m_Failures << "\n"; -} - -CPPUNIT_NS_END - -int main(int argc, char* argv[]) { - try { - TCLAP::CmdLine cmd("Main test binary.", ' ', ALIB_VERSION_INFO); - - TCLAP::MultiArg<std::string> testPathSegments("p", "path", "test path", false, "string" ); - cmd.add( testPathSegments ); - - cmd.parse(argc, argv); - - CppUnit::TestResult controller; - - CppUnit::TestResultCollector result; - controller.addListener( &result ); - - CppUnit::TestProgressListener progressListener; - controller.addListener( &progressListener ); - - CppUnit::Test *suite = NULL; - std::string testPath = ""; - if(testPathSegments.getValue().size() == 0) { - // Get the top level suite from the registry - suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); - } else if(testPathSegments.getValue().size() == 1) { - suite = CppUnit::TestFactoryRegistry::getRegistry(testPathSegments.getValue()[0]).makeTest(); - } else { - suite = CppUnit::TestFactoryRegistry::getRegistry(testPathSegments.getValue()[0]).makeTest(); - bool first = true; - for(const std::string& path : testPathSegments.getValue()) { - if(first) { - first = false; - continue; - } - testPath += path + "/"; - } - testPath.pop_back(); - } - - // Adds the test to the list of test to run - CppUnit::TextUi::TestRunner runner; - runner.addTest( suite ); - - // Change the default outputter to a compiler error format outputter - runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), std::cerr ) ); - // Run the tests. - runner.run( controller, testPath ); - - progressListener.printResults(); - - std::ofstream xmlFileResults("CppUnitTestResults.xml"); - CppUnit::XmlOutputter xmlOut(&result, xmlFileResults); - xmlOut.write(); - - return progressListener.getResult(); -/* } catch(const exception::CommonException& exception) { - std::cerr << exception.getCause() << std::endl; - return 1;*/ - } catch(const TCLAP::ArgException& exception) { - std::cerr << exception.error() << std::endl; - return 2; - } catch (const std::exception& exception) { - std::cerr << "Exception caught: " << exception.what() << std::endl; - return 3; - } catch(...) { - std::cerr << "Unknown exception caught." << std::endl; - return 127; - } -} +#define CATCH_CONFIG_MAIN +#include <catch2/catch.hpp> diff --git a/alib2measure/test-src/measurements/MeasurementsTest.cpp b/alib2measure/test-src/measurements/MeasurementsTest.cpp index a1210d32dc..1571890f1a 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.cpp +++ b/alib2measure/test-src/measurements/MeasurementsTest.cpp @@ -1,179 +1,176 @@ -#include "MeasurementsTest.h" +#include <catch2/catch.hpp> #include <sstream> #include <thread> #include <cmath> +#include <iostream> #include <alib/measure> -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( MeasurementsTest, "measurements" ); -CPPUNIT_TEST_SUITE_REGISTRATION ( MeasurementsTest ); - -void MeasurementsTest::setUp ( ) { +TEST_CASE ( "Measurements", "[unit][measure][measurements]" ) { measurements::reset ( ); -} -void MeasurementsTest::tearDown ( ) { -} + SECTION ( "Construct Measurements" ) { + } -void MeasurementsTest::testConstructMeasurements ( ) { -} + SECTION ( "Time Measurements" ) { + measurements::start ( "global", 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 ); + 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::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::start ( "fin", measurements::Type::FINALIZE ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) ); + 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::end ( ); + measurements::start ( "global2", measurements::Type::OVERALL ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); + measurements::end ( ); + 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 ); + 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::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::end ( ); + + + //root, global1, init, main, aux, aux, fin,aux,...,global2,...,global3, init, main, aux, aux + int expectedResults [ ] = {0, 510000, 100000, 260000, 40000, 40000, 150000, 40000, 100000, 360000, 100000, 260000, 40000, 40000 }; + const int DEVIATION = 25000; + + auto results = measurements::results ( ); + + int i = 0; + for(const measurements::MeasurementFrame & frame : results.frames) { + CHECK ( std::abs ( expectedResults[i] - frame.time.duration.count ( ) ) <= DEVIATION ); + i++; + } -void MeasurementsTest::testTimeMeasurements ( ) { - measurements::start ( "global", 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 ); - 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::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::start ( "fin", measurements::Type::FINALIZE ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) ); - 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::end ( ); - measurements::start ( "global2", measurements::Type::OVERALL ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); - measurements::end ( ); - 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 ); - 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::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::end ( ); - - - //root, global1, init, main, aux, aux, fin,aux,...,global2,...,global3, init, main, aux, aux - int expectedResults [ ] = {0, 510000, 100000, 260000, 40000, 40000, 150000, 40000, 100000, 360000, 100000, 260000, 40000, 40000 }; - const int DEVIATION = 25000; - - auto results = measurements::results ( ); - - int i = 0; - for(const measurements::MeasurementFrame & frame : results.frames) { - CPPUNIT_ASSERT ( std::abs ( expectedResults[i] - frame.time.duration.count ( ) ) <= DEVIATION ); - i++; + // std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; + // std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; } - std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; - std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; -} - #ifdef __clang__ #define __NO_OPTIMIZE_ATTRIBUTE__ __attribute__((optnone)) #else #define __NO_OPTIMIZE_ATTRIBUTE__ __attribute__((optimize("O0"))) #endif -void __NO_OPTIMIZE_ATTRIBUTE__ MeasurementsTest::testMemoryMeasurements ( ) { - measurements::start ( "chunk1", measurements::Type::MAIN ); - int * baz = new int[500]; - measurements::end ( ); - 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 ( ); - delete[] foo; - delete[] bar; - measurements::end ( ); - - measurements::start ( "chunk3", measurements::Type::MAIN ); - measurements::start ( "chunk31", measurements::Type::MAIN ); - bar = new int[1000]; - delete[] bar; - measurements::end ( ); - measurements::end ( ); - - auto results = measurements::results ( ); - - std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; - std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; + //void __NO_OPTIMIZE_ATTRIBUTE__ MeasurementsTest::testMemoryMeasurements ( ) { + SECTION ( "Memory Measurements" ) { + measurements::start ( "chunk1", measurements::Type::MAIN ); + int * baz = new int[500]; + measurements::end ( ); + 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 ( ); + delete[] foo; + delete[] bar; + measurements::end ( ); + + measurements::start ( "chunk3", measurements::Type::MAIN ); + measurements::start ( "chunk31", measurements::Type::MAIN ); + bar = new int[1000]; + delete[] bar; + measurements::end ( ); + measurements::end ( ); + + auto results = measurements::results ( ); + + + + //std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; + //std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; #if 0 - int expectedResultsHW [ ] = { 12000, 2000, 12000 , 12000, 4000, 4000 }; - int expectedResultsSHU [ ] = { 0, 0 , 4000 , 4000 , 0 , 0 }; - int expectedResultsEHU [ ] = { 0, 2000, 0 , 12000, 0 , 0 }; - - int i = 0; - for(const measurements::MeasurementFrame & frame : results.frames) { - CPPUNIT_ASSERT ( expectedResultsHW[i] == frame.memory.highWatermark ); - CPPUNIT_ASSERT ( expectedResultsSHU[i] == frame.memory.startHeapUsage ); - CPPUNIT_ASSERT ( expectedResultsEHU[i] == frame.memory.endHeapUsage ); - i++; - } + int expectedResultsHW [ ] = { 12000, 2000, 12000 , 12000, 4000, 4000 }; + int expectedResultsSHU [ ] = { 0, 0 , 4000 , 4000 , 0 , 0 }; + int expectedResultsEHU [ ] = { 0, 2000, 0 , 12000, 0 , 0 }; + + int i = 0; + for(const measurements::MeasurementFrame & frame : results.frames) { + CHECK ( expectedResultsHW[i] == frame.memory.highWatermark ); + CHECK ( expectedResultsSHU[i] == frame.memory.startHeapUsage ); + CHECK ( expectedResultsEHU[i] == frame.memory.endHeapUsage ); + i++; + } #endif -} + } -void MeasurementsTest::testCounterMeasurements ( ) { - - measurements::start ( "chunk1", measurements::Type::MAIN ); - measurements::counterInc ( "test1", 5 ); - measurements::counterInc ( "test2" ); - measurements::start ( "chunk11", measurements::Type::MAIN ); - measurements::counterDec ( "test3" ); - measurements::start ( "chunk111", measurements::Type::MAIN ); - measurements::counterDec ( "test1" ); - measurements::counterDec ( "test2", 10 ); - measurements::counterDec ( "test3" ); - measurements::counterDec ( "test4" ); - measurements::end ( ); - measurements::start ( "chunk112", measurements::Type::MAIN ); - measurements::counterDec ( "test1" ); - measurements::counterDec ( "test2", 10 ); - measurements::counterDec ( "test3" ); - measurements::counterDec ( "test4" ); - measurements::end ( ); - measurements::end ( ); - measurements::end ( ); - - std::map < std::string, int > expectedResults [ ] = { - { } , - { { "test1", 3 } , { "test2", -19 } , { "test3", -3 } , { "test4", -2 } } , - { { "test1", 3 } , { "test2", -19 } , { "test3", -3 } , { "test4", -2 } } , - { { "test1", 4 } , { "test2", -9 } , { "test3", -2 } , { "test4", -1 } } , - { { "test1", 3 } , { "test2", -19 } , { "test3", -3 } , { "test4", -2 } } , - }; - - auto results = measurements::results ( ); - - int i = 0; - for(const measurements::MeasurementFrame & frame : results.frames) { - - auto erit = expectedResults[i].begin ( ); - auto it = frame.counter.counters.begin ( ); - - while ( erit != expectedResults[i].end ( ) ) { - CPPUNIT_ASSERT ( erit->first == measurements::to_string ( it->first ) ); - CPPUNIT_ASSERT ( erit->second == it->second ); - ++erit; - ++it; + SECTION ( "Counter" ) { + measurements::start ( "chunk1", measurements::Type::MAIN ); + measurements::counterInc ( "test1", 5 ); + measurements::counterInc ( "test2" ); + measurements::start ( "chunk11", measurements::Type::MAIN ); + measurements::counterDec ( "test3" ); + measurements::start ( "chunk111", measurements::Type::MAIN ); + measurements::counterDec ( "test1" ); + measurements::counterDec ( "test2", 10 ); + measurements::counterDec ( "test3" ); + measurements::counterDec ( "test4" ); + measurements::end ( ); + measurements::start ( "chunk112", measurements::Type::MAIN ); + measurements::counterDec ( "test1" ); + measurements::counterDec ( "test2", 10 ); + measurements::counterDec ( "test3" ); + measurements::counterDec ( "test4" ); + measurements::end ( ); + measurements::end ( ); + measurements::end ( ); + + std::map < std::string, int > expectedResults [ ] = { + { } , + { { "test1", 3 } , { "test2", -19 } , { "test3", -3 } , { "test4", -2 } } , + { { "test1", 3 } , { "test2", -19 } , { "test3", -3 } , { "test4", -2 } } , + { { "test1", 4 } , { "test2", -9 } , { "test3", -2 } , { "test4", -1 } } , + { { "test1", 3 } , { "test2", -19 } , { "test3", -3 } , { "test4", -2 } } , + }; + + auto results = measurements::results ( ); + + int i = 0; + for(const measurements::MeasurementFrame & frame : results.frames) { + + auto erit = expectedResults[i].begin ( ); + auto it = frame.counter.counters.begin ( ); + + while ( erit != expectedResults[i].end ( ) ) { + REQUIRE ( erit->first == measurements::to_string ( it->first ) ); + CHECK ( erit->second == it->second ); + ++erit; + ++it; + } + + i++; } - i++; + // std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; + // std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; } - - std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; - std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; } diff --git a/alib2measure/test-src/measurements/MeasurementsTest.h b/alib2measure/test-src/measurements/MeasurementsTest.h deleted file mode 100644 index 4afc116c16..0000000000 --- a/alib2measure/test-src/measurements/MeasurementsTest.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MEASUREMENTS_TEST_H_ -#define MEASUREMENTS_TEST_H_ - -#include <cppunit/extensions/HelperMacros.h> - -class MeasurementsTest : public CppUnit::TestFixture { - CPPUNIT_TEST_SUITE ( MeasurementsTest ); - CPPUNIT_TEST ( testConstructMeasurements ); - CPPUNIT_TEST ( testTimeMeasurements ); - CPPUNIT_TEST ( testMemoryMeasurements ); - CPPUNIT_TEST ( testCounterMeasurements ); - CPPUNIT_TEST_SUITE_END ( ); - -public: - void setUp ( ); - void tearDown ( ); - - void testConstructMeasurements ( ); - void testTimeMeasurements ( ); - void testMemoryMeasurements ( ); - void testCounterMeasurements ( ); -}; - -#endif // MEASUREMENTS_TEST_H_ -- GitLab