Chromium Code Reviews| Index: ash/metrics/desktop_task_switch_metric_recorder_unittest.cc |
| diff --git a/ash/metrics/desktop_task_switch_metric_recorder_unittest.cc b/ash/metrics/desktop_task_switch_metric_recorder_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..741407fc507dc8aa7355cda67cb9b187ed8e79e2 |
| --- /dev/null |
| +++ b/ash/metrics/desktop_task_switch_metric_recorder_unittest.cc |
| @@ -0,0 +1,338 @@ |
| +// Copyright 2015 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/metrics/desktop_task_switch_metric_recorder.h" |
| + |
| +#include "ash/shell.h" |
| +#include "ash/test/ash_test_base.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "base/test/user_action_tester.h" |
| +#include "ui/aura/test/test_window_delegate.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/compositor/layer_type.h" |
| +#include "ui/events/test/event_generator.h" |
| +#include "ui/wm/public/activation_client.h" |
| +#include "ui/wm/public/window_types.h" |
| + |
| +using aura::client::ActivationChangeObserver; |
| + |
| +namespace ash { |
| +namespace { |
| + |
| +const char kDesktopTaskSwitchUserAction[] = "Desktop_SwitchTask"; |
| + |
| +// Test fixture for the DesktopTaskSwitchMetricsRecorder class. NOTE: This |
| +// fixture extends AshTestBase so that the UserMetricsRecorder instance required |
| +// by the test target can be obtained through Shell::GetInstance()->metrics() |
| +// and the test target is not the same instance as the one owned by the |
| +// UserMetricsRecorder instance. |
| +class DesktopTaskSwitchMetricRecorderTest : public test::AshTestBase { |
| + public: |
| + DesktopTaskSwitchMetricRecorderTest(); |
| + ~DesktopTaskSwitchMetricRecorderTest() override; |
| + |
| + // test::AshTestBase: |
| + void SetUp() override; |
| + void TearDown() override; |
| + |
| + // Resets the recorded user action counts. |
| + void ResetActionCounts(); |
| + |
| + // Returns the number of times the "Desktop_SwitchTask" user action was |
| + // recorded. |
| + int GetActionCount() const; |
| + |
| + // Creates a positionable window such that wm::IsWindowUserPositionable(...) |
| + // would retun true. |
| + scoped_ptr<aura::Window> CreatePositionableWindow() const; |
| + |
| + // Creates a non-positionable window such that |
| + // wm::IsWindowUserPositionable(...) would retun false. |
| + scoped_ptr<aura::Window> CreateNonPositionableWindow() const; |
| + |
| + // Wrapper to notify the test target's OnWindowActivated(...) method that |
| + // |window| was activated due to an INPUT_EVENT. |
| + void ActiveTaskWindowWithUserInput(aura::Window* window); |
| + |
| + protected: |
| + // Records UMA user action counts. |
| + scoped_ptr<base::UserActionTester> user_action_tester_; |
| + |
| + // The test target. |
| + scoped_ptr<DesktopTaskSwitchMetricRecorder> metrics_recorder_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(DesktopTaskSwitchMetricRecorderTest); |
| +}; |
| + |
| +DesktopTaskSwitchMetricRecorderTest::DesktopTaskSwitchMetricRecorderTest() { |
| +} |
| + |
| +DesktopTaskSwitchMetricRecorderTest::~DesktopTaskSwitchMetricRecorderTest() { |
| +} |
| + |
| +void DesktopTaskSwitchMetricRecorderTest::SetUp() { |
| + test::AshTestBase::SetUp(); |
| + metrics_recorder_.reset(new DesktopTaskSwitchMetricRecorder); |
| + user_action_tester_.reset(new base::UserActionTester); |
| +} |
| + |
| +void DesktopTaskSwitchMetricRecorderTest::TearDown() { |
| + user_action_tester_.reset(); |
| + metrics_recorder_.reset(); |
| + test::AshTestBase::TearDown(); |
| +} |
| + |
| +void DesktopTaskSwitchMetricRecorderTest::ActiveTaskWindowWithUserInput( |
| + aura::Window* window) { |
| + metrics_recorder_->OnWindowActivated( |
| + ActivationChangeObserver::ActivationReason::INPUT_EVENT, window, nullptr); |
| +} |
| + |
| +void DesktopTaskSwitchMetricRecorderTest::ResetActionCounts() { |
| + user_action_tester_->ResetCounts(); |
| +} |
| + |
| +int DesktopTaskSwitchMetricRecorderTest::GetActionCount() const { |
| + return user_action_tester_->GetActionCount(kDesktopTaskSwitchUserAction); |
| +} |
| + |
| +scoped_ptr<aura::Window> |
| +DesktopTaskSwitchMetricRecorderTest::CreatePositionableWindow() const { |
| + scoped_ptr<aura::Window> window( |
| + new aura::Window(new aura::test::TestWindowDelegate)); |
|
Jeffrey Yasskin
2015/06/05 22:53:51
aura::Window doesn't appear to take ownership of i
|
| + window->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
| + window->Init(ui::LAYER_NOT_DRAWN); |
| + return window.Pass(); |
| +} |
| + |
| +scoped_ptr<aura::Window> |
| +DesktopTaskSwitchMetricRecorderTest::CreateNonPositionableWindow() const { |
| + scoped_ptr<aura::Window> window( |
| + new aura::Window(new aura::test::TestWindowDelegate)); |
| + window->SetType(ui::wm::WINDOW_TYPE_UNKNOWN); |
| + window->Init(ui::LAYER_NOT_DRAWN); |
| + return window.Pass(); |
| +} |
| + |
| +// Verify user action is recorded when a positionable window is activated given |
| +// that a null window was activated last. |
| +TEST_F(DesktopTaskSwitchMetricRecorderTest, |
| + ActivatePositionableWindowWhenNullWindowWasActivatedLast) { |
| + scoped_ptr<aura::Window> null_window; |
| + scoped_ptr<aura::Window> positionable_window = |
| + CreatePositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(null_window.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + EXPECT_EQ(1, GetActionCount()); |
| +} |
| + |
| +// Verify user action is recorded whena positionable window is activated given |
| +// a different positionable window was activated last. |
| +TEST_F( |
| + DesktopTaskSwitchMetricRecorderTest, |
| + ActivatePositionableWindowWhenADifferentPositionableWindowWasActivatedLast) { |
| + scoped_ptr<aura::Window> positionable_window_1 = |
| + CreatePositionableWindow().Pass(); |
| + scoped_ptr<aura::Window> positionable_window_2 = |
| + CreatePositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window_1.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window_2.get()); |
| + EXPECT_EQ(1, GetActionCount()); |
| +} |
| + |
| +// Verify user action is not recorded when a positionable window is activated |
| +// given the same positionable window was activated last. |
| +TEST_F( |
| + DesktopTaskSwitchMetricRecorderTest, |
| + ActivatePositionableWindowWhenTheSamePositionableWindowWasActivatedLast) { |
| + scoped_ptr<aura::Window> positionable_window = |
| + CreatePositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + EXPECT_EQ(0, GetActionCount()); |
| +} |
| + |
| +// Verify user action is recorded when a positionable window is activated given |
| +// a non-positionable window was activated last. |
| +TEST_F(DesktopTaskSwitchMetricRecorderTest, |
| + ActivatePositionableWindowWhenANonPositionableWindowWasActivatedLast) { |
| + scoped_ptr<aura::Window> non_positionable_window = |
| + CreateNonPositionableWindow().Pass(); |
| + scoped_ptr<aura::Window> positionable_window = |
| + CreatePositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(non_positionable_window.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + EXPECT_EQ(1, GetActionCount()); |
| +} |
| + |
| +// Verify user action is not recorded when a non-positionable window is |
| +// activated between two activations of the same positionable window. |
| +TEST_F(DesktopTaskSwitchMetricRecorderTest, |
| + ActivateNonPositionableWindowBetweenTwoPositionableWindowActivations) { |
| + scoped_ptr<aura::Window> positionable_window = |
| + CreatePositionableWindow().Pass(); |
| + scoped_ptr<aura::Window> non_positionable_window = |
| + CreateNonPositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(non_positionable_window.get()); |
| + EXPECT_EQ(0, GetActionCount()); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + EXPECT_EQ(0, GetActionCount()); |
| +} |
| + |
| +// Verify user action is not recorded when a null window is activated. |
| +TEST_F(DesktopTaskSwitchMetricRecorderTest, ActivateNullWindow) { |
| + scoped_ptr<aura::Window> positionable_window = |
| + CreatePositionableWindow().Pass(); |
| + scoped_ptr<aura::Window> null_window = nullptr; |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(null_window.get()); |
| + EXPECT_EQ(0, GetActionCount()); |
| +} |
| + |
| +// Verify user action is not recorded when a non-positionable window is |
| +// activated. |
| +TEST_F(DesktopTaskSwitchMetricRecorderTest, ActivateNonPositionableWindow) { |
| + scoped_ptr<aura::Window> positionable_window = |
| + CreatePositionableWindow().Pass(); |
| + scoped_ptr<aura::Window> non_positionable_window = |
| + CreateNonPositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window.get()); |
| + ResetActionCounts(); |
| + |
| + ActiveTaskWindowWithUserInput(non_positionable_window.get()); |
| + EXPECT_EQ(0, GetActionCount()); |
| +} |
| + |
| +// Verify user action is not recorded when the ActivationReason is not an |
| +// INPUT_EVENT. |
| +TEST_F(DesktopTaskSwitchMetricRecorderTest, |
| + ActivatePositionableWindowWithNonInputEventReason) { |
| + scoped_ptr<aura::Window> positionable_window_1 = |
| + CreatePositionableWindow().Pass(); |
| + scoped_ptr<aura::Window> positionable_window_2 = |
| + CreatePositionableWindow().Pass(); |
| + |
| + ActiveTaskWindowWithUserInput(positionable_window_1.get()); |
| + ResetActionCounts(); |
| + |
| + metrics_recorder_->OnWindowActivated( |
| + ActivationChangeObserver::ActivationReason::ACTIVATION_CLIENT, |
| + positionable_window_2.get(), nullptr); |
| + EXPECT_EQ(0, GetActionCount()); |
| +} |
| + |
| +// Test fixture to test the integration of the DesktopTaskSwitchMetricsRecorder |
| +// class with ash::Shell environment. |
| +class DesktopTaskSwitchMetricRecorderWithShellIntegrationTest |
| + : public test::AshTestBase { |
| + public: |
| + DesktopTaskSwitchMetricRecorderWithShellIntegrationTest(); |
| + ~DesktopTaskSwitchMetricRecorderWithShellIntegrationTest() override; |
| + |
| + // test::AshTestBase: |
| + void SetUp() override; |
| + void TearDown() override; |
| + |
| + // Returns the number of times the "Desktop_SwitchTask" user action was |
| + // recorded. |
| + int GetActionCount() const; |
| + |
| + // Creates a positionable window with the given |bounds| such that |
| + // wm::IsWindowUserPositionable(...) would retun true. |
| + aura::Window* CreatePositionableWindowInShellWithBounds( |
| + const gfx::Rect& bounds); |
| + |
| + protected: |
| + // Records UMA user action counts. |
| + scoped_ptr<base::UserActionTester> user_action_tester_; |
| + |
| + // Delegate used when creating new windows using the |
| + // CreatePositionableWindowInShellWithBounds(...) method. |
| + aura::test::TestWindowDelegate test_window_delegate_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN( |
| + DesktopTaskSwitchMetricRecorderWithShellIntegrationTest); |
| +}; |
| + |
| +DesktopTaskSwitchMetricRecorderWithShellIntegrationTest:: |
| + DesktopTaskSwitchMetricRecorderWithShellIntegrationTest() { |
| +} |
| + |
| +DesktopTaskSwitchMetricRecorderWithShellIntegrationTest:: |
| + ~DesktopTaskSwitchMetricRecorderWithShellIntegrationTest() { |
| +} |
| + |
| +void DesktopTaskSwitchMetricRecorderWithShellIntegrationTest::SetUp() { |
| + test::AshTestBase::SetUp(); |
| + user_action_tester_.reset(new base::UserActionTester); |
| +} |
| + |
| +void DesktopTaskSwitchMetricRecorderWithShellIntegrationTest::TearDown() { |
| + user_action_tester_.reset(); |
| + test::AshTestBase::TearDown(); |
| +} |
| + |
| +int DesktopTaskSwitchMetricRecorderWithShellIntegrationTest::GetActionCount() |
| + const { |
| + return user_action_tester_->GetActionCount(kDesktopTaskSwitchUserAction); |
| +} |
| + |
| +aura::Window* DesktopTaskSwitchMetricRecorderWithShellIntegrationTest:: |
| + CreatePositionableWindowInShellWithBounds(const gfx::Rect& bounds) { |
| + return CreateTestWindowInShellWithDelegate(&test_window_delegate_, 0, bounds); |
| +} |
| + |
| +// Verify a user action is recorded when a positionable window is activated by |
| +// a INPUT_EVENT. |
| +TEST_F(DesktopTaskSwitchMetricRecorderWithShellIntegrationTest, |
| + ActivatePositionableWindowWithInputEvent) { |
| + aura::Window* positionable_window = |
| + CreatePositionableWindowInShellWithBounds(gfx::Rect(0, 0, 10, 10)); |
| + |
| + ui::test::EventGenerator event_generator(Shell::GetPrimaryRootWindow()); |
| + |
| + event_generator.MoveMouseToCenterOf(positionable_window); |
| + event_generator.ClickLeftButton(); |
| + |
| + EXPECT_EQ(1, GetActionCount()); |
| +} |
| + |
| +// Verify a user action is not recorded when a positionable window is activated |
| +// by a non INPUT_EVENT. |
| +TEST_F(DesktopTaskSwitchMetricRecorderWithShellIntegrationTest, |
| + ActivatePositionableWindowWithNonInputEvent) { |
| + aura::Window* positionable_window = |
| + CreatePositionableWindowInShellWithBounds(gfx::Rect(0, 0, 10, 10)); |
| + |
| + Shell::GetInstance()->activation_client()->ActivateWindow( |
| + positionable_window); |
| + |
| + EXPECT_EQ(0, GetActionCount()); |
| +} |
| + |
| +} // namespace |
| +} // namespace ash |