1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "base/basictypes.h"
10 #include "base/compiler_specific.h"
11 #include "base/file_util.h"
12 #include "base/files/file_path.h"
13 #include "base/json/json_writer.h"
14 #include "base/memory/linked_ptr.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/memory/ref_counted_memory.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "base/message_loop/message_loop_proxy.h"
19 #include "base/path_service.h"
20 #include "base/prefs/pref_change_registrar.h"
21 #include "base/prefs/pref_service.h"
22 #include "base/prefs/scoped_user_pref_update.h"
23 #include "base/run_loop.h"
24 #include "base/time/time.h"
25 #include "base/values.h"
26 #include "chrome/browser/browser_process.h"
27 #include "chrome/browser/chrome_notification_types.h"
28 #include "chrome/browser/chromeos/login/default_user_images.h"
29 #include "chrome/browser/chromeos/login/login_manager_test.h"
30 #include "chrome/browser/chromeos/login/mock_user_manager.h"
31 #include "chrome/browser/chromeos/login/startup_utils.h"
32 #include "chrome/browser/chromeos/login/user.h"
33 #include "chrome/browser/chromeos/login/user_image.h"
34 #include "chrome/browser/chromeos/login/user_image_manager.h"
35 #include "chrome/browser/chromeos/login/user_image_manager_impl.h"
36 #include "chrome/browser/chromeos/login/user_image_manager_test_util.h"
37 #include "chrome/browser/chromeos/login/user_manager.h"
38 #include "chrome/browser/chromeos/policy/cloud_external_data_manager_base_test_util.h"
39 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
40 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
41 #include "chrome/browser/profiles/profile.h"
42 #include "chrome/browser/profiles/profile_downloader.h"
43 #include "chrome/common/chrome_paths.h"
44 #include "chrome/test/base/in_process_browser_test.h"
45 #include "chrome/test/base/testing_browser_process.h"
46 #include "chromeos/chromeos_paths.h"
47 #include "chromeos/dbus/cryptohome_client.h"
48 #include "chromeos/dbus/dbus_thread_manager.h"
49 #include "chromeos/dbus/fake_dbus_thread_manager.h"
50 #include "chromeos/dbus/fake_session_manager_client.h"
51 #include "chromeos/dbus/session_manager_client.h"
52 #include "components/policy/core/common/cloud/cloud_policy_core.h"
53 #include "components/policy/core/common/cloud/cloud_policy_store.h"
54 #include "components/policy/core/common/cloud/policy_builder.h"
55 #include "content/public/browser/notification_service.h"
56 #include "content/public/browser/notification_source.h"
57 #include "content/public/test/test_utils.h"
58 #include "crypto/rsa_private_key.h"
59 #include "google_apis/gaia/gaia_oauth_client.h"
60 #include "google_apis/gaia/oauth2_token_service.h"
61 #include "net/test/embedded_test_server/embedded_test_server.h"
62 #include "net/url_request/test_url_fetcher_factory.h"
63 #include "net/url_request/url_fetcher_delegate.h"
64 #include "net/url_request/url_request_status.h"
65 #include "policy/proto/cloud_policy.pb.h"
66 #include "testing/gtest/include/gtest/gtest.h"
67 #include "third_party/skia/include/core/SkBitmap.h"
68 #include "ui/base/layout.h"
69 #include "ui/base/resource/resource_bundle.h"
70 #include "ui/gfx/image/image_skia.h"
77 const char kTestUser1
[] = "test-user@example.com";
78 const char kTestUser2
[] = "test-user2@example.com";
80 policy::CloudPolicyStore
* GetStoreForUser(const User
* user
) {
81 Profile
* profile
= UserManager::Get()->GetProfileByUser(user
);
86 policy::UserCloudPolicyManagerChromeOS
* policy_manager
=
87 policy::UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile
);
88 if (!policy_manager
) {
92 return policy_manager
->core()->store();
97 class UserImageManagerTest
: public LoginManagerTest
,
98 public UserManager::Observer
{
100 UserImageManagerTest() : LoginManagerTest(true) {
103 // LoginManagerTest overrides:
104 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE
{
105 LoginManagerTest::SetUpInProcessBrowserTestFixture();
107 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA
, &test_data_dir_
));
108 ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA
, &user_data_dir_
));
111 virtual void SetUpOnMainThread() OVERRIDE
{
112 LoginManagerTest::SetUpOnMainThread();
113 local_state_
= g_browser_process
->local_state();
114 UserManager::Get()->AddObserver(this);
117 virtual void TearDownOnMainThread() OVERRIDE
{
118 UserManager::Get()->RemoveObserver(this);
119 LoginManagerTest::TearDownOnMainThread();
122 // UserManager::Observer overrides:
123 virtual void LocalStateChanged(UserManager
* user_manager
) OVERRIDE
{
128 // Logs in |username|.
129 void LogIn(const std::string
& username
) {
130 UserManager::Get()->UserLoggedIn(username
, username
, false);
133 // Stores old (pre-migration) user image info.
134 void SetOldUserImageInfo(const std::string
& username
,
136 const base::FilePath
& image_path
) {
137 RegisterUser(username
);
138 DictionaryPrefUpdate
images_pref(local_state_
, "UserImages");
139 base::DictionaryValue
* image_properties
= new base::DictionaryValue();
140 image_properties
->Set(
141 "index", base::Value::CreateIntegerValue(image_index
));
142 image_properties
->Set(
143 "path" , new base::StringValue(image_path
.value()));
144 images_pref
->SetWithoutPathExpansion(username
, image_properties
);
147 // Verifies user image info in |images_pref| dictionary.
148 void ExpectUserImageInfo(const base::DictionaryValue
* images_pref
,
149 const std::string
& username
,
151 const base::FilePath
& image_path
) {
152 ASSERT_TRUE(images_pref
);
153 const base::DictionaryValue
* image_properties
= NULL
;
154 images_pref
->GetDictionaryWithoutPathExpansion(username
, &image_properties
);
155 ASSERT_TRUE(image_properties
);
156 int actual_image_index
;
157 std::string actual_image_path
;
158 ASSERT_TRUE(image_properties
->GetInteger("index", &actual_image_index
) &&
159 image_properties
->GetString("path", &actual_image_path
));
160 EXPECT_EQ(image_index
, actual_image_index
);
161 EXPECT_EQ(image_path
.value(), actual_image_path
);
164 // Verifies that there is no image info for |username| in dictionary
166 void ExpectNoUserImageInfo(const base::DictionaryValue
* images_pref
,
167 const std::string
& username
) {
168 ASSERT_TRUE(images_pref
);
169 const base::DictionaryValue
* image_properties
= NULL
;
170 images_pref
->GetDictionaryWithoutPathExpansion(username
, &image_properties
);
171 ASSERT_FALSE(image_properties
);
174 // Verifies that old user image info matches |image_index| and |image_path|
175 // and that new user image info does not exist.
176 void ExpectOldUserImageInfo(const std::string
& username
,
178 const base::FilePath
& image_path
) {
179 ExpectUserImageInfo(local_state_
->GetDictionary("UserImages"),
180 username
, image_index
, image_path
);
181 ExpectNoUserImageInfo(local_state_
->GetDictionary("user_image_info"),
185 // Verifies that new user image info matches |image_index| and |image_path|
186 // and that old user image info does not exist.
187 void ExpectNewUserImageInfo(const std::string
& username
,
189 const base::FilePath
& image_path
) {
190 ExpectUserImageInfo(local_state_
->GetDictionary("user_image_info"),
191 username
, image_index
, image_path
);
192 ExpectNoUserImageInfo(local_state_
->GetDictionary("UserImages"),
196 // Sets bitmap |resource_id| as image for |username| and saves it to disk.
197 void SaveUserImagePNG(const std::string
& username
,
199 base::FilePath image_path
= GetUserImagePath(username
, "png");
200 scoped_refptr
<base::RefCountedStaticMemory
> image_data(
201 ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale(
202 resource_id
, ui::SCALE_FACTOR_100P
));
203 int written
= base::WriteFile(
205 reinterpret_cast<const char*>(image_data
->front()),
207 EXPECT_EQ(static_cast<int>(image_data
->size()), written
);
208 SetOldUserImageInfo(username
, User::kExternalImageIndex
, image_path
);
211 // Returns the image path for user |username| with specified |extension|.
212 base::FilePath
GetUserImagePath(const std::string
& username
,
213 const std::string
& extension
) {
214 return user_data_dir_
.Append(username
).AddExtension(extension
);
217 // Completes the download of all non-image profile data for the user
218 // |username|. This method must only be called after a profile data
219 // download has been started. |url_fetcher_factory| will capture
220 // the net::TestURLFetcher created by the ProfileDownloader to
221 // download the profile image.
222 void CompleteProfileMetadataDownload(
223 const std::string
& username
,
224 net::TestURLFetcherFactory
* url_fetcher_factory
) {
225 ProfileDownloader
* profile_downloader
=
226 reinterpret_cast<UserImageManagerImpl
*>(
227 UserManager::Get()->GetUserImageManager(username
))->
228 profile_downloader_
.get();
229 ASSERT_TRUE(profile_downloader
);
231 static_cast<OAuth2TokenService::Consumer
*>(profile_downloader
)->
232 OnGetTokenSuccess(NULL
,
234 base::Time::Now() + base::TimeDelta::FromDays(1));
236 net::TestURLFetcher
* fetcher
=
237 url_fetcher_factory
->GetFetcherByID(
238 gaia::GaiaOAuthClient::kUrlFetcherId
);
239 ASSERT_TRUE(fetcher
);
240 fetcher
->SetResponseString(
241 "{ \"image\": {\"url\": \"http://localhost/avatar.jpg\"} }");
242 fetcher
->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS
,
244 fetcher
->set_response_code(200);
245 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
246 base::RunLoop().RunUntilIdle();
249 // Completes the download of the currently logged-in user's profile image.
250 // This method must only be called after a profile data download including
251 // the profile image has been started, the download of all non-image data has
252 // been completed by calling CompleteProfileMetadataDownload() and the
253 // net::TestURLFetcher created by the ProfileDownloader to download the
254 // profile image has been captured by |url_fetcher_factory|.
255 void CompleteProfileImageDownload(
256 net::TestURLFetcherFactory
* url_fetcher_factory
) {
257 std::string profile_image_data
;
258 base::FilePath test_data_dir
;
259 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA
, &test_data_dir
));
260 EXPECT_TRUE(ReadFileToString(
261 test_data_dir
.Append("chromeos").Append("avatar1.jpg"),
262 &profile_image_data
));
264 base::RunLoop run_loop
;
265 PrefChangeRegistrar pref_change_registrar
;
266 pref_change_registrar
.Init(local_state_
);
267 pref_change_registrar
.Add("UserDisplayName", run_loop
.QuitClosure());
268 net::TestURLFetcher
* fetcher
= url_fetcher_factory
->GetFetcherByID(0);
269 ASSERT_TRUE(fetcher
);
270 fetcher
->SetResponseString(profile_image_data
);
271 fetcher
->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS
,
273 fetcher
->set_response_code(200);
274 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
277 const User
* user
= UserManager::Get()->GetLoggedInUser();
279 UserImageManagerImpl
* uim
= reinterpret_cast<UserImageManagerImpl
*>(
280 UserManager::Get()->GetUserImageManager(user
->email()));
281 if (uim
->job_
.get()) {
282 run_loop_
.reset(new base::RunLoop
);
287 base::FilePath test_data_dir_
;
288 base::FilePath user_data_dir_
;
290 PrefService
* local_state_
;
292 scoped_ptr
<gfx::ImageSkia
> decoded_image_
;
294 scoped_ptr
<base::RunLoop
> run_loop_
;
297 DISALLOW_COPY_AND_ASSIGN(UserImageManagerTest
);
300 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_DefaultUserImagePreserved
) {
301 // Setup an old default (stock) user image.
302 ScopedUserManagerEnabler(new MockUserManager
);
303 SetOldUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
306 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, DefaultUserImagePreserved
) {
307 UserManager::Get()->GetUsers(); // Load users.
308 // Old info preserved.
309 ExpectOldUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
311 // Image info is migrated now.
312 ExpectNewUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
315 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_OtherUsersUnaffected
) {
316 // Setup two users with stock images.
317 ScopedUserManagerEnabler(new MockUserManager
);
318 SetOldUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
319 SetOldUserImageInfo(kTestUser2
, kFirstDefaultImageIndex
+ 1,
323 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, OtherUsersUnaffected
) {
324 UserManager::Get()->GetUsers(); // Load users.
325 // Old info preserved.
326 ExpectOldUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
327 ExpectOldUserImageInfo(kTestUser2
, kFirstDefaultImageIndex
+ 1,
330 // Image info is migrated for the first user and unaffected for the rest.
331 ExpectNewUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
332 ExpectOldUserImageInfo(kTestUser2
, kFirstDefaultImageIndex
+ 1,
336 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_PRE_NonJPEGImageFromFile
) {
337 // Setup a user with non-JPEG image.
338 ScopedUserManagerEnabler(new MockUserManager
);
340 kTestUser1
, kDefaultImageResourceIDs
[kFirstDefaultImageIndex
]);
343 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_NonJPEGImageFromFile
) {
344 UserManager::Get()->GetUsers(); // Load users.
345 // Old info preserved.
346 ExpectOldUserImageInfo(kTestUser1
, User::kExternalImageIndex
,
347 GetUserImagePath(kTestUser1
, "png"));
348 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
349 EXPECT_TRUE(user
->image_is_stub());
351 base::RunLoop run_loop
;
352 PrefChangeRegistrar pref_change_registrar_
;
353 pref_change_registrar_
.Init(local_state_
);
354 pref_change_registrar_
.Add("UserImages", run_loop
.QuitClosure());
357 // Wait for migration.
360 // Image info is migrated and the image is converted to JPG.
361 ExpectNewUserImageInfo(kTestUser1
, User::kExternalImageIndex
,
362 GetUserImagePath(kTestUser1
, "jpg"));
363 user
= UserManager::Get()->GetLoggedInUser();
365 EXPECT_FALSE(user
->image_is_safe_format());
366 // Check image dimensions.
367 const gfx::ImageSkia
& saved_image
= GetDefaultImage(kFirstDefaultImageIndex
);
368 EXPECT_EQ(saved_image
.width(), user
->GetImage().width());
369 EXPECT_EQ(saved_image
.height(), user
->GetImage().height());
372 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, NonJPEGImageFromFile
) {
373 UserManager::Get()->GetUsers(); // Load users.
374 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
376 // Wait for image load.
377 if (user
->image_index() == User::kInvalidImageIndex
) {
378 content::WindowedNotificationObserver(
379 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED
,
380 content::NotificationService::AllSources()).Wait();
382 // Now the migrated image is used.
383 EXPECT_TRUE(user
->image_is_safe_format());
384 // Check image dimensions. Images can't be compared since JPEG is lossy.
385 const gfx::ImageSkia
& saved_image
= GetDefaultImage(kFirstDefaultImageIndex
);
386 EXPECT_EQ(saved_image
.width(), user
->GetImage().width());
387 EXPECT_EQ(saved_image
.height(), user
->GetImage().height());
390 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_SaveUserDefaultImageIndex
) {
391 RegisterUser(kTestUser1
);
394 // Verifies that SaveUserDefaultImageIndex() correctly sets and persists the
395 // chosen user image.
396 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, SaveUserDefaultImageIndex
) {
397 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
400 const gfx::ImageSkia
& default_image
=
401 GetDefaultImage(kFirstDefaultImageIndex
);
403 UserImageManager
* user_image_manager
=
404 UserManager::Get()->GetUserImageManager(kTestUser1
);
405 user_image_manager
->SaveUserDefaultImageIndex(kFirstDefaultImageIndex
);
407 EXPECT_TRUE(user
->HasDefaultImage());
408 EXPECT_EQ(kFirstDefaultImageIndex
, user
->image_index());
409 EXPECT_TRUE(test::AreImagesEqual(default_image
, user
->GetImage()));
410 ExpectNewUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
413 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_SaveUserImage
) {
414 RegisterUser(kTestUser1
);
417 // Verifies that SaveUserImage() correctly sets and persists the chosen user
419 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, SaveUserImage
) {
420 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
423 SkBitmap custom_image_bitmap
;
424 custom_image_bitmap
.setConfig(SkBitmap::kARGB_8888_Config
, 10, 10);
425 custom_image_bitmap
.allocPixels();
426 custom_image_bitmap
.setImmutable();
427 const gfx::ImageSkia custom_image
=
428 gfx::ImageSkia::CreateFrom1xBitmap(custom_image_bitmap
);
430 run_loop_
.reset(new base::RunLoop
);
431 UserImageManager
* user_image_manager
=
432 UserManager::Get()->GetUserImageManager(kTestUser1
);
433 user_image_manager
->SaveUserImage(UserImage::CreateAndEncode(custom_image
));
436 EXPECT_FALSE(user
->HasDefaultImage());
437 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
438 EXPECT_TRUE(test::AreImagesEqual(custom_image
, user
->GetImage()));
439 ExpectNewUserImageInfo(kTestUser1
,
440 User::kExternalImageIndex
,
441 GetUserImagePath(kTestUser1
, "jpg"));
443 const scoped_ptr
<gfx::ImageSkia
> saved_image
=
444 test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
445 ASSERT_TRUE(saved_image
);
447 // Check image dimensions. Images can't be compared since JPEG is lossy.
448 EXPECT_EQ(custom_image
.width(), saved_image
->width());
449 EXPECT_EQ(custom_image
.height(), saved_image
->height());
452 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, PRE_SaveUserImageFromFile
) {
453 RegisterUser(kTestUser1
);
456 // Verifies that SaveUserImageFromFile() correctly sets and persists the chosen
458 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, SaveUserImageFromFile
) {
459 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
462 const base::FilePath custom_image_path
=
463 test_data_dir_
.Append(test::kUserAvatarImage1RelativePath
);
464 const scoped_ptr
<gfx::ImageSkia
> custom_image
=
465 test::ImageLoader(custom_image_path
).Load();
466 ASSERT_TRUE(custom_image
);
468 run_loop_
.reset(new base::RunLoop
);
469 UserImageManager
* user_image_manager
=
470 UserManager::Get()->GetUserImageManager(kTestUser1
);
471 user_image_manager
->SaveUserImageFromFile(custom_image_path
);
474 EXPECT_FALSE(user
->HasDefaultImage());
475 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
476 EXPECT_TRUE(test::AreImagesEqual(*custom_image
, user
->GetImage()));
477 ExpectNewUserImageInfo(kTestUser1
,
478 User::kExternalImageIndex
,
479 GetUserImagePath(kTestUser1
, "jpg"));
481 const scoped_ptr
<gfx::ImageSkia
> saved_image
=
482 test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
483 ASSERT_TRUE(saved_image
);
485 // Check image dimensions. Images can't be compared since JPEG is lossy.
486 EXPECT_EQ(custom_image
->width(), saved_image
->width());
487 EXPECT_EQ(custom_image
->height(), saved_image
->height());
490 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
,
491 PRE_SaveUserImageFromProfileImage
) {
492 RegisterUser(kTestUser1
);
493 chromeos::StartupUtils::MarkOobeCompleted();
496 // Verifies that SaveUserImageFromProfileImage() correctly downloads, sets and
497 // persists the chosen user image.
498 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
, SaveUserImageFromProfileImage
) {
499 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
502 UserImageManagerImpl::IgnoreProfileDataDownloadDelayForTesting();
503 LoginUser(kTestUser1
);
505 run_loop_
.reset(new base::RunLoop
);
506 UserImageManager
* user_image_manager
=
507 UserManager::Get()->GetUserImageManager(kTestUser1
);
508 user_image_manager
->SaveUserImageFromProfileImage();
511 net::TestURLFetcherFactory url_fetcher_factory
;
512 CompleteProfileMetadataDownload(kTestUser1
, &url_fetcher_factory
);
513 CompleteProfileImageDownload(&url_fetcher_factory
);
515 const gfx::ImageSkia
& profile_image
=
516 user_image_manager
->DownloadedProfileImage();
518 EXPECT_FALSE(user
->HasDefaultImage());
519 EXPECT_EQ(User::kProfileImageIndex
, user
->image_index());
520 EXPECT_TRUE(test::AreImagesEqual(profile_image
, user
->GetImage()));
521 ExpectNewUserImageInfo(kTestUser1
,
522 User::kProfileImageIndex
,
523 GetUserImagePath(kTestUser1
, "jpg"));
525 const scoped_ptr
<gfx::ImageSkia
> saved_image
=
526 test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
527 ASSERT_TRUE(saved_image
);
529 // Check image dimensions. Images can't be compared since JPEG is lossy.
530 EXPECT_EQ(profile_image
.width(), saved_image
->width());
531 EXPECT_EQ(profile_image
.height(), saved_image
->height());
534 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
,
535 PRE_ProfileImageDownloadDoesNotClobber
) {
536 RegisterUser(kTestUser1
);
537 chromeos::StartupUtils::MarkOobeCompleted();
540 // Sets the user image to the profile image, then sets it to one of the default
541 // images while the profile image download is still in progress. Verifies that
542 // when the download completes, the profile image is ignored and does not
543 // clobber the default image chosen in the meantime.
544 IN_PROC_BROWSER_TEST_F(UserImageManagerTest
,
545 ProfileImageDownloadDoesNotClobber
) {
546 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
549 const gfx::ImageSkia
& default_image
=
550 GetDefaultImage(kFirstDefaultImageIndex
);
552 UserImageManagerImpl::IgnoreProfileDataDownloadDelayForTesting();
553 LoginUser(kTestUser1
);
555 run_loop_
.reset(new base::RunLoop
);
556 UserImageManager
* user_image_manager
=
557 UserManager::Get()->GetUserImageManager(kTestUser1
);
558 user_image_manager
->SaveUserImageFromProfileImage();
561 net::TestURLFetcherFactory url_fetcher_factory
;
562 CompleteProfileMetadataDownload(kTestUser1
, &url_fetcher_factory
);
564 user_image_manager
->SaveUserDefaultImageIndex(kFirstDefaultImageIndex
);
566 CompleteProfileImageDownload(&url_fetcher_factory
);
568 EXPECT_TRUE(user
->HasDefaultImage());
569 EXPECT_EQ(kFirstDefaultImageIndex
, user
->image_index());
570 EXPECT_TRUE(test::AreImagesEqual(default_image
, user
->GetImage()));
571 ExpectNewUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
574 class UserImageManagerPolicyTest
: public UserImageManagerTest
,
575 public policy::CloudPolicyStore::Observer
{
577 UserImageManagerPolicyTest()
578 : fake_dbus_thread_manager_(new chromeos::FakeDBusThreadManager
),
579 fake_session_manager_client_(new chromeos::FakeSessionManagerClient
) {
580 fake_dbus_thread_manager_
->SetFakeClients();
581 fake_dbus_thread_manager_
->SetSessionManagerClient(
582 scoped_ptr
<SessionManagerClient
>(fake_session_manager_client_
));
585 // UserImageManagerTest overrides:
586 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE
{
587 DBusThreadManager::SetInstanceForTesting(fake_dbus_thread_manager_
);
588 UserImageManagerTest::SetUpInProcessBrowserTestFixture();
591 virtual void SetUpOnMainThread() OVERRIDE
{
592 UserImageManagerTest::SetUpOnMainThread();
594 base::FilePath user_keys_dir
;
595 ASSERT_TRUE(PathService::Get(chromeos::DIR_USER_POLICY_KEYS
,
597 const std::string sanitized_username
=
598 chromeos::CryptohomeClient::GetStubSanitizedUsername(kTestUser1
);
599 const base::FilePath user_key_file
=
600 user_keys_dir
.AppendASCII(sanitized_username
)
601 .AppendASCII("policy.pub");
602 std::vector
<uint8
> user_key_bits
;
603 ASSERT_TRUE(user_policy_
.GetSigningKey()->ExportPublicKey(&user_key_bits
));
604 ASSERT_TRUE(base::CreateDirectory(user_key_file
.DirName()));
605 ASSERT_EQ(base::WriteFile(
607 reinterpret_cast<const char*>(user_key_bits
.data()),
608 user_key_bits
.size()),
609 static_cast<int>(user_key_bits
.size()));
610 user_policy_
.policy_data().set_username(kTestUser1
);
612 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
614 policy_image_
= test::ImageLoader(test_data_dir_
.Append(
615 test::kUserAvatarImage2RelativePath
)).Load();
616 ASSERT_TRUE(policy_image_
);
619 // policy::CloudPolicyStore::Observer overrides:
620 virtual void OnStoreLoaded(policy::CloudPolicyStore
* store
) OVERRIDE
{
625 virtual void OnStoreError(policy::CloudPolicyStore
* store
) OVERRIDE
{
630 std::string
ConstructPolicy(const std::string
& relative_path
) {
631 std::string image_data
;
632 if (!base::ReadFileToString(test_data_dir_
.Append(relative_path
),
637 base::JSONWriter::Write(policy::test::ConstructExternalDataReference(
638 embedded_test_server()->GetURL(std::string("/") + relative_path
).spec(),
644 policy::UserPolicyBuilder user_policy_
;
645 FakeDBusThreadManager
* fake_dbus_thread_manager_
;
646 FakeSessionManagerClient
* fake_session_manager_client_
;
648 scoped_ptr
<gfx::ImageSkia
> policy_image_
;
651 DISALLOW_COPY_AND_ASSIGN(UserImageManagerPolicyTest
);
654 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest
, PRE_SetAndClear
) {
655 RegisterUser(kTestUser1
);
656 chromeos::StartupUtils::MarkOobeCompleted();
659 // Verifies that the user image can be set through policy. Also verifies that
660 // after the policy has been cleared, the user is able to choose a different
662 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest
, SetAndClear
) {
663 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
666 LoginUser(kTestUser1
);
667 base::RunLoop().RunUntilIdle();
669 policy::CloudPolicyStore
* store
= GetStoreForUser(user
);
672 // Set policy. Verify that the policy-provided user image is downloaded, set
674 user_policy_
.payload().mutable_useravatarimage()->set_value(
675 ConstructPolicy(test::kUserAvatarImage2RelativePath
));
676 user_policy_
.Build();
677 fake_session_manager_client_
->set_user_policy(kTestUser1
,
678 user_policy_
.GetBlob());
679 run_loop_
.reset(new base::RunLoop
);
683 EXPECT_FALSE(user
->HasDefaultImage());
684 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
685 EXPECT_TRUE(test::AreImagesEqual(*policy_image_
, user
->GetImage()));
686 ExpectNewUserImageInfo(kTestUser1
,
687 User::kExternalImageIndex
,
688 GetUserImagePath(kTestUser1
, "jpg"));
690 scoped_ptr
<gfx::ImageSkia
> saved_image
=
691 test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
692 ASSERT_TRUE(saved_image
);
694 // Check image dimensions. Images can't be compared since JPEG is lossy.
695 EXPECT_EQ(policy_image_
->width(), saved_image
->width());
696 EXPECT_EQ(policy_image_
->height(), saved_image
->height());
698 // Clear policy. Verify that the policy-provided user image remains set as no
699 // different user image has been chosen yet.
700 user_policy_
.payload().Clear();
701 user_policy_
.Build();
702 fake_session_manager_client_
->set_user_policy(kTestUser1
,
703 user_policy_
.GetBlob());
704 run_loop_
.reset(new base::RunLoop
);
705 store
->AddObserver(this);
708 store
->RemoveObserver(this);
709 base::RunLoop().RunUntilIdle();
711 EXPECT_FALSE(user
->HasDefaultImage());
712 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
713 EXPECT_TRUE(test::AreImagesEqual(*policy_image_
, user
->GetImage()));
714 ExpectNewUserImageInfo(kTestUser1
,
715 User::kExternalImageIndex
,
716 GetUserImagePath(kTestUser1
, "jpg"));
718 saved_image
= test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
719 ASSERT_TRUE(saved_image
);
721 // Check image dimensions. Images can't be compared since JPEG is lossy.
722 EXPECT_EQ(policy_image_
->width(), saved_image
->width());
723 EXPECT_EQ(policy_image_
->height(), saved_image
->height());
725 // Choose a different user image. Verify that the chosen user image is set and
727 const gfx::ImageSkia
& default_image
=
728 GetDefaultImage(kFirstDefaultImageIndex
);
730 UserImageManager
* user_image_manager
=
731 UserManager::Get()->GetUserImageManager(kTestUser1
);
732 user_image_manager
->SaveUserDefaultImageIndex(kFirstDefaultImageIndex
);
734 EXPECT_TRUE(user
->HasDefaultImage());
735 EXPECT_EQ(kFirstDefaultImageIndex
, user
->image_index());
736 EXPECT_TRUE(test::AreImagesEqual(default_image
, user
->GetImage()));
737 ExpectNewUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
740 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest
, PRE_PolicyOverridesUser
) {
741 RegisterUser(kTestUser1
);
742 chromeos::StartupUtils::MarkOobeCompleted();
745 // Verifies that when the user chooses a user image and a different image is
746 // then set through policy, the policy takes precedence, overriding the
747 // previously chosen image.
748 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest
, PolicyOverridesUser
) {
749 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
752 LoginUser(kTestUser1
);
753 base::RunLoop().RunUntilIdle();
755 policy::CloudPolicyStore
* store
= GetStoreForUser(user
);
758 // Choose a user image. Verify that the chosen user image is set and
760 const gfx::ImageSkia
& default_image
=
761 GetDefaultImage(kFirstDefaultImageIndex
);
763 UserImageManager
* user_image_manager
=
764 UserManager::Get()->GetUserImageManager(kTestUser1
);
765 user_image_manager
->SaveUserDefaultImageIndex(kFirstDefaultImageIndex
);
767 EXPECT_TRUE(user
->HasDefaultImage());
768 EXPECT_EQ(kFirstDefaultImageIndex
, user
->image_index());
769 EXPECT_TRUE(test::AreImagesEqual(default_image
, user
->GetImage()));
770 ExpectNewUserImageInfo(kTestUser1
, kFirstDefaultImageIndex
, base::FilePath());
772 // Set policy. Verify that the policy-provided user image is downloaded, set
773 // and persisted, overriding the previously set image.
774 user_policy_
.payload().mutable_useravatarimage()->set_value(
775 ConstructPolicy(test::kUserAvatarImage2RelativePath
));
776 user_policy_
.Build();
777 fake_session_manager_client_
->set_user_policy(kTestUser1
,
778 user_policy_
.GetBlob());
779 run_loop_
.reset(new base::RunLoop
);
783 EXPECT_FALSE(user
->HasDefaultImage());
784 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
785 EXPECT_TRUE(test::AreImagesEqual(*policy_image_
, user
->GetImage()));
786 ExpectNewUserImageInfo(kTestUser1
,
787 User::kExternalImageIndex
,
788 GetUserImagePath(kTestUser1
, "jpg"));
790 scoped_ptr
<gfx::ImageSkia
> saved_image
=
791 test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
792 ASSERT_TRUE(saved_image
);
794 // Check image dimensions. Images can't be compared since JPEG is lossy.
795 EXPECT_EQ(policy_image_
->width(), saved_image
->width());
796 EXPECT_EQ(policy_image_
->height(), saved_image
->height());
799 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest
,
800 PRE_UserDoesNotOverridePolicy
) {
801 RegisterUser(kTestUser1
);
802 chromeos::StartupUtils::MarkOobeCompleted();
805 // Verifies that when the user image has been set through policy and the user
806 // chooses a different image, the policy takes precedence, preventing the user
807 // from overriding the previously chosen image.
808 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest
, UserDoesNotOverridePolicy
) {
809 const User
* user
= UserManager::Get()->FindUser(kTestUser1
);
812 LoginUser(kTestUser1
);
813 base::RunLoop().RunUntilIdle();
815 policy::CloudPolicyStore
* store
= GetStoreForUser(user
);
818 // Set policy. Verify that the policy-provided user image is downloaded, set
820 user_policy_
.payload().mutable_useravatarimage()->set_value(
821 ConstructPolicy(test::kUserAvatarImage2RelativePath
));
822 user_policy_
.Build();
823 fake_session_manager_client_
->set_user_policy(kTestUser1
,
824 user_policy_
.GetBlob());
825 run_loop_
.reset(new base::RunLoop
);
829 EXPECT_FALSE(user
->HasDefaultImage());
830 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
831 EXPECT_TRUE(test::AreImagesEqual(*policy_image_
, user
->GetImage()));
832 ExpectNewUserImageInfo(kTestUser1
,
833 User::kExternalImageIndex
,
834 GetUserImagePath(kTestUser1
, "jpg"));
836 scoped_ptr
<gfx::ImageSkia
> saved_image
=
837 test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
838 ASSERT_TRUE(saved_image
);
840 // Check image dimensions. Images can't be compared since JPEG is lossy.
841 EXPECT_EQ(policy_image_
->width(), saved_image
->width());
842 EXPECT_EQ(policy_image_
->height(), saved_image
->height());
844 // Choose a different user image. Verify that the user image does not change
845 // as policy takes precedence.
846 UserImageManager
* user_image_manager
=
847 UserManager::Get()->GetUserImageManager(kTestUser1
);
848 user_image_manager
->SaveUserDefaultImageIndex(kFirstDefaultImageIndex
);
850 EXPECT_FALSE(user
->HasDefaultImage());
851 EXPECT_EQ(User::kExternalImageIndex
, user
->image_index());
852 EXPECT_TRUE(test::AreImagesEqual(*policy_image_
, user
->GetImage()));
853 ExpectNewUserImageInfo(kTestUser1
,
854 User::kExternalImageIndex
,
855 GetUserImagePath(kTestUser1
, "jpg"));
857 saved_image
= test::ImageLoader(GetUserImagePath(kTestUser1
, "jpg")).Load();
858 ASSERT_TRUE(saved_image
);
860 // Check image dimensions. Images can't be compared since JPEG is lossy.
861 EXPECT_EQ(policy_image_
->width(), saved_image
->width());
862 EXPECT_EQ(policy_image_
->height(), saved_image
->height());
865 } // namespace chromeos