| Index: chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc
|
| diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc b/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc
|
| index fa5eaf8c3a152099ef8dcc46a22b5ba9f0f4b37a..a8288494f4ea374145c82e06fdb81c43fcd09613 100644
|
| --- a/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc
|
| +++ b/chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc
|
| @@ -8,8 +8,15 @@
|
| #include "base/run_loop.h"
|
| #include "base/test/histogram_tester.h"
|
| #include "base/test/test_mock_time_task_runner.h"
|
| +#include "base/threading/platform_thread.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +namespace {
|
| +
|
| +const base::TimeDelta kZeroTime = base::TimeDelta::FromSeconds(0);
|
| +
|
| +} // namespace
|
| +
|
| // Mock class for |DesktopSessionDurationTracker| for testing.
|
| class MockDesktopSessionDurationTracker
|
| : public metrics::DesktopSessionDurationTracker {
|
| @@ -33,147 +40,169 @@ class MockDesktopSessionDurationTracker
|
| DISALLOW_COPY_AND_ASSIGN(MockDesktopSessionDurationTracker);
|
| };
|
|
|
| -TEST(DesktopSessionDurationTrackerTest, TestVisibility) {
|
| - base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
|
| - base::HistogramTester histogram_tester;
|
| +class DesktopSessionDurationTrackerTest : public testing::Test {
|
| + public:
|
| + DesktopSessionDurationTrackerTest()
|
| + : loop_(base::MessageLoop::TYPE_DEFAULT) {}
|
| +
|
| + void ExpectTotalDuration(base::TimeDelta duration) {
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
|
| + base::Bucket bucket =
|
| + histogram_tester_.GetAllSamples("Session.TotalDuration")[0];
|
| + int max_expected_value = duration.InMilliseconds();
|
| + EXPECT_LE(bucket.min, max_expected_value);
|
| + }
|
| +
|
| + base::HistogramTester histogram_tester_;
|
| + MockDesktopSessionDurationTracker instance_;
|
|
|
| - MockDesktopSessionDurationTracker instance;
|
| + private:
|
| + base::MessageLoop loop_;
|
|
|
| + DISALLOW_COPY_AND_ASSIGN(DesktopSessionDurationTrackerTest);
|
| +};
|
| +
|
| +TEST_F(DesktopSessionDurationTrackerTest, TestVisibility) {
|
| // The browser becomes visible but it shouldn't start the session.
|
| - instance.OnVisibilityChanged(true);
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_TRUE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| -
|
| - instance.OnUserEvent();
|
| - EXPECT_TRUE(instance.in_session());
|
| - EXPECT_TRUE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| + instance_.OnVisibilityChanged(true, kZeroTime);
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_TRUE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
| +
|
| + instance_.OnUserEvent();
|
| + EXPECT_TRUE(instance_.in_session());
|
| + EXPECT_TRUE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| // Even if there is a recent user event visibility change should end the
|
| // session.
|
| - instance.OnUserEvent();
|
| - instance.OnUserEvent();
|
| - instance.OnVisibilityChanged(false);
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 1);
|
| + instance_.OnUserEvent();
|
| + instance_.OnUserEvent();
|
| + instance_.OnVisibilityChanged(false, kZeroTime);
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
|
|
|
| // For the second time only visibility change should start the session.
|
| - instance.OnVisibilityChanged(true);
|
| - EXPECT_TRUE(instance.in_session());
|
| - EXPECT_TRUE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 1);
|
| - instance.OnVisibilityChanged(false);
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 2);
|
| + instance_.OnVisibilityChanged(true, kZeroTime);
|
| + EXPECT_TRUE(instance_.in_session());
|
| + EXPECT_TRUE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
|
| + instance_.OnVisibilityChanged(false, kZeroTime);
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 2);
|
| }
|
|
|
| -TEST(DesktopSessionDurationTrackerTest, TestUserEvent) {
|
| - base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
|
| - base::HistogramTester histogram_tester;
|
| -
|
| - MockDesktopSessionDurationTracker instance;
|
| - instance.SetInactivityTimeoutForTesting(1);
|
| +TEST_F(DesktopSessionDurationTrackerTest, TestUserEvent) {
|
| + instance_.SetInactivityTimeoutForTesting(1);
|
|
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| // User event doesn't go through if nothing is visible.
|
| - instance.OnUserEvent();
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| -
|
| - instance.OnVisibilityChanged(true);
|
| - instance.OnUserEvent();
|
| - EXPECT_TRUE(instance.in_session());
|
| - EXPECT_TRUE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| + instance_.OnUserEvent();
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
| +
|
| + instance_.OnVisibilityChanged(true, kZeroTime);
|
| + instance_.OnUserEvent();
|
| + EXPECT_TRUE(instance_.in_session());
|
| + EXPECT_TRUE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| // Wait until the session expires.
|
| - while (!instance.is_timeout()) {
|
| + while (!instance_.is_timeout()) {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_TRUE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 1);
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_TRUE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
|
| }
|
|
|
| -TEST(DesktopSessionDurationTrackerTest, TestAudioEvent) {
|
| - base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
|
| - base::HistogramTester histogram_tester;
|
| +TEST_F(DesktopSessionDurationTrackerTest, TestAudioEvent) {
|
| + instance_.SetInactivityTimeoutForTesting(1);
|
|
|
| - MockDesktopSessionDurationTracker instance;
|
| - instance.SetInactivityTimeoutForTesting(1);
|
| + instance_.OnVisibilityChanged(true, kZeroTime);
|
| + instance_.OnAudioStart();
|
| + EXPECT_TRUE(instance_.in_session());
|
| + EXPECT_TRUE(instance_.is_visible());
|
| + EXPECT_TRUE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| - instance.OnVisibilityChanged(true);
|
| - instance.OnAudioStart();
|
| - EXPECT_TRUE(instance.in_session());
|
| - EXPECT_TRUE(instance.is_visible());
|
| - EXPECT_TRUE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| + instance_.OnVisibilityChanged(false, kZeroTime);
|
| + EXPECT_TRUE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_TRUE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| - instance.OnVisibilityChanged(false);
|
| - EXPECT_TRUE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_TRUE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| -
|
| - instance.OnAudioEnd();
|
| - EXPECT_TRUE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| + instance_.OnAudioEnd();
|
| + EXPECT_TRUE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| // Wait until the session expires.
|
| - while (!instance.is_timeout()) {
|
| + while (!instance_.is_timeout()) {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| - EXPECT_FALSE(instance.in_session());
|
| - EXPECT_FALSE(instance.is_visible());
|
| - EXPECT_FALSE(instance.is_audio_playing());
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 1);
|
| + EXPECT_FALSE(instance_.in_session());
|
| + EXPECT_FALSE(instance_.is_visible());
|
| + EXPECT_FALSE(instance_.is_audio_playing());
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 1);
|
| }
|
|
|
| -TEST(DesktopSessionDurationTrackerTest, TestTimeoutDiscount) {
|
| - base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
|
| - base::HistogramTester histogram_tester;
|
| - MockDesktopSessionDurationTracker instance;
|
| -
|
| +TEST_F(DesktopSessionDurationTrackerTest, TestInputTimeoutDiscount) {
|
| int inactivity_interval_seconds = 2;
|
| - instance.SetInactivityTimeoutForTesting(inactivity_interval_seconds);
|
| + instance_.SetInactivityTimeoutForTesting(inactivity_interval_seconds);
|
|
|
| - instance.OnVisibilityChanged(true);
|
| + instance_.OnVisibilityChanged(true, kZeroTime);
|
| base::TimeTicks before_session_start = base::TimeTicks::Now();
|
| - instance.OnUserEvent(); // This should start the session
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 0);
|
| + instance_.OnUserEvent(); // This should start the session
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
|
|
| // Wait until the session expires.
|
| - while (!instance.is_timeout()) {
|
| + while (!instance_.is_timeout()) {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
| base::TimeTicks after_session_end = base::TimeTicks::Now();
|
|
|
| - histogram_tester.ExpectTotalCount("Session.TotalDuration", 1);
|
| - base::Bucket bucket =
|
| - histogram_tester.GetAllSamples("Session.TotalDuration")[0];
|
| - int max_expected_value =
|
| - (after_session_end - before_session_start -
|
| - base::TimeDelta::FromSeconds(inactivity_interval_seconds))
|
| - .InMilliseconds();
|
| - EXPECT_LE(bucket.min, max_expected_value);
|
| + ExpectTotalDuration(
|
| + after_session_end - before_session_start -
|
| + base::TimeDelta::FromSeconds(inactivity_interval_seconds));
|
| +}
|
| +
|
| +TEST_F(DesktopSessionDurationTrackerTest, TestVisibilityTimeoutDiscount) {
|
| + instance_.OnVisibilityChanged(true, kZeroTime);
|
| + base::TimeTicks before_session_start = base::TimeTicks::Now();
|
| + instance_.OnUserEvent(); // This should start the session
|
| + histogram_tester_.ExpectTotalCount("Session.TotalDuration", 0);
|
| +
|
| + // Sleep a little while.
|
| + base::TimeDelta kDelay = base::TimeDelta::FromSeconds(2);
|
| + while (true) {
|
| + base::TimeDelta elapsed = base::TimeTicks::Now() - before_session_start;
|
| + if (elapsed >= kDelay)
|
| + break;
|
| + base::PlatformThread::Sleep(kDelay);
|
| + }
|
| +
|
| + // End the session via visibility change.
|
| + instance_.OnVisibilityChanged(false, kDelay);
|
| + base::TimeTicks after_session_end = base::TimeTicks::Now();
|
| +
|
| + ExpectTotalDuration(after_session_end - before_session_start - kDelay);
|
| }
|
|
|