Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(484)

Unified Diff: ash/wm/power_button_controller_unittest.cc

Issue 8976012: chromeos: Implement power button animations for Aura. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update copyright year to 2012 Created 8 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/wm/power_button_controller.cc ('k') | ash/wm/shadow_controller.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/power_button_controller_unittest.cc
diff --git a/ash/wm/power_button_controller_unittest.cc b/ash/wm/power_button_controller_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..85ff5aa3f1d7d4efc452cef2f8c605c53e3af230
--- /dev/null
+++ b/ash/wm/power_button_controller_unittest.cc
@@ -0,0 +1,276 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/wm/power_button_controller.h"
+
+#include "ash/shell.h"
+#include "ash/test/aura_shell_test_base.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/time.h"
+#include "ui/aura/root_window.h"
+
+namespace ash {
+namespace test {
+
+// Fake implementation of PowerButtonControllerDelegate that just logs requests
+// to lock the screen and shut down the device.
+class TestPowerButtonControllerDelegate : public PowerButtonControllerDelegate {
+ public:
+ TestPowerButtonControllerDelegate()
+ : num_lock_requests_(0),
+ num_shutdown_requests_(0) {}
+
+ int num_lock_requests() const { return num_lock_requests_; }
+ int num_shutdown_requests() const { return num_shutdown_requests_; }
+
+ // PowerButtonControllerDelegate implementation.
+ virtual void RequestLockScreen() OVERRIDE {
+ num_lock_requests_++;
+ }
+ virtual void RequestShutdown() OVERRIDE {
+ num_shutdown_requests_++;
+ }
+
+ private:
+ int num_lock_requests_;
+ int num_shutdown_requests_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestPowerButtonControllerDelegate);
+};
+
+class PowerButtonControllerTest : public AuraShellTestBase {
+ public:
+ PowerButtonControllerTest() : controller_(NULL), delegate_(NULL) {}
+ virtual ~PowerButtonControllerTest() {}
+
+ void SetUp() OVERRIDE {
+ AuraShellTestBase::SetUp();
+ delegate_ = new TestPowerButtonControllerDelegate;
+ controller_ = Shell::GetInstance()->power_button_controller();
+ controller_->set_delegate(delegate_); // transfers ownership
+ test_api_.reset(new PowerButtonController::TestApi(controller_));
+ }
+
+ protected:
+ PowerButtonController* controller_; // not owned
+ TestPowerButtonControllerDelegate* delegate_; // not owned
+ scoped_ptr<PowerButtonController::TestApi> test_api_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PowerButtonControllerTest);
+};
+
+// When we hold the power button while the user isn't logged in, we should shut
+// down the machine directly.
+TEST_F(PowerButtonControllerTest, ShutdownWhenNotLoggedIn) {
+ controller_->OnLoginStateChange(false /*logged_in*/, false /*is_guest*/);
+ controller_->OnLockStateChange(false);
+ EXPECT_FALSE(test_api_->BackgroundLayerIsVisible());
+
+ // Press the power button and check that we start the shutdown timer.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_FALSE(test_api_->lock_timer_is_running());
+ EXPECT_TRUE(test_api_->shutdown_timer_is_running());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_CONTAINERS,
+ PowerButtonController::ANIMATION_SLOW_CLOSE));
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+
+ // Release the power button before the shutdown timer fires.
+ controller_->OnPowerButtonEvent(false, base::TimeTicks::Now());
+ EXPECT_FALSE(test_api_->shutdown_timer_is_running());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_CONTAINERS,
+ PowerButtonController::ANIMATION_UNDO_SLOW_CLOSE));
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+
+ // We should re-hide the black background layer after waiting long enough for
+ // the animation to finish.
+ EXPECT_TRUE(test_api_->hide_background_layer_timer_is_running());
+ test_api_->trigger_hide_background_layer_timeout();
+ EXPECT_FALSE(test_api_->BackgroundLayerIsVisible());
+
+ // Press the button again and make the shutdown timeout fire this time.
+ // Check that we start the timer for actually requesting the shutdown.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_TRUE(test_api_->shutdown_timer_is_running());
+ test_api_->trigger_shutdown_timeout();
+ EXPECT_TRUE(test_api_->real_shutdown_timer_is_running());
+ EXPECT_EQ(0, delegate_->num_shutdown_requests());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_CONTAINERS,
+ PowerButtonController::ANIMATION_FAST_CLOSE));
+
+ // When the timout fires, we should request a shutdown.
+ test_api_->trigger_real_shutdown_timeout();
+ EXPECT_EQ(1, delegate_->num_shutdown_requests());
+}
+
+// Test that we lock the screen and deal with unlocking correctly.
+TEST_F(PowerButtonControllerTest, LockAndUnlock) {
+ controller_->OnLoginStateChange(true /*logged_in*/, false /*is_guest*/);
+ controller_->OnLockStateChange(false);
+ EXPECT_FALSE(test_api_->BackgroundLayerIsVisible());
+
+ // We should initially be showing the screen locker containers, since they
+ // also contain login-related windows that we want to show during the
+ // logging-in animation.
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::SCREEN_LOCKER_CONTAINERS,
+ PowerButtonController::ANIMATION_RESTORE));
+
+ // Press the power button and check that the lock timer is started and that we
+ // start scaling the non-screen-locker containers.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_TRUE(test_api_->lock_timer_is_running());
+ EXPECT_FALSE(test_api_->shutdown_timer_is_running());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_SLOW_CLOSE));
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+
+ // Release the button before the lock timer fires.
+ controller_->OnPowerButtonEvent(false, base::TimeTicks::Now());
+ EXPECT_FALSE(test_api_->lock_timer_is_running());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_UNDO_SLOW_CLOSE));
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+ EXPECT_TRUE(test_api_->hide_background_layer_timer_is_running());
+ test_api_->trigger_hide_background_layer_timeout();
+ EXPECT_FALSE(test_api_->BackgroundLayerIsVisible());
+
+ // Press the button and fire the lock timer. We should request that the
+ // screen be locked, but we should still be in the slow-close animation.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_TRUE(test_api_->lock_timer_is_running());
+ EXPECT_EQ(0, delegate_->num_lock_requests());
+ test_api_->trigger_lock_timeout();
+ EXPECT_EQ(1, delegate_->num_lock_requests());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_SLOW_CLOSE));
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+
+ // Notify that we locked successfully.
+ controller_->OnStartingLock();
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_FAST_CLOSE));
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::SCREEN_LOCKER_CONTAINERS,
+ PowerButtonController::ANIMATION_HIDE));
+
+ // Notify that the lock window is visible. We should make it fade in.
+ controller_->OnLockStateChange(true);
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_FADE_IN));
+
+ // When we release the power button, the lock-to-shutdown timer should be
+ // stopped.
+ EXPECT_TRUE(test_api_->lock_to_shutdown_timer_is_running());
+ controller_->OnPowerButtonEvent(false, base::TimeTicks::Now());
+ EXPECT_FALSE(test_api_->lock_to_shutdown_timer_is_running());
+
+ // Notify that the screen has been unlocked. We should show the
+ // non-screen-locker windows and hide the background layer.
+ controller_->OnLockStateChange(false);
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_RESTORE));
+ EXPECT_FALSE(test_api_->BackgroundLayerIsVisible());
+}
+
+// Hold the power button down from the unlocked state to eventual shutdown.
+TEST_F(PowerButtonControllerTest, LockToShutdown) {
+ controller_->OnLoginStateChange(true /*logged_in*/, false /*is_guest*/);
+ controller_->OnLockStateChange(false);
+
+ // Hold the power button and lock the screen.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_TRUE(test_api_->lock_timer_is_running());
+ test_api_->trigger_lock_timeout();
+ controller_->OnStartingLock();
+ controller_->OnLockStateChange(true);
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+
+ // When the lock-to-shutdown timeout fires, we should start the shutdown
+ // timer.
+ EXPECT_TRUE(test_api_->lock_to_shutdown_timer_is_running());
+ test_api_->trigger_lock_to_shutdown_timeout();
+ EXPECT_TRUE(test_api_->shutdown_timer_is_running());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_CONTAINERS,
+ PowerButtonController::ANIMATION_SLOW_CLOSE));
+
+ // Fire the shutdown timeout and check that we request shutdown.
+ test_api_->trigger_shutdown_timeout();
+ EXPECT_TRUE(test_api_->real_shutdown_timer_is_running());
+ EXPECT_EQ(0, delegate_->num_shutdown_requests());
+ test_api_->trigger_real_shutdown_timeout();
+ EXPECT_EQ(1, delegate_->num_shutdown_requests());
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+}
+
+// Test that we handle the case where lock requests are ignored.
+TEST_F(PowerButtonControllerTest, LockFail) {
+ controller_->OnLoginStateChange(true /*logged_in*/, false /*is_guest*/);
+ controller_->OnLockStateChange(false);
+
+ // Hold the power button and lock the screen.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_TRUE(test_api_->lock_timer_is_running());
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_RESTORE));
+ EXPECT_TRUE(test_api_->BackgroundLayerIsVisible());
+ test_api_->trigger_lock_timeout();
+ EXPECT_EQ(1, delegate_->num_lock_requests());
+ EXPECT_TRUE(test_api_->lock_fail_timer_is_running());
+
+ // We shouldn't start the lock-to-shutdown timer until the screen has actually
+ // been locked.
+ EXPECT_FALSE(test_api_->lock_to_shutdown_timer_is_running());
+
+ // Act as if the request timed out. We should restore the windows.
+ test_api_->trigger_lock_fail_timeout();
+ EXPECT_TRUE(
+ test_api_->ContainerGroupIsAnimated(
+ PowerButtonController::ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
+ PowerButtonController::ANIMATION_RESTORE));
+ EXPECT_FALSE(test_api_->BackgroundLayerIsVisible());
+}
+
+// Test that we start the timer to hide the background layer when the power
+// button is released, but that we cancel the timer if the button is pressed
+// again before the timer has fired.
+TEST_F(PowerButtonControllerTest, CancelHideBackground) {
+ controller_->OnLoginStateChange(false /*logged_in*/, false /*is_guest*/);
+ controller_->OnLockStateChange(false);
+
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ controller_->OnPowerButtonEvent(false, base::TimeTicks::Now());
+ EXPECT_TRUE(test_api_->hide_background_layer_timer_is_running());
+
+ // We should cancel the timer if we get another button-down event.
+ controller_->OnPowerButtonEvent(true, base::TimeTicks::Now());
+ EXPECT_FALSE(test_api_->hide_background_layer_timer_is_running());
+}
+
+} // namespace test
+} // namespace ash
« no previous file with comments | « ash/wm/power_button_controller.cc ('k') | ash/wm/shadow_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698