From: <com...@us...> - 2007-07-18 16:30:52
|
Revision: 1629 http://svn.sourceforge.net/complement/?rev=1629&view=rev Author: complement Date: 2007-07-18 09:30:49 -0700 (Wed, 18 Jul 2007) Log Message: ----------- add guards, hide dangerous objects exposition; FIT_EXAM -> __FIT_EXAM Modified Paths: -------------- trunk/complement/explore/include/exam/suite.h trunk/complement/explore/lib/exam/suite.cc trunk/complement/explore/lib/exam/ut/Makefile trunk/complement/explore/lib/exam/ut/exam_test_suite.h Modified: trunk/complement/explore/include/exam/suite.h =================================================================== --- trunk/complement/explore/include/exam/suite.h 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/include/exam/suite.h 2007-07-18 16:30:49 UTC (rev 1629) @@ -11,7 +11,8 @@ #include <string> #include <exception> -#include "logger.h" +#include <mt/xmt.h> +#include <exam/logger.h> enum vertex_testcase_t { vertex_testcase }; @@ -204,12 +205,10 @@ int flags( int ); bool is_trace(); void report( const char *, int, bool, const char * ); + static void report_async( const char *, int, bool, const char * ); base_logger *set_global_logger( base_logger * ); base_logger *set_logger( base_logger * ); - void set_fail(); - static test_suite& top(); - private: enum { pass = 0, @@ -221,6 +220,7 @@ vertex_t root; vertex_testcase_map_t testcase; base_logger *local_logger; + xmt::mutex _lock_ll; struct test_case_collect { @@ -238,8 +238,10 @@ static int _root_func( test_suite *, int = 0 ); static base_logger *logger; + static xmt::mutex _lock_gl; static std::stack<test_suite *> _stack; + static xmt::mutex _lock_stack; }; template <class TC> @@ -302,27 +304,27 @@ } // namespace exam -#ifdef FIT_EXAM +#ifdef __FIT_EXAM # define EXAM_IMPL(F) F( exam::test_suite *__exam_ts, int __exam_counter ) # define EXAM_DECL(F) F( exam::test_suite *, int = 0 ) # define EXAM_RESULT __exam_counter # define EXAM_CHECK(C) if ( !(C) ) { __exam_ts->report( __FILE__, __LINE__, false, #C ); __exam_counter |= 1; } else __exam_ts->report( __FILE__, __LINE__, true, #C ) -# define EXAM_CHECK_ASYNC(C) if ( !(C) ) { exam::test_suite::top().report( __FILE__, __LINE__, false, #C ); exam::test_suite::top().set_fail(); } else exam::test_suite::top().report( __FILE__, __LINE__, true, #C ) +# define EXAM_CHECK_ASYNC(C) if ( !(C) ) { exam::test_suite::report_async( __FILE__, __LINE__, false, #C ); } else exam::test_suite::report_async( __FILE__, __LINE__, true, #C ) # define EXAM_MESSAGE(M) __exam_ts->report( __FILE__, __LINE__, true, M ) -# define EXAM_MESSAGE_ASYNC(M) exam::test_suite::top().report( __FILE__, __LINE__, true, M ) +# define EXAM_MESSAGE_ASYNC(M) exam::test_suite::report_async( __FILE__, __LINE__, true, M ) # define EXAM_REQUIRE(C) if ( !(C) ) { __exam_ts->report( __FILE__, __LINE__, false, #C ); return 1; } else __exam_ts->report( __FILE__, __LINE__, true, #C ) # define EXAM_FAIL(M) __exam_ts->report( __FILE__, __LINE__, false, M ); return 1 # define EXAM_ERROR(M) __exam_ts->report( __FILE__, __LINE__, false, M ); __exam_counter |= 1 -# define EXAM_ERROR_ASYNC(M) exam::test_suite::top().report( __FILE__, __LINE__, false, M ); exam::test_suite::top().set_fail() +# define EXAM_ERROR_ASYNC(M) exam::test_suite::report_async( __FILE__, __LINE__, false, M ) #else # define EXAM_IMPL(F) F( exam::test_suite *, int ) # define EXAM_DECL(F) F( exam::test_suite *, int = 0 ) # define EXAM_RESULT 0 -# define EXAM_CHECK(C) -# define EXAM_CHECK_ASYNC(C) +# define EXAM_CHECK(C) (C) +# define EXAM_CHECK_ASYNC(C) (C) # define EXAM_MESSAGE(M) # define EXAM_MESSAGE_ASYNC(M) -# define EXAM_REQUIRE(C) +# define EXAM_REQUIRE(C) (C) # define EXAM_FAIL(M) # define EXAM_ERROR(M) # define EXAM_ERROR_ASYNC(M) Modified: trunk/complement/explore/lib/exam/suite.cc =================================================================== --- trunk/complement/explore/lib/exam/suite.cc 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/lib/exam/suite.cc 2007-07-18 16:30:49 UTC (rev 1629) @@ -12,6 +12,7 @@ using namespace std; using namespace boost; using namespace detail; +using namespace xmt; namespace detail { @@ -109,6 +110,7 @@ _test[root].tc = detail::make_test_case( detail::call( _root_func ) ); _test[root].state = 0; + scoped_lock lk( _lock_stack ); _stack.push( this ); } @@ -122,12 +124,16 @@ _test[root].tc = detail::make_test_case( detail::call( _root_func ) ); _test[root].state = 0; + scoped_lock lk( _lock_stack ); _stack.push( this ); } test_suite::~test_suite() { + scoped_lock lk( _lock_stack ); _stack.pop(); + lk.unlock(); + for ( test_case_map_type::iterator i = _test.begin(); i != _test.end(); ++i ) { delete i->second.tc; } @@ -187,42 +193,38 @@ int test_suite::flags() { - return local_logger->flags(); + scoped_lock lk( _lock_ll ); + int tmp = local_logger->flags(); + return tmp; } bool test_suite::is_trace() { - return local_logger->is_trace(); + scoped_lock lk( _lock_ll ); + bool tmp = local_logger->is_trace(); + return tmp; } int test_suite::flags( int f ) { - return local_logger->flags( f ); + scoped_lock lk( _lock_ll ); + int tmp = local_logger->flags( f ); + return tmp; } -void test_suite::set_fail() -{ - _last_state = fail; -} - trivial_logger __trivial_logger_inst( cerr ); base_logger *test_suite::logger = &__trivial_logger_inst; stack<test_suite *> test_suite::_stack; +mutex test_suite::_lock_stack; +mutex test_suite::_lock_gl; -test_suite& test_suite::top() -{ - if ( _stack.empty() ) { - throw runtime_error( "stack of test suites empty" ); - } - - return *_stack.top(); -} - base_logger *test_suite::set_global_logger( base_logger *new_logger ) { + scoped_lock glk( _lock_gl ); base_logger *tmp = logger; logger = new_logger; + scoped_lock lk( _lock_ll ); if ( tmp == local_logger ) { // if local_logger was identical to logger, switch it too local_logger = logger; } @@ -231,6 +233,7 @@ base_logger *test_suite::set_logger( base_logger *new_logger ) { + scoped_lock lk( _lock_ll ); base_logger *tmp = local_logger; local_logger = new_logger; return tmp; @@ -238,9 +241,24 @@ void test_suite::report( const char *file, int line, bool cnd, const char *expr ) { + if ( !cnd ) { + _last_state = fail; + } + scoped_lock lk( _lock_ll ); local_logger->report( file, line, cnd, expr ); } +void test_suite::report_async( const char *file, int line, bool cnd, const char *expr ) +{ + scoped_lock lk( _lock_stack ); + + if ( _stack.empty() ) { + throw runtime_error( "stack of test suites empty" ); + } + + _stack.top()->report( file, line, cnd, expr ); +} + void test_suite::run_test_case( test_suite::vertex_t v ) { try { @@ -249,20 +267,25 @@ if ( (*_test[v].tc)( this, 0 ) == 0 ) { if ( _last_state == 0 ) { ++_stat.passed; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::pass, _test[v].name ); } else { _test[v].state = fail; ++_stat.failed; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::fail, _test[v].name ); _last_state = 0; } } else { _test[v].state = fail; ++_stat.failed; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::fail, _test[v].name ); + _last_state = 0; } } else { ++_stat.skipped; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::skip, _test[v].name ); } } @@ -272,6 +295,7 @@ catch ( ... ) { ++_stat.failed; _test[v].state = fail; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::fail, _test[v].name ); } } Modified: trunk/complement/explore/lib/exam/ut/Makefile =================================================================== --- trunk/complement/explore/lib/exam/ut/Makefile 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/lib/exam/ut/Makefile 2007-07-18 16:30:49 UTC (rev 1629) @@ -7,5 +7,6 @@ # INCLUDES += -I${BOOST_DIR} INCLUDES += -I${CoMT_INCLUDE_DIR} +DEFS += -D__FIT_EXAM LDFLAGS += -Wl,-rpath=${STLPORT_LIB_DIR} Modified: trunk/complement/explore/lib/exam/ut/exam_test_suite.h =================================================================== --- trunk/complement/explore/lib/exam/ut/exam_test_suite.h 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/lib/exam/ut/exam_test_suite.h 2007-07-18 16:30:49 UTC (rev 1629) @@ -3,8 +3,6 @@ #ifndef __exam_test_suite_h #define __exam_test_suite_h -#define FIT_EXAM - #include <exam/suite.h> #include <string> #include <sstream> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |