| Index: ash/system/chromeos/power/power_event_observer_unittest.cc
|
| diff --git a/ash/system/chromeos/power/power_event_observer_unittest.cc b/ash/system/chromeos/power/power_event_observer_unittest.cc
|
| index aaaf2c7c46a0afd0cba9cee8b3cac519ca138906..2fd1a1fdc857cb708a2a04b4992046ed5c832b64 100644
|
| --- a/ash/system/chromeos/power/power_event_observer_unittest.cc
|
| +++ b/ash/system/chromeos/power/power_event_observer_unittest.cc
|
| @@ -4,11 +4,15 @@
|
|
|
| #include "ash/system/chromeos/power/power_event_observer.h"
|
|
|
| +#include "ash/shell.h"
|
| #include "ash/test/ash_test_base.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/time/time.h"
|
| #include "chromeos/dbus/dbus_thread_manager.h"
|
| #include "chromeos/dbus/power_manager_client.h"
|
| +#include "ui/aura/window.h"
|
| +#include "ui/aura/window_tree_host.h"
|
| +#include "ui/compositor/compositor.h"
|
|
|
| namespace ash {
|
|
|
| @@ -29,6 +33,16 @@ class PowerEventObserverTest : public test::AshTestBase {
|
| }
|
|
|
| protected:
|
| + int GetNumVisibleCompositors() {
|
| + int result = 0;
|
| + for (const auto& window : Shell::GetAllRootWindows()) {
|
| + if (window->GetHost()->compositor()->IsVisible())
|
| + ++result;
|
| + }
|
| +
|
| + return result;
|
| + }
|
| +
|
| scoped_ptr<PowerEventObserver> observer_;
|
|
|
| private:
|
| @@ -47,15 +61,17 @@ TEST_F(PowerEventObserverTest, LockBeforeSuspend) {
|
| observer_->SuspendImminent();
|
| EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
|
|
|
| - // It should run the callback when it hears that the screen is locked.
|
| + // It should run the callback when it hears that the screen is locked and the
|
| + // lock screen animations have completed.
|
| observer_->ScreenIsLocked();
|
| - RunAllPendingInMessageLoop();
|
| + observer_->OnLockAnimationsComplete();
|
| EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
|
|
|
| // If the system is already locked, no callback should be requested.
|
| observer_->SuspendDone(base::TimeDelta());
|
| observer_->ScreenIsUnlocked();
|
| observer_->ScreenIsLocked();
|
| + observer_->OnLockAnimationsComplete();
|
| observer_->SuspendImminent();
|
| EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
|
|
|
| @@ -67,4 +83,79 @@ TEST_F(PowerEventObserverTest, LockBeforeSuspend) {
|
| EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
|
| }
|
|
|
| +TEST_F(PowerEventObserverTest, SetInvisibleBeforeSuspend) {
|
| + // Tests that all the Compositors are marked invisible before a suspend
|
| + // request when the screen is not supposed to be locked before a suspend.
|
| + EXPECT_EQ(1, GetNumVisibleCompositors());
|
| +
|
| + observer_->SuspendImminent();
|
| + EXPECT_EQ(0, GetNumVisibleCompositors());
|
| + observer_->SuspendDone(base::TimeDelta());
|
| +
|
| + // Tests that all the Compositors are marked invisible _after_ the screen lock
|
| + // animations have completed.
|
| + SetCanLockScreen(true);
|
| + SetShouldLockScreenBeforeSuspending(true);
|
| +
|
| + observer_->SuspendImminent();
|
| + EXPECT_EQ(1, GetNumVisibleCompositors());
|
| +
|
| + observer_->ScreenIsLocked();
|
| + EXPECT_EQ(1, GetNumVisibleCompositors());
|
| +
|
| + observer_->OnLockAnimationsComplete();
|
| + EXPECT_EQ(0, GetNumVisibleCompositors());
|
| +
|
| + observer_->SuspendDone(base::TimeDelta());
|
| + EXPECT_EQ(1, GetNumVisibleCompositors());
|
| +}
|
| +
|
| +TEST_F(PowerEventObserverTest, CanceledSuspend) {
|
| + // Tests that the Compositors are not marked invisible if a suspend is
|
| + // canceled or the system resumes before the lock screen is ready.
|
| + SetCanLockScreen(true);
|
| + SetShouldLockScreenBeforeSuspending(true);
|
| + observer_->SuspendImminent();
|
| + EXPECT_EQ(1, GetNumVisibleCompositors());
|
| +
|
| + observer_->SuspendDone(base::TimeDelta());
|
| + observer_->ScreenIsLocked();
|
| + observer_->OnLockAnimationsComplete();
|
| + EXPECT_EQ(1, GetNumVisibleCompositors());
|
| +}
|
| +
|
| +TEST_F(PowerEventObserverTest, DelayResuspendForLockAnimations) {
|
| + // Tests that the following order of events is handled correctly:
|
| + //
|
| + // - A suspend request is started.
|
| + // - The screen is locked.
|
| + // - The suspend request is canceled.
|
| + // - Another suspend request is started.
|
| + // - The screen lock animations complete.
|
| + //
|
| + // In this case, the observer should block the second suspend request until
|
| + // the animations have completed.
|
| + SetCanLockScreen(true);
|
| + SetShouldLockScreenBeforeSuspending(true);
|
| +
|
| + chromeos::PowerManagerClient* client =
|
| + chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
|
| + observer_->SuspendImminent();
|
| + EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
|
| +
|
| + observer_->ScreenIsLocked();
|
| + observer_->SuspendDone(base::TimeDelta());
|
| + observer_->SuspendImminent();
|
| +
|
| + // The expected number of suspend readiness callbacks is 2 because the
|
| + // observer has not run the callback that it got from the first suspend
|
| + // request. The real PowerManagerClient would reset its internal counter in
|
| + // this situation but the stub client is not that smart.
|
| + EXPECT_EQ(2, client->GetNumPendingSuspendReadinessCallbacks());
|
| +
|
| + observer_->OnLockAnimationsComplete();
|
| + EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
|
| + EXPECT_EQ(0, GetNumVisibleCompositors());
|
| +}
|
| +
|
| } // namespace ash
|
|
|