| 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..fe38f276ad7592340435332e113208a1ee4171ab
|
| --- /dev/null
|
| +++ b/ash/metrics/desktop_task_switch_metric_recorder_unittest.cc
|
| @@ -0,0 +1,335 @@
|
| +// 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/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));
|
| + window->SetType(ui::wm::WINDOW_TYPE_NORMAL);
|
| + 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);
|
| + 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
|
|
|