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