Index: base/test/test_suite.cc |
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc |
index 635423feb03b7a3e6ff7d580a2c9b0d92ec2df82..8f05419cfaeedd8acce29be4e8ee3a1011bd9551 100644 |
--- a/base/test/test_suite.cc |
+++ b/base/test/test_suite.cc |
@@ -76,6 +76,30 @@ class TestClientInitializer : public testing::EmptyTestEventListener { |
DISALLOW_COPY_AND_ASSIGN(TestClientInitializer); |
}; |
+// This class forces the destruction of all Singletons and LazyInstances |
+// between tests. Deleting singletons between each test prevents state from |
+// being shared amongst tests, which can lead to subtle bugs in tests. |
+class SingletonDestructor : public testing::EmptyTestEventListener { |
+ public: |
+ SingletonDestructor() {} |
+ virtual ~SingletonDestructor() {} |
+ |
+ // testing::EmptyTestEventListener: |
+ virtual void OnTestStart( |
+ const testing::TestInfo& test_info) OVERRIDE { |
+ at_exit_manager_.reset(new base::ShadowingAtExitManager); |
+ } |
+ |
+ virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { |
+ at_exit_manager_.reset(); |
+ } |
+ |
+ private: |
+ scoped_ptr<base::ShadowingAtExitManager> at_exit_manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SingletonDestructor); |
+}; |
+ |
} // namespace |
TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) { |
@@ -251,6 +275,12 @@ void TestSuite::Initialize() { |
CatchMaybeTests(); |
ResetCommandLine(); |
+ // Add a listener to destroy all Singletons and LazyInstances between each |
+ // test. See SingletonDestructor for more information. |
+ testing::TestEventListeners& listeners = |
+ testing::UnitTest::GetInstance()->listeners(); |
+ listeners.Append(new SingletonDestructor); |
+ |
TestTimeouts::Initialize(); |
} |