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

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: 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_clock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace content {
13
14 namespace {
15
16 static WebContents* WEB_CONTENTS_0 = reinterpret_cast<WebContents*>(0x00);
whywhat 2016/01/15 19:01:20 nit: perhaps you meant something like "const WebCo
DaleCurtis 2016/01/15 19:02:03 const these if possible
mlamouri (slow - plz ping) 2016/01/19 12:18:43 Switched to const.
17 static WebContents* WEB_CONTENTS_1 = reinterpret_cast<WebContents*>(0x01);
18 static WebContents* WEB_CONTENTS_2 = reinterpret_cast<WebContents*>(0x10);
19 static WebContents* WEB_CONTENTS_3 = reinterpret_cast<WebContents*>(0x11);
20
21 class AudibleMetricsTest : public testing::Test {
22 public:
23 AudibleMetricsTest() = default;
whywhat 2016/01/15 19:01:20 nit: is this needed? won't it have a default ctor
mlamouri (slow - plz ping) 2016/01/19 12:18:43 I need the default ctor.
24
25 void SetUp() override {
26 clock_ = new base::SimpleTestClock();
27 clock_->SetNow(base::Time::Now());
28 audible_metrics_.SetClockForTest(
29 scoped_ptr<base::SimpleTestClock>(clock_));
30 }
31
32 void TearDown() override {
33 clock_ = nullptr;
whywhat 2016/01/15 19:01:20 nit: this is probably not needed
mlamouri (slow - plz ping) 2016/01/19 12:18:43 |clock_| is owned by |audible_metrics_|, I prefer
34 }
35
36 base::SimpleTestClock* clock() { return clock_; }
37
38 AudibleMetrics& audible_metrics() {
DaleCurtis 2016/01/15 19:02:03 Don't return non-const& -- use a pointer instead (
mlamouri (slow - plz ping) 2016/01/19 12:18:43 Switched to a pointer. Might be allowed now but le
39 return audible_metrics_;
40 };
41
42 scoped_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart(
43 const std::string& name) {
44 return histogram_tester_.GetHistogramSamplesSinceCreation(name);
45 }
46
47 private:
48 base::SimpleTestClock* clock_ = nullptr;
49 AudibleMetrics audible_metrics_;
50 base::HistogramTester histogram_tester_;
51 };
DaleCurtis 2016/01/15 19:02:03 DISALLOW_COPY_AND_ASSIGN.
mlamouri (slow - plz ping) 2016/01/19 12:18:43 Done.
52
53 } // anonymous namespace
54
55 TEST_F(AudibleMetricsTest, CreateAndKillDoesNothing) {
56 {
57 AudibleMetrics* audible_metrics = new AudibleMetrics();
DaleCurtis 2016/01/15 19:02:03 Just use a scoped_ptr?
mlamouri (slow - plz ping) 2016/01/19 12:18:43 It looks a bit odd now but why not.
58 delete audible_metrics;
59 }
60
61 {
62 scoped_ptr<base::HistogramSamples> samples(
63 GetHistogramSamplesSinceTestStart(
64 "Media.Audible.ConcurrentTabsWhenStarting"));
65 EXPECT_EQ(0, samples->TotalCount());
66 }
67
68 {
69 scoped_ptr<base::HistogramSamples> samples(
70 GetHistogramSamplesSinceTestStart(
71 "Media.Audible.ConcurrentTabsInSession"));
72 EXPECT_EQ(0, samples->TotalCount());
73 }
74
75 {
76 scoped_ptr<base::HistogramSamples> samples(
77 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
78 EXPECT_EQ(0, samples->TotalCount());
79 }
80 }
81
82 TEST_F(AudibleMetricsTest, AudibleStart) {
83 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
84
85 {
86 scoped_ptr<base::HistogramSamples> samples(
87 GetHistogramSamplesSinceTestStart(
88 "Media.Audible.ConcurrentTabsWhenStarting"));
89 EXPECT_EQ(1, samples->TotalCount());
90 EXPECT_EQ(1, samples->GetCount(0));
91 }
92
93 {
94 scoped_ptr<base::HistogramSamples> samples(
95 GetHistogramSamplesSinceTestStart(
96 "Media.Audible.ConcurrentTabsInSession"));
97 EXPECT_EQ(1, samples->TotalCount());
98 EXPECT_EQ(1, samples->GetCount(1));
99 }
100
101 {
102 scoped_ptr<base::HistogramSamples> samples(
103 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
104 EXPECT_EQ(0, samples->TotalCount());
105 }
106 }
107
108 TEST_F(AudibleMetricsTest, AudibleStartAndStop) {
109 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
110 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
111
112 {
113 scoped_ptr<base::HistogramSamples> samples(
114 GetHistogramSamplesSinceTestStart(
115 "Media.Audible.ConcurrentTabsWhenStarting"));
DaleCurtis 2016/01/15 19:02:03 I think the histogram macros prevent you from usin
mlamouri (slow - plz ping) 2016/01/19 12:18:43 Done.
116 EXPECT_EQ(1, samples->TotalCount());
117 EXPECT_EQ(1, samples->GetCount(0));
118 }
119
120 {
121 scoped_ptr<base::HistogramSamples> samples(
122 GetHistogramSamplesSinceTestStart(
123 "Media.Audible.ConcurrentTabsInSession"));
124 EXPECT_EQ(1, samples->TotalCount());
125 EXPECT_EQ(1, samples->GetCount(1));
126 }
127
128 {
129 scoped_ptr<base::HistogramSamples> samples(
130 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
131 EXPECT_EQ(0, samples->TotalCount());
132 }
133 }
134
135 TEST_F(AudibleMetricsTest, AddSameTabIsNoOp) {
136 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
137 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
138 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
139 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
140 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
141
142 {
143 scoped_ptr<base::HistogramSamples> samples(
144 GetHistogramSamplesSinceTestStart(
145 "Media.Audible.ConcurrentTabsWhenStarting"));
146 EXPECT_EQ(1, samples->TotalCount());
147 EXPECT_EQ(1, samples->GetCount(0));
148 }
149
150 {
151 scoped_ptr<base::HistogramSamples> samples(
152 GetHistogramSamplesSinceTestStart(
153 "Media.Audible.ConcurrentTabsInSession"));
154 EXPECT_EQ(1, samples->TotalCount());
155 EXPECT_EQ(1, samples->GetCount(1));
156 }
157
158 {
159 scoped_ptr<base::HistogramSamples> samples(
160 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
161 EXPECT_EQ(0, samples->TotalCount());
162 }
163 }
164
165 TEST_F(AudibleMetricsTest, RemoveUnknownTabIsNoOp) {
166 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
167 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
168
169 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
170 "Media.Audible.ConcurrentTabsWhenStarting")->TotalCount());
171 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
172 "Media.Audible.ConcurrentTabsInSession")->TotalCount());
173 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
174 "Media.Audible.ConcurrentTabsTime")->TotalCount());
175 }
176
177 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsIncremental) {
178 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
179 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
180 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
181 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
182
183 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
184 "Media.Audible.ConcurrentTabsInSession"));
185 EXPECT_EQ(4, samples->TotalCount());
186 EXPECT_EQ(1, samples->GetCount(1));
187 EXPECT_EQ(1, samples->GetCount(2));
188 EXPECT_EQ(1, samples->GetCount(3));
189 EXPECT_EQ(1, samples->GetCount(4));
190 }
191
192 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionKeepTrackOfRemovedTabs) {
193 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
194 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
195 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
196 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
197 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
198 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, false);
199 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
200
201 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
202 "Media.Audible.ConcurrentTabsInSession"));
203 EXPECT_EQ(2, samples->TotalCount());
204 EXPECT_EQ(1, samples->GetCount(1));
205 EXPECT_EQ(1, samples->GetCount(2));
206 }
207
208 TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsNotCountedTwice) {
209 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
210 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
211 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
212 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
213
214 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
215 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
216 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, false);
217 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, false);
218
219 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
220 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
221 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
222 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true);
223
224 scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart(
225 "Media.Audible.ConcurrentTabsInSession"));
226 EXPECT_EQ(4, samples->TotalCount());
227 EXPECT_EQ(1, samples->GetCount(1));
228 EXPECT_EQ(1, samples->GetCount(2));
229 EXPECT_EQ(1, samples->GetCount(3));
230 EXPECT_EQ(1, samples->GetCount(4));
231 }
232
233 TEST_F(AudibleMetricsTest, ConcurrentTabsWhenStartingAddedPerTab) {
234 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
235 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
236
237 {
238 scoped_ptr<base::HistogramSamples> samples(
239 GetHistogramSamplesSinceTestStart(
240 "Media.Audible.ConcurrentTabsWhenStarting"));
241 EXPECT_EQ(2, samples->TotalCount());
242 EXPECT_EQ(1, samples->GetCount(0));
243 EXPECT_EQ(1, samples->GetCount(1));
244 }
245
246 // Added again: ignored.
247 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
248 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
249
250 {
251 scoped_ptr<base::HistogramSamples> samples(
252 GetHistogramSamplesSinceTestStart(
253 "Media.Audible.ConcurrentTabsWhenStarting"));
254 EXPECT_EQ(2, samples->TotalCount());
255 EXPECT_EQ(1, samples->GetCount(0));
256 EXPECT_EQ(1, samples->GetCount(1));
257 }
258
259 // Removing both.
260 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
261 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
262
263 {
264 scoped_ptr<base::HistogramSamples> samples(
265 GetHistogramSamplesSinceTestStart(
266 "Media.Audible.ConcurrentTabsWhenStarting"));
267 EXPECT_EQ(2, samples->TotalCount());
268 EXPECT_EQ(1, samples->GetCount(0));
269 EXPECT_EQ(1, samples->GetCount(1));
270 }
271
272 // Adding them after removed, it is counted.
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 "Media.Audible.ConcurrentTabsWhenStarting"));
280 EXPECT_EQ(4, samples->TotalCount());
281 EXPECT_EQ(2, samples->GetCount(0));
282 EXPECT_EQ(2, samples->GetCount(1));
283 }
284 }
285
286 TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRequiresTwoAudibleTabs) {
287 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
288 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
289
290 clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
291
292 // No record because concurrent audbile tabs still running.
whywhat 2016/01/15 19:01:20 nit: s/audbile/audible + one more occurrence below
mlamouri (slow - plz ping) 2016/01/19 12:18:43 Done.
293 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
294 "Media.Audible.ConcurrentTabsTime")->TotalCount());
295
296 // No longer concurrent.
297 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
298 {
299 scoped_ptr<base::HistogramSamples> samples(
300 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
301 EXPECT_EQ(1, samples->TotalCount());
302 EXPECT_EQ(1, samples->GetCount(1000));
303 }
304
305 // Stopping the second tab is a no-op.
306 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
307 {
308 scoped_ptr<base::HistogramSamples> samples(
309 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
310 EXPECT_EQ(1, samples->TotalCount());
311 EXPECT_EQ(1, samples->GetCount(1000));
312 }
313 }
314
315 TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRunsAsLongAsTwoAudibleTabs) {
316 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
317 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
318
319 clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
320
321 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true);
322
323 clock()->Advance(base::TimeDelta::FromMilliseconds(500));
324
325 // Mutes one of the three audible tabs.
326 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
327
328 // No record because concurrent audbile tabs still running.
329 EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
330 "Media.Audible.ConcurrentTabsTime")->TotalCount());
331
332 // Mutes the first audible tab.
333 audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
334 {
335 scoped_ptr<base::HistogramSamples> samples(
336 GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime"));
337 EXPECT_EQ(1, samples->TotalCount());
338 EXPECT_EQ(1, samples->GetCount(1500));
339 }
340 }
341
342 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698