blob: 6cc2837964f94906cb5c6820e16009c67dd315a6 [file] [log] [blame]
// 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.
#include "chrome/browser/profiles/gaia_info_update_service.h"
#include "base/prefs/pref_service.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile_downloader.h"
#include "chrome/browser/profiles/profile_info_cache.h"
#include "chrome/browser/profiles/profile_info_cache_unittest.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_unittest_util.h"
using ::testing::Return;
using ::testing::NiceMock;
namespace {
class ProfileDownloaderMock : public ProfileDownloader {
public:
explicit ProfileDownloaderMock(ProfileDownloaderDelegate* delegate)
: ProfileDownloader(delegate) {
}
virtual ~ProfileDownloaderMock() {
}
MOCK_CONST_METHOD0(GetProfileFullName, string16());
MOCK_CONST_METHOD0(GetProfilePicture, SkBitmap());
MOCK_CONST_METHOD0(GetProfilePictureStatus,
ProfileDownloader::PictureStatus());
MOCK_CONST_METHOD0(GetProfilePictureURL, std::string());
};
class GAIAInfoUpdateServiceMock : public GAIAInfoUpdateService {
public:
explicit GAIAInfoUpdateServiceMock(Profile* profile)
: GAIAInfoUpdateService(profile) {
}
virtual ~GAIAInfoUpdateServiceMock() {
}
MOCK_METHOD0(Update, void());
};
class GAIAInfoUpdateServiceTest : public ProfileInfoCacheTest {
protected:
GAIAInfoUpdateServiceTest() : profile_(NULL) {
}
Profile* profile() {
if (!profile_)
profile_ = testing_profile_manager_.CreateTestingProfile("profile_1");
return profile_;
}
private:
Profile* profile_;
};
} // namespace
TEST_F(GAIAInfoUpdateServiceTest, DownloadSuccess) {
GAIAInfoUpdateService service(profile());
NiceMock<ProfileDownloaderMock> downloader(&service);
string16 name = ASCIIToUTF16("Pat Smith");
EXPECT_CALL(downloader, GetProfileFullName()).WillOnce(Return(name));
gfx::Image image = gfx::test::CreateImage();
const SkBitmap* bmp = image.ToSkBitmap();
EXPECT_CALL(downloader, GetProfilePicture()).WillOnce(Return(*bmp));
EXPECT_CALL(downloader, GetProfilePictureStatus()).
WillOnce(Return(ProfileDownloader::PICTURE_SUCCESS));
std::string url("foo.com");
EXPECT_CALL(downloader, GetProfilePictureURL()).WillOnce(Return(url));
// No URL should be cached yet.
EXPECT_EQ(std::string(), service.GetCachedPictureURL());
service.OnProfileDownloadSuccess(&downloader);
// On success both the profile info and GAIA info should be updated.
size_t index = GetCache()->GetIndexOfProfileWithPath(profile()->GetPath());
EXPECT_TRUE(GetCache()->GetHasMigratedToGAIAInfoOfProfileAtIndex(index));
EXPECT_EQ(name, GetCache()->GetNameOfProfileAtIndex(index));
EXPECT_EQ(name, GetCache()->GetGAIANameOfProfileAtIndex(index));
EXPECT_TRUE(gfx::test::IsEqual(
image, GetCache()->GetAvatarIconOfProfileAtIndex(index)));
EXPECT_TRUE(gfx::test::IsEqual(
image, *GetCache()->GetGAIAPictureOfProfileAtIndex(index)));
EXPECT_EQ(url, service.GetCachedPictureURL());
}
TEST_F(GAIAInfoUpdateServiceTest, DownloadFailure) {
size_t index = GetCache()->GetIndexOfProfileWithPath(profile()->GetPath());
string16 old_name = GetCache()->GetNameOfProfileAtIndex(index);
gfx::Image old_image = GetCache()->GetAvatarIconOfProfileAtIndex(index);
GAIAInfoUpdateService service(profile());
EXPECT_EQ(std::string(), service.GetCachedPictureURL());
NiceMock<ProfileDownloaderMock> downloader(&service);
service.OnProfileDownloadFailure(&downloader,
ProfileDownloaderDelegate::SERVICE_ERROR);
// On failure nothing should be updated.
EXPECT_FALSE(GetCache()->GetHasMigratedToGAIAInfoOfProfileAtIndex(index));
EXPECT_EQ(old_name, GetCache()->GetNameOfProfileAtIndex(index));
EXPECT_EQ(string16(), GetCache()->GetGAIANameOfProfileAtIndex(index));
EXPECT_TRUE(gfx::test::IsEqual(
old_image, GetCache()->GetAvatarIconOfProfileAtIndex(index)));
EXPECT_EQ(NULL, GetCache()->GetGAIAPictureOfProfileAtIndex(index));
EXPECT_EQ(std::string(), service.GetCachedPictureURL());
}
TEST_F(GAIAInfoUpdateServiceTest, NoMigration) {
size_t index = GetCache()->GetIndexOfProfileWithPath(profile()->GetPath());
string16 old_name = GetCache()->GetNameOfProfileAtIndex(index);
gfx::Image old_image = GetCache()->GetAvatarIconOfProfileAtIndex(index);
// Mark the profile as migrated.
GetCache()->SetHasMigratedToGAIAInfoOfProfileAtIndex(index, true);
GAIAInfoUpdateService service(profile());
NiceMock<ProfileDownloaderMock> downloader(&service);
string16 new_name = ASCIIToUTF16("Pat Smith");
EXPECT_CALL(downloader, GetProfileFullName()).WillOnce(Return(new_name));
gfx::Image new_image = gfx::test::CreateImage();
const SkBitmap* new_bmp = new_image.ToSkBitmap();
EXPECT_CALL(downloader, GetProfilePicture()).WillOnce(Return(*new_bmp));
EXPECT_CALL(downloader, GetProfilePictureStatus()).
WillOnce(Return(ProfileDownloader::PICTURE_SUCCESS));
EXPECT_CALL(downloader, GetProfilePictureURL()).WillOnce(Return(""));
service.OnProfileDownloadSuccess(&downloader);
// On success with no migration the profile info should not be updated but
// the GAIA info should be updated.
EXPECT_TRUE(GetCache()->GetHasMigratedToGAIAInfoOfProfileAtIndex(index));
EXPECT_EQ(old_name, GetCache()->GetNameOfProfileAtIndex(index));
EXPECT_EQ(new_name, GetCache()->GetGAIANameOfProfileAtIndex(index));
EXPECT_TRUE(gfx::test::IsEqual(
old_image, GetCache()->GetAvatarIconOfProfileAtIndex(index)));
EXPECT_TRUE(gfx::test::IsEqual(
new_image, *GetCache()->GetGAIAPictureOfProfileAtIndex(index)));
}
TEST_F(GAIAInfoUpdateServiceTest, ShouldUseGAIAProfileInfo) {
#if defined(OS_CHROMEOS)
// This feature should never be enabled on ChromeOS.
EXPECT_FALSE(GAIAInfoUpdateService::ShouldUseGAIAProfileInfo(profile()));
#endif
}
TEST_F(GAIAInfoUpdateServiceTest, ScheduleUpdate) {
GAIAInfoUpdateService service(profile());
EXPECT_TRUE(service.timer_.IsRunning());
service.timer_.Stop();
EXPECT_FALSE(service.timer_.IsRunning());
service.ScheduleNextUpdate();
EXPECT_TRUE(service.timer_.IsRunning());
}
TEST_F(GAIAInfoUpdateServiceTest, LogOut) {
profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
"pat@example.com");
string16 gaia_name = UTF8ToUTF16("Pat Foo");
GetCache()->SetGAIANameOfProfileAtIndex(0, gaia_name);
gfx::Image gaia_picture = gfx::test::CreateImage();
GetCache()->SetGAIAPictureOfProfileAtIndex(0, &gaia_picture);
// Set a fake picture URL.
profile()->GetPrefs()->SetString(prefs::kProfileGAIAInfoPictureURL,
"example.com");
GAIAInfoUpdateService service(profile());
EXPECT_FALSE(service.GetCachedPictureURL().empty());
// Log out.
profile()->GetPrefs()
->SetString(prefs::kGoogleServicesUsername, std::string());
// Verify that the GAIA name and picture, and picture URL are unset.
EXPECT_TRUE(GetCache()->GetGAIANameOfProfileAtIndex(0).empty());
EXPECT_EQ(NULL, GetCache()->GetGAIAPictureOfProfileAtIndex(0));
EXPECT_TRUE(service.GetCachedPictureURL().empty());
}
TEST_F(GAIAInfoUpdateServiceTest, LogIn) {
profile()->GetPrefs()
->SetString(prefs::kGoogleServicesUsername, std::string());
GAIAInfoUpdateServiceMock service(profile());
// Log in.
EXPECT_CALL(service, Update());
profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername,
"pat@example.com");
}