blob: f9d59444327c1904f4d185d1ddb56f2188c69650 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/touch_selection/touch_selection_metrics.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/types/event_type.h"
namespace ui {
namespace {
TEST(TouchSelectionSessionMetricsTest, RecordsSuccessfulCursorSession) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
// Activate cursor, then end session successfully with a menu command.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnCursorActivationEvent();
session_metrics_recorder.OnMenuCommand(true);
histogram_tester.ExpectUniqueSample(
kTouchCursorSessionTouchDownCountHistogramName, 1, 1);
}
TEST(TouchSelectionSessionMetricsTest, RecordsSuccessfulSelectionSession) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
// Activate selection, then end session successfully with a menu command.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
session_metrics_recorder.OnMenuCommand(true);
histogram_tester.ExpectUniqueSample(
kTouchSelectionSessionTouchDownCountHistogramName, 1, 1);
}
TEST(TouchSelectionSessionMetricsTest, DoesNotRecordDismissedSession) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
// Activate selection, then dismiss session.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
session_metrics_recorder.ResetMetrics();
histogram_tester.ExpectTotalCount(
kTouchSelectionSessionTouchDownCountHistogramName, 0);
}
TEST(TouchSelectionSessionMetricsTest, MultipleSessions) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
// Activate, then end session successfully with a menu command.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
session_metrics_recorder.OnMenuCommand(true);
// Activate, then dismiss session.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
session_metrics_recorder.ResetMetrics();
// Activate, then end another session successfully.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnMenuCommand(true);
histogram_tester.ExpectTotalCount(
kTouchSelectionSessionTouchDownCountHistogramName, 2);
// First session.
histogram_tester.ExpectBucketCount(
kTouchSelectionSessionTouchDownCountHistogramName, 1, 1);
// Third session.
histogram_tester.ExpectBucketCount(
kTouchSelectionSessionTouchDownCountHistogramName, 2, 1);
}
TEST(TouchSelectionSessionMetricsTest, MultipleActivationEvents) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
// Activate cursor.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnCursorActivationEvent();
// Activate selection within the same session.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
// Perform some touch events.
session_metrics_recorder.OnTouchEvent(false);
session_metrics_recorder.OnTouchEvent(true);
// End session successfully with a menu command.
session_metrics_recorder.OnMenuCommand(true);
// Selection session metrics should be recorded, since there was an active
// selection when the session ended.
histogram_tester.ExpectUniqueSample(
kTouchSelectionSessionTouchDownCountHistogramName, 3, 1);
}
TEST(TouchSelectionSessionMetricsTest, RecordsAfterCharacterKeyEvent) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
// Activate cursor.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnCursorActivationEvent();
// End session successfully by typing a character key.
const KeyEvent key_event(ET_KEY_PRESSED, VKEY_A, DomCode::US_A, EF_NONE,
DomKey::FromCharacter('a'), EventTimeForNow());
session_metrics_recorder.OnSessionEndEvent(key_event);
histogram_tester.ExpectUniqueSample(
kTouchCursorSessionTouchDownCountHistogramName, 1, 1);
}
TEST(TouchSelectionSessionMetricsTest, DoesNotRecordTimedOutSession) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
base::test::TaskEnvironment task_environment(
base::test::TaskEnvironment::TimeSource::MOCK_TIME);
// Activate selection.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
// Time out the session.
task_environment.FastForwardBy(base::Seconds(50));
session_metrics_recorder.OnMenuCommand(true);
// The session timed out and wasn't activated again, so we don't record touch
// down count metrics.
histogram_tester.ExpectTotalCount(
kTouchSelectionSessionTouchDownCountHistogramName, 0);
}
TEST(TouchSelectionSessionMetricsTest, ActivationAfterTimeOut) {
base::HistogramTester histogram_tester;
TouchSelectionSessionMetricsRecorder session_metrics_recorder;
base::test::TaskEnvironment task_environment(
base::test::TaskEnvironment::TimeSource::MOCK_TIME);
// Activate selection.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
// Time out the session.
task_environment.FastForwardBy(base::Seconds(50));
// Activate selection again.
session_metrics_recorder.OnTouchEvent(true);
session_metrics_recorder.OnSelectionActivationEvent();
session_metrics_recorder.OnMenuCommand(true);
// Metrics should be recorded for the selection session that started from the
// activation event after the timeout.
histogram_tester.ExpectUniqueSample(
kTouchSelectionSessionTouchDownCountHistogramName, 1, 1);
}
} // namespace
} // namespace ui