From c6f01aad81a647eb3f74026dfadaeaa544ab4ed0 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 21 Jan 2022 12:10:12 +0300 Subject: [PATCH] Support logging in tests --- tools/test/source/main.cpp | 52 ++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/tools/test/source/main.cpp b/tools/test/source/main.cpp index 43463751..f277c3d2 100644 --- a/tools/test/source/main.cpp +++ b/tools/test/source/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -44,6 +45,17 @@ namespace psemek::test tests[pname] = f; } + struct sink + : log::sink + { + std::vector> messages; + + void put_message(log::message const & msg) override + { + messages.push_back({msg.level, std::string(msg.message)}); + } + }; + } int main(int argc, char ** argv) @@ -90,6 +102,11 @@ int main(int argc, char ** argv) auto all_start = clock::now(); + std::unique_ptr sink = std::make_unique(); + auto sink_ptr = static_cast(sink.get()); + + psemek::log::register_thread("test"); + std::size_t i = 0; for (auto const & name : tests) { @@ -101,29 +118,54 @@ int main(int argc, char ** argv) psemek::test::context ctx; + psemek::log::add_sink(std::move(sink)); + + bool failure = true; + + auto start = clock::now(); try { - auto start = clock::now(); psemek::test::tests[name](ctx); auto end = clock::now(); - std::cout << "ok " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl; + std::cout << "ok " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}); + + auto filter = [](auto const & m){ return m.first >= psemek::log::level::info; }; + if (std::count_if(sink_ptr->messages.begin(), sink_ptr->messages.end(), filter) == 1) + { + std::cout << " " << std::find_if(sink_ptr->messages.begin(), sink_ptr->messages.end(), filter)->second; + sink_ptr->messages.clear(); + } + std::cout << std::endl; + failure = false; ++success; } catch (psemek::test::failure const & e) { - std::cout << "failure" << std::endl; + auto end = clock::now(); + std::cout << "failure " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl; std::cout << indent << "Reason: " << e.message() << std::endl; std::cout << indent << "Location: " << e.location() << std::endl; } catch (std::exception const & e) { - std::cout << "failure: " << e.what() << std::endl; + auto end = clock::now(); + std::cout << "failure: " << e.what() << " " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl; } catch (...) { - std::cout << "failure: (unknown exception)" << std::endl; + auto end = clock::now(); + std::cout << "failure: (unknown exception) " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl; } + sink = psemek::log::remove_sink(sink_ptr); + + for (auto const & msg : sink_ptr->messages) + { + if (failure || msg.first >= psemek::log::level::info) + std::cout << indent << msg.second << std::endl; + } + sink_ptr->messages.clear(); + std::size_t max_profile_name_len = 0; for (auto const & p : ctx.profile) max_profile_name_len = std::max(max_profile_name_len, p.name.size());