Line data Source code
1 : // (C) Copyright 2016 Raffi Enficiaud. 2 : // Distributed under the Boost Software License, Version 1.0. 3 : // (See accompanying file LICENSE_1_0.txt or copy at 4 : // http://www.boost.org/LICENSE_1_0.txt) 5 : 6 : // See http://www.boost.org/libs/test for the library home page. 7 : // 8 : ///@file 9 : ///@brief Contains the definition of the Junit log formatter (OF_JUNIT) 10 : // *************************************************************************** 11 : 12 : #ifndef BOOST_TEST_JUNIT_LOG_FORMATTER__ 13 : #define BOOST_TEST_JUNIT_LOG_FORMATTER__ 14 : 15 : // Boost.Test 16 : #include <boost/test/detail/global_typedef.hpp> 17 : #include <boost/test/unit_test_log_formatter.hpp> 18 : #include <boost/test/tree/test_unit.hpp> 19 : 20 : //#include <boost/test/results_collector.hpp> 21 : 22 : // STL 23 : #include <cstddef> // std::size_t 24 : #include <map> 25 : #include <list> 26 : 27 : #include <boost/test/detail/suppress_warnings.hpp> 28 : 29 : //____________________________________________________________________________// 30 : 31 : namespace boost { 32 : namespace unit_test { 33 : namespace output { 34 : 35 : 36 : namespace junit_impl { 37 : 38 : // helper for the JUnit logger 39 : struct junit_log_helper 40 : { 41 0 : struct assertion_entry { 42 : 43 : enum log_entry_t { 44 : log_entry_info, 45 : log_entry_error, 46 : log_entry_failure 47 : }; 48 : 49 0 : assertion_entry() : sealed(false) 50 0 : {} 51 : 52 : std::string logentry_message; // the message associated to the JUnit error/entry 53 : std::string logentry_type; // the one that will get expanded in the final junit (failure, error) 54 : std::string output; // additional information/message generated by the assertion 55 : 56 : log_entry_t log_entry; // the type associated to the assertion (or error) 57 : 58 : bool sealed; // indicates if the entry can accept additional information 59 : }; 60 : 61 : std::list<std::string> system_out; // sysout: additional information 62 : std::list<std::string> system_err; // syserr: additional information 63 : std::string skipping_reason; 64 : 65 : // list of failure, errors and messages (assertions message and the full log) 66 : std::vector< assertion_entry > assertion_entries; 67 : 68 : bool skipping; 69 : 70 292 : junit_log_helper(): skipping(false) 71 292 : {} 72 : 73 0 : void clear() { 74 0 : assertion_entries.clear(); 75 0 : system_out.clear(); 76 0 : system_err.clear(); 77 0 : skipping_reason.clear(); 78 0 : skipping = false; 79 0 : } 80 : 81 : }; 82 : } 83 : 84 : // ************************************************************************** // 85 : // ************** junit_log_formatter ************** // 86 : // ************************************************************************** // 87 : 88 : /// JUnit logger class 89 : class junit_log_formatter : public unit_test_log_formatter { 90 : public: 91 : 92 438 : junit_log_formatter() : m_display_build_info(false) 93 292 : { 94 : // we log everything from the logger singleton point of view 95 : // because we need to know about all the messages/commands going to the logger 96 : // we decide what we put inside the logs internally 97 146 : this->m_log_level = log_successful_tests; 98 146 : m_log_level_internal = log_messages; 99 292 : } 100 : 101 : // Formatter interface 102 : void log_start( std::ostream&, counter_t test_cases_amount ) BOOST_OVERRIDE; 103 : void log_finish( std::ostream& ) BOOST_OVERRIDE; 104 : void log_build_info( std::ostream&, bool ) BOOST_OVERRIDE; 105 : 106 : void test_unit_start( std::ostream&, test_unit const& tu ) BOOST_OVERRIDE; 107 : void test_unit_finish( std::ostream&, test_unit const& tu, unsigned long elapsed ) BOOST_OVERRIDE; 108 : void test_unit_skipped( std::ostream&, test_unit const& tu, const_string reason ) BOOST_OVERRIDE; 109 : void test_unit_aborted( std::ostream& os, test_unit const& tu ) BOOST_OVERRIDE; 110 : void test_unit_timed_out( std::ostream& os, test_unit const& tu) BOOST_OVERRIDE; 111 : 112 : void log_exception_start( std::ostream&, log_checkpoint_data const&, execution_exception const& ex ) BOOST_OVERRIDE; 113 : void log_exception_finish( std::ostream& ) BOOST_OVERRIDE; 114 : 115 : void log_entry_start( std::ostream&, log_entry_data const&, log_entry_types let ) BOOST_OVERRIDE; 116 : 117 : using unit_test_log_formatter::log_entry_value; // bring base class functions into overload set 118 : void log_entry_value( std::ostream&, const_string value ) BOOST_OVERRIDE; 119 : void log_entry_finish( std::ostream& ) BOOST_OVERRIDE; 120 : 121 : void entry_context_start( std::ostream&, log_level ) BOOST_OVERRIDE; 122 : void log_entry_context( std::ostream&, log_level, const_string ) BOOST_OVERRIDE; 123 : void entry_context_finish( std::ostream&, log_level ) BOOST_OVERRIDE; 124 : 125 : //! Discards changes in the log level 126 292 : void set_log_level(log_level ll) BOOST_OVERRIDE 127 : { 128 292 : if(ll > log_successful_tests && ll < log_messages) 129 146 : ll = log_successful_tests; 130 146 : else if (ll > log_all_errors) 131 0 : ll = log_all_errors; 132 : 133 292 : this->m_log_level_internal = ll; 134 292 : } 135 : 136 : //! Instead of a regular stream, returns a file name corresponding to 137 : //! the current master test suite. If the file already exists, adds an index 138 : //! to it. 139 : std::string get_default_stream_description() const BOOST_OVERRIDE; 140 : 141 : 142 : private: 143 : typedef std::map<test_unit_id, junit_impl::junit_log_helper> map_trace_t; 144 : map_trace_t map_tests; 145 : junit_impl::junit_log_helper runner_log_entry; 146 : 147 0 : junit_impl::junit_log_helper& get_current_log_entry() { 148 0 : if(list_path_to_root.empty()) 149 0 : return runner_log_entry; 150 0 : map_trace_t::iterator it = map_tests.find(list_path_to_root.back()); 151 0 : return (it == map_tests.end() ? runner_log_entry : it->second); 152 0 : } 153 : 154 : std::list<test_unit_id> list_path_to_root; 155 : bool m_display_build_info; 156 : bool m_is_last_assertion_or_error; // true if failure, false if error 157 : 158 : log_level m_log_level_internal; 159 : friend class junit_result_helper; 160 : }; 161 : 162 : } // namespace output 163 : } // namespace unit_test 164 : } // namespace boost 165 : 166 : #include <boost/test/detail/enable_warnings.hpp> 167 : 168 : #endif // BOOST_TEST_JUNIT_LOG_FORMATTER__