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