summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorpastarmovj@chromium.org <pastarmovj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-21 12:44:32 +0000
committerpastarmovj@chromium.org <pastarmovj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-21 12:44:32 +0000
commit93cc27bf467e4914ebd98d27e0ea551d2debb666 (patch)
tree45f704fc7213c7bc182dc062ef08f5ffcf376681 /chrome
parent1d384e11d21e58c4c6cd0e0b69d9008fcc0a4ed4 (diff)
downloadchromium_src-93cc27bf467e4914ebd98d27e0ea551d2debb666.zip
chromium_src-93cc27bf467e4914ebd98d27e0ea551d2debb666.tar.gz
chromium_src-93cc27bf467e4914ebd98d27e0ea551d2debb666.tar.bz2
Fix UserManager to not leak the mock managers created for unit tests.
All tests share the singletons and if mocks are leaked state will be leaked and possibly corrupted between the tests. This CL tries to force every test that needs a particular UserManager state to use its own mock object and set it in the wanted state. BUG=116996 TEST=unit_tests Review URL: https://chromiumcodereview.appspot.com/9705016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@127946 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/browser_commands_unittest.cc18
-rw-r--r--chrome/browser/chromeos/cros/onc_network_parser_unittest.cc20
-rw-r--r--chrome/browser/chromeos/cros_settings_unittest.cc12
-rw-r--r--chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc55
-rw-r--r--chrome/browser/chromeos/login/existing_user_controller_browsertest.cc8
-rw-r--r--chrome/browser/chromeos/login/login_utils_browsertest.cc24
-rw-r--r--chrome/browser/chromeos/login/mock_user_manager.cc22
-rw-r--r--chrome/browser/chromeos/login/mock_user_manager.h16
-rw-r--r--chrome/browser/chromeos/login/user.h2
-rw-r--r--chrome/browser/chromeos/login/user_manager.cc8
-rw-r--r--chrome/browser/chromeos/login/user_manager.h24
-rw-r--r--chrome/browser/chromeos/login/user_manager_impl.cc54
-rw-r--r--chrome/browser/chromeos/login/user_manager_impl.h16
-rw-r--r--chrome/browser/chromeos/login/user_manager_unittest.cc14
-rw-r--r--chrome/browser/ui/views/ash/status_area_host_aura_browsertest.cc6
-rw-r--r--chrome/browser/website_settings_model_unittest.cc16
16 files changed, 246 insertions, 69 deletions
diff --git a/chrome/browser/browser_commands_unittest.cc b/chrome/browser/browser_commands_unittest.cc
index 9558dd9..d783af8 100644
--- a/chrome/browser/browser_commands_unittest.cc
+++ b/chrome/browser/browser_commands_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -13,6 +13,10 @@
#include "content/public/browser/web_contents.h"
#include "content/test/test_browser_thread.h"
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/mock_user_manager.h"
+#endif
+
typedef BrowserWithTestWindowTest BrowserCommandsTest;
using content::OpenURLParams;
@@ -174,7 +178,15 @@ TEST_F(BrowserCommandsTest, BackForwardInNewTab) {
// Tests IDC_SEARCH (the Search key on Chrome OS devices).
#if defined(OS_CHROMEOS)
+
+namespace chromeos {
+
TEST_F(BrowserCommandsTest, Search) {
+ scoped_ptr<MockUserManager> mock_user_manager(new MockUserManager());
+ UserManager* old_user_manager = UserManager::Set(mock_user_manager.get());
+ EXPECT_CALL(*mock_user_manager, IsLoggedInAsGuest())
+ .Times(1).WillRepeatedly(::testing::Return(false));
+
// Load a non-NTP URL.
GURL non_ntp_url("http://foo/");
AddTab(browser(), non_ntp_url);
@@ -196,5 +208,9 @@ TEST_F(BrowserCommandsTest, Search) {
current_url = browser()->GetSelectedWebContents()->GetURL();
EXPECT_TRUE(current_url.SchemeIs(chrome::kChromeUIScheme));
EXPECT_EQ(chrome::kChromeUINewTabHost, current_url.host());
+
+ UserManager::Set(old_user_manager);
}
+
+} // namespace chromeos
#endif
diff --git a/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc b/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc
index 5a98802..740174f 100644
--- a/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc
+++ b/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc
@@ -20,7 +20,7 @@
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
+#include "chrome/browser/chromeos/login/mock_user_manager.h"
#include "chrome/browser/net/pref_proxy_config_tracker_impl.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/testing_browser_process.h"
@@ -36,6 +36,9 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
+using ::testing::AnyNumber;
+using ::testing::Return;
+
namespace msm = mozilla_security_manager;
namespace chromeos {
@@ -882,6 +885,14 @@ TEST_F(OncNetworkParserTest, TestProxySettingsManual) {
}
TEST(OncNetworkParserUserExpansionTest, GetUserExpandedValue) {
+ scoped_ptr<MockUserManager> mock_user_manager(new MockUserManager());
+ UserManager* old_user_manager = UserManager::Set(mock_user_manager.get());
+ mock_user_manager->SetLoggedInUser("onc@example.com", false);
+
+ EXPECT_CALL(*mock_user_manager, IsUserLoggedIn())
+ .Times(2)
+ .WillRepeatedly(Return(false));
+
NetworkUIData::ONCSource source = NetworkUIData::ONC_SOURCE_USER_IMPORT;
// Setup environment needed by UserManager.
@@ -903,13 +914,18 @@ TEST(OncNetworkParserUserExpansionTest, GetUserExpandedValue) {
login_email_pattern, source));
// Log in a user and check that the expansions work as expected.
- UserManager::Get()->UserLoggedIn("onc@example.com");
+ EXPECT_CALL(*mock_user_manager, IsUserLoggedIn())
+ .Times(2)
+ .WillRepeatedly(Return(true));
+
EXPECT_EQ("a onc b",
chromeos::OncNetworkParser::GetUserExpandedValue(
login_id_pattern, source));
EXPECT_EQ("a onc@example.com b",
chromeos::OncNetworkParser::GetUserExpandedValue(
login_email_pattern, source));
+
+ UserManager::Set(old_user_manager);
}
} // namespace chromeos
diff --git a/chrome/browser/chromeos/cros_settings_unittest.cc b/chrome/browser/chromeos/cros_settings_unittest.cc
index 103d362..ce03ea6 100644
--- a/chrome/browser/chromeos/cros_settings_unittest.cc
+++ b/chrome/browser/chromeos/cros_settings_unittest.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/chromeos/cros_settings.h"
#include "chrome/browser/chromeos/cros_settings_names.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/login/mock_user_manager.h"
#include "chrome/browser/chromeos/login/signed_settings_cache.h"
#include "chrome/browser/policy/proto/chrome_device_policy.pb.h"
#include "chrome/browser/policy/proto/device_management_backend.pb.h"
@@ -23,6 +24,9 @@
#include "content/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
+using ::testing::AnyNumber;
+using ::testing::Return;
+
namespace em = enterprise_management;
namespace chromeos {
@@ -40,6 +44,11 @@ class CrosSettingsTest : public testing::Test {
}
virtual void SetUp() {
+ mock_user_manager_.reset(new MockUserManager());
+ old_user_manager_ = UserManager::Set(mock_user_manager_.get());
+ EXPECT_CALL(*mock_user_manager_, IsCurrentUserOwner())
+ .Times(AnyNumber())
+ .WillRepeatedly(Return(true));
// Reset the cache between tests.
ApplyEmptyPolicy();
}
@@ -50,6 +59,7 @@ class CrosSettingsTest : public testing::Test {
// Reset the cache between tests.
ApplyEmptyPolicy();
STLDeleteValues(&expected_props_);
+ UserManager::Set(old_user_manager_);
}
void FetchPref(const std::string& pref) {
@@ -113,6 +123,8 @@ class CrosSettingsTest : public testing::Test {
ScopedTestingLocalState local_state_;
+ scoped_ptr<MockUserManager> mock_user_manager_;
+ UserManager* old_user_manager_;
ScopedStubCrosEnabler stub_cros_enabler_;
};
diff --git a/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc
index d3b3b65..934a060 100644
--- a/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc
+++ b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc
@@ -8,33 +8,71 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "base/synchronization/waitable_event.h"
-#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
+#include "chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h"
+#include "chrome/browser/chromeos/dbus/mock_power_manager_client.h"
+#include "chrome/browser/chromeos/login/mock_user_manager.h"
#include "chrome/common/chrome_notification_types.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_service.h"
#include "content/test/test_browser_thread.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using content::BrowserThread;
+using ::testing::_;
+using ::testing::AnyNumber;
+using ::testing::Return;
+using ::testing::SaveArg;
namespace chromeos {
+ACTION_P(HasObserver, expected_pointer) {
+ return arg0 == *expected_pointer;
+}
+
+ACTION_P(RemoveObserver, expected_pointer) {
+ if (arg0 == *expected_pointer)
+ *expected_pointer = NULL;
+}
+
class KioskModeScreensaverTest : public testing::Test {
public:
KioskModeScreensaverTest()
: ui_thread_(BrowserThread::UI, &message_loop_),
- screensaver_(NULL) {
+ screensaver_(NULL),
+ observer_(NULL) {
}
virtual void SetUp() OVERRIDE {
- DBusThreadManager::Initialize();
+ mock_user_manager_.reset(new MockUserManager());
+ old_user_manager_ = UserManager::Set(mock_user_manager_.get());
+ EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
+ .Times(AnyNumber())
+ .WillRepeatedly(Return(false));
+
+ MockDBusThreadManager* mock_dbus_thread_manager =
+ new MockDBusThreadManager;
+ DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager);
+
+ MockPowerManagerClient* power_manager =
+ mock_dbus_thread_manager->mock_power_manager_client();
+ EXPECT_CALL(*power_manager, HasObserver(_))
+ .Times(AnyNumber())
+ .WillRepeatedly(HasObserver(&observer_));
+ EXPECT_CALL(*power_manager, AddObserver(_))
+ .WillOnce(SaveArg<0>(&observer_));
+ EXPECT_CALL(*power_manager, RemoveObserver(_))
+ .WillOnce(RemoveObserver(&observer_));
+ EXPECT_CALL(*power_manager, RequestIdleNotification(_))
+ .Times(AnyNumber());
+
screensaver_ = new KioskModeScreensaver();
}
virtual void TearDown() OVERRIDE {
delete screensaver_;
+ UserManager::Set(old_user_manager_);
DBusThreadManager::Shutdown();
}
@@ -46,16 +84,21 @@ class KioskModeScreensaverTest : public testing::Test {
}
bool PowerManagerObserverRegistered() {
- chromeos::PowerManagerClient* power_manager =
- chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
+ PowerManagerClient* power_manager =
+ DBusThreadManager::Get()->GetPowerManagerClient();
return power_manager->HasObserver(screensaver_);
}
MessageLoopForUI message_loop_;
content::TestBrowserThread ui_thread_;
+ scoped_ptr<MockUserManager> mock_user_manager_;
+ UserManager* old_user_manager_;
+
KioskModeScreensaver* screensaver_;
content::NotificationRegistrar registrar_;
+
+ PowerManagerClient::Observer* observer_;
};
TEST_F(KioskModeScreensaverTest, CheckObservers) {
diff --git a/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc b/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
index 7ba7d30..8887e6e 100644
--- a/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
@@ -145,8 +145,8 @@ class ExistingUserControllerTest : public CrosInProcessBrowserTest {
mock_login_display_.reset(new MockLoginDisplay());
mock_login_display_host_.reset(new MockLoginDisplayHost());
- mock_user_manager_ = new MockUserManager();
- UserManager::Set(mock_user_manager_);
+ mock_user_manager_.reset(new MockUserManager());
+ old_user_manager_ = UserManager::Set(mock_user_manager_.get());
EXPECT_CALL(*mock_user_manager_, IsKnownUser(kUsername))
.Times(AnyNumber())
.WillRepeatedly(Return(true));
@@ -182,6 +182,7 @@ class ExistingUserControllerTest : public CrosInProcessBrowserTest {
}
virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
+ UserManager::Set(old_user_manager_);
CrosInProcessBrowserTest::TearDownInProcessBrowserTestFixture();
DBusThreadManager::Shutdown();
}
@@ -194,7 +195,8 @@ class ExistingUserControllerTest : public CrosInProcessBrowserTest {
scoped_ptr<MockLoginDisplayHost> mock_login_display_host_;
// Owned by UserManagerImplWrapper.
- MockUserManager* mock_user_manager_;
+ scoped_ptr<MockUserManager> mock_user_manager_;
+ UserManager* old_user_manager_;
// Owned by LoginUtilsWrapper.
MockLoginUtils* mock_login_utils_;
diff --git a/chrome/browser/chromeos/login/login_utils_browsertest.cc b/chrome/browser/chromeos/login/login_utils_browsertest.cc
index f949662..faa494c 100644
--- a/chrome/browser/chromeos/login/login_utils_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_utils_browsertest.cc
@@ -376,7 +376,8 @@ class LoginUtilsBlockingLoginTest
TEST_F(LoginUtilsTest, NormalLoginDoesntBlock) {
UserManager* user_manager = UserManager::Get();
- EXPECT_FALSE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(!user_manager->IsUserLoggedIn() ||
+ user_manager->IsLoggedInAsStub());
EXPECT_FALSE(connector_->IsEnterpriseManaged());
EXPECT_FALSE(prepared_profile_);
@@ -384,20 +385,23 @@ TEST_F(LoginUtilsTest, NormalLoginDoesntBlock) {
PrepareProfile(kUsername);
EXPECT_TRUE(prepared_profile_);
- EXPECT_TRUE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(user_manager->IsUserLoggedIn() &&
+ !user_manager->IsLoggedInAsStub());
EXPECT_EQ(kUsername, user_manager->GetLoggedInUser().email());
}
TEST_F(LoginUtilsTest, EnterpriseLoginDoesntBlockForNormalUser) {
UserManager* user_manager = UserManager::Get();
- EXPECT_FALSE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(!user_manager->IsUserLoggedIn() ||
+ user_manager->IsLoggedInAsStub());
EXPECT_FALSE(connector_->IsEnterpriseManaged());
EXPECT_FALSE(prepared_profile_);
// Enroll the device.
LockDevice(kUsername);
- EXPECT_FALSE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(!user_manager->IsUserLoggedIn() ||
+ user_manager->IsLoggedInAsStub());
EXPECT_TRUE(connector_->IsEnterpriseManaged());
EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain());
EXPECT_FALSE(prepared_profile_);
@@ -406,20 +410,23 @@ TEST_F(LoginUtilsTest, EnterpriseLoginDoesntBlockForNormalUser) {
PrepareProfile(kUsernameOtherDomain);
EXPECT_TRUE(prepared_profile_);
- EXPECT_TRUE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(user_manager->IsUserLoggedIn() &&
+ !user_manager->IsLoggedInAsStub());
EXPECT_EQ(kUsernameOtherDomain, user_manager->GetLoggedInUser().email());
}
TEST_P(LoginUtilsBlockingLoginTest, EnterpriseLoginBlocksForEnterpriseUser) {
UserManager* user_manager = UserManager::Get();
- EXPECT_FALSE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(!user_manager->IsUserLoggedIn() ||
+ user_manager->IsLoggedInAsStub());
EXPECT_FALSE(connector_->IsEnterpriseManaged());
EXPECT_FALSE(prepared_profile_);
// Enroll the device.
LockDevice(kUsername);
- EXPECT_FALSE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(!user_manager->IsUserLoggedIn() ||
+ user_manager->IsLoggedInAsStub());
EXPECT_TRUE(connector_->IsEnterpriseManaged());
EXPECT_EQ(kDomain, connector_->GetEnterpriseDomain());
EXPECT_FALSE(prepared_profile_);
@@ -428,7 +435,8 @@ TEST_P(LoginUtilsBlockingLoginTest, EnterpriseLoginBlocksForEnterpriseUser) {
PrepareProfile(kUsername);
EXPECT_FALSE(prepared_profile_);
- EXPECT_TRUE(user_manager->IsUserLoggedIn());
+ ASSERT_TRUE(user_manager->IsUserLoggedIn() &&
+ !user_manager->IsLoggedInAsStub());
GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
TestURLFetcher* fetcher;
diff --git a/chrome/browser/chromeos/login/mock_user_manager.cc b/chrome/browser/chromeos/login/mock_user_manager.cc
index 901be88..4bd6798 100644
--- a/chrome/browser/chromeos/login/mock_user_manager.cc
+++ b/chrome/browser/chromeos/login/mock_user_manager.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,8 +6,24 @@
namespace chromeos {
-MockUserManager::MockUserManager() {}
+MockUserManager::MockUserManager() : user_(NULL) {}
-MockUserManager::~MockUserManager() {}
+MockUserManager::~MockUserManager() {
+ delete user_;
+}
+
+const User& MockUserManager::GetLoggedInUser() const {
+ return *user_;
+}
+
+User& MockUserManager::GetLoggedInUser() {
+ return *user_;
+}
+
+// Creates a new User instance.
+void MockUserManager::SetLoggedInUser(const std::string& email, bool guest) {
+ delete user_;
+ user_ = new User(email, guest);
+}
} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/mock_user_manager.h b/chrome/browser/chromeos/login/mock_user_manager.h
index 943a4ec..554d828 100644
--- a/chrome/browser/chromeos/login/mock_user_manager.h
+++ b/chrome/browser/chromeos/login/mock_user_manager.h
@@ -28,8 +28,6 @@ class MockUserManager : public UserManager {
MOCK_METHOD1(RemoveUserFromList, void(const std::string&));
MOCK_CONST_METHOD1(IsKnownUser, bool(const std::string&));
MOCK_CONST_METHOD1(FindUser, const User*(const std::string&));
- MOCK_CONST_METHOD0(GetLoggedInUser, const User&(void));
- MOCK_METHOD0(GetLoggedInUser, User&(void));
MOCK_CONST_METHOD1(IsDisplayNameUnique, bool(const std::string&));
MOCK_METHOD2(SaveUserOAuthStatus, void(const std::string&,
User::OAuthTokenStatus));
@@ -50,10 +48,24 @@ class MockUserManager : public UserManager {
MOCK_CONST_METHOD0(IsUserLoggedIn, bool(void));
MOCK_CONST_METHOD0(IsLoggedInAsDemoUser, bool(void));
MOCK_CONST_METHOD0(IsLoggedInAsGuest, bool(void));
+ MOCK_CONST_METHOD0(IsLoggedInAsStub, bool(void));
MOCK_METHOD1(AddObserver, void(UserManager::Observer*));
MOCK_METHOD1(RemoveObserver, void(UserManager::Observer*));
MOCK_METHOD0(NotifyLocalStateChanged, void(void));
MOCK_CONST_METHOD0(DownloadedProfileImage, const SkBitmap& (void));
+
+ // You can't mock this function easily because nobody can create User objects
+ // but the UserManagerImpl and us.
+ virtual const User& GetLoggedInUser() const OVERRIDE;
+
+ // You can't mock this function easily because nobody can create User objects
+ // but the UserManagerImpl and us.
+ virtual User& GetLoggedInUser() OVERRIDE;
+
+ // Sets a new User instance.
+ void SetLoggedInUser(const std::string& email, bool guest);
+
+ User* user_;
};
} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/user.h b/chrome/browser/chromeos/login/user.h
index 6d7cd1d..c82d57e 100644
--- a/chrome/browser/chromeos/login/user.h
+++ b/chrome/browser/chromeos/login/user.h
@@ -72,6 +72,8 @@ class User {
private:
friend class UserManagerImpl;
+ friend class MockUserManager;
+ friend class UserManagerTest;
// Do not allow anyone else to create new User instances.
User(const std::string& email, bool is_guest);
diff --git a/chrome/browser/chromeos/login/user_manager.cc b/chrome/browser/chromeos/login/user_manager.cc
index d460086..cde6c0b 100644
--- a/chrome/browser/chromeos/login/user_manager.cc
+++ b/chrome/browser/chromeos/login/user_manager.cc
@@ -41,6 +41,10 @@ class UserManagerImplWrapper {
ptr_.reset(ptr);
}
+ UserManager* release() {
+ return ptr_.release();
+ }
+
private:
friend struct DefaultSingletonTraits<UserManagerImplWrapper>;
@@ -63,8 +67,10 @@ UserManager* UserManager::Get() {
}
// static
-void UserManager::Set(UserManager* mock) {
+UserManager* UserManager::Set(UserManager* mock) {
+ UserManager* old_manager = UserManagerImplWrapper::GetInstance()->release();
UserManagerImplWrapper::GetInstance()->reset(mock);
+ return old_manager;
}
// static
diff --git a/chrome/browser/chromeos/login/user_manager.h b/chrome/browser/chromeos/login/user_manager.h
index 392b4b7..28681f0f 100644
--- a/chrome/browser/chromeos/login/user_manager.h
+++ b/chrome/browser/chromeos/login/user_manager.h
@@ -53,8 +53,25 @@ class UserManager {
// called from the main UI thread.
static UserManager* Get();
- // Set UserManager singleton object for test purpose only!
- static void Set(UserManager* mock);
+ // Set UserManager singleton object for test purpose only! Returns the
+ // previous singleton object and releases it from the singleton memory
+ // management. It is the responsibility of the test writer to restore the
+ // original object or delete it if needed.
+ //
+ // The intended usage is meant to be something like this:
+ // virtual void SetUp() {
+ // mock_user_manager_.reset(new MockUserManager());
+ // old_user_manager_ = UserManager::Set(mock_user_manager_.get());
+ // EXPECT_CALL...
+ // ...
+ // }
+ // virtual void TearDown() {
+ // ...
+ // UserManager::Set(old_user_manager_);
+ // }
+ // scoped_ptr<MockUserManager> mock_user_manager_;
+ // UserManager* old_user_manager_;
+ static UserManager* Set(UserManager* mock);
// Registers user manager preferences.
static void RegisterPrefs(PrefService* local_state);
@@ -177,6 +194,9 @@ class UserManager {
// Returns true if we're logged in as a Guest.
virtual bool IsLoggedInAsGuest() const = 0;
+ // Returns true if we're logged in as the stub userused for testing on linux.
+ virtual bool IsLoggedInAsStub() const = 0;
+
virtual void AddObserver(Observer* obs) = 0;
virtual void RemoveObserver(Observer* obs) = 0;
diff --git a/chrome/browser/chromeos/login/user_manager_impl.cc b/chrome/browser/chromeos/login/user_manager_impl.cc
index 2115010..a8ed2c8 100644
--- a/chrome/browser/chromeos/login/user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/user_manager_impl.cc
@@ -20,6 +20,7 @@
#include "base/metrics/histogram.h"
#include "base/path_service.h"
#include "base/rand_util.h"
+#include "base/stl_util.h"
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/time.h"
@@ -283,14 +284,10 @@ void RealTPMTokenInfoDelegate::OnPkcs11GetTpmTokenInfo(
UserManagerImpl::UserManagerImpl()
: ALLOW_THIS_IN_INITIALIZER_LIST(image_loader_(new UserImageLoader)),
- demo_user_(kDemoUser, false),
- guest_user_(kGuestUser, true),
- stub_user_(kStubUser, false),
logged_in_user_(NULL),
is_current_user_owner_(false),
is_current_user_new_(false),
is_current_user_ephemeral_(false),
- is_user_logged_in_(false),
ephemeral_users_enabled_(false),
observed_sync_service_(NULL),
last_image_set_async_(false),
@@ -306,6 +303,12 @@ UserManagerImpl::UserManagerImpl()
}
UserManagerImpl::~UserManagerImpl() {
+ // Can't use STLDeleteElements because of the private destructor of User.
+ for (size_t i = 0; i < users_.size();++i)
+ delete users_[i];
+ users_.clear();
+ if (is_current_user_ephemeral_)
+ delete logged_in_user_;
}
const UserList& UserManagerImpl::GetUsers() const {
@@ -314,9 +317,13 @@ const UserList& UserManagerImpl::GetUsers() const {
}
void UserManagerImpl::UserLoggedIn(const std::string& email) {
- DCHECK(!is_user_logged_in_);
-
- is_user_logged_in_ = true;
+ // Remove the stub user if it is still around.
+ if (logged_in_user_) {
+ DCHECK(IsLoggedInAsStub());
+ delete logged_in_user_;
+ logged_in_user_ = NULL;
+ is_current_user_ephemeral_ = false;
+ }
if (email == kGuestUser) {
GuestUserLoggedIn();
@@ -400,14 +407,14 @@ void UserManagerImpl::UserLoggedIn(const std::string& email) {
void UserManagerImpl::DemoUserLoggedIn() {
is_current_user_new_ = true;
is_current_user_ephemeral_ = true;
- logged_in_user_ = &demo_user_;
+ logged_in_user_ = new User(kDemoUser, false);
SetInitialUserImage(kDemoUser);
NotifyOnLogin();
}
void UserManagerImpl::GuestUserLoggedIn() {
is_current_user_ephemeral_ = true;
- logged_in_user_ = &guest_user_;
+ logged_in_user_ = new User(kGuestUser, true);
NotifyOnLogin();
}
@@ -419,6 +426,13 @@ void UserManagerImpl::EphemeralUserLoggedIn(const std::string& email) {
NotifyOnLogin();
}
+void UserManagerImpl::StubUserLoggedIn() {
+ is_current_user_ephemeral_ = true;
+ logged_in_user_ = new User(kStubUser, false);
+ logged_in_user_->SetImage(GetDefaultImage(kStubDefaultImageIndex),
+ kStubDefaultImageIndex);
+}
+
void UserManagerImpl::RemoveUser(const std::string& email,
RemoveUserDelegate* delegate) {
if (!IsKnownUser(email))
@@ -605,7 +619,7 @@ void UserManagerImpl::Observe(int type,
base::Unretained(this)));
break;
case chrome::NOTIFICATION_PROFILE_ADDED:
- if (IsUserLoggedIn() && !IsLoggedInAsGuest()) {
+ if (IsUserLoggedIn() && !IsLoggedInAsGuest() && !IsLoggedInAsStub()) {
Profile* profile = content::Source<Profile>(source).ptr();
if (!profile->IsOffTheRecord() &&
profile == ProfileManager::GetDefaultProfile()) {
@@ -623,7 +637,7 @@ void UserManagerImpl::Observe(int type,
}
void UserManagerImpl::OnStateChanged() {
- DCHECK(IsUserLoggedIn() && !IsLoggedInAsGuest());
+ DCHECK(IsUserLoggedIn() && !IsLoggedInAsGuest() && !IsLoggedInAsStub());
if (observed_sync_service_->GetAuthError().state() != AuthError::NONE) {
// Invalidate OAuth token to force Gaia sign-in flow. This is needed
// because sign-out/sign-in solution is suggested to the user.
@@ -654,15 +668,19 @@ bool UserManagerImpl::IsCurrentUserEphemeral() const {
}
bool UserManagerImpl::IsUserLoggedIn() const {
- return is_user_logged_in_;
+ return logged_in_user_;
}
bool UserManagerImpl::IsLoggedInAsDemoUser() const {
- return logged_in_user_ == &demo_user_;
+ return IsUserLoggedIn() && logged_in_user_->email() == kDemoUser;
}
bool UserManagerImpl::IsLoggedInAsGuest() const {
- return logged_in_user_ == &guest_user_;
+ return IsUserLoggedIn() && logged_in_user_->email() == kGuestUser;
+}
+
+bool UserManagerImpl::IsLoggedInAsStub() const {
+ return IsUserLoggedIn() && logged_in_user_->email() == kStubUser;
}
void UserManagerImpl::AddObserver(Observer* obs) {
@@ -826,7 +844,7 @@ bool UserManagerImpl::AreEphemeralUsersEnabled() const {
bool UserManagerImpl::IsEphemeralUser(const std::string& email) const {
// The guest user always is ephemeral.
- if (email == guest_user_.email())
+ if (email == kGuestUser)
return true;
// The currently logged-in user is ephemeral iff logged in as ephemeral.
@@ -849,12 +867,6 @@ const User* UserManagerImpl::FindUserInList(const std::string& email) const {
return NULL;
}
-void UserManagerImpl::StubUserLoggedIn() {
- logged_in_user_ = &stub_user_;
- stub_user_.SetImage(GetDefaultImage(kStubDefaultImageIndex),
- kStubDefaultImageIndex);
-}
-
void UserManagerImpl::NotifyOnLogin() {
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
content::NotificationService::current()->Notify(
diff --git a/chrome/browser/chromeos/login/user_manager_impl.h b/chrome/browser/chromeos/login/user_manager_impl.h
index 8176df7..d40688e 100644
--- a/chrome/browser/chromeos/login/user_manager_impl.h
+++ b/chrome/browser/chromeos/login/user_manager_impl.h
@@ -40,6 +40,8 @@ class UserManagerImpl : public UserManager,
public content::NotificationObserver {
public:
// UserManager implementation:
+ virtual ~UserManagerImpl();
+
virtual const UserList& GetUsers() const OVERRIDE;
virtual void UserLoggedIn(const std::string& email) OVERRIDE;
virtual void DemoUserLoggedIn() OVERRIDE;
@@ -79,6 +81,7 @@ class UserManagerImpl : public UserManager,
virtual bool IsUserLoggedIn() const OVERRIDE;
virtual bool IsLoggedInAsDemoUser() const OVERRIDE;
virtual bool IsLoggedInAsGuest() const OVERRIDE;
+ virtual bool IsLoggedInAsStub() const OVERRIDE;
virtual void AddObserver(Observer* obs) OVERRIDE;
virtual void RemoveObserver(Observer* obs) OVERRIDE;
virtual void NotifyLocalStateChanged() OVERRIDE;
@@ -94,7 +97,6 @@ class UserManagerImpl : public UserManager,
protected:
UserManagerImpl();
- virtual ~UserManagerImpl();
// Returns image filepath for the given user.
FilePath GetImagePathForUser(const std::string& username);
@@ -207,15 +209,6 @@ class UserManagerImpl : public UserManager,
// display names.
mutable base::hash_map<std::string, size_t> display_name_count_;
- // User instance used to represent the demo user.
- User demo_user_;
-
- // User instance used to represent the off-the-record (guest) user.
- User guest_user_;
-
- // A stub User instance for test paths (running without a logged-in user).
- User stub_user_;
-
// The logged-in user. NULL until a user has logged in, then points to one
// of the User instances in |users_|, the |guest_user_| instance or an
// ephemeral user instance. In test paths without login points to the
@@ -237,9 +230,6 @@ class UserManagerImpl : public UserManager,
// mounting their cryptohomes using tmpfs.
bool is_current_user_ephemeral_;
- // Cached flag of whether any user is logged in at the moment.
- bool is_user_logged_in_;
-
// Cached flag indicating whether ephemeral users are enabled. Defaults to
// |false| if the value has not been read from trusted device policy yet.
bool ephemeral_users_enabled_;
diff --git a/chrome/browser/chromeos/login/user_manager_unittest.cc b/chrome/browser/chromeos/login/user_manager_unittest.cc
index b50e146..ccad36b 100644
--- a/chrome/browser/chromeos/login/user_manager_unittest.cc
+++ b/chrome/browser/chromeos/login/user_manager_unittest.cc
@@ -52,6 +52,7 @@ class UserManagerTest : public testing::Test {
->SetLocalState(local_state_.get());
UserManager::RegisterPrefs(local_state_.get());
+ old_user_manager_ = UserManager::Get();
// A stub user is automatically logged in by UserManager. Reset this.
ResetUserManager();
}
@@ -65,6 +66,8 @@ class UserManagerTest : public testing::Test {
EXPECT_TRUE(
cros_settings_->RemoveSettingsProvider(&stub_settings_provider_));
cros_settings_->AddSettingsProvider(device_settings_provider_);
+
+ UserManager::Set(old_user_manager_);
}
bool GetUserManagerEphemeralUsersEnabled() const {
@@ -88,9 +91,13 @@ class UserManagerTest : public testing::Test {
}
void ResetUserManager() {
- UserManagerImpl* user_manager_impl(new UserManagerImpl());
+ user_manager_impl.reset(new UserManagerImpl());
+ // Clean up the stub user that gets created in the UserManagerImpl
+ // constructor.
+ delete user_manager_impl->logged_in_user_;
user_manager_impl->logged_in_user_ = NULL;
- UserManager::Set(user_manager_impl);
+ user_manager_impl->is_current_user_ephemeral_ = false;
+ UserManager::Set(user_manager_impl.get());
}
void SetDeviceSettings(bool ephemeral_users_enabled,
@@ -117,6 +124,9 @@ class UserManagerTest : public testing::Test {
CrosSettingsProvider* device_settings_provider_;
StubCrosSettingsProvider stub_settings_provider_;
scoped_ptr<TestingPrefService> local_state_;
+
+ scoped_ptr<UserManagerImpl> user_manager_impl;
+ UserManager* old_user_manager_;
};
TEST_F(UserManagerTest, RetrieveTrustedDevicePolicies) {
diff --git a/chrome/browser/ui/views/ash/status_area_host_aura_browsertest.cc b/chrome/browser/ui/views/ash/status_area_host_aura_browsertest.cc
index 797fd9a..6afeea9 100644
--- a/chrome/browser/ui/views/ash/status_area_host_aura_browsertest.cc
+++ b/chrome/browser/ui/views/ash/status_area_host_aura_browsertest.cc
@@ -33,7 +33,8 @@ IN_PROC_BROWSER_TEST_F(StatusAreaHostAuraTest, TextStyle) {
StatusAreaHostAura* host = delegate->status_area_host();
#if defined(OS_CHROMEOS)
- ASSERT_FALSE(chromeos::UserManager::Get()->IsUserLoggedIn());
+ ASSERT_TRUE(!chromeos::UserManager::Get()->IsUserLoggedIn() ||
+ chromeos::UserManager::Get()->IsLoggedInAsStub());
if (base::chromeos::IsRunningOnChromeOS()) {
EXPECT_EQ(StatusAreaButton::GRAY_PLAIN_LIGHT,
host->GetStatusAreaTextStyle());
@@ -46,7 +47,8 @@ IN_PROC_BROWSER_TEST_F(StatusAreaHostAuraTest, TextStyle) {
CommandLine::ForCurrentProcess()->AppendSwitchNative(
switches::kLoginProfile, "StatusAreaHostAuraTest");
chromeos::UserManager::Get()->UserLoggedIn("foo@example.com");
- ASSERT_TRUE(chromeos::UserManager::Get()->IsUserLoggedIn());
+ ASSERT_TRUE(chromeos::UserManager::Get()->IsUserLoggedIn() &&
+ !chromeos::UserManager::Get()->IsLoggedInAsStub());
#endif
Browser* browser = CreateBrowser(ProfileManager::GetDefaultProfile());
diff --git a/chrome/browser/website_settings_model_unittest.cc b/chrome/browser/website_settings_model_unittest.cc
index a753a60..3e09187 100644
--- a/chrome/browser/website_settings_model_unittest.cc
+++ b/chrome/browser/website_settings_model_unittest.cc
@@ -5,10 +5,12 @@
#include "chrome/browser/website_settings_model.h"
#include "base/at_exit.h"
+#include "base/message_loop.h"
#include "base/utf_string_conversions.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/browser/cert_store.h"
#include "content/public/common/ssl_status.h"
+#include "content/test/test_browser_thread.h"
#include "net/base/cert_status_flags.h"
#include "net/base/ssl_connection_status_flags.h"
#include "net/base/test_certificate_data.h"
@@ -47,9 +49,13 @@ class MockCertStore : public content::CertStore {
class WebsiteSettingsModelTest : public testing::Test {
public:
- WebsiteSettingsModelTest() : testing::Test(),
- profile_(new TestingProfile()),
- cert_id_(0) {
+ WebsiteSettingsModelTest()
+ : testing::Test(),
+ message_loop_(MessageLoop::TYPE_UI),
+ ui_thread_(content::BrowserThread::UI, &message_loop_),
+ file_thread_(content::BrowserThread::FILE, &message_loop_),
+ profile_(new TestingProfile()),
+ cert_id_(0) {
}
virtual ~WebsiteSettingsModelTest() {
@@ -77,6 +83,10 @@ class WebsiteSettingsModelTest : public testing::Test {
Profile* profile() const { return profile_.get(); }
+ MessageLoop message_loop_;
+ content::TestBrowserThread ui_thread_;
+ content::TestBrowserThread file_thread_;
+
scoped_ptr<Profile> profile_;
int cert_id_;
scoped_refptr<net::X509Certificate> cert_;