summaryrefslogtreecommitdiffstats
path: root/base/test/test_suite.cc
diff options
context:
space:
mode:
authorscottbyer@chromium.org <scottbyer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-27 17:54:59 +0000
committerscottbyer@chromium.org <scottbyer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-27 17:54:59 +0000
commitda596cd33eb81af1a129d71c96384b9b353ae3ae (patch)
tree6fcfdda8d0390f9601537e053f2102f6f3c3aa7a /base/test/test_suite.cc
parent2b0f67f2c247009fb924c3e3c061f81a233cdf9f (diff)
downloadchromium_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.cc56
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();
}