]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/test/test/execution_monitor-ts/boost_exception-test.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / test / test / execution_monitor-ts / boost_exception-test.cpp
1 // (C) Copyright Raffi Enficiaud 2018.
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 // Checks boost::exception, see https://github.com/boostorg/test/issues/147
9 // ***************************************************************************
10
11 // Boost.Test
12 #define BOOST_TEST_MAIN
13 #include <boost/test/unit_test.hpp>
14 #include <boost/test/tools/output_test_stream.hpp>
15
16 // BOOST
17 #include <boost/exception/exception.hpp>
18 #include <boost/exception/info.hpp>
19 #include <boost/cstdint.hpp>
20
21 #include <iostream>
22 #include <ios>
23
24 using boost::test_tools::output_test_stream;
25 using namespace boost::unit_test;
26
27 typedef boost::error_info<struct tag_error_code, boost::uint32_t> error_code;
28 typedef boost::error_info<struct tag_error_string, std::string> error_string;
29 struct myexception : std::exception, virtual boost::exception
30 {};
31
32 // this one should generate a message as it does not execute any assertion
33 void exception_raised() {
34 BOOST_THROW_EXCEPTION( myexception() << error_code(123) << error_string("error%%string") );
35 }
36
37 struct output_test_stream2 : public output_test_stream {
38 std::string get_stream_string_representation() const {
39 (void)const_cast<output_test_stream2*>(this)->output_test_stream::check_length(0, false); // to sync only!!
40 return output_test_stream::get_stream_string_representation();
41 }
42 };
43
44 BOOST_AUTO_TEST_CASE( test_logs )
45 {
46 test_suite* ts_main = BOOST_TEST_SUITE( "fake master" );
47 ts_main->add( BOOST_TEST_CASE( exception_raised ) );
48
49 output_test_stream2 test_output;
50
51 ts_main->p_default_status.value = test_unit::RS_ENABLED;
52 boost::unit_test::unit_test_log.set_stream(test_output);
53 boost::unit_test::unit_test_log.set_threshold_level( log_successful_tests );
54
55 framework::finalize_setup_phase( ts_main->p_id );
56 framework::run( ts_main->p_id, false ); // do not continue the test tree to have the test_log_start/end
57
58 boost::unit_test::unit_test_log.set_stream(std::cout);
59
60 std::string error_string(test_output.get_stream_string_representation());
61 // the message is "Dynamic exception type: boost::exception_detail::clone_impl<myexception>" on Unix
62 // and "Dynamic exception type: boost::exception_detail::clone_impl<struct myexception>" on Windows.
63 // Also contains "[tag_error_code*] = 123" on Unix and "[struct tag_error_code * __ptr64] = 123" On Windows
64 // Also contains "[tag_error_string*] = error%%string" on Unix and "[struct tag_error_string * __ptr64] = error%%string" On Windows
65 BOOST_TEST(error_string.find("tag_error_code") != std::string::npos);
66 BOOST_TEST(error_string.find("= 123") != std::string::npos);
67 BOOST_TEST(error_string.find("tag_error_string") != std::string::npos);
68 BOOST_TEST(error_string.find("= error%%string") != std::string::npos);
69 BOOST_TEST(error_string.find("Dynamic exception type") != std::string::npos);
70 BOOST_TEST(error_string.find("boost::wrapexcept<") != std::string::npos);
71 BOOST_TEST(error_string.find("myexception>") != std::string::npos);
72 }