1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <map> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/basictypes.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/files/file_path.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/json/json_writer.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/linked_ptr.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/ref_counted.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/run_loop.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/time/time.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/browser_process.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_manager_test.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/avatar/user_image_manager.h" 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.h" 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/avatar/user_image_manager_test_util.h" 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/mock_user_manager.h" 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/cloud_external_data_manager_base_test_util.h" 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h" 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h" 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/profiles/profile_downloader.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chromeos/chromeos_paths.h" 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chromeos/dbus/cryptohome_client.h" 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chromeos/dbus/fake_session_manager_client.h" 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h" 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_core.h" 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_store.h" 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/policy_builder.h" 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h" 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user_image/default_user_images.h" 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/user_manager/user_image/user_image.h" 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/notification_source.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "crypto/rsa_private_key.h" 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "google_apis/gaia/gaia_oauth_client.h" 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h" 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/url_request/url_request_status.h" 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/cloud_policy.pb.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "url/gurl.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestUser1[] = "test-user@example.com"; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestUser2[] = "test-user2@example.com"; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)policy::CloudPolicyStore* GetStoreForUser(const user_manager::User* user) { 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Profile* profile = ProfileHelper::Get()->GetProfileByUserUnsafe(user); 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!profile) { 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ADD_FAILURE(); 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy::UserCloudPolicyManagerChromeOS* policy_manager = 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy::UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile); 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!policy_manager) { 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ADD_FAILURE(); 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return policy_manager->core()->store(); 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class UserImageManagerTest : public LoginManagerTest, 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public user_manager::UserManager::Observer { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManagerTest() : LoginManagerTest(true) { 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // LoginManagerTest overrides: 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginManagerTest::SetUpInProcessBrowserTestFixture(); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_)); 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginManagerTest::SetUpOnMainThread(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_state_ = g_browser_process->local_state(); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->AddObserver(this); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE { 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->RemoveObserver(this); 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginManagerTest::TearDownOnMainThread(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // UserManager::Observer overrides: 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void LocalStateChanged( 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager* user_manager) OVERRIDE { 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (run_loop_) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Quit(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Logs in |username|. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LogIn(const std::string& username) { 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->UserLoggedIn(username, username, false); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stores old (pre-migration) user image info. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetOldUserImageInfo(const std::string& username, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_index, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& image_path) { 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(username); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate images_pref(local_state_, "UserImages"); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* image_properties = new base::DictionaryValue(); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) image_properties->Set("index", new base::FundamentalValue(image_index)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_properties->Set( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "path" , new base::StringValue(image_path.value())); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images_pref->SetWithoutPathExpansion(username, image_properties); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies user image info in |images_pref| dictionary. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectUserImageInfo(const base::DictionaryValue* images_pref, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& username, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_index, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& image_path) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(images_pref); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* image_properties = NULL; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images_pref->GetDictionaryWithoutPathExpansion(username, &image_properties); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(image_properties); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual_image_index; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string actual_image_path; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(image_properties->GetInteger("index", &actual_image_index) && 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_properties->GetString("path", &actual_image_path)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(image_index, actual_image_index); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(image_path.value(), actual_image_path); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that there is no image info for |username| in dictionary 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |images_pref|. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectNoUserImageInfo(const base::DictionaryValue* images_pref, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& username) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(images_pref); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* image_properties = NULL; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images_pref->GetDictionaryWithoutPathExpansion(username, &image_properties); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(image_properties); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that old user image info matches |image_index| and |image_path| 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and that new user image info does not exist. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectOldUserImageInfo(const std::string& username, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_index, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& image_path) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectUserImageInfo(local_state_->GetDictionary("UserImages"), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username, image_index, image_path); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNoUserImageInfo(local_state_->GetDictionary("user_image_info"), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that new user image info matches |image_index| and |image_path| 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and that old user image info does not exist. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectNewUserImageInfo(const std::string& username, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_index, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& image_path) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectUserImageInfo(local_state_->GetDictionary("user_image_info"), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username, image_index, image_path); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNoUserImageInfo(local_state_->GetDictionary("UserImages"), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets bitmap |resource_id| as image for |username| and saves it to disk. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SaveUserImagePNG(const std::string& username, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int resource_id) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath image_path = GetUserImagePath(username, "png"); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedStaticMemory> image_data( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource_id, ui::SCALE_FACTOR_100P)); 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int written = base::WriteFile( 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_path, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(image_data->front()), 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_data->size()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(image_data->size()), written); 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetOldUserImageInfo( 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) username, user_manager::User::USER_IMAGE_EXTERNAL, image_path); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the image path for user |username| with specified |extension|. 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetUserImagePath(const std::string& username, 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& extension) { 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return user_data_dir_.Append(username).AddExtension(extension); 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Completes the download of all non-image profile data for the user 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |username|. This method must only be called after a profile data 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // download has been started. |url_fetcher_factory| will capture 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the net::TestURLFetcher created by the ProfileDownloader to 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // download the profile image. 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CompleteProfileMetadataDownload( 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& username, 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::TestURLFetcherFactory* url_fetcher_factory) { 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProfileDownloader* profile_downloader = 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reinterpret_cast<UserImageManagerImpl*>( 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(username)) 2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->profile_downloader_.get(); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(profile_downloader); 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<OAuth2TokenService::Consumer*>(profile_downloader)-> 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnGetTokenSuccess(NULL, 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Time::Now() + base::TimeDelta::FromDays(1)); 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::TestURLFetcher* fetcher = 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_fetcher_factory->GetFetcherByID(0); 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(fetcher); 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->SetResponseString( 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "{ \"picture\": \"http://localhost/avatar.jpg\" }"); 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::OK)); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->set_response_code(200); 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Completes the download of the currently logged-in user's profile image. 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This method must only be called after a profile data download including 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the profile image has been started, the download of all non-image data has 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // been completed by calling CompleteProfileMetadataDownload() and the 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // net::TestURLFetcher created by the ProfileDownloader to download the 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // profile image has been captured by |url_fetcher_factory|. 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CompleteProfileImageDownload( 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::TestURLFetcherFactory* url_fetcher_factory) { 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string profile_image_data; 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath test_data_dir; 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(ReadFileToString( 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test_data_dir.Append("chromeos").Append("avatar1.jpg"), 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &profile_image_data)); 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop run_loop; 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrefChangeRegistrar pref_change_registrar; 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pref_change_registrar.Init(local_state_); 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pref_change_registrar.Add("UserDisplayName", run_loop.QuitClosure()); 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::TestURLFetcher* fetcher = url_fetcher_factory->GetFetcherByID(0); 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(fetcher); 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->SetResponseString(profile_image_data); 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::OK)); 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->set_response_code(200); 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop.Run(); 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetLoggedInUser(); 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UserImageManagerImpl* uim = reinterpret_cast<UserImageManagerImpl*>( 2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(user->email())); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (uim->job_.get()) { 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath test_data_dir_; 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath user_data_dir_; 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* local_state_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<gfx::ImageSkia> decoded_image_; 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::RunLoop> run_loop_; 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserImageManagerTest); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_DefaultUserImagePreserved) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup an old default (stock) user image. 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedUserManagerEnabler(new MockUserManager); 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetOldUserImageInfo( 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, DefaultUserImagePreserved) { 3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetUsers(); // Load users. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old info preserved. 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectOldUserImageInfo( 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogIn(kTestUser1); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Image info is migrated now. 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNewUserImageInfo( 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_OtherUsersUnaffected) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup two users with stock images. 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedUserManagerEnabler(new MockUserManager); 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetOldUserImageInfo( 3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetOldUserImageInfo( 3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser2, user_manager::kFirstDefaultImageIndex + 1, base::FilePath()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, OtherUsersUnaffected) { 3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetUsers(); // Load users. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old info preserved. 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectOldUserImageInfo( 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectOldUserImageInfo( 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser2, user_manager::kFirstDefaultImageIndex + 1, base::FilePath()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogIn(kTestUser1); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Image info is migrated for the first user and unaffected for the rest. 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNewUserImageInfo( 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectOldUserImageInfo( 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser2, user_manager::kFirstDefaultImageIndex + 1, base::FilePath()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_PRE_NonJPEGImageFromFile) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup a user with non-JPEG image. 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedUserManagerEnabler(new MockUserManager); 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SaveUserImagePNG(kTestUser1, 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kDefaultImageResourceIDs 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) [user_manager::kFirstDefaultImageIndex]); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_NonJPEGImageFromFile) { 3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetUsers(); // Load users. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Old info preserved. 3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectOldUserImageInfo(kTestUser1, 3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUserImagePath(kTestUser1, "png")); 3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(user->image_is_stub()); 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop run_loop; 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrefChangeRegistrar pref_change_registrar_; 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pref_change_registrar_.Init(local_state_); 366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pref_change_registrar_.Add("UserImages", run_loop.QuitClosure()); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogIn(kTestUser1); 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for migration. 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) run_loop.Run(); 371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Image info is migrated and the image is converted to JPG. 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user = user_manager::UserManager::Get()->GetLoggedInUser(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(user->image_is_safe_format()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check image dimensions. 3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::ImageSkia& saved_image = 3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(user_manager::kFirstDefaultImageIndex); 3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(saved_image.width(), user->GetImage().width()); 3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(saved_image.height(), user->GetImage().height()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, NonJPEGImageFromFile) { 3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetUsers(); // Load users. 3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(user); 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Wait for image load. 3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (user->image_index() == user_manager::User::USER_IMAGE_INVALID) { 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver( 394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()).Wait(); 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now the migrated image is used. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(user->image_is_safe_format()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::ImageSkia& saved_image = 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(user_manager::kFirstDefaultImageIndex); 4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(saved_image.width(), user->GetImage().width()); 4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(saved_image.height(), user->GetImage().height()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_SaveUserDefaultImageIndex) { 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that SaveUserDefaultImageIndex() correctly sets and persists the 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// chosen user image. 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, SaveUserDefaultImageIndex) { 4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::ImageSkia& default_image = 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(user_manager::kFirstDefaultImageIndex); 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 4216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_image_manager->SaveUserDefaultImageIndex( 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kFirstDefaultImageIndex); 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(user->HasDefaultImage()); 4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::kFirstDefaultImageIndex, user->image_index()); 4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage())); 4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNewUserImageInfo( 4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_SaveUserImage) { 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that SaveUserImage() correctly sets and persists the chosen user 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// image. 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, SaveUserImage) { 4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkBitmap custom_image_bitmap; 444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch custom_image_bitmap.allocN32Pixels(10, 10); 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) custom_image_bitmap.setImmutable(); 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::ImageSkia custom_image = 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::ImageSkia::CreateFrom1xBitmap(custom_image_bitmap); 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch user_image_manager->SaveUserImage( 453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch user_manager::UserImage::CreateAndEncode(custom_image)); 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_EXTERNAL, user->image_index()); 4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(custom_image, user->GetImage())); 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const scoped_ptr<gfx::ImageSkia> saved_image = 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(custom_image.width(), saved_image->width()); 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(custom_image.height(), saved_image->height()); 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, PRE_SaveUserImageFromFile) { 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that SaveUserImageFromFile() correctly sets and persists the chosen 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// user image. 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, SaveUserImageFromFile) { 4796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 4806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::FilePath custom_image_path = 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test_data_dir_.Append(test::kUserAvatarImage1RelativePath); 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const scoped_ptr<gfx::ImageSkia> custom_image = 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(custom_image_path).Load(); 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(custom_image); 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 4916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_image_manager->SaveUserImageFromFile(custom_image_path); 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_EXTERNAL, user->image_index()); 4975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(*custom_image, user->GetImage())); 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const scoped_ptr<gfx::ImageSkia> saved_image = 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(custom_image->width(), saved_image->width()); 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(custom_image->height(), saved_image->height()); 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRE_SaveUserImageFromProfileImage) { 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::StartupUtils::MarkOobeCompleted(); 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that SaveUserImageFromProfileImage() correctly downloads, sets and 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// persists the chosen user image. 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, SaveUserImageFromProfileImage) { 5206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 5216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManagerImpl::IgnoreProfileDataDownloadDelayForTesting(); 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginUser(kTestUser1); 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 5296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_image_manager->SaveUserImageFromProfileImage(); 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::TestURLFetcherFactory url_fetcher_factory; 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteProfileMetadataDownload(kTestUser1, &url_fetcher_factory); 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CompleteProfileImageDownload(&url_fetcher_factory); 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::ImageSkia& profile_image = 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_image_manager->DownloadedProfileImage(); 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_PROFILE, user->image_index()); 5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(profile_image, user->GetImage())); 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_PROFILE, 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const scoped_ptr<gfx::ImageSkia> saved_image = 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(profile_image.width(), saved_image->width()); 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(profile_image.height(), saved_image->height()); 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRE_ProfileImageDownloadDoesNotClobber) { 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::StartupUtils::MarkOobeCompleted(); 560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Sets the user image to the profile image, then sets it to one of the default 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// images while the profile image download is still in progress. Verifies that 564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// when the download completes, the profile image is ignored and does not 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// clobber the default image chosen in the meantime. 566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerTest, 567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProfileImageDownloadDoesNotClobber) { 5686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::ImageSkia& default_image = 5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(user_manager::kFirstDefaultImageIndex); 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManagerImpl::IgnoreProfileDataDownloadDelayForTesting(); 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginUser(kTestUser1); 577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 5806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_image_manager->SaveUserImageFromProfileImage(); 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::TestURLFetcherFactory url_fetcher_factory; 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompleteProfileMetadataDownload(kTestUser1, &url_fetcher_factory); 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_image_manager->SaveUserDefaultImageIndex( 5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kFirstDefaultImageIndex); 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CompleteProfileImageDownload(&url_fetcher_factory); 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(user->HasDefaultImage()); 5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::kFirstDefaultImageIndex, user->image_index()); 5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage())); 5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNewUserImageInfo( 5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class UserImageManagerPolicyTest : public UserImageManagerTest, 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public policy::CloudPolicyStore::Observer { 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManagerPolicyTest() 6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : fake_session_manager_client_(new chromeos::FakeSessionManagerClient) { 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // UserImageManagerTest overrides: 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient( 6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<SessionManagerClient>(fake_session_manager_client_)); 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManagerTest::SetUpInProcessBrowserTestFixture(); 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManagerTest::SetUpOnMainThread(); 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath user_keys_dir; 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chromeos::DIR_USER_POLICY_KEYS, 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &user_keys_dir)); 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string sanitized_username = 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::CryptohomeClient::GetStubSanitizedUsername(kTestUser1); 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::FilePath user_key_file = 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_keys_dir.AppendASCII(sanitized_username) 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) .AppendASCII("policy.pub"); 624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<uint8> user_key_bits; 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user_policy_.GetSigningKey()->ExportPublicKey(&user_key_bits)); 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(user_key_file.DirName())); 627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(base::WriteFile( 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_key_file, 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reinterpret_cast<const char*>(user_key_bits.data()), 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_key_bits.size()), 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<int>(user_key_bits.size())); 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.policy_data().set_username(kTestUser1); 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy_image_ = test::ImageLoader(test_data_dir_.Append( 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::kUserAvatarImage2RelativePath)).Load(); 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(policy_image_); 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // policy::CloudPolicyStore::Observer overrides: 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnStoreLoaded(policy::CloudPolicyStore* store) OVERRIDE { 643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (run_loop_) 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Quit(); 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE { 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (run_loop_) 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Quit(); 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string ConstructPolicy(const std::string& relative_path) { 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string image_data; 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!base::ReadFileToString(test_data_dir_.Append(relative_path), 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &image_data)) { 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ADD_FAILURE(); 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string policy; 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::JSONWriter::Write(policy::test::ConstructExternalDataReference( 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) embedded_test_server()->GetURL(std::string("/") + relative_path).spec(), 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) image_data).get(), 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &policy); 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return policy; 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy::UserPolicyBuilder user_policy_; 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FakeSessionManagerClient* fake_session_manager_client_; 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<gfx::ImageSkia> policy_image_; 670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserImageManagerPolicyTest); 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, PRE_SetAndClear) { 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::StartupUtils::MarkOobeCompleted(); 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that the user image can be set through policy. Also verifies that 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// after the policy has been cleared, the user is able to choose a different 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// image. 6835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396352 6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, DISABLED_SetAndClear) { 6856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 6866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginUser(kTestUser1); 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy::CloudPolicyStore* store = GetStoreForUser(user); 693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(store); 694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Set policy. Verify that the policy-provided user image is downloaded, set 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and persisted. 697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.payload().mutable_useravatarimage()->set_value( 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConstructPolicy(test::kUserAvatarImage2RelativePath)); 699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.Build(); 700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fake_session_manager_client_->set_user_policy(kTestUser1, 701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.GetBlob()); 702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) store->Load(); 704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 7075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_EXTERNAL, user->image_index()); 7085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(*policy_image_, user->GetImage())); 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<gfx::ImageSkia> saved_image = 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->width(), saved_image->width()); 719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->height(), saved_image->height()); 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 72146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Clear policy. Verify that the user image switches to a random default 72246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // image. 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.payload().Clear(); 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.Build(); 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fake_session_manager_client_->set_user_policy(kTestUser1, 726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.GetBlob()); 727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) store->AddObserver(this); 729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) store->Load(); 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) store->RemoveObserver(this); 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 73446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int default_image_index = user->image_index(); 73546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(user->HasDefaultImage()); 7365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LE(user_manager::kFirstDefaultImageIndex, default_image_index); 7375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_GT( 7385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kFirstDefaultImageIndex + user_manager::kDefaultImagesCount, 7395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) default_image_index); 7405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::ImageSkia& default_image = 7415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(default_image_index); 74246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage())); 74346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, default_image_index, base::FilePath()); 744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Choose a different user image. Verify that the chosen user image is set and 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // persisted. 7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int user_image_index = 7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kFirstDefaultImageIndex + 7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (default_image_index - user_manager::kFirstDefaultImageIndex + 1) % 7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kDefaultImagesCount; 7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::ImageSkia& user_image = 7525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(user_image_index); 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 7556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 75646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) user_image_manager->SaveUserDefaultImageIndex(user_image_index); 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(user->HasDefaultImage()); 75946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(user_image_index, user->image_index()); 76046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(test::AreImagesEqual(user_image, user->GetImage())); 76146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, user_image_index, base::FilePath()); 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, PRE_PolicyOverridesUser) { 765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::StartupUtils::MarkOobeCompleted(); 767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that when the user chooses a user image and a different image is 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// then set through policy, the policy takes precedence, overriding the 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// previously chosen image. 772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, PolicyOverridesUser) { 7736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 7746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginUser(kTestUser1); 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy::CloudPolicyStore* store = GetStoreForUser(user); 781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(store); 782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Choose a user image. Verify that the chosen user image is set and 784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // persisted. 785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::ImageSkia& default_image = 7865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::GetDefaultImage(user_manager::kFirstDefaultImageIndex); 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 7896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 7905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_image_manager->SaveUserDefaultImageIndex( 7915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kFirstDefaultImageIndex); 792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(user->HasDefaultImage()); 7945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::kFirstDefaultImageIndex, user->image_index()); 7955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage())); 7965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExpectNewUserImageInfo( 7975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kTestUser1, user_manager::kFirstDefaultImageIndex, base::FilePath()); 798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Set policy. Verify that the policy-provided user image is downloaded, set 800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and persisted, overriding the previously set image. 801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.payload().mutable_useravatarimage()->set_value( 802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConstructPolicy(test::kUserAvatarImage2RelativePath)); 803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.Build(); 804a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fake_session_manager_client_->set_user_policy(kTestUser1, 805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.GetBlob()); 806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) store->Load(); 808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 8115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_EXTERNAL, user->image_index()); 8125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(*policy_image_, user->GetImage())); 813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 817a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<gfx::ImageSkia> saved_image = 818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->width(), saved_image->width()); 823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->height(), saved_image->height()); 824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, 827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRE_UserDoesNotOverridePolicy) { 828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegisterUser(kTestUser1); 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::StartupUtils::MarkOobeCompleted(); 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verifies that when the user image has been set through policy and the user 833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// chooses a different image, the policy takes precedence, preventing the user 834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// from overriding the previously chosen image. 835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(UserImageManagerPolicyTest, UserDoesNotOverridePolicy) { 8366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const user_manager::User* user = 8376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->FindUser(kTestUser1); 838a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(user); 839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoginUser(kTestUser1); 841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) policy::CloudPolicyStore* store = GetStoreForUser(user); 844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(store); 845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Set policy. Verify that the policy-provided user image is downloaded, set 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and persisted. 848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.payload().mutable_useravatarimage()->set_value( 849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConstructPolicy(test::kUserAvatarImage2RelativePath)); 850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.Build(); 851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fake_session_manager_client_->set_user_policy(kTestUser1, 852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_policy_.GetBlob()); 853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_.reset(new base::RunLoop); 854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) store->Load(); 855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) run_loop_->Run(); 856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 8585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_EXTERNAL, user->image_index()); 8595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(*policy_image_, user->GetImage())); 860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 8615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<gfx::ImageSkia> saved_image = 865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->width(), saved_image->width()); 870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->height(), saved_image->height()); 871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Choose a different user image. Verify that the user image does not change 873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // as policy takes precedence. 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserImageManager* user_image_manager = 8756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetUserImageManager(kTestUser1); 8765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_image_manager->SaveUserDefaultImageIndex( 8775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::kFirstDefaultImageIndex); 878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(user->HasDefaultImage()); 8805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(user_manager::User::USER_IMAGE_EXTERNAL, user->image_index()); 8815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(test::AreImagesEqual(*policy_image_, user->GetImage())); 882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExpectNewUserImageInfo(kTestUser1, 8835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::USER_IMAGE_EXTERNAL, 884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetUserImagePath(kTestUser1, "jpg")); 885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) saved_image = test::ImageLoader(GetUserImagePath(kTestUser1, "jpg")).Load(); 887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(saved_image); 888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check image dimensions. Images can't be compared since JPEG is lossy. 890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->width(), saved_image->width()); 891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(policy_image_->height(), saved_image->height()); 892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 895