Index: base/test/test_suite.cc |
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc |
index 05a6069ba22a25720da254f8188b813f51b4b482..1a123118d6501aa492da3f35defdb594e105120c 100644 |
--- a/base/test/test_suite.cc |
+++ b/base/test/test_suite.cc |
@@ -81,32 +81,66 @@ class TestWatchAtExitManager : public testing::EmptyTestEventListener { |
TestWatchAtExitManager() { } |
~TestWatchAtExitManager() { } |
- virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { |
+ virtual void OnTestCaseStart(const testing::TestCase& /*test_case*/) { |
initial_top_manager_ = AtExitManager::current(); |
at_exit_stack_size_ = initial_top_manager_->CallbackStackSize(); |
+ per_test_case_manager_.reset(new base::AtExitManager); |
} |
- virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { |
+ virtual void OnTestCaseEnd(const testing::TestCase& test_case) { |
AtExitManager* new_top_manager = AtExitManager::current(); |
+ if (per_test_case_manager_.get() != new_top_manager) { |
+ ADD_FAILURE() |
+ << "The current AtExitManager has changed across the test case " |
+ << test_case.name() << " most likely because one was created in " |
+ << "setting up the test case without being destroyed."; |
+ } |
+ per_test_case_manager_.reset(); |
+ |
+ new_top_manager = AtExitManager::current(); |
size_t new_stack_size = new_top_manager->CallbackStackSize(); |
if (initial_top_manager_ != new_top_manager) { |
- ADD_FAILURE() << "The current AtExitManager has changed across the " |
- "test " << test_info.test_case_name() << "." << test_info.name() << |
- " most likely because one was created without being destroyed."; |
+ ADD_FAILURE() |
+ << "Clearing the per test case AtExitManager did not restore the " |
+ << "original AtExitManager to the top of the stack, indicating that " |
+ << "the testing AtExitManager stack was corrupted while running the " |
+ << "test case " << test_case.name() << "."; |
} else if (new_stack_size != at_exit_stack_size_) { |
- // TODO(scottbyer): clean up all the errors that result from this and |
- // turn this into a test failure with |
- // ADD_FAILURE(). http://crbug.com/133403 |
- LOG(WARNING) << |
- "AtExitManager: items were added to the callback list by " << |
- test_info.test_case_name() << "." << test_info.name() << |
- ". Global state should be cleaned up before a test exits."; |
+ ADD_FAILURE() |
+ << "Items were added to the original AtExitManager callback list " |
+ << "while running the test case " << test_case.name() << "."; |
+ } |
+ } |
+ |
+ virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { |
+ per_test_manager_.reset(new base::AtExitManager); |
+ } |
+ |
+ virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { |
+ AtExitManager* new_top_manager = AtExitManager::current(); |
+ if (per_test_manager_.get() != new_top_manager) { |
+ ADD_FAILURE() |
+ << "The current AtExitManager has changed across the test " |
+ << test_info.test_case_name() << "." << test_info.name() |
+ << " most likely because one was created without being destroyed."; |
+ } |
+ per_test_manager_.reset(); |
+ |
+ new_top_manager = AtExitManager::current(); |
+ if (per_test_case_manager_.get() != new_top_manager) { |
+ ADD_FAILURE() |
+ << "Clearing the per test AtExitManager did not restore the test " |
+ << "case AtExitManager to the top of the stack, indicating that the " |
+ << "testing AtExitManager stack was corrupted while running the test " |
+ << test_info.test_case_name() << "." << test_info.name() << "."; |
} |
} |
private: |
AtExitManager* initial_top_manager_; |
+ scoped_ptr<base::AtExitManager> per_test_case_manager_; |
+ scoped_ptr<base::AtExitManager> per_test_manager_; |
size_t at_exit_stack_size_; |
DISALLOW_COPY_AND_ASSIGN(TestWatchAtExitManager); |