Index: content/browser/media/session/media_session_impl_service_routing_unittest.cc |
diff --git a/content/browser/media/session/media_session_impl_service_routing_unittest.cc b/content/browser/media/session/media_session_impl_service_routing_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b1b8c64426907d934a6837557d41827b2947eda0 |
--- /dev/null |
+++ b/content/browser/media/session/media_session_impl_service_routing_unittest.cc |
@@ -0,0 +1,188 @@ |
+// 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 "content/browser/media/session/media_session_player_observer.h" |
+#include "content/browser/media/session/media_session_service_impl.h" |
+#include "content/test/test_render_view_host.h" |
+#include "content/test/test_web_contents.h" |
+#include "media/base/media_content_type.h" |
+ |
+namespace content { |
+ |
+namespace { |
+ |
+static const int kPlayerId = 0; |
+ |
+class MockMediaSessionServiceImpl : public MediaSessionServiceImpl { |
+ public: |
+ explicit MockMediaSessionServiceImpl(RenderFrameHost* rfh) |
+ : MediaSessionServiceImpl(rfh) {} |
+ ~MockMediaSessionServiceImpl() override = default; |
+}; |
+ |
+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 { |
+ return render_frame_host_; |
+ } |
+ |
+ private: |
+ RenderFrameHost* render_frame_host_; |
+}; |
+ |
+} // anonymous namespace |
+ |
+class MediaSessionImplServiceRoutingTest |
+ : public RenderViewHostImplTestHarness { |
+ public: |
+ MediaSessionImplServiceRoutingTest() = default; |
+ ~MediaSessionImplServiceRoutingTest() override = default; |
+ |
+ void SetUp() override { |
+ RenderViewHostImplTestHarness::SetUp(); |
+ |
+ contents()->GetMainFrame()->InitializeRenderFrameIfNeeded(); |
+ main_frame_ = contents()->GetMainFrame(); |
+ sub_frame_ = main_frame_->AppendChild("sub_frame"); |
+ |
+ player_in_main_frame_.reset( |
+ new MockMediaSessionPlayerObserver(main_frame_)); |
+ player_in_sub_frame_.reset(new MockMediaSessionPlayerObserver(sub_frame_)); |
+ } |
+ |
+ void TearDown() override { |
+ services_.clear(); |
+ |
+ RenderViewHostImplTestHarness::TearDown(); |
+ } |
+ |
+ protected: |
+ void CreateServiceForFrame(TestRenderFrameHost* frame) { |
+ services_[frame] = base::MakeUnique<MockMediaSessionServiceImpl>(frame); |
+ services_[frame]->SetMetadata(MediaMetadata()); |
+ } |
+ |
+ void StartPlayerForFrame(TestRenderFrameHost* frame) { |
+ players_[frame] = base::MakeUnique<MockMediaSessionPlayerObserver>(frame); |
+ MediaSessionImpl::Get(contents()) |
+ ->AddPlayer(players_[frame].get(), kPlayerId, |
+ media::MediaContentType::Persistent); |
+ } |
+ |
+ void ClearPlayersForFrame(TestRenderFrameHost* frame) { |
+ if (!players_.count(frame)) |
+ return; |
+ |
+ MediaSessionImpl::Get(contents()) |
+ ->RemovePlayer(players_[frame].get(), kPlayerId); |
+ } |
+ |
+ MediaSessionServiceImpl* ComputeServiceForRouting() { |
+ return MediaSessionImpl::Get(contents())->ComputeServiceForRouting(); |
+ } |
+ |
+ TestRenderFrameHost* main_frame_; |
+ TestRenderFrameHost* sub_frame_; |
+ |
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_in_main_frame_; |
+ std::unique_ptr<MockMediaSessionPlayerObserver> player_in_sub_frame_; |
+ |
+ using ServiceMap = std::map<TestRenderFrameHost*, |
+ std::unique_ptr<MockMediaSessionServiceImpl>>; |
+ ServiceMap services_; |
+ |
+ using PlayerMap = std::map<TestRenderFrameHost*, |
+ std::unique_ptr<MockMediaSessionPlayerObserver>>; |
+ PlayerMap players_; |
+}; |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, NoFrameProducesAudio) { |
+ CreateServiceForFrame(main_frame_); |
+ CreateServiceForFrame(sub_frame_); |
+ |
+ ASSERT_EQ(nullptr, ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, |
+ OnlyMainFrameProducesAudioButHasNoService) { |
+ StartPlayerForFrame(main_frame_); |
+ |
+ ASSERT_EQ(nullptr, ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, |
+ OnlySubFrameProducesAudioButHasNoService) { |
+ StartPlayerForFrame(sub_frame_); |
+ |
+ ASSERT_EQ(nullptr, ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, |
+ OnlyMainFrameProducesAudioButHasInactiveService) { |
+ StartPlayerForFrame(main_frame_); |
+ |
+ CreateServiceForFrame(main_frame_); |
+ services_[main_frame_]->SetMetadata(base::nullopt); |
+ |
+ ASSERT_EQ(nullptr, ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, |
+ OnlySubFrameProducesAudioButHasInactiveService) { |
+ StartPlayerForFrame(sub_frame_); |
+ |
+ CreateServiceForFrame(sub_frame_); |
+ services_[sub_frame_]->SetMetadata(base::nullopt); |
+ |
+ ASSERT_EQ(nullptr, ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, |
+ BothFrameProducesAudioButOnlySubFrameHasService) { |
+ StartPlayerForFrame(main_frame_); |
+ StartPlayerForFrame(sub_frame_); |
+ |
+ CreateServiceForFrame(sub_frame_); |
+ |
+ ASSERT_EQ(services_[sub_frame_].get(), ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, PreferTopMostFrame) { |
+ StartPlayerForFrame(main_frame_); |
+ StartPlayerForFrame(sub_frame_); |
+ |
+ CreateServiceForFrame(main_frame_); |
+ CreateServiceForFrame(sub_frame_); |
+ |
+ ASSERT_EQ(services_[main_frame_].get(), ComputeServiceForRouting()); |
+} |
+ |
+TEST_F(MediaSessionImplServiceRoutingTest, |
+ RoutedServiceUpdatedAfterRemovingPlayer) { |
+ StartPlayerForFrame(main_frame_); |
+ StartPlayerForFrame(sub_frame_); |
+ |
+ CreateServiceForFrame(main_frame_); |
+ CreateServiceForFrame(sub_frame_); |
+ |
+ ClearPlayersForFrame(main_frame_); |
+ |
+ ASSERT_EQ(services_[sub_frame_].get(), ComputeServiceForRouting()); |
+} |
+ |
+} // namespace content |