summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-02 22:35:09 +0000
committermukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-02 22:35:09 +0000
commit78e2370448246f03b6f795b105746bf82ba5f4f4 (patch)
treebe70c89c40618855fe3ff898137966dd63528dd0
parent515bef9756380702ae4dc450fa277781c5c3c5fb (diff)
downloadchromium_src-78e2370448246f03b6f795b105746bf82ba5f4f4.zip
chromium_src-78e2370448246f03b6f795b105746bf82ba5f4f4.tar.gz
chromium_src-78e2370448246f03b6f795b105746bf82ba5f4f4.tar.bz2
Adds DisplayPreferencesTest for chromeos
BUG=163812, 166964 TEST=unit_test --gtest_filter='DisplayPreferencesTest.*' passes Review URL: https://chromiumcodereview.appspot.com/11660018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174876 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/display/display_preferences_unittest.cc233
-rw-r--r--chrome/chrome_tests_unit.gypi1
2 files changed, 234 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/display/display_preferences_unittest.cc b/chrome/browser/chromeos/display/display_preferences_unittest.cc
new file mode 100644
index 0000000..e791aed
--- /dev/null
+++ b/chrome/browser/chromeos/display/display_preferences_unittest.cc
@@ -0,0 +1,233 @@
+// Copyright (c) 2012 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/display/display_preferences.h"
+
+#include "ash/display/display_controller.h"
+#include "ash/screen_ash.h"
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "base/string_number_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/chromeos/login/mock_user_manager.h"
+#include "chrome/browser/chromeos/login/user_manager.h"
+#include "chrome/browser/prefs/scoped_user_pref_update.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_pref_service.h"
+
+namespace chromeos {
+namespace {
+
+class DisplayPreferencesTest : public ash::test::AshTestBase {
+ protected:
+ DisplayPreferencesTest() : ash::test::AshTestBase() {}
+ virtual ~DisplayPreferencesTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ ash::test::AshTestBase::SetUp();
+ RegisterDisplayLocalStatePrefs(&local_state_);
+ TestingBrowserProcess* browser_process =
+ static_cast<TestingBrowserProcess*>(g_browser_process);
+ browser_process->SetLocalState(&local_state_);
+ }
+
+ virtual void TearDown() OVERRIDE {
+ TestingBrowserProcess* browser_process =
+ static_cast<TestingBrowserProcess*>(g_browser_process);
+ browser_process->SetLocalState(NULL);
+ ash::test::AshTestBase::TearDown();
+ }
+
+ void LoggedInAsUser() {
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsUserLoggedIn())
+ .WillRepeatedly(testing::Return(true));
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsLoggedInAsDemoUser())
+ .WillRepeatedly(testing::Return(false));
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsLoggedInAsGuest())
+ .WillRepeatedly(testing::Return(false));
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsLoggedInAsStub())
+ .WillRepeatedly(testing::Return(false));
+ }
+
+ void LoggedInAsGuest() {
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsUserLoggedIn())
+ .WillRepeatedly(testing::Return(true));
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsLoggedInAsDemoUser())
+ .WillRepeatedly(testing::Return(false));
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsLoggedInAsGuest())
+ .WillRepeatedly(testing::Return(true));
+ EXPECT_CALL(*mock_user_manager_.user_manager(), IsLoggedInAsStub())
+ .WillRepeatedly(testing::Return(false));
+ }
+
+ // Do not use the implementation of display_preferences.cc directly to avoid
+ // notifying the update to the system.
+ void SetupDisplayLayoutPref(int64 id,
+ ash::DisplayLayout::Position layout,
+ int offset) {
+ DictionaryPrefUpdate update(&local_state_, prefs::kSecondaryDisplays);
+ ash::DisplayLayout display_layout(layout, offset);
+
+ std::string name = base::Int64ToString(id);
+ DCHECK(!name.empty());
+
+ base::DictionaryValue* pref_data = update.Get();
+ scoped_ptr<base::Value>layout_value(new base::DictionaryValue());
+ if (pref_data->HasKey(name)) {
+ base::Value* value = NULL;
+ if (pref_data->Get(name, &value) && value != NULL)
+ layout_value.reset(value->DeepCopy());
+ }
+ if (ash::DisplayLayout::ConvertToValue(display_layout, layout_value.get()))
+ pref_data->Set(name, layout_value.release());
+ }
+
+ void SetupDefaultLayoutPref(ash::DisplayLayout::Position layout,
+ int offset) {
+ local_state_.SetInteger(
+ prefs::kSecondaryDisplayLayout, static_cast<int>(layout));
+ local_state_.SetInteger(prefs::kSecondaryDisplayOffset, offset);
+ }
+
+ void SetupPrimaryDisplayId(int64 display_id) {
+ local_state_.SetInt64(prefs::kPrimaryDisplayID, display_id);
+ }
+
+ void SetupDisplayOverscan(int64 id, const gfx::Insets& insets) {
+ DictionaryPrefUpdate update(&local_state_, prefs::kDisplayOverscans);
+ const std::string name = base::Int64ToString(id);
+
+ base::DictionaryValue* pref_data = update.Get();
+ base::DictionaryValue* insets_value = new base::DictionaryValue();
+ insets_value->SetInteger("top", insets.top());
+ insets_value->SetInteger("left", insets.left());
+ insets_value->SetInteger("bottom", insets.bottom());
+ insets_value->SetInteger("right", insets.right());
+ pref_data->Set(name, insets_value);
+ }
+
+ const PrefService* local_state() const { return &local_state_; }
+
+ private:
+ ScopedMockUserManagerEnabler mock_user_manager_;
+ TestingPrefServiceSimple local_state_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayPreferencesTest);
+};
+
+TEST_F(DisplayPreferencesTest, Initialization) {
+ UpdateDisplay("100x100,200x200");
+ int64 id1 = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().id();
+ int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
+ int64 dummy_id = id2 + 1;
+ ASSERT_NE(id1, dummy_id);
+
+ SetupDisplayLayoutPref(id1, ash::DisplayLayout::BOTTOM, 20);
+ SetupDisplayLayoutPref(id2, ash::DisplayLayout::TOP, -10);
+ SetupDisplayLayoutPref(dummy_id, ash::DisplayLayout::RIGHT, -30);
+ SetupDefaultLayoutPref(ash::DisplayLayout::LEFT, 50);
+ SetupPrimaryDisplayId(id2);
+ SetupDisplayOverscan(id1, gfx::Insets(10, 10, 10, 10));
+ SetupDisplayOverscan(id2, gfx::Insets(20, 20, 20, 20));
+
+ NotifyDisplayLocalStatePrefChanged();
+ // Check if the layout settings are notified to the system properly.
+ ash::DisplayController* display_controller =
+ ash::Shell::GetInstance()->display_controller();
+ gfx::Screen* screen = gfx::Screen::GetNativeScreen();
+ EXPECT_EQ(id2, screen->GetPrimaryDisplay().id());
+ EXPECT_EQ(ash::DisplayLayout::BOTTOM,
+ display_controller->GetCurrentDisplayLayout().position);
+ EXPECT_EQ(20, display_controller->GetCurrentDisplayLayout().offset);
+ EXPECT_EQ("160x160", screen->GetPrimaryDisplay().bounds().size().ToString());
+ EXPECT_EQ("80x80",
+ ash::ScreenAsh::GetSecondaryDisplay().bounds().size().ToString());
+}
+
+TEST_F(DisplayPreferencesTest, BasicSaves) {
+ UpdateDisplay("100x100,200x200");
+ int64 id1 = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().id();
+ int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
+ int64 dummy_id = id2 + 1;
+ ASSERT_NE(id1, dummy_id);
+
+ LoggedInAsUser();
+ ash::DisplayLayout layout(ash::DisplayLayout::TOP, 10);
+ SetDisplayLayoutPref(ash::ScreenAsh::GetSecondaryDisplay(),
+ static_cast<int>(layout.position), layout.offset);
+ SetDisplayLayoutPref(gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(),
+ ash::DisplayLayout::LEFT, 20);
+ SetPrimaryDisplayIDPref(dummy_id);
+ SetDisplayOverscan(ash::ScreenAsh::GetNativeScreen()->GetPrimaryDisplay(),
+ gfx::Insets(10, 11, 12, 13));
+
+ base::DictionaryValue* serialized_value = new base::DictionaryValue();
+ ASSERT_TRUE(ash::DisplayLayout::ConvertToValue(layout, serialized_value));
+
+ const base::DictionaryValue* displays =
+ local_state()->GetDictionary(prefs::kSecondaryDisplays);
+ const base::DictionaryValue* display_layout = NULL;
+ EXPECT_TRUE(
+ displays->GetDictionary(base::Int64ToString(id2), &display_layout));
+ EXPECT_TRUE(serialized_value->Equals(display_layout));
+
+ // The default value is set for the last call of SetDisplayLayoutPref()
+ EXPECT_EQ(ash::DisplayLayout::LEFT,
+ local_state()->GetInteger(prefs::kSecondaryDisplayLayout));
+ EXPECT_EQ(20, local_state()->GetInteger(prefs::kSecondaryDisplayOffset));
+
+ const base::DictionaryValue* overscans =
+ local_state()->GetDictionary(prefs::kDisplayOverscans);
+ const base::DictionaryValue* overscan = NULL;
+ EXPECT_TRUE(overscans->GetDictionary(base::Int64ToString(id1), &overscan));
+ int top = 0, left = 0, bottom = 0, right = 0;
+ EXPECT_TRUE(overscan->GetInteger("top", &top));
+ EXPECT_TRUE(overscan->GetInteger("left", &left));
+ EXPECT_TRUE(overscan->GetInteger("bottom", &bottom));
+ EXPECT_TRUE(overscan->GetInteger("right", &right));
+ EXPECT_EQ(10, top);
+ EXPECT_EQ(11, left);
+ EXPECT_EQ(12, bottom);
+ EXPECT_EQ(13, right);
+ EXPECT_EQ(dummy_id, local_state()->GetInt64(prefs::kPrimaryDisplayID));
+}
+
+TEST_F(DisplayPreferencesTest, DontSaveInGuestMode) {
+ UpdateDisplay("100x100,200x200");
+
+ LoggedInAsGuest();
+ int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
+ ash::DisplayLayout layout(ash::DisplayLayout::TOP, 10);
+ SetDisplayLayoutPref(ash::ScreenAsh::GetSecondaryDisplay(),
+ static_cast<int>(layout.position), layout.offset);
+ SetPrimaryDisplayIDPref(id2);
+ SetDisplayOverscan(ash::ScreenAsh::GetNativeScreen()->GetPrimaryDisplay(),
+ gfx::Insets(10, 11, 12, 13));
+
+ // Does not store the preferences locally.
+ EXPECT_FALSE(local_state()->FindPreference(
+ prefs::kSecondaryDisplays)->HasUserSetting());
+ EXPECT_FALSE(local_state()->FindPreference(
+ prefs::kSecondaryDisplayLayout)->HasUserSetting());
+ EXPECT_FALSE(local_state()->FindPreference(
+ prefs::kSecondaryDisplayOffset)->HasUserSetting());
+ EXPECT_FALSE(local_state()->FindPreference(
+ prefs::kPrimaryDisplayID)->HasUserSetting());
+ EXPECT_FALSE(local_state()->FindPreference(
+ prefs::kDisplayOverscans)->HasUserSetting());
+
+ // Settings are still notified to the system.
+ ash::DisplayController* display_controller =
+ ash::Shell::GetInstance()->display_controller();
+ gfx::Screen* screen = gfx::Screen::GetNativeScreen();
+ EXPECT_EQ(id2, screen->GetPrimaryDisplay().id());
+ EXPECT_EQ(ash::DisplayLayout::BOTTOM,
+ display_controller->GetCurrentDisplayLayout().position);
+ EXPECT_EQ(-10, display_controller->GetCurrentDisplayLayout().offset);
+ EXPECT_EQ("176x178", screen->GetPrimaryDisplay().bounds().size().ToString());
+}
+
+} // namespace
+} // namespace chromeos
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 6d95e52..97f4287e 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -539,6 +539,7 @@
'browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc',
'browser/chromeos/dbus/service_provider_test_helper.cc',
'browser/chromeos/dbus/service_provider_test_helper.h',
+ 'browser/chromeos/display/display_preferences_unittest.cc',
'browser/chromeos/drive/drive_cache_metadata_unittest.cc',
'browser/chromeos/drive/drive_cache_unittest.cc',
'browser/chromeos/drive/drive_file_system_unittest.cc',