summaryrefslogtreecommitdiff
path: root/src/mongo/unittest
diff options
context:
space:
mode:
authorKevin Albertson <kevin.albertson@10gen.com>2018-01-02 16:53:16 -0500
committerKevin Albertson <kevin.albertson@10gen.com>2018-01-08 15:16:47 -0500
commit36eb9e78bc7466cac268c8b2995956a47e946ee5 (patch)
treec348de4aa14d91e14219f6a946f9327fc3548e61 /src/mongo/unittest
parent52c3dc23a9b8e532482d6be480a105a805b26faf (diff)
downloadmongo-36eb9e78bc7466cac268c8b2995956a47e946ee5.tar.gz
SERVER-6024 add stacktrace to unittests
Diffstat (limited to 'src/mongo/unittest')
-rw-r--r--src/mongo/unittest/unittest.cpp17
-rw-r--r--src/mongo/unittest/unittest.h5
-rw-r--r--src/mongo/unittest/unittest_test.cpp14
3 files changed, 30 insertions, 6 deletions
diff --git a/src/mongo/unittest/unittest.cpp b/src/mongo/unittest/unittest.cpp
index fa318762f18..02ef29c9188 100644
--- a/src/mongo/unittest/unittest.cpp
+++ b/src/mongo/unittest/unittest.cpp
@@ -47,6 +47,7 @@
#include "mongo/stdx/mutex.h"
#include "mongo/util/assert_util.h"
#include "mongo/util/log.h"
+#include "mongo/util/stacktrace.h"
#include "mongo/util/timer.h"
namespace mongo {
@@ -296,18 +297,18 @@ Result* Suite::run(const std::string& filter, int runsPerTest) {
}
passes = true;
} catch (const TestAssertionFailureException& ae) {
- err << ae.toString();
+ err << ae.toString() << " in test " << tc->getName() << '\n' << ae.getStacktrace();
} catch (const DBException& e) {
- err << " DBException: " << e.toString() << " in test " << tc->getName();
+ err << "DBException: " << e.toString() << " in test " << tc->getName();
} catch (const std::exception& e) {
- err << " std::exception: " << e.what() << " in test " << tc->getName();
+ err << "std::exception: " << e.what() << " in test " << tc->getName();
} catch (int x) {
- err << " caught int " << x << " in test " << tc->getName();
+ err << "caught int " << x << " in test " << tc->getName();
}
if (!passes) {
std::string s = err.str();
- log() << "FAIL: " << s << std::endl;
+ log() << "FAIL: " << s;
r->_fails.push_back(tc->getName());
r->_messages.push_back(s);
}
@@ -434,7 +435,11 @@ void Suite::setupTests() {}
TestAssertionFailureException::TestAssertionFailureException(
const std::string& theFile, unsigned theLine, const std::string& theFailingExpression)
- : _file(theFile), _line(theLine), _message(theFailingExpression) {}
+ : _file(theFile), _line(theLine), _message(theFailingExpression) {
+ std::ostringstream ostream;
+ printStackTrace(ostream);
+ _stacktrace = ostream.str();
+}
std::string TestAssertionFailureException::toString() const {
std::ostringstream os;
diff --git a/src/mongo/unittest/unittest.h b/src/mongo/unittest/unittest.h
index 0b770a901d1..1913e7a9197 100644
--- a/src/mongo/unittest/unittest.h
+++ b/src/mongo/unittest/unittest.h
@@ -483,10 +483,15 @@ public:
std::string toString() const;
+ const std::string& getStacktrace() const {
+ return _stacktrace;
+ }
+
private:
std::string _file;
unsigned _line;
std::string _message;
+ std::string _stacktrace;
};
class TestAssertionFailure {
diff --git a/src/mongo/unittest/unittest_test.cpp b/src/mongo/unittest/unittest_test.cpp
index ad919735595..6e0fa8726e8 100644
--- a/src/mongo/unittest/unittest_test.cpp
+++ b/src/mongo/unittest/unittest_test.cpp
@@ -254,4 +254,18 @@ public:
};
DEATH_TEST_F(DeathTestSelfTestFixture, DieInTearDown, "Died in tear-down") {}
+
+TEST(UnitTestSelfTest, StackTraceForAssertion) {
+ bool threw = false;
+ std::string stacktrace;
+ try {
+ ASSERT_EQ(0, 1);
+ } catch (mongo::unittest::TestAssertionFailureException& ae) {
+ stacktrace = ae.getStacktrace();
+ threw = true;
+ }
+ ASSERT_TRUE(threw);
+ ASSERT_STRING_CONTAINS(stacktrace, "printStackTrace");
+}
+
} // namespace