910e62b5创建于 1月15日历史提交
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/browser/media/session/media_session_uma_helper.h"

#include "base/metrics/histogram_samples.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/simple_test_tick_clock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace content {

namespace {

const char kPictureInPictureTotalTimeForSessionHistogram[] =
    "Media.Session.PictureInPicture.TotalTimeForSession";

class MediaSessionUmaHelperTest : public testing::Test {
 public:
  MediaSessionUmaHelperTest() = default;

  void SetUp() override {
    clock_.SetNowTicks(base::TimeTicks::Now());
    media_session_uma_helper_.SetClockForTest(&clock_);
  }

  base::SimpleTestTickClock* clock() { return &clock_; }

  MediaSessionUmaHelper& media_session_uma_helper() {
    return media_session_uma_helper_;
  }

  std::unique_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart(
      const std::string& name) {
    return histogram_tester_.GetHistogramSamplesSinceCreation(name);
  }

 private:
  base::SimpleTestTickClock clock_;
  MediaSessionUmaHelper media_session_uma_helper_;
  base::HistogramTester histogram_tester_;
};

}  // anonymous namespace

TEST_F(MediaSessionUmaHelperTest, CreateAndKillDoesNothing) {
  {
    MediaSessionUmaHelper* uma_helper = new MediaSessionUmaHelper();
    delete uma_helper;
  }

  {
    std::unique_ptr<base::HistogramSamples> samples(
        GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
    EXPECT_EQ(0, samples->TotalCount());
  }
}

TEST_F(MediaSessionUmaHelperTest, ActivationNotTerminatedDoesNotCommit) {
  media_session_uma_helper().OnSessionActive();
  clock()->Advance(base::Milliseconds(1000));

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(0, samples->TotalCount());
}

TEST_F(MediaSessionUmaHelperTest, SuspendActivationNotTerminatedDoesNotCommit) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(0, samples->TotalCount());
}

TEST_F(MediaSessionUmaHelperTest, FullActivation) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionInactive();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(1000));
}

TEST_F(MediaSessionUmaHelperTest, ActivationCycleWithSuspend) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionInactive();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(2000));
}

TEST_F(MediaSessionUmaHelperTest, ActivationCycleWithMultipleSuspend) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionInactive();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(3000));
}

TEST_F(MediaSessionUmaHelperTest, MultipleActivations) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionInactive();

  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionInactive();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(2, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(2000));
  EXPECT_EQ(1, samples->GetCount(3000));
}

TEST_F(MediaSessionUmaHelperTest, MultipleActivationCalls) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(500));
  media_session_uma_helper().OnSessionInactive();

  // Calling OnSessionActive() multiple times reset the start time of the
  // session.
  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(500));
}

TEST_F(MediaSessionUmaHelperTest, MultipleSuspendCalls_WhileSuspended) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(500));
  media_session_uma_helper().OnSessionSuspended();

  media_session_uma_helper().OnSessionInactive();

  // If the session is already suspended, OnSessionSuspended() calls are
  // ignored.
  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(1000));
}

TEST_F(MediaSessionUmaHelperTest, MultipleSuspendCalls_WhileInactive) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnSessionInactive();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionSuspended();

  clock()->Advance(base::Milliseconds(500));
  media_session_uma_helper().OnSessionSuspended();

  media_session_uma_helper().OnSessionInactive();

  // If the session is already inactive, OnSessionSuspended() calls are
  // ignored.
  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(1000));
}

TEST_F(MediaSessionUmaHelperTest, MultipleInactiveCalls) {
  media_session_uma_helper().OnSessionActive();

  clock()->Advance(base::Milliseconds(3000));
  media_session_uma_helper().OnSessionInactive();

  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnSessionInactive();

  clock()->Advance(base::Milliseconds(500));
  media_session_uma_helper().OnSessionInactive();

  // If the session is already inactive, OnSessionInactive() calls are ignored.
  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(3000));
}

TEST_F(MediaSessionUmaHelperTest,
       OnServiceDestroyedWithoutTotalTimeDoesNotCommit) {
  media_session_uma_helper().OnServiceDestroyed();
  clock()->Advance(base::Milliseconds(1000));

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart(
          kPictureInPictureTotalTimeForSessionHistogram));
  EXPECT_EQ(0, samples->TotalCount());
}

TEST_F(MediaSessionUmaHelperTest,
       EnterAndClosePipMultipleTimes_DoesCommitTotalPipTime) {
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);

  clock()->Advance(base::Milliseconds(4000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);

  media_session_uma_helper().OnMediaPictureInPictureChanged(true);
  clock()->Advance(base::Milliseconds(3000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);

  media_session_uma_helper().OnMediaPictureInPictureChanged(true);
  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);
  media_session_uma_helper().OnServiceDestroyed();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart(
          kPictureInPictureTotalTimeForSessionHistogram));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(9000));
}

TEST_F(MediaSessionUmaHelperTest, EnterAndClosePip_DoesCommitTotalPipTime) {
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);

  clock()->Advance(base::Milliseconds(3000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);
  media_session_uma_helper().OnServiceDestroyed();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart(
          kPictureInPictureTotalTimeForSessionHistogram));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(3000));
}

TEST_F(MediaSessionUmaHelperTest,
       EnterAndRepeatedlyClosePip_DoesCommitTotalPipTime) {
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);

  clock()->Advance(base::Milliseconds(3000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);
  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);
  media_session_uma_helper().OnServiceDestroyed();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart(
          kPictureInPictureTotalTimeForSessionHistogram));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(3000));
}

TEST_F(MediaSessionUmaHelperTest,
       CloseAndRepeatedlyEnterPip_DoesNotCommitTotalPipTime) {
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);

  clock()->Advance(base::Milliseconds(3000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);
  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);
  media_session_uma_helper().OnServiceDestroyed();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart(
          kPictureInPictureTotalTimeForSessionHistogram));
  EXPECT_EQ(0, samples->TotalCount());
}

TEST_F(MediaSessionUmaHelperTest,
       CloseRepeatedlyEnterThenClosePip_DoesCommitTotalPipTime) {
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);

  clock()->Advance(base::Milliseconds(3000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);
  clock()->Advance(base::Milliseconds(2000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(true);
  clock()->Advance(base::Milliseconds(1000));
  media_session_uma_helper().OnMediaPictureInPictureChanged(false);
  media_session_uma_helper().OnServiceDestroyed();

  std::unique_ptr<base::HistogramSamples> samples(
      GetHistogramSamplesSinceTestStart(
          kPictureInPictureTotalTimeForSessionHistogram));
  EXPECT_EQ(1, samples->TotalCount());
  EXPECT_EQ(1, samples->GetCount(1000));
}

}  // namespace content