11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/system/chromeos/power/power_event_observer.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/test/ash_test_base.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/time/time.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chromeos/dbus/power_manager_client.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace ash {
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class PowerEventObserverTest : public test::AshTestBase {
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PowerEventObserverTest() {}
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~PowerEventObserverTest() {}
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // test::AshTestBase::SetUp() overrides:
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    test::AshTestBase::SetUp();
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observer_.reset(new PowerEventObserver());
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observer_.reset();
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    test::AshTestBase::TearDown();
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected:
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<PowerEventObserver> observer_;
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PowerEventObserverTest);
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(PowerEventObserverTest, LockBeforeSuspend) {
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  chromeos::PowerManagerClient* client =
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Check that the observer requests a suspend-readiness callback when it hears
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // that the system is about to suspend.
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetCanLockScreen(true);
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetShouldLockScreenBeforeSuspending(true);
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  observer_->SuspendImminent();
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // It should run the callback when it hears that the screen is locked.
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  observer_->ScreenIsLocked();
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunAllPendingInMessageLoop();
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // If the system is already locked, no callback should be requested.
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  observer_->SuspendDone(base::TimeDelta());
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  observer_->ScreenIsUnlocked();
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  observer_->ScreenIsLocked();
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  observer_->SuspendImminent();
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // It also shouldn't request a callback if it isn't instructed to lock the
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // screen.
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  observer_->SuspendDone(base::TimeDelta());
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetShouldLockScreenBeforeSuspending(false);
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  observer_->SuspendImminent();
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace ash
71