summaryrefslogtreecommitdiff
path: root/src/mongo/unittest/unittest.cpp
diff options
context:
space:
mode:
authorAndy Schwerin <schwerin@mongodb.com>2014-08-07 16:26:51 -0400
committerAndy Schwerin <schwerin@mongodb.com>2014-08-07 18:36:05 -0400
commita88395dff3cc8bc3beec8356b8b25869d9c6cfe4 (patch)
treeeedbfd99b844ac1a167719fe8b24d3d467ae48e0 /src/mongo/unittest/unittest.cpp
parentd261864e9156af7ecc3d0491111dffa0161e9d0d (diff)
downloadmongo-a88395dff3cc8bc3beec8356b8b25869d9c6cfe4.tar.gz
SERVER-14825 Add utility methods to C++ unit tests for capturing and examining log messages.
Diffstat (limited to 'src/mongo/unittest/unittest.cpp')
-rw-r--r--src/mongo/unittest/unittest.cpp44
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 );
}