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

Side by Side Diff: content/browser/media/audible_metrics_unittest.cc

Issue 1591453005: Add metrics regarding concurrent audible tabs in Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: user action and tick Created 4 years, 11 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/browser/media/audible_metrics.h"
6
7 #include "base/metrics/histogram_samples.h"
8 #include "base/test/histogram_tester.h"
9 #include "base/test/simple_test_tick_clock.h"
10 #include "base/test/user_action_tester.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace content {
14
15 namespace {
16
17 static const WebContents* WEB_CONTENTS_0 = reinterpret_cast<WebContents*>(0x00);
18 static const WebContents* WEB_CONTENTS_1 = reinterpret_cast<WebContents*>(0x01);
19 static const WebContents* WEB_CONTENTS_2 = reinterpret_cast<WebContents*>(0x10);
20 static const WebContents* WEB_CONTENTS_3 = reinterpret_cast<WebContents*>(0x11);
21
22 static const char* CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM =
23 "Media.Audible.ConcurrentTabsWhenStarting";
24 static const char* CONCURRENT_TAB_IN_SESSION_HISTOGRAM =
25 "Media.Audible.ConcurrentTabsInSession";
26 static const char* CONCURRENT_TABS_TIME_HISTOGRAM =
27 "Media.Audible.ConcurrentTabsTime";
28
29 static const char* ADD_TAB_USER_ACTION = "Media.Audible.AddTab";
30 static const char* REMOVE_TAB_USER_ACTION = "Media.Audible.RemoveTab";
31
32 class AudibleMetricsTest : public testing::Test {
33 public:
34 AudibleMetricsTest() = default;
35
36 void SetUp() override {
37 clock_ = new base::SimpleTestTickClock();
38 // Set the clock to a value different than 0 so the time it gives is
39 // recognized as initialized.
40 clock_->Advance(base::TimeDelta::FromMilliseconds(1));
41 audible_metrics_.SetClockForTest(
42 scoped_ptr<base::SimpleTestTickClock>(clock_));
43 }
44
45 void TearDown() override {
46 clock_ = nullptr;
47 }
48
49 base::SimpleTestTickClock* clock() { return clock_; }
50
51 AudibleMetrics* audible_metrics() {
52 return &audible_metrics_;
53 };
54
55 const base::UserActionTester& user_action_tester() const {
56 return user_action_tester_;
57 }
58
59 scoped_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart(
60 const std::string& name) {
61 return histogram_tester_.GetHistogramSamplesSinceCreation(name);
62 }
63
64 private:
65 base::SimpleTestTickClock* clock_ = nullptr;
66 AudibleMetrics audible_metrics_;
67 base::HistogramTester histogram_tester_;
68 base::UserActionTester user_action_tester_;
69
70 DISALLOW_COPY_AND_ASSIGN(AudibleMetricsTest);
71 };
72
73 } // anonymous namespace
74
75 TEST_F(AudibleMetricsTest, CreateAndKillDoesNothing) {
76 {
77 scoped_ptr<AudibleMetrics> audible_metrics;
DaleCurtis 2016/01/19 19:32:57 This does nothing, you want audible_metrics(new Au
mlamouri (slow - plz ping) 2016/01/19 19:55:09 Stupid me :)
78 }
79
80 {
81 scoped_ptr<base::HistogramSamples> samples(
82 GetHistogramSamplesSinceTestStart(
83 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
84 EXPECT_EQ(0, samples->TotalCount());
85 }
86
87 {
88 scoped_ptr<base::HistogramSamples> samples(
89 GetHistogramSamplesSinceTestStart(CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
90 EXPECT_EQ(0, samples->TotalCount());
91 }
92
93 {
94 scoped_ptr<base::HistogramSamples> samples(
95 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
96 EXPECT_EQ(0, samples->TotalCount());
97 }
98
99 EXPECT_EQ(0, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
100 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
101 }
102
103 TEST_F(AudibleMetricsTest, AudibleStart) {
104 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
105
106 {
107 scoped_ptr<base::HistogramSamples> samples(
108 GetHistogramSamplesSinceTestStart(
109 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
110 EXPECT_EQ(1, samples->TotalCount());
111 EXPECT_EQ(1, samples->GetCount(0));
112 }
113
114 {
115 scoped_ptr<base::HistogramSamples> samples(
116 GetHistogramSamplesSinceTestStart(CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
117 EXPECT_EQ(1, samples->TotalCount());
118 EXPECT_EQ(1, samples->GetCount(1));
119 }
120
121 {
122 scoped_ptr<base::HistogramSamples> samples(
123 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
124 EXPECT_EQ(0, samples->TotalCount());
125 }
126
127 EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
128 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
129 }
130
131 TEST_F(AudibleMetricsTest, AudibleStartAndStop) {
132 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
133 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
134
135 {
136 scoped_ptr<base::HistogramSamples> samples(
137 GetHistogramSamplesSinceTestStart(
138 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
139 EXPECT_EQ(1, samples->TotalCount());
140 EXPECT_EQ(1, samples->GetCount(0));
141 }
142
143 {
144 scoped_ptr<base::HistogramSamples> samples(
145 GetHistogramSamplesSinceTestStart(CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
146 EXPECT_EQ(1, samples->TotalCount());
147 EXPECT_EQ(1, samples->GetCount(1));
148 }
149
150 {
151 scoped_ptr<base::HistogramSamples> samples(
152 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
153 EXPECT_EQ(0, samples->TotalCount());
154 }
155
156 EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
157 EXPECT_EQ(1, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
158 }
159
160 TEST_F(AudibleMetricsTest, AddSameTabIsNoOp) {
161 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
162 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
163 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
164 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
165 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
166
167 {
168 scoped_ptr<base::HistogramSamples> samples(
169 GetHistogramSamplesSinceTestStart(
170 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
171 EXPECT_EQ(1, samples->TotalCount());
172 EXPECT_EQ(1, samples->GetCount(0));
173 }
174
175 {
176 scoped_ptr<base::HistogramSamples> samples(
177 GetHistogramSamplesSinceTestStart(CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
178 EXPECT_EQ(1, samples->TotalCount());
179 EXPECT_EQ(1, samples->GetCount(1));
180 }
181
182 {
183 scoped_ptr<base::HistogramSamples> samples(
184 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
185 EXPECT_EQ(0, samples->TotalCount());
186 }
187
188 EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
189 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
190 }
191
192 TEST_F(AudibleMetricsTest, RemoveUnknownTabIsNoOp) {
193 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
194 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
195
196 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
197 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM)->TotalCount());
198 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
199 CONCURRENT_TAB_IN_SESSION_HISTOGRAM)->TotalCount());
200 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
201 CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
202
203 EXPECT_EQ(0, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
204 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
205 }
206
207 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsIncremental) {
208 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
209 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
210 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
211 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
212
213 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
214 CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
215 EXPECT_EQ(4, samples->TotalCount());
216 EXPECT_EQ(1, samples->GetCount(1));
217 EXPECT_EQ(1, samples->GetCount(2));
218 EXPECT_EQ(1, samples->GetCount(3));
219 EXPECT_EQ(1, samples->GetCount(4));
220
221 EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
222 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
223 }
224
225 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionKeepTrackOfRemovedTabs) {
226 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
227 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
228 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
229 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
230 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
231 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, false);
232 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
233
234 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
235 CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
236 EXPECT_EQ(2, samples->TotalCount());
237 EXPECT_EQ(1, samples->GetCount(1));
238 EXPECT_EQ(1, samples->GetCount(2));
239
240 EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
241 EXPECT_EQ(3, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
242 }
243
244 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsNotCountedTwice) {
245 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
246 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
247 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
248 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
249
250 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
251 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
252 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, false);
253 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, false);
254
255 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
256 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
257 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
258 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
259
260 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
261 CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
262 EXPECT_EQ(4, samples->TotalCount());
263 EXPECT_EQ(1, samples->GetCount(1));
264 EXPECT_EQ(1, samples->GetCount(2));
265 EXPECT_EQ(1, samples->GetCount(3));
266 EXPECT_EQ(1, samples->GetCount(4));
267
268 EXPECT_EQ(8, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
269 EXPECT_EQ(4, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
270 }
271
272 TEST_F(AudibleMetricsTest, ConcurrentTabsWhenStartingAddedPerTab) {
273 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
274 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
275
276 {
277 scoped_ptr<base::HistogramSamples> samples(
278 GetHistogramSamplesSinceTestStart(
279 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
280 EXPECT_EQ(2, samples->TotalCount());
281 EXPECT_EQ(1, samples->GetCount(0));
282 EXPECT_EQ(1, samples->GetCount(1));
283 }
284
285 EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
286 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
287
288 // Added again: ignored.
289 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
290 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
291
292 {
293 scoped_ptr<base::HistogramSamples> samples(
294 GetHistogramSamplesSinceTestStart(
295 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
296 EXPECT_EQ(2, samples->TotalCount());
297 EXPECT_EQ(1, samples->GetCount(0));
298 EXPECT_EQ(1, samples->GetCount(1));
299 }
300
301 EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
302 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
303
304 // Removing both.
305 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
306 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
307
308 {
309 scoped_ptr<base::HistogramSamples> samples(
310 GetHistogramSamplesSinceTestStart(
311 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
312 EXPECT_EQ(2, samples->TotalCount());
313 EXPECT_EQ(1, samples->GetCount(0));
314 EXPECT_EQ(1, samples->GetCount(1));
315 }
316
317 EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
318 EXPECT_EQ(2, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
319
320 // Adding them after removed, it is counted.
321 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
322 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
323
324 {
325 scoped_ptr<base::HistogramSamples> samples(
326 GetHistogramSamplesSinceTestStart(
327 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
328 EXPECT_EQ(4, samples->TotalCount());
329 EXPECT_EQ(2, samples->GetCount(0));
330 EXPECT_EQ(2, samples->GetCount(1));
331 }
332
333 EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
334 EXPECT_EQ(2, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
335 }
336
337 TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRequiresTwoAudibleTabs) {
338 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
339 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
340
341 clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
342
343 // No record because concurrent audible tabs still running.
344 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
345 CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
346
347 // No longer concurrent.
348 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
349 {
350 scoped_ptr<base::HistogramSamples> samples(
351 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
352 EXPECT_EQ(1, samples->TotalCount());
353 EXPECT_EQ(1, samples->GetCount(1000));
354 }
355
356 // Stopping the second tab is a no-op.
357 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
358 {
359 scoped_ptr<base::HistogramSamples> samples(
360 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
361 EXPECT_EQ(1, samples->TotalCount());
362 EXPECT_EQ(1, samples->GetCount(1000));
363 }
364 }
365
366 TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRunsAsLongAsTwoAudibleTabs) {
367 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
368 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
369
370 clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
371
372 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
373
374 clock()->Advance(base::TimeDelta::FromMilliseconds(500));
375
376 // Mutes one of the three audible tabs.
377 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
378
379 // No record because concurrent audible tabs still running.
380 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
381 CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
382
383 // Mutes the first audible tab.
384 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
385 {
386 scoped_ptr<base::HistogramSamples> samples(
387 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
388 EXPECT_EQ(1, samples->TotalCount());
389 EXPECT_EQ(1, samples->GetCount(1500));
390 }
391 }
392
393 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698