1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file.
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/resolution_notification_controller.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/display_manager.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h"
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/shell.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/test/ash_test_base.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/ash_strings.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/size.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/message_center/message_center.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/message_center/notification.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/message_center/notification_list.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace ash {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExpectedNotificationMessage(int64 display_id,
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           const gfx::Size& new_resolution) {
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return l10n_util::GetStringFUTF16(
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF8ToUTF16(
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          Shell::GetInstance()->display_manager()->GetDisplayNameForId(
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              display_id)),
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF8ToUTF16(new_resolution.ToString()));
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExpectedFallbackNotificationMessage(
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int64 display_id,
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size& specified_resolution,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const gfx::Size& fallback_resolution) {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return l10n_util::GetStringFUTF16(
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TO_UNSUPPORTED,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF8ToUTF16(
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          Shell::GetInstance()->display_manager()->GetDisplayNameForId(
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              display_id)),
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF8ToUTF16(specified_resolution.ToString()),
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF8ToUTF16(fallback_resolution.ToString()));
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass ResolutionNotificationControllerTest : public ash::test::AshTestBase {
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public:
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ResolutionNotificationControllerTest()
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      : accept_count_(0) {
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual ~ResolutionNotificationControllerTest() {}
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch protected:
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SetUp() OVERRIDE {
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ash::test::AshTestBase::SetUp();
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ResolutionNotificationController::SuppressTimerForTest();
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetDisplayResolutionAndNotifyWithResolution(
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Display& display,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Size& new_resolution,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Size& actual_new_resolution) {
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DisplayManager* display_manager = Shell::GetInstance()->display_manager();
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const DisplayInfo& info = display_manager->GetDisplayInfo(display.id());
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DisplayMode old_mode(info.size_in_pixel(),
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         60 /* refresh_rate */,
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         false /* interlaced */,
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         false /* native */);
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DisplayMode new_mode = old_mode;
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    new_mode.size = new_resolution;
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (display_manager->SetDisplayMode(display.id(), new_mode)) {
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      controller()->PrepareNotification(
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          display.id(),
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          old_mode,
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          new_mode,
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::Bind(&ResolutionNotificationControllerTest::OnAccepted,
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     base::Unretained(this)));
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // OnConfigurationChanged event won't be emitted in the test environment,
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // so invoke UpdateDisplay() to emit that event explicitly.
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::vector<DisplayInfo> info_list;
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      int64 id = display_manager->GetDisplayAt(i).id();
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      DisplayInfo info = display_manager->GetDisplayInfo(id);
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (display.id() == id) {
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        gfx::Rect bounds = info.bounds_in_native();
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        bounds.set_size(actual_new_resolution);
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        info.SetBounds(bounds);
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      info_list.push_back(info);
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    display_manager->OnNativeDisplaysChanged(info_list);
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RunAllPendingInMessageLoop();
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetDisplayResolutionAndNotify(const gfx::Display& display,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     const gfx::Size& new_resolution) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetDisplayResolutionAndNotifyWithResolution(
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        display, new_resolution, new_resolution);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static base::string16 GetNotificationMessage() {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const message_center::NotificationList::Notifications& notifications =
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        message_center::MessageCenter::Get()->GetVisibleNotifications();
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (message_center::NotificationList::Notifications::const_iterator iter =
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             notifications.begin(); iter != notifications.end(); ++iter) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if ((*iter)->id() == ResolutionNotificationController::kNotificationId)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return (*iter)->title();
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::string16();
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void ClickOnNotification() {
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message_center::MessageCenter::Get()->ClickOnNotification(
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        ResolutionNotificationController::kNotificationId);
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void ClickOnNotificationButton(int index) {
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    message_center::MessageCenter::Get()->ClickOnNotificationButton(
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        ResolutionNotificationController::kNotificationId, index);
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void CloseNotification() {
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    message_center::MessageCenter::Get()->RemoveNotification(
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ResolutionNotificationController::kNotificationId, true /* by_user */);
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool IsNotificationVisible() {
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return message_center::MessageCenter::Get()->FindVisibleNotificationById(
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        ResolutionNotificationController::kNotificationId);
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void TickTimer() {
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    controller()->OnTimerTick();
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static ResolutionNotificationController* controller() {
145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return Shell::GetInstance()->resolution_notification_controller();
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int accept_count() const {
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return accept_count_;
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private:
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void OnAccepted() {
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_FALSE(controller()->DoesNotificationTimeout());
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    accept_count_++;
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int accept_count_;
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ResolutionNotificationControllerTest);
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch};
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Basic behaviors and verifies it doesn't cause crashes.
164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, Basic) {
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!SupportsMultipleDisplays())
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%59|200x200%60");
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id();
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::Shell::GetInstance()->display_manager();
172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0, accept_count());
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Changes the resolution and apply the result.
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200));
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(IsNotificationVisible());
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(controller()->DoesNotificationTimeout());
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ExpectedNotificationMessage(id2, gfx::Size(200, 200)),
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetNotificationMessage());
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(60.0, mode.refresh_rate);
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Click the revert button, which reverts to the best resolution.
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ClickOnNotificationButton(0);
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunAllPendingInMessageLoop();
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, accept_count());
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("250x250", mode.size.ToString());
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(59.0, mode.refresh_rate);
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, ClickMeansAccept) {
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!SupportsMultipleDisplays())
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%59|200x200%60");
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id();
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::Shell::GetInstance()->display_manager();
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0, accept_count());
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Changes the resolution and apply the result.
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200));
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(IsNotificationVisible());
212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(controller()->DoesNotificationTimeout());
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(60.0, mode.refresh_rate);
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Click the revert button, which reverts the resolution.
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ClickOnNotification();
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunAllPendingInMessageLoop();
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, accept_count());
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(60.0, mode.refresh_rate);
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, AcceptButton) {
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!SupportsMultipleDisplays())
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::Shell::GetInstance()->display_manager();
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%59|200x200%60");
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay();
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(display, gfx::Size(200, 200));
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(IsNotificationVisible());
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // If there's a single display only, it will have timeout and the first button
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // becomes accept.
242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(controller()->DoesNotificationTimeout());
243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ClickOnNotificationButton(0);
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, accept_count());
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager->GetSelectedModeForDisplayId(display.id(), &mode));
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(60.0f, mode.refresh_rate);
251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // In that case the second button is revert.
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%59|200x200%60");
254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(display, gfx::Size(200, 200));
255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(IsNotificationVisible());
256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(controller()->DoesNotificationTimeout());
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ClickOnNotificationButton(1);
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, accept_count());
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager->GetSelectedModeForDisplayId(display.id(), &mode));
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("300x300", mode.size.ToString());
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(59.0f, mode.refresh_rate);
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ResolutionNotificationControllerTest, Close) {
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("100x100,150x150#150x150%59|200x200%60");
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id();
273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ash::Shell::GetInstance()->display_manager();
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(0, accept_count());
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(IsNotificationVisible());
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Changes the resolution and apply the result.
2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SetDisplayResolutionAndNotify(
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200));
2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(IsNotificationVisible());
2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(controller()->DoesNotificationTimeout());
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(60.0f, mode.refresh_rate);
2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Close the notification (imitates clicking [x] button). Also verifies if
2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // this does not cause a crash.  See crbug.com/271784
2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CloseNotification();
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  RunAllPendingInMessageLoop();
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(IsNotificationVisible());
2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, accept_count());
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, Timeout) {
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!SupportsMultipleDisplays())
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%59|200x200%60");
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay();
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(display, gfx::Size(200, 200));
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < ResolutionNotificationController::kTimeoutInSec; ++i) {
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_TRUE(IsNotificationVisible()) << "notification is closed after "
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                         << i << "-th timer tick";
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    TickTimer();
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RunAllPendingInMessageLoop();
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, accept_count());
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::Shell::GetInstance()->display_manager();
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager->GetSelectedModeForDisplayId(display.id(), &mode));
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("300x300", mode.size.ToString());
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(59.0f, mode.refresh_rate);
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, DisplayDisconnected) {
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!SupportsMultipleDisplays())
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%56|200x200%57,"
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                "200x200#250x250%58|200x200%59|100x100%60");
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id();
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::Shell::GetInstance()->display_manager();
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(), gfx::Size(100, 100));
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(IsNotificationVisible());
333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Disconnects the secondary display and verifies it doesn't cause crashes.
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%56|200x200%57");
336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunAllPendingInMessageLoop();
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, accept_count());
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  gfx::Size resolution;
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(59.0f, mode.refresh_rate);
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) {
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!SupportsMultipleDisplays())
348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%56|200x200%57,"
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                "250x250#250x250%58|200x200%59");
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id();
353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ash::Shell::GetInstance()->display_manager();
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200));
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(IsNotificationVisible());
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(controller()->DoesNotificationTimeout());
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(59.0f, mode.refresh_rate);
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Invokes SetDisplayResolutionAndNotify during the previous notification is
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // visible.
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetDisplayResolutionAndNotify(
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(), gfx::Size(250, 250));
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("250x250", mode.size.ToString());
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(58.0f, mode.refresh_rate);
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Then, click the revert button. Although |old_resolution| for the second
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // SetDisplayResolutionAndNotify is 200x200, it should revert to the original
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // size 250x250.
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ClickOnNotificationButton(0);
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunAllPendingInMessageLoop();
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(IsNotificationVisible());
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, accept_count());
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("250x250", mode.size.ToString());
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(58.0f, mode.refresh_rate);
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResolutionNotificationControllerTest, Fallback) {
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("300x300#300x300%56|200x200%57,"
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                "250x250#250x250%58|220x220%59|200x200%60");
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id();
392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ash::DisplayManager* display_manager =
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::Shell::GetInstance()->display_manager();
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0, accept_count());
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(IsNotificationVisible());
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Changes the resolution and apply the result.
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetDisplayResolutionAndNotifyWithResolution(
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay(),
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Size(220, 220),
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Size(200, 200));
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(IsNotificationVisible());
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(controller()->DoesNotificationTimeout());
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExpectedFallbackNotificationMessage(
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          id2, gfx::Size(220, 220), gfx::Size(200, 200)),
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetNotificationMessage());
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("200x200", mode.size.ToString());
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(60.0f, mode.refresh_rate);
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Click the revert button, which reverts to the best resolution.
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ClickOnNotificationButton(0);
415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunAllPendingInMessageLoop();
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(IsNotificationVisible());
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, accept_count());
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode));
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("250x250", mode.size.ToString());
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(58.0f, mode.refresh_rate);
421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace ash
424