OLD | NEW |
---|---|
(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 | |
OLD | NEW |