From 2d09993bed545f836cd624577c3ae749de6329b7 Mon Sep 17 00:00:00 2001 From: Giorgio Arena Date: Wed, 25 Oct 2017 15:47:08 +0100 Subject: COMPMID-621 Support several printers for tests Change-Id: I2e8e98aab1ec14c2a1bf17db2facc908b241b783 Reviewed-on: http://mpd-gerrit.cambridge.arm.com/93308 Tested-by: Kaizen Reviewed-by: Anthony Barbier --- tests/framework/Framework.cpp | 132 +++++++++++++++++++++++++++++------------- tests/framework/Framework.h | 16 +++-- tests/main.cpp | 2 +- 3 files changed, 104 insertions(+), 46 deletions(-) (limited to 'tests') diff --git a/tests/framework/Framework.cpp b/tests/framework/Framework.cpp index 318f9b1d4c..82ea0fa93d 100644 --- a/tests/framework/Framework.cpp +++ b/tests/framework/Framework.cpp @@ -134,11 +134,20 @@ void Framework::print_test_info(std::ostream &os) const } } +template +void Framework::func_on_all_printers(F &&func) +{ + std::for_each(std::begin(_printers), std::end(_printers), func); +} + void Framework::log_test_start(const TestInfo &info) { - if(_printer != nullptr && _log_level >= LogLevel::TESTS) + if(_log_level >= LogLevel::TESTS) { - _printer->print_test_header(info); + func_on_all_printers([&](Printer * p) + { + p->print_test_header(info); + }); } } @@ -149,17 +158,20 @@ void Framework::log_test_skipped(const TestInfo &info) void Framework::log_test_end(const TestInfo &info) { - if(_printer != nullptr) + if(_log_level >= LogLevel::MEASUREMENTS) { - if(_log_level >= LogLevel::MEASUREMENTS) + func_on_all_printers([&](Printer * p) { - _printer->print_measurements(_test_results.at(info).measurements); - } + p->print_measurements(_test_results.at(info).measurements); + }); + } - if(_log_level >= LogLevel::TESTS) + if(_log_level >= LogLevel::TESTS) + { + func_on_all_printers([](Printer * p) { - _printer->print_test_footer(); - } + p->print_test_footer(); + }); } } @@ -170,9 +182,12 @@ void Framework::log_failed_expectation(const TestError &error) const bool is_expected_failure = _current_test_info->status == TestCaseFactory::Status::EXPECTED_FAILURE; - if(_log_level >= error.level() && _printer != nullptr) + if(_log_level >= error.level()) { - _printer->print_error(error, is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(error, is_expected_failure); + }); } _current_test_result->status = TestResult::Status::FAILED; @@ -180,9 +195,12 @@ void Framework::log_failed_expectation(const TestError &error) void Framework::log_info(const std::string &info) { - if(_log_level >= LogLevel::DEBUG && _printer != nullptr) + if(_log_level >= LogLevel::DEBUG) { - _printer->print_info(info); + func_on_all_printers([&](Printer * p) + { + p->print_info(info); + }); } } @@ -243,9 +261,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) _current_test_info = &info; _current_test_result = &result; - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { - _printer->print_errors_header(); + func_on_all_printers([](Printer * p) + { + p->print_errors_header(); + }); } const bool is_expected_failure = info.status == TestCaseFactory::Status::EXPECTED_FAILURE; @@ -283,10 +304,13 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) { if(_error_on_missing_assets) { - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { TestError test_error(error.what(), LogLevel::ERRORS); - _printer->print_error(test_error, is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(test_error, is_expected_failure); + }); } result.status = TestResult::Status::FAILED; @@ -298,9 +322,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) } else { - if(_log_level >= LogLevel::DEBUG && _printer != nullptr) + if(_log_level >= LogLevel::DEBUG) { - _printer->print_info(error.what()); + func_on_all_printers([&](Printer * p) + { + p->print_info(error.what()); + }); } result.status = TestResult::Status::NOT_RUN; @@ -308,9 +335,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) } catch(const TestError &error) { - if(_log_level >= error.level() && _printer != nullptr) + if(_log_level >= error.level()) { - _printer->print_error(error, is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(error, is_expected_failure); + }); } result.status = TestResult::Status::FAILED; @@ -323,12 +353,15 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) #ifdef ARM_COMPUTE_CL catch(const ::cl::Error &error) { - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { std::stringstream stream; stream << "Error code: " << error.err(); TestError test_error(error.what(), LogLevel::ERRORS, stream.str()); - _printer->print_error(test_error, is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(test_error, is_expected_failure); + }); } result.status = TestResult::Status::FAILED; @@ -341,9 +374,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) #endif /* ARM_COMPUTE_CL */ catch(const std::exception &error) { - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { - _printer->print_error(error, is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(error, is_expected_failure); + }); } result.status = TestResult::Status::CRASHED; @@ -355,9 +391,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) } catch(...) { - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { - _printer->print_error(TestError("Received unknown exception"), is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(TestError("Received unknown exception"), is_expected_failure); + }); } result.status = TestResult::Status::CRASHED; @@ -370,9 +409,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) } catch(const std::exception &error) { - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { - _printer->print_error(error, is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(error, is_expected_failure); + }); } result.status = TestResult::Status::CRASHED; @@ -384,9 +426,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) } catch(...) { - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { - _printer->print_error(TestError("Received unknown exception"), is_expected_failure); + func_on_all_printers([&](Printer * p) + { + p->print_error(TestError("Received unknown exception"), is_expected_failure); + }); } result.status = TestResult::Status::CRASHED; @@ -397,9 +442,12 @@ void Framework::run_test(const TestInfo &info, TestCaseFactory &test_factory) } } - if(_log_level >= LogLevel::ERRORS && _printer != nullptr) + if(_log_level >= LogLevel::ERRORS) { - _printer->print_errors_footer(); + func_on_all_printers([](Printer * p) + { + p->print_errors_footer(); + }); } _current_test_info = nullptr; @@ -432,9 +480,12 @@ bool Framework::run() // Clear old test results _test_results.clear(); - if(_printer != nullptr && _log_level >= LogLevel::TESTS) + if(_log_level >= LogLevel::TESTS) { - _printer->print_run_header(); + func_on_all_printers([](Printer * p) + { + p->print_run_header(); + }); } const std::chrono::time_point start = std::chrono::high_resolution_clock::now(); @@ -456,9 +507,12 @@ bool Framework::run() const std::chrono::time_point end = std::chrono::high_resolution_clock::now(); - if(_printer != nullptr && _log_level >= LogLevel::TESTS) + if(_log_level >= LogLevel::TESTS) { - _printer->print_run_footer(); + func_on_all_printers([](Printer * p) + { + p->print_run_footer(); + }); } auto runtime = std::chrono::duration_cast(end - start); @@ -527,9 +581,9 @@ Profiler Framework::get_profiler() const return profiler; } -void Framework::set_printer(Printer *printer) +void Framework::add_printer(Printer *printer) { - _printer = printer; + _printers.push_back(printer); } std::vector Framework::test_infos() const diff --git a/tests/framework/Framework.h b/tests/framework/Framework.h index 063824cbdb..1d7efee59f 100644 --- a/tests/framework/Framework.h +++ b/tests/framework/Framework.h @@ -280,7 +280,7 @@ public: * * @param[in] printer Pointer to a printer. */ - void set_printer(Printer *printer); + void add_printer(Printer *printer); /** List of @ref TestInfo's. * @@ -314,14 +314,18 @@ private: */ std::string current_suite_name() const; + /* Perform func on all printers */ + template + void func_on_all_printers(F &&func); + std::vector _test_suite_name{}; std::vector> _test_factories{}; std::map _test_results{}; - int _num_iterations{ 1 }; - bool _throw_errors{ false }; - bool _stop_on_error{ false }; - bool _error_on_missing_assets{ false }; - Printer *_printer{ nullptr }; + int _num_iterations{ 1 }; + bool _throw_errors{ false }; + bool _stop_on_error{ false }; + bool _error_on_missing_assets{ false }; + std::vector _printers{}; using create_function = std::unique_ptr(); std::map _available_instruments{}; diff --git a/tests/main.cpp b/tests/main.cpp index 5bdd665068..d056267418 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -197,7 +197,7 @@ int main(int argc, char **argv) } framework.init(instruments->value(), iterations->value(), dataset_mode->value(), filter->value(), filter_id->value(), log_level->value()); - framework.set_printer(printer.get()); + framework.add_printer(printer.get()); framework.set_throw_errors(throw_errors->value()); framework.set_stop_on_error(stop_on_error->value()); framework.set_error_on_missing_assets(error_on_missing_assets->value()); -- cgit v1.2.1