Support logging in tests

This commit is contained in:
Nikita Lisitsa 2022-01-21 12:10:12 +03:00
parent 454d975ba6
commit c6f01aad81

View file

@ -1,5 +1,6 @@
#include <psemek/test/test.hpp>
#include <psemek/util/pretty_print.hpp>
#include <psemek/log/log.hpp>
#include <map>
#include <set>
@ -44,6 +45,17 @@ namespace psemek::test
tests[pname] = f;
}
struct sink
: log::sink
{
std::vector<std::pair<log::level, std::string>> 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<psemek::log::sink> sink = std::make_unique<psemek::test::sink>();
auto sink_ptr = static_cast<psemek::test::sink *>(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());