blob: ed33cff53bc59da918f46d308f6ef89421d020f6 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
#include "ash/desktop_background/desktop_background_controller.h"
#include "ash/desktop_background/desktop_background_controller_observer.h"
#include "ash/desktop_background/desktop_background_controller_test_api.h"
#include "ash/display/display_manager.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/ash_test_helper.h"
#include "ash/test/display_manager_test_api.h"
#include "ash/test/test_user_wallpaper_delegate.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "base/path_service.h"
#include "base/prefs/scoped_user_pref_update.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chromeos/chromeos_switches.h"
#include "chromeos/login/user_names.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
#include "content/public/test/test_utils.h"
#include "ui/aura/env.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
using namespace ash;
namespace chromeos {
namespace {
int kLargeWallpaperWidth = 256;
int kLargeWallpaperHeight = chromeos::kLargeWallpaperMaxHeight;
int kSmallWallpaperWidth = 256;
int kSmallWallpaperHeight = chromeos::kSmallWallpaperMaxHeight;
const char kTestUser1[] = "test1@domain.com";
const char kTestUser1Hash[] = "test1@domain.com-hash";
const char kTestUser2[] = "test2@domain.com";
const char kTestUser2Hash[] = "test2@domain.com-hash";
} // namespace
class WallpaperManagerBrowserTest : public InProcessBrowserTest {
public:
WallpaperManagerBrowserTest () : controller_(NULL),
local_state_(NULL) {
}
virtual ~WallpaperManagerBrowserTest () {}
virtual void SetUpOnMainThread() override {
controller_ = ash::Shell::GetInstance()->desktop_background_controller();
local_state_ = g_browser_process->local_state();
DesktopBackgroundController::TestAPI(controller_)
.set_wallpaper_reload_delay_for_test(0);
UpdateDisplay("800x600");
}
virtual void SetUpCommandLine(CommandLine* command_line) override {
command_line->AppendSwitch(switches::kLoginManager);
command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
}
virtual void TearDownOnMainThread() override {
controller_ = NULL;
}
// Update the display configuration as given in |display_specs|. See
// ash::test::DisplayManagerTestApi::UpdateDisplay for more details.
void UpdateDisplay(const std::string& display_specs) {
ash::test::DisplayManagerTestApi display_manager_test_api(
ash::Shell::GetInstance()->display_manager());
display_manager_test_api.UpdateDisplay(display_specs);
}
void WaitAsyncWallpaperLoadStarted() {
base::RunLoop().RunUntilIdle();
}
protected:
// Return custom wallpaper path. Create directory if not exist.
base::FilePath GetCustomWallpaperPath(const char* sub_dir,
const std::string& username_hash,
const std::string& id) {
base::FilePath wallpaper_path =
WallpaperManager::Get()->GetCustomWallpaperPath(sub_dir,
username_hash,
id);
if (!base::DirectoryExists(wallpaper_path.DirName()))
base::CreateDirectory(wallpaper_path.DirName());
return wallpaper_path;
}
// Logs in |username|.
void LogIn(const std::string& username, const std::string& username_hash) {
user_manager::UserManager::Get()->UserLoggedIn(
username, username_hash, false);
WaitAsyncWallpaperLoadStarted();
}
int LoadedWallpapers() {
return WallpaperManager::Get()->loaded_wallpapers();
}
void ClearDisposableWallpaperCache() {
WallpaperManager::Get()->ClearDisposableWallpaperCache();
}
// Initializes default wallpaper paths "*default_*file" and writes JPEG
// wallpaper images to them.
// Only needs to be called (once) by tests that want to test loading of
// default wallpapers.
void CreateCmdlineWallpapers() {
wallpaper_dir_.reset(new base::ScopedTempDir);
ASSERT_TRUE(wallpaper_dir_->CreateUniqueTempDir());
wallpaper_manager_test_utils::CreateCmdlineWallpapers(
*wallpaper_dir_, &wallpaper_manager_command_line_);
}
DesktopBackgroundController* controller_;
PrefService* local_state_;
scoped_ptr<base::CommandLine> wallpaper_manager_command_line_;
// Directory created by CreateCmdlineWallpapers () to store default
// wallpaper images.
scoped_ptr<base::ScopedTempDir> wallpaper_dir_;
private:
DISALLOW_COPY_AND_ASSIGN(WallpaperManagerBrowserTest);
};
// Tests that the appropriate custom wallpaper (large vs. small) is loaded
// depending on the desktop resolution.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
LoadCustomLargeWallpaperForLargeExternalScreen) {
WallpaperManager* wallpaper_manager = WallpaperManager::Get();
LogIn(kTestUser1, kTestUser1Hash);
std::string id = base::Int64ToString(base::Time::Now().ToInternalValue());
base::FilePath small_wallpaper_path = GetCustomWallpaperPath(
kSmallWallpaperSubDir,
kTestUser1Hash,
id);
base::FilePath large_wallpaper_path = GetCustomWallpaperPath(
kLargeWallpaperSubDir,
kTestUser1Hash,
id);
// Saves the small/large resolution wallpapers to small/large custom
// wallpaper paths.
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
small_wallpaper_path,
kSmallWallpaperWidth,
kSmallWallpaperHeight,
wallpaper_manager_test_utils::kSmallDefaultWallpaperColor));
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
large_wallpaper_path,
kLargeWallpaperWidth,
kLargeWallpaperHeight,
wallpaper_manager_test_utils::kLargeDefaultWallpaperColor));
std::string relative_path = base::FilePath(kTestUser1Hash).Append(id).value();
// Saves wallpaper info to local state for user |kTestUser1|.
WallpaperInfo info = {relative_path, WALLPAPER_LAYOUT_CENTER_CROPPED,
user_manager::User::CUSTOMIZED,
base::Time::Now().LocalMidnight()};
wallpaper_manager->SetUserWallpaperInfo(kTestUser1, info, true);
// Set the wallpaper for |kTestUser1|.
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
gfx::ImageSkia wallpaper = controller_->GetWallpaper();
// Display is initialized to 800x600. The small resolution custom wallpaper is
// expected.
EXPECT_EQ(kSmallWallpaperWidth, wallpaper.width());
EXPECT_EQ(kSmallWallpaperHeight, wallpaper.height());
// Hook up another 800x600 display. This shouldn't trigger a reload.
UpdateDisplay("800x600,800x600");
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// The small resolution custom wallpaper is expected.
EXPECT_EQ(kSmallWallpaperWidth, wallpaper.width());
EXPECT_EQ(kSmallWallpaperHeight, wallpaper.height());
// Detach the secondary display.
UpdateDisplay("800x600");
// Hook up a 2000x2000 display. The large resolution custom wallpaper should
// be loaded.
UpdateDisplay("800x600,2000x2000");
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
wallpaper = controller_->GetWallpaper();
// The large resolution custom wallpaper is expected.
EXPECT_EQ(kLargeWallpaperWidth, wallpaper.width());
EXPECT_EQ(kLargeWallpaperHeight, wallpaper.height());
// Detach the secondary display.
UpdateDisplay("800x600");
// Hook up the 2000x2000 display again. The large resolution default wallpaper
// should persist. Test for crbug/165788.
UpdateDisplay("800x600,2000x2000");
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
wallpaper = controller_->GetWallpaper();
// The large resolution custom wallpaper is expected.
EXPECT_EQ(kLargeWallpaperWidth, wallpaper.width());
EXPECT_EQ(kLargeWallpaperHeight, wallpaper.height());
}
// If chrome tries to reload the same wallpaper twice, the latter request should
// be prevented. Otherwise, there are some strange animation issues as
// described in crbug.com/158383.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
PreventReloadingSameWallpaper) {
WallpaperManager* wallpaper_manager = WallpaperManager::Get();
// New user log in, a default wallpaper is loaded.
LogIn(kTestUser1, kTestUser1Hash);
EXPECT_EQ(1, LoadedWallpapers());
// Loads the same wallpaper before the initial one finished. It should be
// prevented.
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(1, LoadedWallpapers());
// Loads the same wallpaper after the initial one finished. It should be
// prevented.
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(1, LoadedWallpapers());
ClearDisposableWallpaperCache();
// Change wallpaper to a custom wallpaper.
std::string id = base::Int64ToString(base::Time::Now().ToInternalValue());
base::FilePath small_wallpaper_path = GetCustomWallpaperPath(
kSmallWallpaperSubDir,
kTestUser1Hash,
id);
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
small_wallpaper_path,
kSmallWallpaperWidth,
kSmallWallpaperHeight,
wallpaper_manager_test_utils::kSmallDefaultWallpaperColor));
std::string relative_path = base::FilePath(kTestUser1Hash).Append(id).value();
// Saves wallpaper info to local state for user |kTestUser1|.
WallpaperInfo info = {relative_path, WALLPAPER_LAYOUT_CENTER_CROPPED,
user_manager::User::CUSTOMIZED,
base::Time::Now().LocalMidnight()};
wallpaper_manager->SetUserWallpaperInfo(kTestUser1, info, true);
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
WaitAsyncWallpaperLoadStarted();
EXPECT_EQ(2, LoadedWallpapers());
// Loads the same wallpaper before the initial one finished. It should be
// prevented.
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
WaitAsyncWallpaperLoadStarted();
EXPECT_EQ(2, LoadedWallpapers());
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(2, LoadedWallpapers());
}
// Some users have old user profiles which may have legacy wallpapers. And these
// lagacy wallpapers should migrate to new wallpaper picker version seamlessly.
// This tests make sure we compatible with migrated old wallpapers.
// crosbug.com/38429
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
PRE_UseMigratedWallpaperInfo) {
// New user log in, a default wallpaper is loaded.
LogIn(kTestUser1, kTestUser1Hash);
// Old wallpaper migration code doesn't exist in codebase anymore. Modify user
// wallpaper info directly to simulate the wallpaper migration. See
// crosbug.com/38429 for details about why we modify wallpaper info this way.
WallpaperInfo info = {"123", WALLPAPER_LAYOUT_CENTER_CROPPED,
user_manager::User::DEFAULT,
base::Time::Now().LocalMidnight()};
base::FilePath user_data_dir;
ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir));
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
user_data_dir.Append("123"),
wallpaper_manager_test_utils::kWallpaperSize,
wallpaper_manager_test_utils::kWallpaperSize,
wallpaper_manager_test_utils::kLargeDefaultWallpaperColor));
WallpaperManager::Get()->SetUserWallpaperInfo(kTestUser1, info, true);
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
UseMigratedWallpaperInfo) {
LogIn(kTestUser1, kTestUser1Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// This test should finish normally. If timeout, it is probably because
// migrated wallpaper is somehow not loaded. Bad things can happen if
// wallpaper is not loaded at login screen. One example is: crosbug.com/38429.
}
// Some users have old user profiles which may never get a chance to migrate.
// This tests make sure we compatible with these profiles.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
PRE_UsePreMigrationWallpaperInfo) {
// New user log in, a default wallpaper is loaded.
LogIn(kTestUser1, kTestUser1Hash);
// Old wallpaper migration code doesn't exist in codebase anymore. So if
// user's profile is not migrated, it is the same as no wallpaper info. To
// simulate this, we remove user's wallpaper info here.
WallpaperManager::Get()->RemoveUserWallpaperInfo(kTestUser1);
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
UsePreMigrationWallpaperInfo) {
LogIn(kTestUser1, kTestUser1Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// This test should finish normally. If timeout, it is probably because chrome
// can not handle pre migrated user profile (M21 profile or older).
}
// Test for http://crbug.com/265689. When hooked up a large external monitor,
// the default large resolution wallpaper should load.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
HotPlugInScreenAtGAIALoginScreen) {
UpdateDisplay("800x600");
// Set initial wallpaper to the default wallpaper.
WallpaperManager::Get()->SetDefaultWallpaperNow(chromeos::login::kStubUser);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// Hook up a 2000x2000 display. The large resolution custom wallpaper should
// be loaded.
UpdateDisplay("800x600,2000x2000");
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
}
class WallpaperManagerBrowserTestNoAnimation
: public WallpaperManagerBrowserTest {
public:
virtual void SetUpCommandLine(CommandLine* command_line) override {
command_line->AppendSwitch(switches::kLoginManager);
command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
command_line->AppendSwitch(chromeos::switches::kDisableLoginAnimations);
command_line->AppendSwitch(chromeos::switches::kDisableBootAnimation);
}
};
// Same test as WallpaperManagerBrowserTest.UseMigratedWallpaperInfo. But
// disabled boot and login animation.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestNoAnimation,
PRE_UseMigratedWallpaperInfo) {
// New user log in, a default wallpaper is loaded.
LogIn(kTestUser1, kTestUser1Hash);
// Old wallpaper migration code doesn't exist in codebase anymore. Modify user
// wallpaper info directly to simulate the wallpaper migration. See
// crosbug.com/38429 for details about why we modify wallpaper info this way.
WallpaperInfo info = {"123", WALLPAPER_LAYOUT_CENTER_CROPPED,
user_manager::User::DEFAULT,
base::Time::Now().LocalMidnight()};
base::FilePath user_data_dir;
ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir));
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
user_data_dir.Append("123"),
wallpaper_manager_test_utils::kWallpaperSize,
wallpaper_manager_test_utils::kWallpaperSize,
wallpaper_manager_test_utils::kLargeDefaultWallpaperColor));
WallpaperManager::Get()->SetUserWallpaperInfo(kTestUser1, info, true);
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestNoAnimation,
UseMigratedWallpaperInfo) {
LogIn(kTestUser1, kTestUser1Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// This test should finish normally. If timeout, it is probably because
// migrated wallpaper is somehow not loaded. Bad things can happen if
// wallpaper is not loaded at login screen. One example is: crosbug.com/38429.
}
// Same test as WallpaperManagerBrowserTest.UsePreMigrationWallpaperInfo. But
// disabled boot and login animation.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestNoAnimation,
PRE_UsePreMigrationWallpaperInfo) {
// New user log in, a default wallpaper is loaded.
LogIn(kTestUser1, kTestUser1Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// Old wallpaper migration code doesn't exist in codebase anymore. So if
// user's profile is not migrated, it is the same as no wallpaper info. To
// simulate this, we remove user's wallpaper info here.
WallpaperManager::Get()->RemoveUserWallpaperInfo(kTestUser1);
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestNoAnimation,
UsePreMigrationWallpaperInfo) {
LogIn(kTestUser1, kTestUser1Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// This test should finish normally. If timeout, it is probably because chrome
// can not handle pre migrated user profile (M21 profile or older).
}
class WallpaperManagerBrowserTestCrashRestore
: public WallpaperManagerBrowserTest {
public:
virtual void SetUpCommandLine(CommandLine* command_line) override {
command_line->AppendSwitch(chromeos::switches::kDisableLoginAnimations);
command_line->AppendSwitch(chromeos::switches::kDisableBootAnimation);
command_line->AppendSwitchASCII(switches::kLoginUser, kTestUser1);
command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
}
};
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestCrashRestore,
PRE_RestoreWallpaper) {
LogIn(kTestUser1, kTestUser1Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
}
// Test for crbug.com/270278. It simulates a browser crash and verifies if user
// wallpaper is loaded.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestCrashRestore,
RestoreWallpaper) {
EXPECT_EQ(1, LoadedWallpapers());
}
class WallpaperManagerBrowserTestCacheUpdate
: public WallpaperManagerBrowserTest {
public:
virtual void SetUpCommandLine(CommandLine* command_line) override {
command_line->AppendSwitchASCII(switches::kLoginUser, kTestUser1);
command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
}
protected:
// Creates a test image of size 1x1.
gfx::ImageSkia CreateTestImage(SkColor color) {
return wallpaper_manager_test_utils::CreateTestImage(1, 1, color);
}
};
// Sets kTestUser1's wallpaper to a custom wallpaper.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestCacheUpdate,
PRE_VerifyWallpaperCache) {
// Add kTestUser1 to user list. kTestUser1 is the default login profile.
LogIn(kTestUser1, kTestUser1Hash);
std::string id = base::Int64ToString(base::Time::Now().ToInternalValue());
WallpaperManager* wallpaper_manager = WallpaperManager::Get();
base::FilePath small_wallpaper_path = GetCustomWallpaperPath(
kSmallWallpaperSubDir,
kTestUser1Hash,
id);
base::FilePath large_wallpaper_path = GetCustomWallpaperPath(
kLargeWallpaperSubDir,
kTestUser1Hash,
id);
// Saves the small/large resolution wallpapers to small/large custom
// wallpaper paths.
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
small_wallpaper_path,
kSmallWallpaperWidth,
kSmallWallpaperHeight,
wallpaper_manager_test_utils::kSmallDefaultWallpaperColor));
ASSERT_TRUE(wallpaper_manager_test_utils::WriteJPEGFile(
large_wallpaper_path,
kLargeWallpaperWidth,
kLargeWallpaperHeight,
wallpaper_manager_test_utils::kLargeDefaultWallpaperColor));
std::string relative_path = base::FilePath(kTestUser1Hash).Append(id).value();
// Saves wallpaper info to local state for user |kTestUser1|.
WallpaperInfo info = {relative_path, WALLPAPER_LAYOUT_CENTER_CROPPED,
user_manager::User::CUSTOMIZED,
base::Time::Now().LocalMidnight()};
wallpaper_manager->SetUserWallpaperInfo(kTestUser1, info, true);
wallpaper_manager->SetUserWallpaperNow(kTestUser1);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
scoped_ptr<WallpaperManager::TestApi> test_api;
test_api.reset(new WallpaperManager::TestApi(wallpaper_manager));
// Verify SetUserWallpaperNow updates wallpaper cache.
gfx::ImageSkia cached_wallpaper;
EXPECT_TRUE(test_api->GetWallpaperFromCache(kTestUser1, &cached_wallpaper));
}
// Tests for crbug.com/339576. Wallpaper cache should be updated in
// multi-profile mode when user:
// 1. chooses an online wallpaper from wallpaper
// picker (calls SetWallpaperFromImageSkia);
// 2. chooses a custom wallpaper from wallpaper
// picker (calls SetCustomWallpaper);
// 3. reverts to a default wallpaper.
// Also, when user login at multi-profile mode, previous logged in users'
// wallpaper cache should not be deleted.
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTestCacheUpdate,
VerifyWallpaperCache) {
WallpaperManager* wallpaper_manager = WallpaperManager::Get();
// Force load initial wallpaper
// (simulate DesktopBackgroundController::UpdateDisplay()).
wallpaper_manager->UpdateWallpaper(true);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
scoped_ptr<WallpaperManager::TestApi> test_api;
test_api.reset(new WallpaperManager::TestApi(wallpaper_manager));
gfx::ImageSkia cached_wallpaper;
// Previous custom wallpaper should be cached after user login.
EXPECT_TRUE(test_api->GetWallpaperFromCache(kTestUser1, &cached_wallpaper));
LogIn(kTestUser2, kTestUser2Hash);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// Login another user should not delete logged in user's wallpaper cache.
// Note active user is still kTestUser1.
EXPECT_TRUE(test_api->GetWallpaperFromCache(kTestUser1, &cached_wallpaper));
gfx::ImageSkia red_wallpaper = CreateTestImage(SK_ColorRED);
wallpaper_manager->SetWallpaperFromImageSkia(kTestUser1,
red_wallpaper,
WALLPAPER_LAYOUT_CENTER,
true);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// SetWallpaperFromImageSkia should update wallpaper cache when multi-profile
// is turned on.
EXPECT_TRUE(test_api->GetWallpaperFromCache(kTestUser1, &cached_wallpaper));
EXPECT_TRUE(cached_wallpaper.BackedBySameObjectAs(red_wallpaper));
gfx::ImageSkia green_wallpaper = CreateTestImage(SK_ColorGREEN);
wallpaper_manager->SetCustomWallpaper(kTestUser1,
kTestUser1Hash,
"dummy", // dummy file name
WALLPAPER_LAYOUT_CENTER,
user_manager::User::CUSTOMIZED,
green_wallpaper,
true);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// SetCustomWallpaper should also update wallpaper cache when multi-profile is
// turned on.
EXPECT_TRUE(test_api->GetWallpaperFromCache(kTestUser1, &cached_wallpaper));
EXPECT_TRUE(cached_wallpaper.BackedBySameObjectAs(green_wallpaper));
wallpaper_manager->SetDefaultWallpaperNow(kTestUser1);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
// SetDefaultWallpaper should invalidate the user's wallpaper cache.
EXPECT_FALSE(test_api->GetWallpaperFromCache(kTestUser1, &cached_wallpaper));
}
// ----------------------------------------------------------------------
// Test default wallpapers.
class TestObserver : public WallpaperManager::Observer {
public:
explicit TestObserver(WallpaperManager* wallpaper_manager)
: update_wallpaper_count_(0), wallpaper_manager_(wallpaper_manager) {
DCHECK(wallpaper_manager_);
wallpaper_manager_->AddObserver(this);
}
virtual ~TestObserver() {
wallpaper_manager_->RemoveObserver(this);
}
virtual void OnWallpaperAnimationFinished(const std::string&) override {
}
virtual void OnUpdateWallpaperForTesting() override {
++update_wallpaper_count_;
}
int GetUpdateWallpaperCountAndReset() {
const size_t old = update_wallpaper_count_;
update_wallpaper_count_ = 0;
return old;
}
private:
int update_wallpaper_count_;
WallpaperManager* wallpaper_manager_;
DISALLOW_COPY_AND_ASSIGN(TestObserver);
};
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest, DisplayChange) {
// TODO(derat|oshima|bshe): Host windows can't be resized on Win8.
if (!ash::test::AshTestHelper::SupportsHostWindowResize())
return;
TestObserver observer(WallpaperManager::Get());
// Set the wallpaper to ensure that UpdateWallpaper() will be called when the
// display configuration changes.
gfx::ImageSkia image = wallpaper_manager_test_utils::CreateTestImage(
640, 480, wallpaper_manager_test_utils::kCustomWallpaperColor);
controller_->SetWallpaperImage(image, WALLPAPER_LAYOUT_STRETCH);
// Small wallpaper images should be used for configurations less than or
// equal to kSmallWallpaperMaxWidth by kSmallWallpaperMaxHeight, even if
// multiple displays are connected.
UpdateDisplay("800x600");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_SMALL,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(0, observer.GetUpdateWallpaperCountAndReset());
UpdateDisplay("800x600,800x600");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_SMALL,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(0, observer.GetUpdateWallpaperCountAndReset());
UpdateDisplay("1366x800");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_SMALL,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
// At larger sizes, large wallpapers should be used.
UpdateDisplay("1367x800");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_LARGE,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
UpdateDisplay("1367x801");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_LARGE,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
UpdateDisplay("2560x1700");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_LARGE,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
// Rotated smaller screen may use larger image.
UpdateDisplay("800x600/r");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_SMALL,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
UpdateDisplay("800x600/r,800x600");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_SMALL,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
UpdateDisplay("1366x800/r");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(WallpaperManager::WALLPAPER_RESOLUTION_LARGE,
WallpaperManager::Get()->GetAppropriateResolution());
EXPECT_EQ(1, observer.GetUpdateWallpaperCountAndReset());
// Max display size didn't chagne.
UpdateDisplay("900x800/r,400x1366");
// Wait for asynchronous DisplayBackgroundController::UpdateDisplay() call.
base::RunLoop().RunUntilIdle();
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_EQ(0, observer.GetUpdateWallpaperCountAndReset());
}
// Test that WallpaperManager loads the appropriate wallpaper
// images as specified via command-line flags in various situations.
// Splitting these into separate tests avoids needing to run animations.
// TODO(derat): Combine these into a single test
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest, SmallDefaultWallpaper) {
if (!ash::test::AshTestHelper::SupportsMultipleDisplays())
return;
CreateCmdlineWallpapers();
// At 800x600, the small wallpaper should be loaded.
UpdateDisplay("800x600");
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kSmallDefaultWallpaperColor));
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest, LargeDefaultWallpaper) {
if (!ash::test::AshTestHelper::SupportsMultipleDisplays())
return;
CreateCmdlineWallpapers();
UpdateDisplay("1600x1200");
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kLargeDefaultWallpaperColor));
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
LargeDefaultWallpaperWhenRotated) {
if (!ash::test::AshTestHelper::SupportsMultipleDisplays())
return;
CreateCmdlineWallpapers();
UpdateDisplay("1200x800/r");
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kLargeDefaultWallpaperColor));
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest, SmallGuestWallpaper) {
if (!ash::test::AshTestHelper::SupportsMultipleDisplays())
return;
CreateCmdlineWallpapers();
user_manager::UserManager::Get()->UserLoggedIn(
chromeos::login::kGuestUserName, chromeos::login::kGuestUserName, false);
UpdateDisplay("800x600");
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kSmallGuestWallpaperColor));
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest, LargeGuestWallpaper) {
if (!ash::test::AshTestHelper::SupportsMultipleDisplays())
return;
CreateCmdlineWallpapers();
user_manager::UserManager::Get()->UserLoggedIn(
chromeos::login::kGuestUserName, chromeos::login::kGuestUserName, false);
UpdateDisplay("1600x1200");
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kLargeGuestWallpaperColor));
}
IN_PROC_BROWSER_TEST_F(WallpaperManagerBrowserTest,
SwitchBetweenDefaultAndCustom) {
// Start loading the default wallpaper.
UpdateDisplay("640x480");
CreateCmdlineWallpapers();
user_manager::UserManager::Get()->UserLoggedIn(
chromeos::login::kStubUser, "test_hash", false);
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
// Custom wallpaper should be applied immediately, canceling the default
// wallpaper load task.
gfx::ImageSkia image = wallpaper_manager_test_utils::CreateTestImage(
640, 480, wallpaper_manager_test_utils::kCustomWallpaperColor);
WallpaperManager::Get()->SetCustomWallpaper(chromeos::login::kStubUser,
"test_hash",
"test-nofile.jpeg",
WALLPAPER_LAYOUT_STRETCH,
user_manager::User::CUSTOMIZED,
image,
true);
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kCustomWallpaperColor));
WallpaperManager::Get()->SetDefaultWallpaperNow(std::string());
wallpaper_manager_test_utils::WaitAsyncWallpaperLoadFinished();
EXPECT_TRUE(wallpaper_manager_test_utils::ImageIsNearColor(
controller_->GetWallpaper(),
wallpaper_manager_test_utils::kSmallDefaultWallpaperColor));
}
} // namespace chromeos