Add colour log formatter 35/248435/3
authorDariusz Michaluk <d.michaluk@samsung.com>
Thu, 26 Nov 2020 11:18:10 +0000 (12:18 +0100)
committerDariusz Michaluk <d.michaluk@samsung.com>
Thu, 26 Nov 2020 12:00:31 +0000 (13:00 +0100)
Change-Id: I2f5febb66b26107e092c72cfadccf6a91ab8a976

tests/CMakeLists.txt
tests/colour_log_formatter.cpp [new file with mode: 0644]
tests/colour_log_formatter.h [new file with mode: 0644]
tests/common.cpp

index efcbd0e2cb64bdbd808405f4c8856779dc66ebc7..5bb357a022f13df8d6bf50c84599c8b9b15919de 100644 (file)
@@ -48,6 +48,7 @@ ENDIF (CMAKE_BUILD_TYPE MATCHES "COVERAGE")
 FILE(GLOB YACA_SOURCES ${SRC_FOLDER}/*.c)
 SET(TESTS_SOURCES
        common.cpp
+       colour_log_formatter.cpp
        test_debug.cpp
        test_crypto.cpp
        test_key.cpp
diff --git a/tests/colour_log_formatter.cpp b/tests/colour_log_formatter.cpp
new file mode 100644 (file)
index 0000000..5033e2f
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+ *  (C) Copyright Gennadiy Rozental 2005-2008.
+ *  Distributed under the Boost Software License, Version 1.0.
+ *  (See accompanying file LICENSE_1_0.txt or copy at
+ *  http://www.boost.org/LICENSE_1_0.txt)
+ *
+ *  See http://www.boost.org/libs/test for the library home page.
+ */
+/*
+ * @file        colour_log_formatter.cpp
+ * @author      Zofia Abramowska (z.abramowska@samsung.com)
+ * @version
+ * @brief
+ */
+// Boost.Test
+#include "colour_log_formatter.h"
+#include <boost/test/impl/execution_monitor.ipp>
+#if BOOST_VERSION >= 105900
+#include <boost/test/tree/test_unit.hpp>
+#else
+#include <boost/test/unit_test_suite_impl.hpp>
+#endif
+#include <boost/test/framework.hpp>
+#include <boost/test/utils/basic_cstring/io.hpp>
+#include <boost/test/utils/lazy_ostream.hpp>
+
+// Boost
+#include <boost/version.hpp>
+
+// STL
+#include <iostream>
+#include <string>
+
+const char* GREEN_BEGIN = "\033[0;32m";
+const char* RED_BEGIN = "\033[0;31m";
+const char* CYAN_BEGIN = "\033[0;36m";
+const char* BOLD_YELLOW_BEGIN = "\033[1;33m";
+const char* COLOR_END = "\033[m";
+
+// ************************************************************************** //
+// **************            colour_log_formatter            ************** //
+// ************************************************************************** //
+
+using namespace boost::unit_test;
+namespace Yaca {
+
+namespace {
+
+const_string
+test_unit_type_name(const test_unit &tu)
+{
+#if BOOST_VERSION >= 105900
+       return const_string(tu.p_type_name);
+#else
+       return tu.p_type_name.get();
+#endif
+}
+
+const_string
+test_unit_name(const test_unit &tu)
+{
+#if BOOST_VERSION >= 105900
+       return const_string(tu.p_name);
+#else
+       return tu.p_name.get();
+#endif
+}
+
+const_string
+test_phase_identifier()
+{
+       return test_unit_name(framework::current_test_case());
+}
+
+const_string
+get_basename(const const_string &file_name)
+{
+       return basename(file_name.begin());
+}
+
+std::string
+get_basename(const std::string &file_name)
+{
+       return basename(file_name.c_str());
+}
+
+bool
+test_unit_type_name_contains(const test_unit &tu, const std::string &substr)
+{
+       return test_unit_type_name(tu).find(const_string(substr)) == 0;
+}
+
+} // local namespace
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_start(
+       std::ostream &output,
+       counter_t test_cases_amount)
+{
+       if (test_cases_amount > 0)
+               output  << "Running " << test_cases_amount << " test "
+                               << (test_cases_amount > 1 ? "cases" : "case") << "...\n";
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_finish(std::ostream &ostr)
+{
+       ostr.flush();
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_build_info(std::ostream &output, bool log_build_info)
+{
+       if (log_build_info)
+               output  << "Platform: " << BOOST_PLATFORM            << '\n'
+                               << "Compiler: " << BOOST_COMPILER            << '\n'
+                               << "STL     : " << BOOST_STDLIB              << '\n';
+       output  << "Boost   : " << BOOST_VERSION / 100000      << '.'
+                       << BOOST_VERSION / 100 % 1000  << '.'
+                       << BOOST_VERSION % 100       << std::endl;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::test_unit_start(
+       std::ostream &output,
+       test_unit const &tu)
+{
+       if (test_unit_type_name_contains(tu, "suite")) {
+               output << "Starting test ";
+       } else {
+               output << "Running test ";
+       }
+       output << test_unit_type_name(tu) << " \"" << test_unit_name(tu)
+                  << "\"" << std::endl;
+
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::test_unit_finish(
+       std::ostream &output,
+       test_unit const &tu,
+       unsigned long elapsed)
+{
+       if (test_unit_type_name_contains(tu, "suite")) {
+               output << "Finished test " << test_unit_type_name(tu) << " \"" << test_unit_name(tu) << "\"" <<
+                          std::endl;
+               return;
+       }
+
+       std::string color = GREEN_BEGIN;
+       std::string status = "OK";
+
+       if (m_isTestCaseFailed) {
+               color = RED_BEGIN;
+               status = "FAIL";
+       }
+
+       output << "\t" << "[   " << color << status << COLOR_END <<
+                  "   ]";
+
+
+       output << ", " << CYAN_BEGIN << "time: ";
+
+       if (elapsed > 0) {
+               if (elapsed % 1000 == 0)
+                       output << elapsed / 1000 << "ms";
+               else
+                       output << elapsed << "mks";
+       } else {
+               output << "N/A";
+       }
+
+       output << COLOR_END << std::endl;
+       m_isTestCaseFailed = false;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::test_unit_skipped(
+       std::ostream &output,
+       test_unit const &tu)
+{
+       output  << "Test " << test_unit_type_name(tu) << " \"" << test_unit_name(tu) << "\"" <<
+                       "is skipped" << std::endl;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_exception(
+       std::ostream &output,
+       log_checkpoint_data const &checkpoint_data,
+       boost::execution_exception const &ex)
+{
+       boost::execution_exception::location const &loc = ex.where();
+       output << '\t' << BOLD_YELLOW_BEGIN << get_basename(
+                          loc.m_file_name)
+                  << '(' << loc.m_line_num << "), ";
+
+       output << "fatal error in \""
+                  << (loc.m_function.is_empty() ? test_phase_identifier() : loc.m_function) <<
+                  "\": ";
+
+       output << COLOR_END << ex.what();
+
+       if (!checkpoint_data.m_file_name.is_empty()) {
+               output << '\n';
+               output << "\tlast checkpoint : " << get_basename(checkpoint_data.m_file_name)
+                          << '(' << checkpoint_data.m_line_num << ")";
+
+               if (!checkpoint_data.m_message.empty())
+                       output << ": " << checkpoint_data.m_message;
+       }
+
+       output << std::endl;
+       m_isTestCaseFailed = true;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_entry_start(
+       std::ostream &output,
+       log_entry_data const &entry_data,
+       log_entry_types let)
+{
+       switch (let) {
+       case BOOST_UTL_ET_INFO:
+               output << '\t' << entry_data.m_file_name << '(' << entry_data.m_line_num <<
+                          "), ";
+               output << "info: ";
+               break;
+
+       case BOOST_UTL_ET_MESSAGE:
+               break;
+
+       case BOOST_UTL_ET_WARNING:
+               output << '\t' << get_basename(entry_data.m_file_name) << '(' <<
+                          entry_data.m_line_num << "), ";
+               output << "warning in \"" << test_phase_identifier() << "\": ";
+               break;
+
+       case BOOST_UTL_ET_ERROR:
+               output << '\t' << BOLD_YELLOW_BEGIN <<  get_basename(
+                                  entry_data.m_file_name)
+                          << '(' << entry_data.m_line_num << "), ";
+               output << "error in \"" << test_phase_identifier() << "\": ";
+               m_isTestCaseFailed = true;
+               break;
+
+       case BOOST_UTL_ET_FATAL_ERROR:
+               output << '\t' << BOLD_YELLOW_BEGIN <<  get_basename(
+                                  entry_data.m_file_name)
+                          << '(' << entry_data.m_line_num << "),  ";
+               output <<  " fatal error in \"" << test_phase_identifier() << "\": ";
+               m_isTestCaseFailed = true;
+               break;
+       }
+
+       output << COLOR_END;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_entry_value(
+       std::ostream &output,
+       const_string value)
+{
+       output << value;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_entry_value(
+       std::ostream &output,
+       lazy_ostream const &value)
+{
+       output << value;
+}
+
+//____________________________________________________________________________//
+
+void
+colour_log_formatter::log_entry_finish(
+       std::ostream &output)
+{
+       output << std::endl;
+}
+
+//____________________________________________________________________________//
+
+#if BOOST_VERSION >= 106501
+void
+colour_log_formatter::log_exception_start(
+       std::ostream& os,
+       boost::unit_test::log_checkpoint_data const& lcd,
+       boost::execution_exception const& ex)
+{
+       log_exception(os, lcd, ex);
+}
+
+void
+colour_log_formatter::log_exception_finish(std::ostream& os)
+{
+       (void)os;
+}
+
+void
+colour_log_formatter::entry_context_start(
+       std::ostream& os,
+       boost::unit_test::log_level l)
+{
+       (void)os;
+       (void)l;
+}
+
+void
+colour_log_formatter::log_entry_context(
+       std::ostream& os,
+       boost::unit_test::log_level l,
+       boost::unit_test::const_string value)
+{
+       (void)os;
+       (void)l;
+       (void)value;
+}
+
+void
+colour_log_formatter::entry_context_finish(
+       std::ostream& os,
+       boost::unit_test::log_level l)
+{
+       (void)os;
+       (void)l;
+}
+#endif
+
+//____________________________________________________________________________//
+
+} // namespace Yaca
+
+//____________________________________________________________________________//
diff --git a/tests/colour_log_formatter.h b/tests/colour_log_formatter.h
new file mode 100644 (file)
index 0000000..c971263
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ *  (C) Copyright Gennadiy Rozental 2005-2008.
+ *  Distributed under the Boost Software License, Version 1.0.
+ *  (See accompanying file LICENSE_1_0.txt or copy at
+ *  http://www.boost.org/LICENSE_1_0.txt)
+ *
+ *  See http://www.boost.org/libs/test for the library home page.
+ */
+/*
+ * @file        colour_log_formatter.h
+ * @author      Zofia Abramowska (z.abramowska@samsung.com)
+ * @version
+ * @brief
+ */
+#pragma once
+#include <boost/test/unit_test_log_formatter.hpp>
+
+namespace Yaca {
+class colour_log_formatter : public boost::unit_test::unit_test_log_formatter {
+public:
+       // Formatter interface
+       colour_log_formatter() : m_isTestCaseFailed(false) {}
+       void    log_start(
+               std::ostream &,
+               boost::unit_test::counter_t test_cases_amount);
+       void    log_finish(std::ostream &);
+       void    log_build_info(std::ostream &output, bool log_build_info = true);
+
+       void    test_unit_start(
+               std::ostream &,
+               boost::unit_test::test_unit const &tu);
+       void    test_unit_finish(
+               std::ostream &,
+               boost::unit_test::test_unit const &tu,
+               unsigned long elapsed);
+       void    test_unit_skipped(
+               std::ostream &,
+               boost::unit_test::test_unit const &tu);
+
+       void    log_exception(
+               std::ostream &,
+               boost::unit_test::log_checkpoint_data const &,
+               boost::execution_exception const &ex);
+
+       void    log_entry_start(
+               std::ostream &,
+               boost::unit_test::log_entry_data const &,
+               log_entry_types let);
+       void    log_entry_value(
+               std::ostream &,
+               boost::unit_test::const_string value);
+       void    log_entry_value(
+               std::ostream &,
+               boost::unit_test::lazy_ostream const &value);
+       void    log_entry_finish(std::ostream &);
+
+#if BOOST_VERSION >= 106501
+       void    log_exception_start(
+               std::ostream& os,
+               boost::unit_test::log_checkpoint_data const& lcd,
+               boost::execution_exception const& ex);
+       void    log_exception_finish(std::ostream& os);
+       void    entry_context_start(
+               std::ostream& os,
+               boost::unit_test::log_level l);
+       void    log_entry_context(
+               std::ostream& os,
+               boost::unit_test::log_level l,
+               boost::unit_test::const_string value);
+       void    entry_context_finish(
+               std::ostream& os,
+               boost::unit_test::log_level l);
+#endif
+
+private:
+       bool m_isTestCaseFailed;
+};
+} // namespace Yaca
index e7b5db33b98131bb03e3d987b41e54f179244348..04c2779ddc12cd13937c86f0cdbb719b7da795a5 100644 (file)
@@ -36,6 +36,7 @@
 #include "../src/debug.h"
 
 #include "common.h"
+#include "colour_log_formatter.h"
 
 
 namespace {
@@ -84,6 +85,7 @@ struct TestConfig {
                boost::unit_test::unit_test_log.set_threshold_level(
                        boost::unit_test::log_test_units);
                boost::unit_test::results_reporter::set_level(boost::unit_test::SHORT_REPORT);
+               boost::unit_test::unit_test_log.set_formatter(new Yaca::colour_log_formatter);
        }
        ~TestConfig()
        {