1 // (C) Copyright Gennadiy Rozental 2001.
2 // (C) Copyright Beman Dawes 1995-2001.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 // See http://www.boost.org/libs/test for the library home page.
11 // Version : $Revision$
13 // Description : main function implementation for Program Executon Monitor
14 // ***************************************************************************
16 #ifndef BOOST_TEST_CPP_MAIN_IPP_012205GER
17 #define BOOST_TEST_CPP_MAIN_IPP_012205GER
20 #include <boost/test/execution_monitor.hpp>
21 #include <boost/test/detail/config.hpp>
22 #include <boost/test/utils/basic_cstring/io.hpp>
25 #include <boost/cstdlib.hpp> // for exit codes
26 #include <boost/config.hpp> // for workarounds
30 #include <cstdlib> // std::getenv
31 #include <cstring> // std::strerror
33 #include <boost/test/detail/suppress_warnings.hpp>
35 //____________________________________________________________________________//
37 #ifdef BOOST_NO_STDC_NAMESPACE
38 namespace std { using ::getenv; using ::strerror; }
43 struct cpp_main_caller {
44 cpp_main_caller( int (*cpp_main_func)( int argc, char* argv[] ), int argc, char** argv )
45 : m_cpp_main_func( cpp_main_func )
49 int operator()() { return (*m_cpp_main_func)( m_argc, m_argv ); }
53 int (*m_cpp_main_func)( int argc, char* argv[] );
60 // ************************************************************************** //
61 // ************** prg_exec_monitor_main ************** //
62 // ************************************************************************** //
67 prg_exec_monitor_main( int (*cpp_main)( int argc, char* argv[] ), int argc, char* argv[] )
72 boost::unit_test::const_string p( std::getenv( "BOOST_TEST_CATCH_SYSTEM_ERRORS" ) );
73 ::boost::execution_monitor ex_mon;
75 ex_mon.p_catch_system_errors.value = p != "no";
77 result = ex_mon.execute( cpp_main_caller( cpp_main, argc, argv ) );
80 result = ::boost::exit_success;
81 else if( result != ::boost::exit_success ) {
82 std::cout << "\n**** error return code: " << result << std::endl;
83 result = ::boost::exit_failure;
86 BOOST_TEST_I_CATCH( ::boost::execution_exception, exex ) {
87 std::cout << "\n**** exception(" << exex.code() << "): " << exex.what() << std::endl;
88 result = ::boost::exit_exception_failure;
90 BOOST_TEST_I_CATCH( ::boost::system_error, ex ) {
91 std::cout << "\n**** failed to initialize execution monitor."
92 << "\n**** expression at fault: " << ex.p_failed_exp
93 << "\n**** error(" << ex.p_errno << "): " << std::strerror( ex.p_errno ) << std::endl;
94 result = ::boost::exit_exception_failure;
97 if( result != ::boost::exit_success ) {
98 std::cerr << "******** errors detected; see standard output for details ********" << std::endl;
101 // Some prefer a confirming message when all is well, while others don't
102 // like the clutter. Use an environment variable to avoid command
103 // line argument modifications; for use in production programs
104 // that's a no-no in some organizations.
105 ::boost::unit_test::const_string p( std::getenv( "BOOST_PRG_MON_CONFIRM" ) );
107 std::cerr << std::flush << "no errors detected" << std::endl;
116 #if !defined(BOOST_TEST_DYN_LINK) && !defined(BOOST_TEST_NO_MAIN)
118 // ************************************************************************** //
119 // ************** main function for tests using lib ************** //
120 // ************************************************************************** //
122 int cpp_main( int argc, char* argv[] ); // prototype for user's cpp_main()
124 int BOOST_TEST_CALL_DECL
125 main( int argc, char* argv[] )
127 return ::boost::prg_exec_monitor_main( &cpp_main, argc, argv );
130 //____________________________________________________________________________//
132 #endif // !BOOST_TEST_DYN_LINK && !BOOST_TEST_NO_MAIN
134 #include <boost/test/detail/enable_warnings.hpp>
136 #endif // BOOST_TEST_CPP_MAIN_IPP_012205GER