xref: /aosp_15_r20/external/cronet/base/test/metrics/user_action_tester_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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