#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_;
};
}
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();
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();
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();
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();
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));
}
}