Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(427)

Side by Side Diff: chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc

Issue 2385103003: [DesktopSessionDurationTracker] Remove visibility-switch timeout from session length. (Closed)
Patch Set: Fix unittest. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/metrics/desktop_session_duration/desktop_session_durati on_tracker.h" 5 #include "chrome/browser/metrics/desktop_session_duration/desktop_session_durati on_tracker.h"
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/test/histogram_tester.h" 9 #include "base/test/histogram_tester.h"
10 #include "base/test/test_mock_time_task_runner.h" 10 #include "base/test/test_mock_time_task_runner.h"
11 #include "base/threading/platform_thread.h"
11 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
12 13
14 namespace {
15
16 const base::TimeDelta kZeroTime = base::TimeDelta::FromSeconds(0);
17
18 } // namespace
19
13 // Mock class for |DesktopSessionDurationTracker| for testing. 20 // Mock class for |DesktopSessionDurationTracker| for testing.
14 class MockDesktopSessionDurationTracker 21 class MockDesktopSessionDurationTracker
15 : public metrics::DesktopSessionDurationTracker { 22 : public metrics::DesktopSessionDurationTracker {
16 public: 23 public:
17 MockDesktopSessionDurationTracker() {} 24 MockDesktopSessionDurationTracker() {}
18 25
19 bool is_timeout() const { return time_out_; } 26 bool is_timeout() const { return time_out_; }
20 27
21 using metrics::DesktopSessionDurationTracker::OnAudioStart; 28 using metrics::DesktopSessionDurationTracker::OnAudioStart;
22 using metrics::DesktopSessionDurationTracker::OnAudioEnd; 29 using metrics::DesktopSessionDurationTracker::OnAudioEnd;
23 30
24 protected: 31 protected:
25 void OnTimerFired() override { 32 void OnTimerFired() override {
26 DesktopSessionDurationTracker::OnTimerFired(); 33 DesktopSessionDurationTracker::OnTimerFired();
27 time_out_ = true; 34 time_out_ = true;
28 } 35 }
29 36
30 private: 37 private:
31 bool time_out_ = false; 38 bool time_out_ = false;
32 39
33 DISALLOW_COPY_AND_ASSIGN(MockDesktopSessionDurationTracker); 40 DISALLOW_COPY_AND_ASSIGN(MockDesktopSessionDurationTracker);
34 }; 41 };
35 42
36 TEST(DesktopSessionDurationTrackerTest, TestVisibility) { 43 class DesktopSessionDurationTrackerTest : public testing::Test {
37 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 44 public:
38 base::HistogramTester histogram_tester; 45 DesktopSessionDurationTrackerTest()
46 : loop_(base::MessageLoop::TYPE_DEFAULT) {}
39 47
40 MockDesktopSessionDurationTracker instance; 48 void ExpectTotalDuration(base::TimeDelta duration) {
49 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
50 base::Bucket bucket =
51 histogram_tester_.GetAllSamples("Session.TotalDuration")[0];
52 int max_expected_value = duration.InMilliseconds();
53 EXPECT_LE(bucket.min, max_expected_value);
54 }
41 55
56 base::MessageLoop loop_;
Alexei Svitkine (slow) 2016/10/03 18:38:49 Nit: For things not used directly in the tests, pu
57 base::HistogramTester histogram_tester_;
58 MockDesktopSessionDurationTracker instance_;
59 };
60
61 TEST_F(DesktopSessionDurationTrackerTest, TestVisibility) {
42 // The browser becomes visible but it shouldn't start the session. 62 // The browser becomes visible but it shouldn't start the session.
43 instance.OnVisibilityChanged(true); 63 instance_.OnVisibilityChanged(true, kZeroTime);
44 EXPECT_FALSE(instance.in_session()); 64 EXPECT_FALSE(instance_.in_session());
45 EXPECT_TRUE(instance.is_visible()); 65 EXPECT_TRUE(instance_.is_visible());
46 EXPECT_FALSE(instance.is_audio_playing()); 66 EXPECT_FALSE(instance_.is_audio_playing());
47 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0); 67 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
48 68
49 instance.OnUserEvent(); 69 instance_.OnUserEvent();
50 EXPECT_TRUE(instance.in_session()); 70 EXPECT_TRUE(instance_.in_session());
51 EXPECT_TRUE(instance.is_visible()); 71 EXPECT_TRUE(instance_.is_visible());
52 EXPECT_FALSE(instance.is_audio_playing()); 72 EXPECT_FALSE(instance_.is_audio_playing());
53 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0); 73 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
54 74
55 // Even if there is a recent user event visibility change should end the 75 // Even if there is a recent user event visibility change should end the
56 // session. 76 // session.
57 instance.OnUserEvent(); 77 instance_.OnUserEvent();
58 instance.OnUserEvent(); 78 instance_.OnUserEvent();
59 instance.OnVisibilityChanged(false); 79 instance_.OnVisibilityChanged(false, kZeroTime);
60 EXPECT_FALSE(instance.in_session()); 80 EXPECT_FALSE(instance_.in_session());
61 EXPECT_FALSE(instance.is_visible()); 81 EXPECT_FALSE(instance_.is_visible());
62 EXPECT_FALSE(instance.is_audio_playing()); 82 EXPECT_FALSE(instance_.is_audio_playing());
63 histogram_tester.ExpectTotalCount("Session.TotalDuration", 1); 83 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
64 84
65 // For the second time only visibility change should start the session. 85 // For the second time only visibility change should start the session.
66 instance.OnVisibilityChanged(true); 86 instance_.OnVisibilityChanged(true, kZeroTime);
67 EXPECT_TRUE(instance.in_session()); 87 EXPECT_TRUE(instance_.in_session());
68 EXPECT_TRUE(instance.is_visible()); 88 EXPECT_TRUE(instance_.is_visible());
69 EXPECT_FALSE(instance.is_audio_playing()); 89 EXPECT_FALSE(instance_.is_audio_playing());
70 histogram_tester.ExpectTotalCount("Session.TotalDuration", 1); 90 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
71 instance.OnVisibilityChanged(false); 91 instance_.OnVisibilityChanged(false, kZeroTime);
72 EXPECT_FALSE(instance.in_session()); 92 EXPECT_FALSE(instance_.in_session());
73 EXPECT_FALSE(instance.is_visible()); 93 EXPECT_FALSE(instance_.is_visible());
74 EXPECT_FALSE(instance.is_audio_playing()); 94 EXPECT_FALSE(instance_.is_audio_playing());
75 histogram_tester.ExpectTotalCount("Session.TotalDuration", 2); 95 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 2);
76 } 96 }
77 97
78 TEST(DesktopSessionDurationTrackerTest, TestUserEvent) { 98 TEST_F(DesktopSessionDurationTrackerTest, TestUserEvent) {
79 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 99 instance_.SetInactivityTimeoutForTesting(1);
80 base::HistogramTester histogram_tester;
81 100
82 MockDesktopSessionDurationTracker instance; 101 EXPECT_FALSE(instance_.in_session());
83 instance.SetInactivityTimeoutForTesting(1); 102 EXPECT_FALSE(instance_.is_visible());
84 103 EXPECT_FALSE(instance_.is_audio_playing());
85 EXPECT_FALSE(instance.in_session()); 104 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
86 EXPECT_FALSE(instance.is_visible());
87 EXPECT_FALSE(instance.is_audio_playing());
88 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
89 105
90 // User event doesn't go through if nothing is visible. 106 // User event doesn't go through if nothing is visible.
91 instance.OnUserEvent(); 107 instance_.OnUserEvent();
92 EXPECT_FALSE(instance.in_session()); 108 EXPECT_FALSE(instance_.in_session());
93 EXPECT_FALSE(instance.is_visible()); 109 EXPECT_FALSE(instance_.is_visible());
94 EXPECT_FALSE(instance.is_audio_playing()); 110 EXPECT_FALSE(instance_.is_audio_playing());
95 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0); 111 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
96 112
97 instance.OnVisibilityChanged(true); 113 instance_.OnVisibilityChanged(true, kZeroTime);
98 instance.OnUserEvent(); 114 instance_.OnUserEvent();
99 EXPECT_TRUE(instance.in_session()); 115 EXPECT_TRUE(instance_.in_session());
100 EXPECT_TRUE(instance.is_visible()); 116 EXPECT_TRUE(instance_.is_visible());
101 EXPECT_FALSE(instance.is_audio_playing()); 117 EXPECT_FALSE(instance_.is_audio_playing());
102 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0); 118 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
103 119
104 // Wait until the session expires. 120 // Wait until the session expires.
105 while (!instance.is_timeout()) { 121 while (!instance_.is_timeout()) {
106 base::RunLoop().RunUntilIdle(); 122 base::RunLoop().RunUntilIdle();
107 } 123 }
108 124
109 EXPECT_FALSE(instance.in_session()); 125 EXPECT_FALSE(instance_.in_session());
110 EXPECT_TRUE(instance.is_visible()); 126 EXPECT_TRUE(instance_.is_visible());
111 EXPECT_FALSE(instance.is_audio_playing()); 127 EXPECT_FALSE(instance_.is_audio_playing());
112 histogram_tester.ExpectTotalCount("Session.TotalDuration", 1); 128 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
113 } 129 }
114 130
115 TEST(DesktopSessionDurationTrackerTest, TestAudioEvent) { 131 TEST_F(DesktopSessionDurationTrackerTest, TestAudioEvent) {
116 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 132 instance_.SetInactivityTimeoutForTesting(1);
117 base::HistogramTester histogram_tester;
118 133
119 MockDesktopSessionDurationTracker instance; 134 instance_.OnVisibilityChanged(true, kZeroTime);
120 instance.SetInactivityTimeoutForTesting(1); 135 instance_.OnAudioStart();
136 EXPECT_TRUE(instance_.in_session());
137 EXPECT_TRUE(instance_.is_visible());
138 EXPECT_TRUE(instance_.is_audio_playing());
139 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
121 140
122 instance.OnVisibilityChanged(true); 141 instance_.OnVisibilityChanged(false, kZeroTime);
123 instance.OnAudioStart(); 142 EXPECT_TRUE(instance_.in_session());
124 EXPECT_TRUE(instance.in_session()); 143 EXPECT_FALSE(instance_.is_visible());
125 EXPECT_TRUE(instance.is_visible()); 144 EXPECT_TRUE(instance_.is_audio_playing());
126 EXPECT_TRUE(instance.is_audio_playing()); 145 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
127 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
128 146
129 instance.OnVisibilityChanged(false); 147 instance_.OnAudioEnd();
130 EXPECT_TRUE(instance.in_session()); 148 EXPECT_TRUE(instance_.in_session());
131 EXPECT_FALSE(instance.is_visible()); 149 EXPECT_FALSE(instance_.is_visible());
132 EXPECT_TRUE(instance.is_audio_playing()); 150 EXPECT_FALSE(instance_.is_audio_playing());
133 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0); 151 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
134
135 instance.OnAudioEnd();
136 EXPECT_TRUE(instance.in_session());
137 EXPECT_FALSE(instance.is_visible());
138 EXPECT_FALSE(instance.is_audio_playing());
139 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
140 152
141 // Wait until the session expires. 153 // Wait until the session expires.
142 while (!instance.is_timeout()) { 154 while (!instance_.is_timeout()) {
143 base::RunLoop().RunUntilIdle(); 155 base::RunLoop().RunUntilIdle();
144 } 156 }
145 157
146 EXPECT_FALSE(instance.in_session()); 158 EXPECT_FALSE(instance_.in_session());
147 EXPECT_FALSE(instance.is_visible()); 159 EXPECT_FALSE(instance_.is_visible());
148 EXPECT_FALSE(instance.is_audio_playing()); 160 EXPECT_FALSE(instance_.is_audio_playing());
149 histogram_tester.ExpectTotalCount("Session.TotalDuration", 1); 161 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
150 } 162 }
151 163
152 TEST(DesktopSessionDurationTrackerTest, TestTimeoutDiscount) { 164 TEST_F(DesktopSessionDurationTrackerTest, TestInputTimeoutDiscount) {
153 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 165 int inactivity_interval_seconds = 2;
154 base::HistogramTester histogram_tester; 166 instance_.SetInactivityTimeoutForTesting(inactivity_interval_seconds);
155 MockDesktopSessionDurationTracker instance;
156 167
157 int inactivity_interval_seconds = 2; 168 instance_.OnVisibilityChanged(true, kZeroTime);
158 instance.SetInactivityTimeoutForTesting(inactivity_interval_seconds);
159
160 instance.OnVisibilityChanged(true);
161 base::TimeTicks before_session_start = base::TimeTicks::Now(); 169 base::TimeTicks before_session_start = base::TimeTicks::Now();
162 instance.OnUserEvent(); // This should start the session 170 instance_.OnUserEvent(); // This should start the session
163 histogram_tester.ExpectTotalCount("Session.TotalDuration", 0); 171 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
164 172
165 // Wait until the session expires. 173 // Wait until the session expires.
166 while (!instance.is_timeout()) { 174 while (!instance_.is_timeout()) {
167 base::RunLoop().RunUntilIdle(); 175 base::RunLoop().RunUntilIdle();
168 } 176 }
169 base::TimeTicks after_session_end = base::TimeTicks::Now(); 177 base::TimeTicks after_session_end = base::TimeTicks::Now();
170 178
171 histogram_tester.ExpectTotalCount("Session.TotalDuration", 1); 179 ExpectTotalDuration(
172 base::Bucket bucket = 180 after_session_end - before_session_start -
173 histogram_tester.GetAllSamples("Session.TotalDuration")[0]; 181 base::TimeDelta::FromSeconds(inactivity_interval_seconds));
174 int max_expected_value =
175 (after_session_end - before_session_start -
176 base::TimeDelta::FromSeconds(inactivity_interval_seconds))
177 .InMilliseconds();
178 EXPECT_LE(bucket.min, max_expected_value);
179 } 182 }
183
184 TEST_F(DesktopSessionDurationTrackerTest, TestVisibilityTimeoutDiscount) {
185 instance_.OnVisibilityChanged(true, kZeroTime);
186 base::TimeTicks before_session_start = base::TimeTicks::Now();
187 instance_.OnUserEvent(); // This should start the session
188 histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
189
190 // Sleep a little while.
191 base::TimeDelta kDelay = base::TimeDelta::FromSeconds(2);
192 while (true) {
193 base::TimeDelta elapsed = base::TimeTicks::Now() - before_session_start;
194 if (elapsed >= kDelay)
195 break;
196 base::PlatformThread::Sleep(kDelay);
197 }
198
199 // End the session via visibility change.
200 instance_.OnVisibilityChanged(false, kDelay);
201 base::TimeTicks after_session_end = base::TimeTicks::Now();
202
203 ExpectTotalDuration(after_session_end - before_session_start - kDelay);
204 }
OLDNEW
« no previous file with comments | « chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698