Chromium Code Reviews| Index: content/browser/media/session/media_session_impl_uma_unittest.cc |
| diff --git a/content/browser/media/session/media_session_impl_uma_unittest.cc b/content/browser/media/session/media_session_impl_uma_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..17414071b45806471d6b4585f4a62043d00fe83c |
| --- /dev/null |
| +++ b/content/browser/media/session/media_session_impl_uma_unittest.cc |
| @@ -0,0 +1,179 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// 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_impl.h" |
| + |
| +#include <map> |
| +#include <memory> |
| + |
| +#include "base/metrics/histogram_samples.h" |
| +#include "base/test/histogram_tester.h" |
| +#include "content/browser/media/session/media_session_player_observer.h" |
| +#include "content/test/test_render_view_host.h" |
| +#include "content/test/test_web_contents.h" |
| +#include "media/base/media_content_type.h" |
| +#include "third_party/WebKit/public/platform/modules/mediasession/media_session.mojom.h" |
| + |
| +namespace content { |
| + |
| +using MediaSessionUserAction = MediaSessionUmaHelper::MediaSessionUserAction; |
| +using SuspendType = MediaSession::SuspendType; |
| +using MediaSessionAction = blink::mojom::MediaSessionAction; |
| + |
| +namespace { |
| + |
| +static const int kPlayerId = 0; |
| + |
| +class MockMediaSessionPlayerObserver : public MediaSessionPlayerObserver { |
| + public: |
| + explicit MockMediaSessionPlayerObserver(RenderFrameHost* rfh) |
| + : render_frame_host_(rfh) {} |
| + |
| + ~MockMediaSessionPlayerObserver() override = default; |
| + |
| + void OnSuspend(int player_id) override {} |
| + void OnResume(int player_id) override {} |
| + void OnSetVolumeMultiplier(int player_id, double volume_multiplier) override { |
| + } |
| + |
| + RenderFrameHost* GetRenderFrameHost() const override { |
|
mlamouri (slow - plz ping)
2017/04/10 12:37:18
style: render_frame_host()
Zhiqiang Zhang (Slow)
2017/04/10 15:43:05
Done.
|
| + return render_frame_host_; |
| + } |
| + |
| + private: |
| + RenderFrameHost* render_frame_host_; |
| +}; |
| + |
| +struct ActionMappingEntry { |
| + blink::mojom::MediaSessionAction action; |
| + MediaSessionUserAction user_action; |
| +}; |
| + |
| +ActionMappingEntry kActionMappings[] = { |
| + {MediaSessionAction::PLAY, MediaSessionUserAction::Play}, |
| + {MediaSessionAction::PAUSE, MediaSessionUserAction::Pause}, |
| + {MediaSessionAction::PREVIOUS_TRACK, MediaSessionUserAction::PreviousTrack}, |
| + {MediaSessionAction::NEXT_TRACK, MediaSessionUserAction::NextTrack}, |
| + {MediaSessionAction::SEEK_BACKWARD, MediaSessionUserAction::SeekBackward}, |
| + {MediaSessionAction::SEEK_FORWARD, MediaSessionUserAction::SeekForward}, |
| +}; |
| + |
| +} // anonymous namespace |
| + |
| +class MediaSessionImplUmaTest : public RenderViewHostImplTestHarness { |
| + public: |
| + MediaSessionImplUmaTest() = default; |
| + ~MediaSessionImplUmaTest() override = default; |
| + |
| + void SetUp() override { |
| + RenderViewHostImplTestHarness::SetUp(); |
| + contents()->GetMainFrame()->InitializeRenderFrameIfNeeded(); |
| + StartPlayer(); |
| + } |
| + |
| + void TearDown() override { RenderViewHostImplTestHarness::TearDown(); } |
| + |
| + protected: |
| + MediaSessionImpl* session() { return MediaSessionImpl::Get(contents()); } |
|
mlamouri (slow - plz ping)
2017/04/10 12:37:18
style: GetSession()
Zhiqiang Zhang (Slow)
2017/04/10 15:43:05
Done.
|
| + |
| + void StartPlayer() { |
| + player_.reset( |
| + new MockMediaSessionPlayerObserver(contents()->GetMainFrame())); |
| + session()->AddPlayer(player_.get(), kPlayerId, |
| + media::MediaContentType::Persistent); |
| + } |
| + |
| + std::unique_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart( |
| + const std::string& name) { |
| + return histogram_tester_.GetHistogramSamplesSinceCreation(name); |
| + } |
| + |
| + std::unique_ptr<MockMediaSessionPlayerObserver> player_; |
| + base::HistogramTester histogram_tester_; |
| +}; |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnUISuspend) { |
| + session()->Suspend(SuspendType::UI); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(static_cast<base::HistogramBase::Sample>( |
| + MediaSessionUserAction::PauseDefault))); |
| +} |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnSystemSuspend) { |
| + session()->Suspend(SuspendType::SYSTEM); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| +} |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnContentSuspend) { |
| + session()->Suspend(SuspendType::CONTENT); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| +} |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnUIResume) { |
| + session()->Suspend(SuspendType::SYSTEM); |
| + session()->Resume(SuspendType::UI); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(static_cast<base::HistogramBase::Sample>( |
| + MediaSessionUserAction::PlayDefault))); |
| +} |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnSystemResume) { |
| + session()->Suspend(SuspendType::SYSTEM); |
| + session()->Resume(SuspendType::SYSTEM); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| +} |
| + |
| +// This should never happen but just check this to be safe. |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnContentResume) { |
| + session()->Suspend(SuspendType::SYSTEM); |
| + session()->Resume(SuspendType::CONTENT); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| +} |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnUIStop) { |
| + session()->Stop(SuspendType::UI); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(static_cast<base::HistogramBase::Sample>( |
| + MediaSessionUserAction::StopDefault))); |
| +} |
| + |
| +// This should never happen but just check this to be safe. |
| +TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnSystemStop) { |
| + session()->Stop(SuspendType::SYSTEM); |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Session.UserAction")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| +} |
| + |
| +TEST_F(MediaSessionImplUmaTest, RecordMediaSessionAction) { |
| + for (const auto& mapping_entry : kActionMappings) { |
| + // Uniquely create a HistogramTester for each action to check the histograms |
| + // for each action independently. |
| + base::HistogramTester histogram_tester; |
| + session()->DidReceiveAction(mapping_entry.action); |
| + |
| + std::unique_ptr<base::HistogramSamples> samples( |
| + histogram_tester.GetHistogramSamplesSinceCreation( |
| + "Media.Session.UserAction")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(static_cast<base::HistogramBase::Sample>( |
| + mapping_entry.user_action))); |
| + } |
| +} |
| + |
| +} // namespace content |