Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1342)

Unified Diff: content/browser/media/session/media_session_impl_uma_unittest.cc

Issue 2798083002: Record user interactions with MediaSession by action type (Closed)
Patch Set: addressed style nits Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..523a52e2c7ebc48a9416e4d4106b5ecf594bc48d
--- /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* render_frame_host() const override {
+ 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* GetSession() { return MediaSessionImpl::Get(contents()); }
+
+ void StartPlayer() {
+ player_.reset(
+ new MockMediaSessionPlayerObserver(contents()->GetMainFrame()));
+ GetSession()->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) {
+ GetSession()->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) {
+ GetSession()->Suspend(SuspendType::SYSTEM);
+ std::unique_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart("Media.Session.UserAction"));
+ EXPECT_EQ(0, samples->TotalCount());
+}
+
+TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnContentSuspend) {
+ GetSession()->Suspend(SuspendType::CONTENT);
+ std::unique_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart("Media.Session.UserAction"));
+ EXPECT_EQ(0, samples->TotalCount());
+}
+
+TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnUIResume) {
+ GetSession()->Suspend(SuspendType::SYSTEM);
+ GetSession()->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) {
+ GetSession()->Suspend(SuspendType::SYSTEM);
+ GetSession()->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) {
+ GetSession()->Suspend(SuspendType::SYSTEM);
+ GetSession()->Resume(SuspendType::CONTENT);
+ std::unique_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart("Media.Session.UserAction"));
+ EXPECT_EQ(0, samples->TotalCount());
+}
+
+TEST_F(MediaSessionImplUmaTest, RecordPauseDefaultOnUIStop) {
+ GetSession()->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) {
+ GetSession()->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;
+ GetSession()->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

Powered by Google App Engine
This is Rietveld 408576698