diff options
Diffstat (limited to 'src/mongo/unittest/unittest.cpp')
-rw-r--r-- | src/mongo/unittest/unittest.cpp | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/mongo/unittest/unittest.cpp b/src/mongo/unittest/unittest.cpp index e728ced46b1..feb9a2aeb05 100644 --- a/src/mongo/unittest/unittest.cpp +++ b/src/mongo/unittest/unittest.cpp @@ -36,6 +36,7 @@ #include "mongo/base/init.h" #include "mongo/logger/console_appender.h" #include "mongo/logger/log_manager.h" +#include "mongo/logger/logger.h" #include "mongo/logger/message_event_utf8_encoder.h" #include "mongo/logger/message_log_domain.h" #include "mongo/util/assert_util.h" @@ -111,8 +112,13 @@ namespace mongo { Result* Result::cur = 0; - Test::Test() {} - Test::~Test() {} + Test::Test() : _isCapturingLogMessages(false) {} + + Test::~Test() { + if (_isCapturingLogMessages) { + stopCapturingLogMessages(); + } + } void Test::run() { setUp(); @@ -139,6 +145,40 @@ namespace mongo { void Test::setUp() {} void Test::tearDown() {} +namespace { + class StringVectorAppender : public logger::MessageLogDomain::EventAppender { + public: + explicit StringVectorAppender(std::vector<std::string>* lines) : _lines(lines) {} + virtual ~StringVectorAppender() {} + virtual Status append(const logger::MessageLogDomain::Event& event) { + std::ostringstream _os; + if (!_encoder.encode(event, _os)) { + return Status(ErrorCodes::LogWriteFailed, "Failed to append to LogTestAppender."); + } + _lines->push_back(_os.str()); + return Status::OK(); + } + private: + logger::MessageEventDetailsEncoder _encoder; + std::vector<std::string>* _lines; + }; +} // namespace + + void Test::startCapturingLogMessages() { + invariant(!_isCapturingLogMessages); + _capturedLogMessages.clear(); + _captureAppenderHandle = logger::globalLogDomain()->attachAppender( + logger::MessageLogDomain::AppenderAutoPtr(new StringVectorAppender( + &_capturedLogMessages))); + _isCapturingLogMessages = true; + } + + void Test::stopCapturingLogMessages() { + invariant(_isCapturingLogMessages); + logger::globalLogDomain()->detachAppender(_captureAppenderHandle); + _isCapturingLogMessages = false; + } + Suite::Suite( const std::string& name ) : _name( name ) { registerSuite( name , this ); } |