Cast: Stop logging kVideoFrameSentToEncoder and rename a couple events.
[chromium-blink-merge.git] / chrome / browser / chromeos / login / user_image_manager_browsertest.cc
blob0bb9730b572624cc5bb63d9c7c8da2a779bcfca4
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.
5 #include <map>
6 #include <string>
7 #include <vector>
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"
71 #include "url/gurl.h"
73 namespace chromeos {
75 namespace {
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);
82 if (!profile) {
83 ADD_FAILURE();
84 return NULL;
86 policy::UserCloudPolicyManagerChromeOS* policy_manager =
87 policy::UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile);
88 if (!policy_manager) {
89 ADD_FAILURE();
90 return NULL;
92 return policy_manager->core()->store();
95 } // namespace
97 class UserImageManagerTest : public LoginManagerTest,
98 public UserManager::Observer {
99 protected:
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 {
124 if (run_loop_)
125 run_loop_->Quit();
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,
135 int image_index,
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,
150 int image_index,
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
165 // |images_pref|.
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,
177 int image_index,
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"),
182 username);
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,
188 int image_index,
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"),
193 username);
196 // Sets bitmap |resource_id| as image for |username| and saves it to disk.
197 void SaveUserImagePNG(const std::string& username,
198 int resource_id) {
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(
204 image_path,
205 reinterpret_cast<const char*>(image_data->front()),
206 image_data->size());
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,
233 "token",
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,
243 net::OK));
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,
272 net::OK));
273 fetcher->set_response_code(200);
274 fetcher->delegate()->OnURLFetchComplete(fetcher);
275 run_loop.Run();
277 const User* user = UserManager::Get()->GetLoggedInUser();
278 ASSERT_TRUE(user);
279 UserImageManagerImpl* uim = reinterpret_cast<UserImageManagerImpl*>(
280 UserManager::Get()->GetUserImageManager(user->email()));
281 if (uim->job_.get()) {
282 run_loop_.reset(new base::RunLoop);
283 run_loop_->Run();
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_;
296 private:
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());
310 LogIn(kTestUser1);
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,
320 base::FilePath());
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,
328 base::FilePath());
329 LogIn(kTestUser1);
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,
333 base::FilePath());
336 IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_PRE_NonJPEGImageFromFile) {
337 // Setup a user with non-JPEG image.
338 ScopedUserManagerEnabler(new MockUserManager);
339 SaveUserImagePNG(
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());
355 LogIn(kTestUser1);
357 // Wait for migration.
358 run_loop.Run();
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();
364 ASSERT_TRUE(user);
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);
375 ASSERT_TRUE(user);
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);
398 ASSERT_TRUE(user);
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
418 // image.
419 IN_PROC_BROWSER_TEST_F(UserImageManagerTest, SaveUserImage) {
420 const User* user = UserManager::Get()->FindUser(kTestUser1);
421 ASSERT_TRUE(user);
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));
434 run_loop_->Run();
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
457 // user image.
458 IN_PROC_BROWSER_TEST_F(UserImageManagerTest, SaveUserImageFromFile) {
459 const User* user = UserManager::Get()->FindUser(kTestUser1);
460 ASSERT_TRUE(user);
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);
472 run_loop_->Run();
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);
500 ASSERT_TRUE(user);
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();
509 run_loop_->Run();
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);
547 ASSERT_TRUE(user);
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();
559 run_loop_->Run();
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 {
576 protected:
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,
596 &user_keys_dir));
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(
606 user_key_file,
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 {
621 if (run_loop_)
622 run_loop_->Quit();
625 virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE {
626 if (run_loop_)
627 run_loop_->Quit();
630 std::string ConstructPolicy(const std::string& relative_path) {
631 std::string image_data;
632 if (!base::ReadFileToString(test_data_dir_.Append(relative_path),
633 &image_data)) {
634 ADD_FAILURE();
636 std::string policy;
637 base::JSONWriter::Write(policy::test::ConstructExternalDataReference(
638 embedded_test_server()->GetURL(std::string("/") + relative_path).spec(),
639 image_data).get(),
640 &policy);
641 return policy;
644 policy::UserPolicyBuilder user_policy_;
645 FakeDBusThreadManager* fake_dbus_thread_manager_;
646 FakeSessionManagerClient* fake_session_manager_client_;
648 scoped_ptr<gfx::ImageSkia> policy_image_;
650 private:
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
661 // image.
662 IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, SetAndClear) {
663 const User* user = UserManager::Get()->FindUser(kTestUser1);
664 ASSERT_TRUE(user);
666 LoginUser(kTestUser1);
667 base::RunLoop().RunUntilIdle();
669 policy::CloudPolicyStore* store = GetStoreForUser(user);
670 ASSERT_TRUE(store);
672 // Set policy. Verify that the policy-provided user image is downloaded, set
673 // and persisted.
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);
680 store->Load();
681 run_loop_->Run();
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);
706 store->Load();
707 run_loop_->Run();
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
726 // persisted.
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);
750 ASSERT_TRUE(user);
752 LoginUser(kTestUser1);
753 base::RunLoop().RunUntilIdle();
755 policy::CloudPolicyStore* store = GetStoreForUser(user);
756 ASSERT_TRUE(store);
758 // Choose a user image. Verify that the chosen user image is set and
759 // persisted.
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);
780 store->Load();
781 run_loop_->Run();
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);
810 ASSERT_TRUE(user);
812 LoginUser(kTestUser1);
813 base::RunLoop().RunUntilIdle();
815 policy::CloudPolicyStore* store = GetStoreForUser(user);
816 ASSERT_TRUE(store);
818 // Set policy. Verify that the policy-provided user image is downloaded, set
819 // and persisted.
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);
826 store->Load();
827 run_loop_->Run();
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