1 // Copyright 2015 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/test/metrics/user_action_tester.h"
6
7 #include "base/metrics/user_metrics.h"
8 #include "base/metrics/user_metrics_action.h"
9 #include "base/test/scoped_mock_clock_override.h"
10 #include "base/time/time.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using ::testing::UnorderedElementsAre;
15
16 namespace base {
17
18 namespace {
19
20 const char kUserAction1[] = "user.action.1";
21 const char kUserAction2[] = "user.action.2";
22 const char kUserAction3[] = "user.action.3";
23
24 // Record an action and cause all ActionCallback observers to be notified.
RecordAction(const char user_action[])25 void RecordAction(const char user_action[]) {
26 base::RecordAction(base::UserMetricsAction(user_action));
27 }
28
29 } // namespace
30
31 // Verify user action counts are zero initially.
TEST(UserActionTesterTest,GetActionCountWhenNoActionsHaveBeenRecorded)32 TEST(UserActionTesterTest, GetActionCountWhenNoActionsHaveBeenRecorded) {
33 UserActionTester user_action_tester;
34 EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction1));
35 }
36
37 // Verify user action counts are zero initially.
TEST(UserActionTesterTest,GetActionTimesWhenNoActionsHaveBeenRecorded)38 TEST(UserActionTesterTest, GetActionTimesWhenNoActionsHaveBeenRecorded) {
39 UserActionTester user_action_tester;
40 EXPECT_TRUE(user_action_tester.GetActionTimes(kUserAction1).empty());
41 }
42
43 // Verify user action counts are tracked properly.
TEST(UserActionTesterTest,GetActionCountWhenActionsHaveBeenRecorded)44 TEST(UserActionTesterTest, GetActionCountWhenActionsHaveBeenRecorded) {
45 UserActionTester user_action_tester;
46
47 RecordAction(kUserAction1);
48 RecordAction(kUserAction2);
49 RecordAction(kUserAction2);
50
51 EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
52 EXPECT_EQ(2, user_action_tester.GetActionCount(kUserAction2));
53 EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction3));
54 }
55
56 // Verify user action times are tracked properly.
TEST(UserActionTesterTest,GetActionTimesWhenActionsHaveBeenRecorded)57 TEST(UserActionTesterTest, GetActionTimesWhenActionsHaveBeenRecorded) {
58 ScopedMockClockOverride clock;
59 UserActionTester user_action_tester;
60
61 TimeTicks t1 = TimeTicks::Now();
62 RecordAction(kUserAction1);
63 clock.Advance(Minutes(10));
64
65 TimeTicks t2 = TimeTicks::Now();
66 RecordAction(kUserAction2);
67 clock.Advance(Minutes(20));
68
69 TimeTicks t3 = TimeTicks::Now();
70 RecordAction(kUserAction3);
71
72 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction1),
73 UnorderedElementsAre(t1));
74 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction2),
75 UnorderedElementsAre(t2));
76 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction3),
77 UnorderedElementsAre(t3));
78 }
79
80 // Verify no seg faults occur when resetting action counts when none have been
81 // recorded.
TEST(UserActionTesterTest,ResetCountsWhenNoActionsHaveBeenRecorded)82 TEST(UserActionTesterTest, ResetCountsWhenNoActionsHaveBeenRecorded) {
83 UserActionTester user_action_tester;
84 user_action_tester.ResetCounts();
85 }
86
87 // Verify user action counts are set to zero on a ResetCounts.
TEST(UserActionTesterTest,ResetCountsWhenActionsHaveBeenRecorded)88 TEST(UserActionTesterTest, ResetCountsWhenActionsHaveBeenRecorded) {
89 UserActionTester user_action_tester;
90
91 RecordAction(kUserAction1);
92 RecordAction(kUserAction1);
93 RecordAction(kUserAction2);
94 user_action_tester.ResetCounts();
95
96 EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction1));
97 EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction2));
98 EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction3));
99 }
100
101 // Verify user action times are cleared on a ResetCounts.
TEST(UserActionTesterTest,ResetTimesWhenActionsHaveBeenRecorded)102 TEST(UserActionTesterTest, ResetTimesWhenActionsHaveBeenRecorded) {
103 UserActionTester user_action_tester;
104
105 RecordAction(kUserAction1);
106 RecordAction(kUserAction1);
107 RecordAction(kUserAction2);
108 user_action_tester.ResetCounts();
109
110 EXPECT_TRUE(user_action_tester.GetActionTimes(kUserAction1).empty());
111 EXPECT_TRUE(user_action_tester.GetActionTimes(kUserAction2).empty());
112 EXPECT_TRUE(user_action_tester.GetActionTimes(kUserAction3).empty());
113 }
114
115 // Verify the UserActionsTester is notified when base::RecordAction is called.
TEST(UserActionTesterTest,VerifyUserActionTesterListensForUserActions)116 TEST(UserActionTesterTest, VerifyUserActionTesterListensForUserActions) {
117 ScopedMockClockOverride clock;
118 UserActionTester user_action_tester;
119
120 TimeTicks time = TimeTicks::Now();
121 base::RecordAction(base::UserMetricsAction(kUserAction1));
122
123 EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
124 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction1),
125 UnorderedElementsAre(time));
126 }
127
128 // Verify the UserActionsTester is notified when base::RecordComputedAction is
129 // called.
TEST(UserActionTesterTest,VerifyUserActionTesterListensForComputedUserActions)130 TEST(UserActionTesterTest,
131 VerifyUserActionTesterListensForComputedUserActions) {
132 ScopedMockClockOverride clock;
133 UserActionTester user_action_tester;
134
135 TimeTicks time = TimeTicks::Now();
136 base::RecordComputedAction(kUserAction1);
137
138 EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
139 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction1),
140 UnorderedElementsAre(time));
141 }
142
143 // Verify the UserActionsTester is notified when base::RecordComputedActionAt is
144 // called.
TEST(UserActionTesterTest,VerifyUserActionTesterListensForComputedUserActionAt)145 TEST(UserActionTesterTest,
146 VerifyUserActionTesterListensForComputedUserActionAt) {
147 UserActionTester user_action_tester;
148
149 TimeTicks time = TimeTicks::Now() - Minutes(10);
150 base::RecordComputedActionAt(kUserAction1, time);
151
152 EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
153 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction1),
154 UnorderedElementsAre(time));
155 }
156
157 // Verify the UserActionsTester is notified when base::RecordComputedActionSince
158 // is called.
TEST(UserActionTesterTest,VerifyUserActionTesterListensForComputedUserActionSince)159 TEST(UserActionTesterTest,
160 VerifyUserActionTesterListensForComputedUserActionSince) {
161 ScopedMockClockOverride clock;
162 UserActionTester user_action_tester;
163
164 TimeTicks time = TimeTicks::Now();
165 base::RecordComputedActionSince(kUserAction1, Minutes(20));
166 TimeTicks expected_time = time - Minutes(20);
167
168 EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
169 EXPECT_THAT(user_action_tester.GetActionTimes(kUserAction1),
170 UnorderedElementsAre(expected_time));
171 }
172
173 } // namespace base
174