screen_locker_browsertest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/mock_network_library.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/mock_authenticator.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker_tester.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_controls.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_power_manager_client.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/mock_session_manager_client.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/mock_update_engine_client.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer_animator.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object that wait for lock state and fullscreen state.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Waiter : public content::NotificationObserver {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Waiter(Browser* browser)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : browser_(browser),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        running_(false) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   chrome::NOTIFICATION_FULLSCREEN_CHANGED,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Waiter() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(type == chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED ||
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type == chrome::NOTIFICATION_FULLSCREEN_CHANGED);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (running_)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageLoop::current()->Quit();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until the two conditions are met.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Wait(bool locker_state, bool fullscreen) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    running_ = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<chromeos::test::ScreenLockerTester>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tester(chromeos::ScreenLocker::GetTester());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (tester->IsLocked() != locker_state ||
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           browser_->window()->IsFullscreen() != fullscreen) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure all pending tasks are executed.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    running_ = false;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Are we currently running the message loop?
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool running_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Waiter);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenLockerTest : public CrosInProcessBrowserTest {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLockerTest() : mock_power_manager_client_(NULL),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       mock_session_manager_client_(NULL) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPowerManagerClient* mock_power_manager_client_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSessionManagerClient* mock_session_manager_client_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LockScreen(test::ScreenLockerTester* tester) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScreenLocker::Show();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tester->EmulateWindowManagerReady();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver lock_state_observer(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!tester->IsLocked())
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lock_state_observer.Wait();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tester->IsLocked());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockDBusThreadManager* mock_dbus_thread_manager =
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new MockDBusThreadManager;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_dbus_thread_manager, GetSystemBus())
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(reinterpret_cast<dbus::Bus*>(NULL)));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CrosInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_power_manager_client_ = static_cast<MockPowerManagerClient*>(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DBusThreadManager::Get()->GetPowerManagerClient());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_session_manager_client_ = static_cast<MockSessionManagerClient*>(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DBusThreadManager::Get()->GetSessionManagerClient());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cros_mock_->InitStatusAreaMocks();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_power_manager_client_, AddObserver(_))
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenDismissed())
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expectations for the status are on the screen lock window.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cros_mock_->SetStatusAreaMocksExpectations();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockNetworkLibrary* mock_network_library =
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cros_mock_->mock_network_library();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_network_library, AddUserActionObserver(_))
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(AnyNumber());
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_network_library, LoadOncNetworks(_, _))
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AnyNumber());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    zero_duration_mode_.reset(new ui::ScopedAnimationDurationScaleMode(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ScopedAnimationDurationScaleMode::ZERO_DURATION));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScreenLockerTest);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestBasic) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown())
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLocker::Show();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->EmulateWindowManagerReady();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver lock_state_observer(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!chromeos::ScreenLocker::GetTester()->IsLocked())
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lock_state_observer.Wait();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test to make sure that the widget is actually appearing and is of
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reasonable size, preventing a regression of
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium-os/issues/detail?id=5987
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect lock_bounds = tester->GetChildWidget()->GetWindowBoundsInScreen();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(lock_bounds.width(), 10);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(lock_bounds.height(), 10);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->InjectMockAuthenticator(UserManager::kStubUser, "pass");
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tester->IsLocked());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->EnterPassword("fail");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tester->IsLocked());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->EnterPassword("pass");
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successful authentication simply send a unlock request to PowerManager.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tester->IsLocked());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emulate LockScreen request from SessionManager.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(oshima): Find out better way to handle this in mock.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLocker::Hide();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tester->IsLocked());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestFullscreenExit) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown())
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Waiter waiter(browser());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenMode();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiter.Wait(false /* not locked */, true /* full screen */);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(browser()->window()->IsFullscreen());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(tester->IsLocked());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Waiter waiter(browser());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScreenLocker::Show();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tester->EmulateWindowManagerReady();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiter.Wait(true /* locked */, false /* full screen */);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(browser()->window()->IsFullscreen());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tester->IsLocked());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->InjectMockAuthenticator(UserManager::kStubUser, "pass");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->EnterPassword("pass");
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLocker::Hide();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tester->IsLocked());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimulateKeyPress(views::Widget* widget, ui::KeyboardCode key_code) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_controls::SendKeyPress(widget->GetNativeWindow(),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            key_code, false, false, false, false);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnlockKeyPress(views::Widget* widget) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateKeyPress(widget, ui::VKEY_SPACE);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, TestShowTwice) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown())
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(2)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LockScreen(tester.get());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure there's a profile or this test crashes.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager::GetDefaultProfile();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling Show again simply send LockCompleted signal.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLocker::Show();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tester->IsLocked());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the locker to match expectations.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLocker::Hide();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tester->IsLocked());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(flackr): Find out why the RenderView isn't getting the escape press
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and re-enable this test (currently this test is flaky).
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ScreenLockerTest, DISABLED_TestEscape) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_session_manager_client_, NotifyLockScreenShown())
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<test::ScreenLockerTester> tester(ScreenLocker::GetTester());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LockScreen(tester.get());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure there's a profile or this test crashes.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager::GetDefaultProfile();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tester->SetPassword("password");
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("password", tester->GetPassword());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Escape clears the password.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateKeyPress(tester->GetWidget(), ui::VKEY_ESCAPE);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", tester->GetPassword());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the locker to match expectations.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScreenLocker::Hide();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tester->IsLocked());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
275