172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/command_line.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/automation/ui_controls.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/mock_input_method_library.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/cros/mock_screen_lock_library.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/mock_authenticator.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/screen_locker.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/screen_locker_tester.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_manager.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile_manager.h"
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/browser_dialogs.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_service.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_type.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/textfield/textfield.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window_gtk.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An object that wait for lock state and fullscreen state.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Waiter : public NotificationObserver {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  explicit Waiter(Browser* browser)
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      : browser_(browser),
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        running_(false) {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    registrar_.Add(this,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NotificationType::SCREEN_LOCK_STATE_CHANGED,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NotificationService::AllSources());
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    handler_id_ = g_signal_connect(
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        G_OBJECT(browser_->window()->GetNativeHandle()),
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "window-state-event",
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        G_CALLBACK(OnWindowStateEventThunk),
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        this);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~Waiter() {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_signal_handler_disconnect(
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        G_OBJECT(browser_->window()->GetNativeHandle()),
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        handler_id_);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details) {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(type == NotificationType::SCREEN_LOCK_STATE_CHANGED);
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (running_)
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      MessageLoop::current()->Quit();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wait until the two conditions are met.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Wait(bool locker_state, bool fullscreen) {
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    running_ = true;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<chromeos::test::ScreenLockerTester>
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        tester(chromeos::ScreenLocker::GetTester());
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    while (tester->IsLocked() != locker_state ||
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           browser_->window()->IsFullscreen() != fullscreen) {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::RunMessageLoop();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Make sure all pending tasks are executed.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::RunAllPendingInMessageLoop();
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    running_ = false;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(Waiter, gboolean, OnWindowStateEvent,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       GdkEventWindowState*);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* browser_;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gulong handler_id_;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Are we currently running the message loop?
844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool running_;
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(Waiter);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean Waiter::OnWindowStateEvent(GtkWidget* widget,
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    GdkEventWindowState* event) {
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->Quit();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ScreenLockerTest : public CrosInProcessBrowserTest {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ScreenLockerTest() : mock_screen_lock_library_(NULL),
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       mock_input_method_library_(NULL) {
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MockScreenLockLibrary *mock_screen_lock_library_;
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MockInputMethodLibrary *mock_input_method_library_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test the no password mode with different unlock scheme given by
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |unlock| function.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void TestNoPassword(void (unlock)(views::Widget*)) {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenUnlockRequested())
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .Times(1)
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .RetiresOnSaturation();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenLockCompleted())
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .Times(1)
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .RetiresOnSaturation();
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UserManager::Get()->OffTheRecordUserLoggedIn();
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScreenLocker::Show();
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tester->EmulateWindowManagerReady();
1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (!chromeos::ScreenLocker::GetTester()->IsLocked())
1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      ui_test_utils::WaitForNotification(
1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          NotificationType::SCREEN_LOCK_STATE_CHANGED);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(tester->IsLocked());
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tester->InjectMockAuthenticator("", "");
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unlock(tester->GetWidget());
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::RunAllPendingInMessageLoop();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(tester->IsLocked());
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Emulate LockScreen request from PowerManager (via SessionManager).
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScreenLocker::Hide();
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::RunAllPendingInMessageLoop();
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(tester->IsLocked());
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void LockScreenWithUser(test::ScreenLockerTester* tester,
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          const std::string& user) {
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    UserManager::Get()->UserLoggedIn(user);
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ScreenLocker::Show();
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    tester->EmulateWindowManagerReady();
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (!tester->IsLocked()) {
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ui_test_utils::WaitForNotification(
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          NotificationType::SCREEN_LOCK_STATE_CHANGED);
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(tester->IsLocked());
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUpInProcessBrowserTestFixture() {
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cros_mock_->InitStatusAreaMocks();
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cros_mock_->InitMockScreenLockLibrary();
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    mock_screen_lock_library_ = cros_mock_->mock_screen_lock_library();
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    mock_input_method_library_ = cros_mock_->mock_input_method_library();
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_screen_lock_library_, AddObserver(testing::_))
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .Times(1)
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .RetiresOnSaturation();
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenUnlockCompleted())
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .Times(1)
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        .RetiresOnSaturation();
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Expectations for the status are on the screen lock window.
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cros_mock_->SetStatusAreaMocksExpectations();
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Expectations for the status area on the browser window.
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cros_mock_->SetStatusAreaMocksExpectations();
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) {
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    command_line->AppendSwitch(switches::kNoFirstRun);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ScreenLockerTest);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Temporarily disabling all screen locker tests while investigating the
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// issue crbug.com/78764.
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestBasic) {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_input_method_library_, GetNumActiveInputMethods())
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillRepeatedly((testing::Return(0)))
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RetiresOnSaturation();
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenUnlockRequested())
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RetiresOnSaturation();
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenLockCompleted())
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RetiresOnSaturation();
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UserManager::Get()->UserLoggedIn("user");
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScreenLocker::Show();
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tester->EmulateWindowManagerReady();
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!chromeos::ScreenLocker::GetTester()->IsLocked())
1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ui_test_utils::WaitForNotification(
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        NotificationType::SCREEN_LOCK_STATE_CHANGED);
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Test to make sure that the widget is actually appearing and is of
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // reasonable size, preventing a regression of
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // http://code.google.com/p/chromium-os/issues/detail?id=5987
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gfx::Rect lock_bounds = tester->GetChildWidget()->GetWindowScreenBounds();
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_GT(lock_bounds.width(), 10);
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_GT(lock_bounds.height(), 10);
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tester->InjectMockAuthenticator("user", "pass");
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tester->IsLocked());
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tester->EnterPassword("fail");
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tester->IsLocked());
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tester->EnterPassword("pass");
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Successful authentication simply send a unlock request to PowerManager.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tester->IsLocked());
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Emulate LockScreen request from PowerManager (via SessionManager).
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(oshima): Find out better way to handle this in mock.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScreenLocker::Hide();
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(tester->IsLocked());
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestFullscreenExit) {
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenUnlockRequested())
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RetiresOnSaturation();
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenLockCompleted())
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RetiresOnSaturation();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Waiter waiter(browser());
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    browser()->ToggleFullscreenMode();
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    waiter.Wait(false /* not locked */, true /* full screen */);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(browser()->window()->IsFullscreen());
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(tester->IsLocked());
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Waiter waiter(browser());
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UserManager::Get()->UserLoggedIn("user");
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ScreenLocker::Show();
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tester->EmulateWindowManagerReady();
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    waiter.Wait(true /* locked */, false /* full screen */);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(browser()->window()->IsFullscreen());
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(tester->IsLocked());
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tester->InjectMockAuthenticator("user", "pass");
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tester->EnterPassword("pass");
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ui_test_utils::RunAllPendingInMessageLoop();
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScreenLocker::Hide();
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(tester->IsLocked());
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MouseMove(views::Widget* widget) {
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_controls::SendMouseMove(10, 10);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest,
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       DISABLED_TestNoPasswordWithMouseMove) {
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestNoPassword(MouseMove);
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MouseClick(views::Widget* widget) {
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_controls::SendMouseClick(ui_controls::RIGHT);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest,
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       DISABLED_TestNoPasswordWithMouseClick) {
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestNoPassword(MouseClick);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid KeyPress(views::Widget* widget) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_controls::SendKeyPress(GTK_WINDOW(widget->GetNativeView()),
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            ui::VKEY_SPACE, false, false, false, false);
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestNoPasswordWithKeyPress) {
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestNoPassword(KeyPress);
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestShowTwice) {
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenLockCompleted())
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(2)
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .RetiresOnSaturation();
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  LockScreenWithUser(tester.get(), "user");
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Ensure there's a profile or this test crashes.
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ProfileManager::GetDefaultProfile();
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calling Show again simply send LockCompleted signal.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScreenLocker::Show();
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tester->IsLocked());
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the locker to match expectations.
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScreenLocker::Hide();
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(tester->IsLocked());
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestEscape) {
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_CALL(*mock_screen_lock_library_, NotifyScreenLockCompleted())
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      .Times(1)
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      .RetiresOnSaturation();
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  LockScreenWithUser(tester.get(), "user");
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Ensure there's a profile or this test crashes.
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ProfileManager::GetDefaultProfile();
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tester->SetPassword("password");
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ("password", tester->GetPassword());
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Escape clears the password.
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui_controls::SendKeyPress(GTK_WINDOW(tester->GetWidget()->GetNativeView()),
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            ui::VKEY_ESCAPE, false, false, false, false);
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui_test_utils::RunAllPendingInMessageLoop();
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ("", tester->GetPassword());
31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Close the locker to match expectations.
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ScreenLocker::Hide();
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui_test_utils::RunAllPendingInMessageLoop();
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(tester->IsLocked());
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
326