diff options
author | Kevin Albertson <kevin.albertson@10gen.com> | 2018-01-02 16:53:16 -0500 |
---|---|---|
committer | Kevin Albertson <kevin.albertson@10gen.com> | 2018-01-08 15:16:47 -0500 |
commit | 36eb9e78bc7466cac268c8b2995956a47e946ee5 (patch) | |
tree | c348de4aa14d91e14219f6a946f9327fc3548e61 /src/mongo/unittest | |
parent | 52c3dc23a9b8e532482d6be480a105a805b26faf (diff) | |
download | mongo-36eb9e78bc7466cac268c8b2995956a47e946ee5.tar.gz |
SERVER-6024 add stacktrace to unittests
Diffstat (limited to 'src/mongo/unittest')
-rw-r--r-- | src/mongo/unittest/unittest.cpp | 17 | ||||
-rw-r--r-- | src/mongo/unittest/unittest.h | 5 | ||||
-rw-r--r-- | src/mongo/unittest/unittest_test.cpp | 14 |
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 |