display_preferences_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/display/display_preferences.h"
6
7#include "ash/display/display_controller.h"
8#include "ash/display/display_layout_store.h"
9#include "ash/display/display_manager.h"
10#include "ash/display/resolution_notification_controller.h"
11#include "ash/screen_ash.h"
12#include "ash/shell.h"
13#include "ash/test/ash_test_base.h"
14#include "base/prefs/scoped_user_pref_update.h"
15#include "base/prefs/testing_pref_service.h"
16#include "base/strings/string_number_conversions.h"
17#include "base/values.h"
18#include "chrome/browser/chromeos/display/display_configuration_observer.h"
19#include "chrome/browser/chromeos/login/mock_user_manager.h"
20#include "chrome/browser/chromeos/login/user_manager.h"
21#include "chrome/common/pref_names.h"
22#include "chrome/test/base/testing_browser_process.h"
23#include "chromeos/display/output_configurator.h"
24#include "ui/message_center/message_center.h"
25
26using ash::internal::ResolutionNotificationController;
27
28namespace chromeos {
29namespace {
30const char kPrimaryIdKey[] = "primary-id";
31const char kMirroredKey[] = "mirrored";
32const char kPositionKey[] = "position";
33const char kOffsetKey[] = "offset";
34
35class DisplayPreferencesTest : public ash::test::AshTestBase {
36 protected:
37  DisplayPreferencesTest() : ash::test::AshTestBase(),
38                             mock_user_manager_(new MockUserManager),
39                             user_manager_enabler_(mock_user_manager_) {
40  }
41
42  virtual ~DisplayPreferencesTest() {}
43
44  virtual void SetUp() OVERRIDE {
45    EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
46        .WillRepeatedly(testing::Return(false));
47    EXPECT_CALL(*mock_user_manager_, Shutdown());
48    ash::test::AshTestBase::SetUp();
49    RegisterDisplayLocalStatePrefs(local_state_.registry());
50    TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
51    observer_.reset(new DisplayConfigurationObserver());
52  }
53
54  virtual void TearDown() OVERRIDE {
55    observer_.reset();
56    TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
57    ash::test::AshTestBase::TearDown();
58  }
59
60  void LoggedInAsUser() {
61    EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
62        .WillRepeatedly(testing::Return(true));
63    EXPECT_CALL(*mock_user_manager_, IsLoggedInAsRegularUser())
64        .WillRepeatedly(testing::Return(true));
65  }
66
67  void LoggedInAsGuest() {
68    EXPECT_CALL(*mock_user_manager_, IsUserLoggedIn())
69        .WillRepeatedly(testing::Return(true));
70    EXPECT_CALL(*mock_user_manager_, IsLoggedInAsRegularUser())
71        .WillRepeatedly(testing::Return(false));
72    EXPECT_CALL(*mock_user_manager_, IsLoggedInAsLocallyManagedUser())
73        .WillRepeatedly(testing::Return(false));
74  }
75
76  // Do not use the implementation of display_preferences.cc directly to avoid
77  // notifying the update to the system.
78  void StoreDisplayLayoutPrefForName(const std::string& name,
79                                     ash::DisplayLayout::Position layout,
80                                     int offset,
81                                     int64 primary_id) {
82    DictionaryPrefUpdate update(&local_state_, prefs::kSecondaryDisplays);
83    ash::DisplayLayout display_layout(layout, offset);
84    display_layout.primary_id = primary_id;
85
86    DCHECK(!name.empty());
87
88    base::DictionaryValue* pref_data = update.Get();
89    scoped_ptr<base::Value>layout_value(new base::DictionaryValue());
90    if (pref_data->HasKey(name)) {
91      base::Value* value = NULL;
92      if (pref_data->Get(name, &value) && value != NULL)
93        layout_value.reset(value->DeepCopy());
94    }
95    if (ash::DisplayLayout::ConvertToValue(display_layout, layout_value.get()))
96      pref_data->Set(name, layout_value.release());
97  }
98
99  void StoreDisplayLayoutPrefForPair(int64 id1,
100                                     int64 id2,
101                                     ash::DisplayLayout::Position layout,
102                                     int offset) {
103    StoreDisplayLayoutPrefForName(
104        base::Int64ToString(id1) + "," + base::Int64ToString(id2),
105        layout, offset, id1);
106  }
107
108  void StoreDisplayLayoutPrefForSecondary(int64 id,
109                                          ash::DisplayLayout::Position layout,
110                                          int offset,
111                                          int64 primary_id) {
112    StoreDisplayLayoutPrefForName(
113        base::Int64ToString(id), layout, offset, primary_id);
114  }
115
116  void StoreDisplayOverscan(int64 id, const gfx::Insets& insets) {
117    DictionaryPrefUpdate update(&local_state_, prefs::kDisplayProperties);
118    const std::string name = base::Int64ToString(id);
119
120    base::DictionaryValue* pref_data = update.Get();
121    base::DictionaryValue* insets_value = new base::DictionaryValue();
122    insets_value->SetInteger("insets_top", insets.top());
123    insets_value->SetInteger("insets_left", insets.left());
124    insets_value->SetInteger("insets_bottom", insets.bottom());
125    insets_value->SetInteger("insets_right", insets.right());
126    pref_data->Set(name, insets_value);
127  }
128
129  std::string GetRegisteredDisplayLayoutStr(int64 id1, int64 id2) {
130    ash::DisplayIdPair pair;
131    pair.first = id1;
132    pair.second = id2;
133    return ash::Shell::GetInstance()->display_manager()->layout_store()->
134        GetRegisteredDisplayLayout(pair).ToString();
135  }
136
137  PrefService* local_state() { return &local_state_; }
138
139 private:
140  MockUserManager* mock_user_manager_;  // Not owned.
141  ScopedUserManagerEnabler user_manager_enabler_;
142  TestingPrefServiceSimple local_state_;
143  scoped_ptr<DisplayConfigurationObserver> observer_;
144
145  DISALLOW_COPY_AND_ASSIGN(DisplayPreferencesTest);
146};
147
148}  // namespace
149
150TEST_F(DisplayPreferencesTest, PairedLayoutOverrides) {
151  UpdateDisplay("100x100,200x200");
152  int64 id1 = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().id();
153  int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
154  int64 dummy_id = id2 + 1;
155  ASSERT_NE(id1, dummy_id);
156
157  StoreDisplayLayoutPrefForPair(id1, id2, ash::DisplayLayout::TOP, 20);
158  StoreDisplayLayoutPrefForPair(id1, dummy_id, ash::DisplayLayout::LEFT, 30);
159  StoreDisplayPowerStateForTest(
160      chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON);
161
162  ash::Shell* shell = ash::Shell::GetInstance();
163
164  LoadDisplayPreferences(true);
165  // DisplayPowerState should be ignored at boot.
166  EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON,
167            shell->output_configurator()->power_state());
168
169  shell->display_manager()->UpdateDisplays();
170  // Check if the layout settings are notified to the system properly.
171  // The paired layout overrides old layout.
172  // Inverted one of for specified pair (id1, id2).  Not used for the pair
173  // (id1, dummy_id) since dummy_id is not connected right now.
174  EXPECT_EQ("top, 20",
175            shell->display_manager()->GetCurrentDisplayLayout().ToString());
176  EXPECT_EQ("top, 20", GetRegisteredDisplayLayoutStr(id1, id2));
177  EXPECT_EQ("left, 30", GetRegisteredDisplayLayoutStr(id1, dummy_id));
178}
179
180TEST_F(DisplayPreferencesTest, BasicStores) {
181  ash::DisplayController* display_controller =
182      ash::Shell::GetInstance()->display_controller();
183  ash::internal::DisplayManager* display_manager =
184      ash::Shell::GetInstance()->display_manager();
185
186  UpdateDisplay("200x200*2, 400x300#400x400|300x200");
187  int64 id1 = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().id();
188  gfx::Display::SetInternalDisplayId(id1);
189  int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
190  int64 dummy_id = id2 + 1;
191  ASSERT_NE(id1, dummy_id);
192
193  LoggedInAsUser();
194  ash::DisplayLayout layout(ash::DisplayLayout::TOP, 10);
195  SetCurrentDisplayLayout(layout);
196  StoreDisplayLayoutPrefForTest(
197      id1, dummy_id, ash::DisplayLayout(ash::DisplayLayout::LEFT, 20));
198  // Can't switch to a display that does not exist.
199  display_controller->SetPrimaryDisplayId(dummy_id);
200  EXPECT_NE(dummy_id, display_controller->GetPrimaryDisplay().id());
201
202  display_controller->SetOverscanInsets(id1, gfx::Insets(10, 11, 12, 13));
203  display_manager->SetDisplayRotation(id1, gfx::Display::ROTATE_90);
204  display_manager->SetDisplayUIScale(id1, 1.25f);
205  display_manager->SetDisplayUIScale(id2, 1.25f);
206
207  const base::DictionaryValue* displays =
208      local_state()->GetDictionary(prefs::kSecondaryDisplays);
209  const base::DictionaryValue* layout_value = NULL;
210  std::string key = base::Int64ToString(id1) + "," + base::Int64ToString(id2);
211  EXPECT_TRUE(displays->GetDictionary(key, &layout_value));
212
213  ash::DisplayLayout stored_layout;
214  EXPECT_TRUE(ash::DisplayLayout::ConvertFromValue(*layout_value,
215                                                   &stored_layout));
216  EXPECT_EQ(layout.position, stored_layout.position);
217  EXPECT_EQ(layout.offset, stored_layout.offset);
218
219  bool mirrored = true;
220  EXPECT_TRUE(layout_value->GetBoolean(kMirroredKey, &mirrored));
221  EXPECT_FALSE(mirrored);
222
223  const base::DictionaryValue* properties =
224      local_state()->GetDictionary(prefs::kDisplayProperties);
225  const base::DictionaryValue* property = NULL;
226  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id1), &property));
227  int ui_scale = 0;
228  int rotation = 0;
229  EXPECT_TRUE(property->GetInteger("rotation", &rotation));
230  EXPECT_TRUE(property->GetInteger("ui-scale", &ui_scale));
231  EXPECT_EQ(1, rotation);
232  EXPECT_EQ(1250, ui_scale);
233
234  // Internal display never registere the resolution.
235  int width = 0, height = 0;
236  EXPECT_FALSE(property->GetInteger("width", &width));
237  EXPECT_FALSE(property->GetInteger("height", &height));
238
239  int top = 0, left = 0, bottom = 0, right = 0;
240  EXPECT_TRUE(property->GetInteger("insets_top", &top));
241  EXPECT_TRUE(property->GetInteger("insets_left", &left));
242  EXPECT_TRUE(property->GetInteger("insets_bottom", &bottom));
243  EXPECT_TRUE(property->GetInteger("insets_right", &right));
244  EXPECT_EQ(10, top);
245  EXPECT_EQ(11, left);
246  EXPECT_EQ(12, bottom);
247  EXPECT_EQ(13, right);
248
249  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id2), &property));
250  EXPECT_TRUE(property->GetInteger("rotation", &rotation));
251  EXPECT_TRUE(property->GetInteger("ui-scale", &ui_scale));
252  EXPECT_EQ(0, rotation);
253  // ui_scale works only on 2x scale factor/1st display.
254  EXPECT_EQ(1000, ui_scale);
255  EXPECT_FALSE(property->GetInteger("insets_top", &top));
256  EXPECT_FALSE(property->GetInteger("insets_left", &left));
257  EXPECT_FALSE(property->GetInteger("insets_bottom", &bottom));
258  EXPECT_FALSE(property->GetInteger("insets_right", &right));
259
260  // Resolution is saved only when the resolution is set
261  // by DisplayManager::SetDisplayResolution
262  width = 0;
263  height = 0;
264  EXPECT_FALSE(property->GetInteger("width", &width));
265  EXPECT_FALSE(property->GetInteger("height", &height));
266
267  display_manager->SetDisplayResolution(id2, gfx::Size(300, 200));
268
269  display_controller->SetPrimaryDisplayId(id2);
270
271  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id1), &property));
272  width = 0;
273  height = 0;
274  // Internal dispaly shouldn't store its resolution.
275  EXPECT_FALSE(property->GetInteger("width", &width));
276  EXPECT_FALSE(property->GetInteger("height", &height));
277
278  // External dispaly's resolution must be stored this time because
279  // it's not best.
280  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id2), &property));
281  EXPECT_TRUE(property->GetInteger("width", &width));
282  EXPECT_TRUE(property->GetInteger("height", &height));
283  EXPECT_EQ(300, width);
284  EXPECT_EQ(200, height);
285
286  // The layout remains the same.
287  EXPECT_TRUE(displays->GetDictionary(key, &layout_value));
288  EXPECT_TRUE(ash::DisplayLayout::ConvertFromValue(*layout_value,
289                                                   &stored_layout));
290  EXPECT_EQ(layout.position, stored_layout.position);
291  EXPECT_EQ(layout.offset, stored_layout.offset);
292  EXPECT_EQ(id2, stored_layout.primary_id);
293
294  mirrored = true;
295  EXPECT_TRUE(layout_value->GetBoolean(kMirroredKey, &mirrored));
296  EXPECT_FALSE(mirrored);
297  std::string primary_id_str;
298  EXPECT_TRUE(layout_value->GetString(kPrimaryIdKey, &primary_id_str));
299  EXPECT_EQ(base::Int64ToString(id2), primary_id_str);
300
301  SetCurrentDisplayLayout(
302      ash::DisplayLayout(ash::DisplayLayout::BOTTOM, 20));
303
304  UpdateDisplay("1+0-200x200*2,1+0-200x200");
305  // Mirrored.
306  int offset = 0;
307  std::string position;
308  EXPECT_TRUE(displays->GetDictionary(key, &layout_value));
309  EXPECT_TRUE(layout_value->GetString(kPositionKey, &position));
310  EXPECT_EQ("top", position);
311  EXPECT_TRUE(layout_value->GetInteger(kOffsetKey, &offset));
312  EXPECT_EQ(-20, offset);
313  mirrored = false;
314  EXPECT_TRUE(layout_value->GetBoolean(kMirroredKey, &mirrored));
315  EXPECT_TRUE(mirrored);
316  EXPECT_TRUE(layout_value->GetString(kPrimaryIdKey, &primary_id_str));
317  EXPECT_EQ(base::Int64ToString(id2), primary_id_str);
318
319  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id1), &property));
320  EXPECT_FALSE(property->GetInteger("width", &width));
321  EXPECT_FALSE(property->GetInteger("height", &height));
322
323  // External dispaly's selected resolution must not change
324  // by mirroring.
325  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id2), &property));
326  EXPECT_TRUE(property->GetInteger("width", &width));
327  EXPECT_TRUE(property->GetInteger("height", &height));
328  EXPECT_EQ(300, width);
329  EXPECT_EQ(200, height);
330
331  // Set new display's selected resolution.
332  display_manager->RegisterDisplayProperty(id2 + 1,
333                                           gfx::Display::ROTATE_0,
334                                           1.0f,
335                                           NULL,
336                                           gfx::Size(500, 400));
337
338  UpdateDisplay("200x200*2, 600x500#600x500|500x400");
339
340  // Update key as the 2nd display gets new id.
341  id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
342  key = base::Int64ToString(id1) + "," + base::Int64ToString(id2);
343  EXPECT_TRUE(displays->GetDictionary(key, &layout_value));
344  EXPECT_TRUE(layout_value->GetString(kPositionKey, &position));
345  EXPECT_EQ("right", position);
346  EXPECT_TRUE(layout_value->GetInteger(kOffsetKey, &offset));
347  EXPECT_EQ(0, offset);
348  mirrored = true;
349  EXPECT_TRUE(layout_value->GetBoolean(kMirroredKey, &mirrored));
350  EXPECT_FALSE(mirrored);
351  EXPECT_TRUE(layout_value->GetString(kPrimaryIdKey, &primary_id_str));
352  EXPECT_EQ(base::Int64ToString(id1), primary_id_str);
353
354  // External dispaly's selected resolution must be updated.
355  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id2), &property));
356  EXPECT_TRUE(property->GetInteger("width", &width));
357  EXPECT_TRUE(property->GetInteger("height", &height));
358  EXPECT_EQ(500, width);
359  EXPECT_EQ(400, height);
360}
361
362TEST_F(DisplayPreferencesTest, PreventStore) {
363  ResolutionNotificationController::SuppressTimerForTest();
364  LoggedInAsUser();
365  UpdateDisplay("400x300#500x400|400x300|300x200");
366  int64 id = ash::Shell::GetScreen()->GetPrimaryDisplay().id();
367  // Set display's resolution in single display. It creates the notification and
368  // display preferences should not stored meanwhile.
369  ash::Shell::GetInstance()->resolution_notification_controller()->
370      SetDisplayResolutionAndNotify(
371          id, gfx::Size(400, 300), gfx::Size(500, 400), base::Closure());
372  UpdateDisplay("500x400#500x400|400x300|300x200");
373
374  const base::DictionaryValue* properties =
375      local_state()->GetDictionary(prefs::kDisplayProperties);
376  const base::DictionaryValue* property = NULL;
377  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id), &property));
378  int width = 0, height = 0;
379  EXPECT_FALSE(property->GetInteger("width", &width));
380  EXPECT_FALSE(property->GetInteger("height", &height));
381
382  // Revert the change. When timeout, 2nd button is revert.
383  message_center::MessageCenter::Get()->ClickOnNotificationButton(
384      ResolutionNotificationController::kNotificationId, 1);
385  RunAllPendingInMessageLoop();
386  EXPECT_FALSE(message_center::MessageCenter::Get()->HasNotification(
387      ResolutionNotificationController::kNotificationId));
388
389  // Once the notification is removed, the specified resolution will be stored
390  // by SetDisplayResolution.
391  ash::Shell::GetInstance()->display_manager()->SetDisplayResolution(
392      id, gfx::Size(300, 200));
393  UpdateDisplay("300x200#500x400|400x300|300x200");
394
395  property = NULL;
396  EXPECT_TRUE(properties->GetDictionary(base::Int64ToString(id), &property));
397  EXPECT_TRUE(property->GetInteger("width", &width));
398  EXPECT_TRUE(property->GetInteger("height", &height));
399  EXPECT_EQ(300, width);
400  EXPECT_EQ(200, height);
401}
402
403TEST_F(DisplayPreferencesTest, StoreForSwappedDisplay) {
404  UpdateDisplay("100x100,200x200");
405  int64 id1 = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().id();
406  int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
407
408  ash::DisplayController* display_controller =
409      ash::Shell::GetInstance()->display_controller();
410  display_controller->SwapPrimaryDisplay();
411  ASSERT_EQ(id1, ash::ScreenAsh::GetSecondaryDisplay().id());
412
413  LoggedInAsUser();
414  ash::DisplayLayout layout(ash::DisplayLayout::TOP, 10);
415  SetCurrentDisplayLayout(layout);
416  layout = layout.Invert();
417
418  const base::DictionaryValue* displays =
419      local_state()->GetDictionary(prefs::kSecondaryDisplays);
420  const base::DictionaryValue* new_value = NULL;
421  std::string key = base::Int64ToString(id1) + "," + base::Int64ToString(id2);
422  EXPECT_TRUE(displays->GetDictionary(key, &new_value));
423
424  ash::DisplayLayout stored_layout;
425  EXPECT_TRUE(ash::DisplayLayout::ConvertFromValue(*new_value, &stored_layout));
426  EXPECT_EQ(layout.position, stored_layout.position);
427  EXPECT_EQ(layout.offset, stored_layout.offset);
428  EXPECT_EQ(id2, stored_layout.primary_id);
429
430  display_controller->SwapPrimaryDisplay();
431  EXPECT_TRUE(displays->GetDictionary(key, &new_value));
432  EXPECT_TRUE(ash::DisplayLayout::ConvertFromValue(*new_value, &stored_layout));
433  EXPECT_EQ(layout.position, stored_layout.position);
434  EXPECT_EQ(layout.offset, stored_layout.offset);
435  EXPECT_EQ(id1, stored_layout.primary_id);
436}
437
438TEST_F(DisplayPreferencesTest, DontStoreInGuestMode) {
439  ash::DisplayController* display_controller =
440      ash::Shell::GetInstance()->display_controller();
441  ash::internal::DisplayManager* display_manager =
442      ash::Shell::GetInstance()->display_manager();
443
444  UpdateDisplay("200x200*2,200x200");
445
446  LoggedInAsGuest();
447  int64 id1 = ash::ScreenAsh::GetNativeScreen()->GetPrimaryDisplay().id();
448  gfx::Display::SetInternalDisplayId(id1);
449  int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
450  ash::DisplayLayout layout(ash::DisplayLayout::TOP, 10);
451  SetCurrentDisplayLayout(layout);
452  display_manager->SetDisplayUIScale(id1, 1.25f);
453  display_controller->SetPrimaryDisplayId(id2);
454  int64 new_primary =
455      ash::ScreenAsh::GetNativeScreen()->GetPrimaryDisplay().id();
456  display_controller->SetOverscanInsets(
457      new_primary,
458      gfx::Insets(10, 11, 12, 13));
459  display_manager->SetDisplayRotation(new_primary, gfx::Display::ROTATE_90);
460
461  // Does not store the preferences locally.
462  EXPECT_FALSE(local_state()->FindPreference(
463      prefs::kSecondaryDisplays)->HasUserSetting());
464  EXPECT_FALSE(local_state()->FindPreference(
465      prefs::kDisplayProperties)->HasUserSetting());
466
467  // Settings are still notified to the system.
468  gfx::Screen* screen = gfx::Screen::GetNativeScreen();
469  EXPECT_EQ(id2, screen->GetPrimaryDisplay().id());
470  EXPECT_EQ(ash::DisplayLayout::BOTTOM,
471            display_manager->GetCurrentDisplayLayout().position);
472  EXPECT_EQ(-10, display_manager->GetCurrentDisplayLayout().offset);
473  const gfx::Display& primary_display = screen->GetPrimaryDisplay();
474  EXPECT_EQ("178x176", primary_display.bounds().size().ToString());
475  EXPECT_EQ(gfx::Display::ROTATE_90, primary_display.rotation());
476
477  const ash::internal::DisplayInfo& info1 =
478      display_manager->GetDisplayInfo(id1);
479  EXPECT_EQ(1.25f, info1.configured_ui_scale());
480
481  const ash::internal::DisplayInfo& info_primary =
482      display_manager->GetDisplayInfo(new_primary);
483  EXPECT_EQ(gfx::Display::ROTATE_90, info_primary.rotation());
484  EXPECT_EQ(1.0f, info_primary.configured_ui_scale());
485}
486
487TEST_F(DisplayPreferencesTest, StorePowerStateNoLogin) {
488  EXPECT_FALSE(local_state()->HasPrefPath(prefs::kDisplayPowerState));
489
490  // Stores display prefs without login, which still stores the power state.
491  StoreDisplayPrefs();
492  EXPECT_TRUE(local_state()->HasPrefPath(prefs::kDisplayPowerState));
493}
494
495TEST_F(DisplayPreferencesTest, StorePowerStateGuest) {
496  EXPECT_FALSE(local_state()->HasPrefPath(prefs::kDisplayPowerState));
497
498  LoggedInAsGuest();
499  StoreDisplayPrefs();
500  EXPECT_TRUE(local_state()->HasPrefPath(prefs::kDisplayPowerState));
501}
502
503TEST_F(DisplayPreferencesTest, StorePowerStateNormalUser) {
504  EXPECT_FALSE(local_state()->HasPrefPath(prefs::kDisplayPowerState));
505
506  LoggedInAsUser();
507  StoreDisplayPrefs();
508  EXPECT_TRUE(local_state()->HasPrefPath(prefs::kDisplayPowerState));
509}
510
511TEST_F(DisplayPreferencesTest, DisplayPowerStateAfterRestart) {
512  StoreDisplayPowerStateForTest(
513      chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON);
514  LoadDisplayPreferences(false);
515  EXPECT_EQ(
516      chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
517      ash::Shell::GetInstance()->output_configurator()->power_state());
518}
519
520TEST_F(DisplayPreferencesTest, DontSaveAndRestoreAllOff) {
521  ash::Shell* shell = ash::Shell::GetInstance();
522  StoreDisplayPowerStateForTest(
523      chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON);
524  LoadDisplayPreferences(false);
525  // DisplayPowerState should be ignored at boot.
526  EXPECT_EQ(chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
527            shell->output_configurator()->power_state());
528
529  StoreDisplayPowerStateForTest(
530      chromeos::DISPLAY_POWER_ALL_OFF);
531  EXPECT_EQ(chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
532            shell->output_configurator()->power_state());
533  EXPECT_EQ("internal_off_external_on",
534            local_state()->GetString(prefs::kDisplayPowerState));
535
536  // Don't try to load
537  local_state()->SetString(prefs::kDisplayPowerState, "all_off");
538  LoadDisplayPreferences(false);
539  EXPECT_EQ(chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON,
540            shell->output_configurator()->power_state());
541}
542
543}  // namespace chromeos
544