diff options
author | scottbyer@chromium.org <scottbyer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-27 17:54:59 +0000 |
---|---|---|
committer | scottbyer@chromium.org <scottbyer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-27 17:54:59 +0000 |
commit | da596cd33eb81af1a129d71c96384b9b353ae3ae (patch) | |
tree | 6fcfdda8d0390f9601537e053f2102f6f3c3aa7a /base/test/test_suite.cc | |
parent | 2b0f67f2c247009fb924c3e3c061f81a233cdf9f (diff) | |
download | chromium_src-da596cd33eb81af1a129d71c96384b9b353ae3ae.zip chromium_src-da596cd33eb81af1a129d71c96384b9b353ae3ae.tar.gz chromium_src-da596cd33eb81af1a129d71c96384b9b353ae3ae.tar.bz2 |
For unit tests, track additions to AtExitManager and warn.
While trying to bullet proof a unit test, I had trouble getting very far when
running all tests in shuffle mode. Tracked that back to a few other tests doing
stuff that accessed Singleton()s outside of a test-scoped
ShadowingAtExitManager. Seemed to me that should be an invariant around any
unit test, so created this towards that end, hopefully helping stabilize out
unit_tests a bit more.
BUG=133403
Review URL: https://chromiumcodereview.appspot.com/10582012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144488 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/test/test_suite.cc')
-rw-r--r-- | base/test/test_suite.cc | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc index fb0070f..67ea0a4 100644 --- a/base/test/test_suite.cc +++ b/base/test/test_suite.cc @@ -17,6 +17,7 @@ #include "base/path_service.h" #include "base/process_util.h" #include "base/test/multiprocess_test.h" +#include "base/test/test_switches.h" #include "base/test/test_timeouts.h" #include "base/time.h" #include "testing/gtest/include/gtest/gtest.h" @@ -69,6 +70,46 @@ class TestClientInitializer : public testing::EmptyTestEventListener { } // namespace +namespace base { + +class TestWatchAtExitManager : public testing::EmptyTestEventListener { + public: + TestWatchAtExitManager() { } + ~TestWatchAtExitManager() { } + + virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { + initial_top_manager_ = AtExitManager::current(); + at_exit_stack_size_ = initial_top_manager_->CallbackStackSize(); + } + + virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { + AtExitManager* 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."; + } 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."; + } + } + + private: + AtExitManager* initial_top_manager_; + size_t at_exit_stack_size_; + + DISALLOW_COPY_AND_ASSIGN(TestWatchAtExitManager); +}; + +} // namespace base + const char TestSuite::kStrictFailureHandling[] = "strict_failure_handling"; TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) { @@ -170,6 +211,12 @@ void TestSuite::ResetCommandLine() { listeners.Append(new TestClientInitializer); } +void TestSuite::WatchAtExitManager() { + testing::TestEventListeners& listeners = + testing::UnitTest::GetInstance()->listeners(); + listeners.Append(new TestWatchAtExitManager); +} + // Don't add additional code to this method. Instead add it to // Initialize(). See bug 6436. int TestSuite::Run() { @@ -287,6 +334,15 @@ void TestSuite::Initialize() { CatchMaybeTests(); ResetCommandLine(); + // Don't watch for AtExit items being added if we're running as a child + // process (e.g., browser_tests or interactive_ui_tests). + if (!CommandLine::ForCurrentProcess()->HasSwitch( + switches::kSingleProcessTestsFlag) && + !CommandLine::ForCurrentProcess()->HasSwitch( + switches::kSingleProcessChromeFlag)) { + WatchAtExitManager(); + } + TestTimeouts::Initialize(); } |