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

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: review comments 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
« no previous file with comments | « content/browser/media/audible_metrics.cc ('k') | content/browser/media/audio_stream_monitor.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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* MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM =
25 "Media.Audible.MaxConcurrentTabsInSession";
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(new AudibleMetrics());
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(
90 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
91 EXPECT_EQ(0, samples->TotalCount());
92 }
93
94 {
95 scoped_ptr<base::HistogramSamples> samples(
96 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
97 EXPECT_EQ(0, samples->TotalCount());
98 }
99
100 EXPECT_EQ(0, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
101 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
102 }
103
104 TEST_F(AudibleMetricsTest, AudibleStart) {
105 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
106
107 {
108 scoped_ptr<base::HistogramSamples> samples(
109 GetHistogramSamplesSinceTestStart(
110 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
111 EXPECT_EQ(1, samples->TotalCount());
112 EXPECT_EQ(1, samples->GetCount(0));
113 }
114
115 {
116 scoped_ptr<base::HistogramSamples> samples(
117 GetHistogramSamplesSinceTestStart(
118 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
119 EXPECT_EQ(1, samples->TotalCount());
120 EXPECT_EQ(1, samples->GetCount(1));
121 }
122
123 {
124 scoped_ptr<base::HistogramSamples> samples(
125 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
126 EXPECT_EQ(0, samples->TotalCount());
127 }
128
129 EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
130 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
131 }
132
133 TEST_F(AudibleMetricsTest, AudibleStartAndStop) {
134 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
135 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
136
137 {
138 scoped_ptr<base::HistogramSamples> samples(
139 GetHistogramSamplesSinceTestStart(
140 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
141 EXPECT_EQ(1, samples->TotalCount());
142 EXPECT_EQ(1, samples->GetCount(0));
143 }
144
145 {
146 scoped_ptr<base::HistogramSamples> samples(
147 GetHistogramSamplesSinceTestStart(
148 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
149 EXPECT_EQ(1, samples->TotalCount());
150 EXPECT_EQ(1, samples->GetCount(1));
151 }
152
153 {
154 scoped_ptr<base::HistogramSamples> samples(
155 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
156 EXPECT_EQ(0, samples->TotalCount());
157 }
158
159 EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
160 EXPECT_EQ(1, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
161 }
162
163 TEST_F(AudibleMetricsTest, AddSameTabIsNoOp) {
164 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
165 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
166 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
167 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
168 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
169
170 {
171 scoped_ptr<base::HistogramSamples> samples(
172 GetHistogramSamplesSinceTestStart(
173 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
174 EXPECT_EQ(1, samples->TotalCount());
175 EXPECT_EQ(1, samples->GetCount(0));
176 }
177
178 {
179 scoped_ptr<base::HistogramSamples> samples(
180 GetHistogramSamplesSinceTestStart(
181 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
182 EXPECT_EQ(1, samples->TotalCount());
183 EXPECT_EQ(1, samples->GetCount(1));
184 }
185
186 {
187 scoped_ptr<base::HistogramSamples> samples(
188 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
189 EXPECT_EQ(0, samples->TotalCount());
190 }
191
192 EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
193 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
194 }
195
196 TEST_F(AudibleMetricsTest, RemoveUnknownTabIsNoOp) {
197 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
198 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
199
200 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
201 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM)->TotalCount());
202 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
203 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM)->TotalCount());
204 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
205 CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
206
207 EXPECT_EQ(0, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
208 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
209 }
210
211 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsIncremental) {
212 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
213 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
214 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
215 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
216
217 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
218 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
219 EXPECT_EQ(4, samples->TotalCount());
220 EXPECT_EQ(1, samples->GetCount(1));
221 EXPECT_EQ(1, samples->GetCount(2));
222 EXPECT_EQ(1, samples->GetCount(3));
223 EXPECT_EQ(1, samples->GetCount(4));
224
225 EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
226 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
227 }
228
229 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionKeepTrackOfRemovedTabs) {
230 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
231 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
232 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
233 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
234 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
235 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, false);
236 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
237
238 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
239 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
240 EXPECT_EQ(2, samples->TotalCount());
241 EXPECT_EQ(1, samples->GetCount(1));
242 EXPECT_EQ(1, samples->GetCount(2));
243
244 EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
245 EXPECT_EQ(3, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
246 }
247
248 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsNotCountedTwice) {
249 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
250 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
251 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
252 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
253
254 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
255 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
256 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, false);
257 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, false);
258
259 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
260 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
261 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
262 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
263
264 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
265 MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
266 EXPECT_EQ(4, samples->TotalCount());
267 EXPECT_EQ(1, samples->GetCount(1));
268 EXPECT_EQ(1, samples->GetCount(2));
269 EXPECT_EQ(1, samples->GetCount(3));
270 EXPECT_EQ(1, samples->GetCount(4));
271
272 EXPECT_EQ(8, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
273 EXPECT_EQ(4, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
274 }
275
276 TEST_F(AudibleMetricsTest, ConcurrentTabsWhenStartingAddedPerTab) {
277 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
278 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
279
280 {
281 scoped_ptr<base::HistogramSamples> samples(
282 GetHistogramSamplesSinceTestStart(
283 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
284 EXPECT_EQ(2, samples->TotalCount());
285 EXPECT_EQ(1, samples->GetCount(0));
286 EXPECT_EQ(1, samples->GetCount(1));
287 }
288
289 EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
290 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
291
292 // Added again: ignored.
293 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
294 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
295
296 {
297 scoped_ptr<base::HistogramSamples> samples(
298 GetHistogramSamplesSinceTestStart(
299 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
300 EXPECT_EQ(2, samples->TotalCount());
301 EXPECT_EQ(1, samples->GetCount(0));
302 EXPECT_EQ(1, samples->GetCount(1));
303 }
304
305 EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
306 EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
307
308 // Removing both.
309 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
310 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
311
312 {
313 scoped_ptr<base::HistogramSamples> samples(
314 GetHistogramSamplesSinceTestStart(
315 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
316 EXPECT_EQ(2, samples->TotalCount());
317 EXPECT_EQ(1, samples->GetCount(0));
318 EXPECT_EQ(1, samples->GetCount(1));
319 }
320
321 EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
322 EXPECT_EQ(2, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
323
324 // Adding them after removed, it is counted.
325 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
326 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
327
328 {
329 scoped_ptr<base::HistogramSamples> samples(
330 GetHistogramSamplesSinceTestStart(
331 CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
332 EXPECT_EQ(4, samples->TotalCount());
333 EXPECT_EQ(2, samples->GetCount(0));
334 EXPECT_EQ(2, samples->GetCount(1));
335 }
336
337 EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
338 EXPECT_EQ(2, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
339 }
340
341 TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRequiresTwoAudibleTabs) {
342 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
343 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
344
345 clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
346
347 // No record because concurrent audible tabs still running.
348 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
349 CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
350
351 // No longer concurrent.
352 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
353 {
354 scoped_ptr<base::HistogramSamples> samples(
355 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
356 EXPECT_EQ(1, samples->TotalCount());
357 EXPECT_EQ(1, samples->GetCount(1000));
358 }
359
360 // Stopping the second tab is a no-op.
361 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
362 {
363 scoped_ptr<base::HistogramSamples> samples(
364 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
365 EXPECT_EQ(1, samples->TotalCount());
366 EXPECT_EQ(1, samples->GetCount(1000));
367 }
368 }
369
370 TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRunsAsLongAsTwoAudibleTabs) {
371 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
372 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
373
374 clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
375
376 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
377
378 clock()->Advance(base::TimeDelta::FromMilliseconds(500));
379
380 // Mutes one of the three audible tabs.
381 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
382
383 // No record because concurrent audible tabs still running.
384 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
385 CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
386
387 // Mutes the first audible tab.
388 audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
389 {
390 scoped_ptr<base::HistogramSamples> samples(
391 GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
392 EXPECT_EQ(1, samples->TotalCount());
393 EXPECT_EQ(1, samples->GetCount(1500));
394 }
395 }
396
397 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/audible_metrics.cc ('k') | content/browser/media/audio_stream_monitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698