Chromium Code Reviews| Index: chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc |
| diff --git a/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc b/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc |
| index e410d1688ebcb9e97d24c7b20de6ae1442064b26..fca35317762a428d590ccb80954a199c16ef641d 100644 |
| --- a/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc |
| +++ b/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc |
| @@ -77,15 +77,17 @@ class MockOffscreenPresentationManager : public OffscreenPresentationManager { |
| const GURL& presentation_url, |
| const RenderFrameHostId& render_frame_id, |
| content::PresentationConnectionPtr controller, |
| - content::PresentationConnectionRequest) override { |
| + content::PresentationConnectionRequest, |
| + const MediaRoute& route) override { |
| RegisterOffscreenPresentationController(presentation_id, presentation_url, |
| - render_frame_id); |
| + render_frame_id, route); |
| } |
| - MOCK_METHOD3(RegisterOffscreenPresentationController, |
| + MOCK_METHOD4(RegisterOffscreenPresentationController, |
| void(const std::string& presentation_id, |
| const GURL& presentation_url, |
| - const RenderFrameHostId& render_frame_id)); |
| + const RenderFrameHostId& render_frame_id, |
| + const MediaRoute& route)); |
| MOCK_METHOD2(UnregisterOffscreenPresentationController, |
| void(const std::string& presentation_id, |
| const RenderFrameHostId& render_frame_id)); |
| @@ -96,6 +98,9 @@ class MockOffscreenPresentationManager : public OffscreenPresentationManager { |
| receiver_callback)); |
| MOCK_METHOD1(OnOffscreenPresentationReceiverTerminated, |
| void(const std::string& presentation_id)); |
| + MOCK_METHOD1(IsOffscreenPresentation, |
| + bool(const std::string& presentation_id)); |
| + MOCK_METHOD1(GetRoute, MediaRoute*(const std::string& presentation_id)); |
| }; |
| std::unique_ptr<KeyedService> BuildMockOffscreenPresentationManager( |
| @@ -124,6 +129,7 @@ class PresentationServiceDelegateImplTest |
| delegate_impl_->SetMediaRouterForTest(&router_); |
| presentation_urls_.push_back(presentation_url1_); |
| SetMainFrame(); |
| + SetMockOffscreenPresentationManager(); |
| } |
| MOCK_METHOD1(OnDefaultPresentationStarted, |
| @@ -132,6 +138,10 @@ class PresentationServiceDelegateImplTest |
| protected: |
| virtual content::WebContents* GetWebContents() { return web_contents(); } |
| + MockOffscreenPresentationManager* GetMockOffscreenPresentationManager() { |
|
mark a. foltz
2017/03/16 23:02:17
Maybe return MockOffscreenPresentationManager& to
zhaobin
2017/03/17 00:31:51
Done.
|
| + return mock_offscreen_manager_; |
| + } |
| + |
| void RunDefaultPresentationUrlCallbackTest(bool incognito) { |
| auto callback = base::Bind( |
| &PresentationServiceDelegateImplTest::OnDefaultPresentationStarted, |
| @@ -179,11 +189,20 @@ class PresentationServiceDelegateImplTest |
| main_frame_routing_id_ = main_frame->GetRoutingID(); |
| } |
| + void SetMockOffscreenPresentationManager() { |
| + OffscreenPresentationManagerFactory::GetInstanceForTest() |
| + ->SetTestingFactory(profile(), &BuildMockOffscreenPresentationManager); |
| + mock_offscreen_manager_ = static_cast<MockOffscreenPresentationManager*>( |
| + OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext( |
| + profile())); |
| + } |
| + |
| PresentationServiceDelegateImpl* delegate_impl_; |
| MockMediaRouter router_; |
| const GURL presentation_url1_; |
| const GURL presentation_url2_; |
| std::vector<GURL> presentation_urls_; |
| + MockOffscreenPresentationManager* mock_offscreen_manager_; |
| // |source1_| and |source2_| correspond to |presentation_url1_| and |
| // |presentation_url2_|, respectively. |
| @@ -415,6 +434,11 @@ TEST_F(PresentationServiceDelegateImplTest, ListenForConnnectionStateChange) { |
| const std::string kPresentationId("pid"); |
| presentation_urls_.push_back(GURL(kPresentationUrl3)); |
| + |
| + auto* mock_offscreen_manager = GetMockOffscreenPresentationManager(); |
| + EXPECT_CALL(*mock_offscreen_manager, IsOffscreenPresentation(kPresentationId)) |
| + .WillRepeatedly(Return(false)); |
| + |
| MockCreatePresentationConnnectionCallbacks mock_create_connection_callbacks; |
| delegate_impl_->JoinSession( |
| main_frame_process_id_, main_frame_routing_id_, presentation_urls_, |
| @@ -485,6 +509,71 @@ TEST_F(PresentationServiceDelegateImplTest, SinksObserverCantRegister) { |
| main_frame_process_id_, main_frame_routing_id_, &listener1_)); |
| } |
| +TEST_F(PresentationServiceDelegateImplTest, |
| + TestCloseConnectionForOffscreenPresentation) { |
| + std::string presentation_id = "presentation_id"; |
| + GURL presentation_url = GURL("http://www.example.com/presentation.html"); |
| + content::PresentationSessionInfo session_info(presentation_url, |
| + presentation_id); |
| + RenderFrameHostId rfh_id(main_frame_process_id_, main_frame_routing_id_); |
| + MediaRoute media_route("route_id", |
| + MediaSourceForPresentationUrl(presentation_url), |
| + "mediaSinkId", "", true, "", true); |
| + media_route.set_offscreen_presentation(true); |
| + |
| + auto* mock_offscreen_manager = GetMockOffscreenPresentationManager(); |
| + EXPECT_CALL(*mock_offscreen_manager, IsOffscreenPresentation(presentation_id)) |
| + .WillRepeatedly(Return(true)); |
| + |
| + base::MockCallback<content::PresentationSessionStartedCallback> success_cb; |
| + EXPECT_CALL(success_cb, Run(_)); |
| + |
| + delegate_impl_->OnStartSessionSucceeded( |
| + main_frame_process_id_, main_frame_routing_id_, success_cb.Get(), |
| + session_info, media_route); |
| + |
| + EXPECT_CALL( |
| + *mock_offscreen_manager, |
| + UnregisterOffscreenPresentationController(presentation_id, rfh_id)) |
| + .Times(1); |
| + EXPECT_CALL(router_, DetachRoute(_)).Times(0); |
| + |
| + delegate_impl_->CloseConnection(main_frame_process_id_, |
| + main_frame_routing_id_, presentation_id); |
| + delegate_impl_->CloseConnection(main_frame_process_id_, |
| + main_frame_routing_id_, presentation_id); |
| +} |
| + |
| +TEST_F(PresentationServiceDelegateImplTest, |
| + TestJoinSessionForOffscreenPresentation) { |
| + std::string presentation_id = "presentation_id"; |
| + GURL presentation_url = GURL("http://www.example.com/presentation.html"); |
| + MediaRoute media_route("route_id", |
| + MediaSourceForPresentationUrl(presentation_url), |
| + "mediaSinkId", "", true, "", true); |
| + media_route.set_offscreen_presentation(true); |
| + |
| + auto* mock_offscreen_manager = GetMockOffscreenPresentationManager(); |
| + EXPECT_CALL(*mock_offscreen_manager, IsOffscreenPresentation(presentation_id)) |
| + .WillRepeatedly(Return(true)); |
| + EXPECT_CALL(*mock_offscreen_manager, GetRoute(presentation_id)) |
| + .WillRepeatedly(Return(&media_route)); |
| + |
| + std::vector<GURL> urls = {presentation_url}; |
| + base::MockCallback<content::PresentationSessionStartedCallback> success_cb; |
| + base::MockCallback<content::PresentationSessionErrorCallback> error_cb; |
| + EXPECT_CALL(success_cb, Run(_)); |
| + EXPECT_CALL(*mock_offscreen_manager, |
| + UnregisterOffscreenPresentationController( |
| + presentation_id, RenderFrameHostId(main_frame_process_id_, |
| + main_frame_routing_id_))); |
| + |
| + delegate_impl_->JoinSession(main_frame_process_id_, main_frame_routing_id_, |
| + urls, presentation_id, success_cb.Get(), |
| + error_cb.Get()); |
| + delegate_impl_->Reset(main_frame_process_id_, main_frame_routing_id_); |
| +} |
| + |
| TEST_F(PresentationServiceDelegateImplTest, ConnectToPresentation) { |
| content::RenderFrameHost* main_frame = GetWebContents()->GetMainFrame(); |
| ASSERT_TRUE(main_frame); |
| @@ -494,29 +583,24 @@ TEST_F(PresentationServiceDelegateImplTest, ConnectToPresentation) { |
| GURL presentation_url = GURL("http://www.example.com/presentation.html"); |
| content::PresentationSessionInfo session_info(presentation_url, |
| presentation_id); |
| - |
| - base::MockCallback< |
| - base::Callback<void(const content::PresentationSessionInfo&)>> |
| - mock_callback; |
| - EXPECT_CALL(mock_callback, Run(_)); |
| MediaRoute media_route( |
| "route_id", MediaSourceForPresentationUrl(session_info.presentation_url), |
| "mediaSinkId", "", true, "", true); |
| media_route.set_offscreen_presentation(true); |
| + |
| + base::MockCallback<content::PresentationSessionStartedCallback> success_cb; |
| + EXPECT_CALL(success_cb, Run(_)); |
| + |
| delegate_impl_->OnStartSessionSucceeded(render_process_id, render_frame_id, |
| - mock_callback.Get(), session_info, |
| + success_cb.Get(), session_info, |
| media_route); |
| - OffscreenPresentationManagerFactory::GetInstanceForTest()->SetTestingFactory( |
| - profile(), &BuildMockOffscreenPresentationManager); |
| - MockOffscreenPresentationManager* mock_offscreen_manager = |
| - static_cast<MockOffscreenPresentationManager*>( |
| - OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext( |
| - profile())); |
| + auto* mock_offscreen_manager = GetMockOffscreenPresentationManager(); |
| EXPECT_CALL(*mock_offscreen_manager, |
| RegisterOffscreenPresentationController( |
| presentation_id, presentation_url, |
| - RenderFrameHostId(render_process_id, render_frame_id))); |
| + RenderFrameHostId(render_process_id, render_frame_id), |
| + Equals(media_route))); |
| content::PresentationConnectionPtr connection_ptr; |
| content::PresentationConnectionRequest connection_request; |
| @@ -528,7 +612,7 @@ TEST_F(PresentationServiceDelegateImplTest, ConnectToPresentation) { |
| UnregisterOffscreenPresentationController( |
| presentation_id, |
| RenderFrameHostId(render_process_id, render_frame_id))); |
| - EXPECT_CALL(router_, DetachRoute("route_id")); |
| + EXPECT_CALL(router_, DetachRoute("route_id")).Times(0); |
| delegate_impl_->Reset(render_process_id, render_frame_id); |
| } |
| @@ -550,6 +634,10 @@ TEST_F(PresentationServiceDelegateImplTest, AutoJoinRequest) { |
| update->AppendIfNotPresent(base::MakeUnique<base::Value>(origin)); |
| } |
| + auto* mock_offscreen_manager = GetMockOffscreenPresentationManager(); |
| + EXPECT_CALL(*mock_offscreen_manager, IsOffscreenPresentation(kPresentationId)) |
| + .WillRepeatedly(Return(false)); |
| + |
| // Auto-join requests should be rejected. |
| EXPECT_CALL(mock_create_connection_callbacks, OnCreateConnectionError(_)); |
| EXPECT_CALL(router_, JoinRoute(_, kPresentationId, _, _, _, _, _)).Times(0); |
| @@ -600,6 +688,10 @@ TEST_F(PresentationServiceDelegateImplIncognitoTest, AutoJoinRequest) { |
| update->AppendIfNotPresent(base::MakeUnique<base::Value>(origin)); |
| } |
| + auto* mock_offscreen_manager = GetMockOffscreenPresentationManager(); |
| + EXPECT_CALL(*mock_offscreen_manager, IsOffscreenPresentation(kPresentationId)) |
| + .WillRepeatedly(Return(false)); |
| + |
| // Setting the pref in incognito shouldn't set it for the non-incognito |
| // profile. |
| const base::ListValue* non_incognito_origins = |