Index: chromeos/dbus/dbus_thread_manager.cc |
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc |
index 66a12aff7a786dcc65ecde1d1c1c75653f5eda45..33e6a97418cb4dfe694a4d3200faa540ab786752 100644 |
--- a/chromeos/dbus/dbus_thread_manager.cc |
+++ b/chromeos/dbus/dbus_thread_manager.cc |
@@ -52,7 +52,7 @@ |
namespace chromeos { |
static DBusThreadManager* g_dbus_thread_manager = NULL; |
-static bool g_dbus_thread_manager_set_for_testing = false; |
+static DBusThreadManager* g_dbus_thread_manager_for_testing = NULL; |
// The DBusThreadManager implementation used in production. |
class DBusThreadManagerImpl : public DBusThreadManager { |
@@ -330,13 +330,16 @@ class DBusThreadManagerImpl : public DBusThreadManager { |
// static |
void DBusThreadManager::Initialize() { |
- // Ignore Initialize() if we set a test DBusThreadManager. |
- if (g_dbus_thread_manager_set_for_testing) |
- return; |
// If we initialize DBusThreadManager twice we may also be shutting it down |
// early; do not allow that. |
CHECK(g_dbus_thread_manager == NULL); |
+ if (g_dbus_thread_manager_for_testing) { |
+ g_dbus_thread_manager = g_dbus_thread_manager_for_testing; |
+ InitializeClients(); |
+ VLOG(1) << "DBusThreadManager initialized with test implementation"; |
+ return; |
+ } |
// Determine whether we use stub or real client implementations. |
if (base::SysInfo::IsRunningOnChromeOS()) { |
g_dbus_thread_manager = new DBusThreadManagerImpl; |
@@ -344,21 +347,22 @@ void DBusThreadManager::Initialize() { |
VLOG(1) << "DBusThreadManager initialized for ChromeOS"; |
} else { |
InitializeWithStub(); |
- return; |
} |
} |
// static |
+void DBusThreadManager::SetInstanceForTesting( |
+ DBusThreadManager* dbus_thread_manager) { |
+ CHECK(!g_dbus_thread_manager); |
+ CHECK(!g_dbus_thread_manager_for_testing); |
+ g_dbus_thread_manager_for_testing = dbus_thread_manager; |
+} |
+ |
+// static |
void DBusThreadManager::InitializeForTesting( |
DBusThreadManager* dbus_thread_manager) { |
- // If we initialize DBusThreadManager twice we may also be shutting it down |
- // early; do not allow that. |
- CHECK(g_dbus_thread_manager == NULL); |
- CHECK(dbus_thread_manager); |
- g_dbus_thread_manager = dbus_thread_manager; |
- g_dbus_thread_manager_set_for_testing = true; |
- InitializeClients(); |
- VLOG(1) << "DBusThreadManager initialized with test implementation"; |
+ SetInstanceForTesting(dbus_thread_manager); |
+ Initialize(); |
} |
// static |
@@ -383,9 +387,10 @@ bool DBusThreadManager::IsInitialized() { |
void DBusThreadManager::Shutdown() { |
// If we called InitializeForTesting, this may get called more than once. |
// Ensure that we only shutdown DBusThreadManager once. |
- CHECK(g_dbus_thread_manager || g_dbus_thread_manager_set_for_testing); |
+ CHECK(g_dbus_thread_manager || g_dbus_thread_manager_for_testing); |
DBusThreadManager* dbus_thread_manager = g_dbus_thread_manager; |
g_dbus_thread_manager = NULL; |
+ g_dbus_thread_manager_for_testing = NULL; |
delete dbus_thread_manager; |
VLOG(1) << "DBusThreadManager Shutdown completed"; |
} |
@@ -400,9 +405,9 @@ DBusThreadManager::~DBusThreadManager() { |
return; // Called form Shutdown() or local test instance. |
// There should never be both a global instance and a local instance. |
CHECK(this == g_dbus_thread_manager); |
- if (g_dbus_thread_manager_set_for_testing) { |
+ if (g_dbus_thread_manager_for_testing) { |
g_dbus_thread_manager = NULL; |
- g_dbus_thread_manager_set_for_testing = false; |
+ g_dbus_thread_manager_for_testing = NULL; |
VLOG(1) << "DBusThreadManager destroyed"; |
} else { |
LOG(FATAL) << "~DBusThreadManager() called outside of Shutdown()"; |