136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  (C) Copyright 2016 Raffi Enficiaud. | ||
|  | //  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 | ||
|  | ///@brief Contains the definition of the Junit log formatter (OF_JUNIT) | ||
|  | // *************************************************************************** | ||
|  | 
 | ||
|  | #ifndef BOOST_TEST_JUNIT_LOG_FORMATTER__ | ||
|  | #define BOOST_TEST_JUNIT_LOG_FORMATTER__ | ||
|  | 
 | ||
|  | // Boost.Test | ||
|  | #include <boost/test/detail/global_typedef.hpp> | ||
|  | #include <boost/test/unit_test_log_formatter.hpp> | ||
|  | #include <boost/test/tree/test_unit.hpp> | ||
|  | 
 | ||
|  | //#include <boost/test/results_collector.hpp> | ||
|  | 
 | ||
|  | // STL | ||
|  | #include <cstddef> // std::size_t | ||
|  | #include <map> | ||
|  | #include <list> | ||
|  | 
 | ||
|  | #include <boost/test/detail/suppress_warnings.hpp> | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace unit_test { | ||
|  | namespace output { | ||
|  | 
 | ||
|  | 
 | ||
|  |   namespace junit_impl { | ||
|  | 
 | ||
|  |     // helper for the JUnit logger | ||
|  |     struct junit_log_helper | ||
|  |     { | ||
|  |       struct assertion_entry { | ||
|  | 
 | ||
|  |         enum log_entry_t { | ||
|  |           log_entry_info, | ||
|  |           log_entry_error, | ||
|  |           log_entry_failure | ||
|  |         }; | ||
|  | 
 | ||
|  |         assertion_entry() : sealed(false) | ||
|  |         {} | ||
|  | 
 | ||
|  |         std::string logentry_message; | ||
|  |         std::string logentry_type; // the one that will get expanded in the final junit (failure, error) | ||
|  |         std::string output;        // additional information/message generated by the assertion | ||
|  | 
 | ||
|  |         log_entry_t log_entry;     // the type associated to the assertion (or error) | ||
|  | 
 | ||
|  |         bool sealed;               // indicates if the entry can accept additional information | ||
|  |       }; | ||
|  | 
 | ||
|  |       std::string system_out;      // sysout: additional information | ||
|  |       std::string system_err;      // syserr: additional information | ||
|  | 
 | ||
|  |       // list of failure, errors and messages (assertions message and the full log) | ||
|  |       std::vector< assertion_entry > assertion_entries; | ||
|  | 
 | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************               junit_log_formatter              ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | /// JUnit logger class | ||
|  | class junit_log_formatter : public unit_test_log_formatter { | ||
|  | public: | ||
|  | 
 | ||
|  |     junit_log_formatter() : m_display_build_info(false) | ||
|  |     { | ||
|  |       this->m_log_level = log_successful_tests; | ||
|  |     } | ||
|  | 
 | ||
|  |     // Formatter interface | ||
|  |     void    log_start( std::ostream&, counter_t test_cases_amount ); | ||
|  |     void    log_finish( std::ostream& ); | ||
|  |     void    log_build_info( std::ostream& ); | ||
|  | 
 | ||
|  |     void    test_unit_start( std::ostream&, test_unit const& tu ); | ||
|  |     void    test_unit_finish( std::ostream&, test_unit const& tu, unsigned long elapsed ); | ||
|  |     void    test_unit_skipped( std::ostream&, test_unit const& tu, const_string reason ); | ||
|  |     void    test_unit_aborted( std::ostream& os, test_unit const& tu ); | ||
|  | 
 | ||
|  |     void    log_exception_start( std::ostream&, log_checkpoint_data const&, execution_exception const& ex ); | ||
|  |     void    log_exception_finish( std::ostream& ); | ||
|  | 
 | ||
|  |     void    log_entry_start( std::ostream&, log_entry_data const&, log_entry_types let ); | ||
|  | 
 | ||
|  |     using   unit_test_log_formatter::log_entry_value; // bring base class functions into overload set | ||
|  |     void    log_entry_value( std::ostream&, const_string value ); | ||
|  |     void    log_entry_finish( std::ostream& ); | ||
|  | 
 | ||
|  |     void    entry_context_start( std::ostream&, log_level ); | ||
|  |     void    log_entry_context( std::ostream&, const_string ); | ||
|  |     void    entry_context_finish( std::ostream& ); | ||
|  | 
 | ||
|  |     //! Discards changes in the log level | ||
|  |     virtual void        set_log_level(log_level ) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     //! Instead of a regular stream, returns a file name corresponding to | ||
|  |     //! the current master test suite. If the file already exists, adds an index | ||
|  |     //! to it. | ||
|  |     virtual std::string  get_default_stream_description() const; | ||
|  | 
 | ||
|  | 
 | ||
|  | private: | ||
|  |     typedef std::map<test_unit_id, junit_impl::junit_log_helper> map_trace_t; | ||
|  |     map_trace_t map_tests; | ||
|  | 
 | ||
|  |     std::list<test_unit_id> list_path_to_root; | ||
|  |     test_unit_id root_id; | ||
|  |     bool m_display_build_info; | ||
|  |     bool m_is_last_assertion_or_error; // true if failure, false if error | ||
|  | 
 | ||
|  |     friend class junit_result_helper; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace output | ||
|  | } // namespace unit_test | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #include <boost/test/detail/enable_warnings.hpp> | ||
|  | 
 | ||
|  | #endif // BOOST_TEST_JUNIT_LOG_FORMATTER__ |