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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1a11b808dc5bca1645fff1674f39cdc59d0971a4 |
--- /dev/null |
+++ b/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc |
@@ -0,0 +1,222 @@ |
+// Copyright 2015 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 <vector> |
+ |
+#include "base/strings/stringprintf.h" |
+#include "chrome/browser/media/router/media_source.h" |
+#include "chrome/browser/media/router/media_source_helper.h" |
+#include "chrome/browser/media/router/mock_media_router.h" |
+#include "chrome/browser/media/router/mock_screen_availability_listener.h" |
+#include "chrome/browser/media/router/presentation_service_delegate_impl.h" |
+#include "chrome/browser/media/router/test_helper.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
+#include "content/public/browser/presentation_screen_availability_listener.h" |
+#include "content/public/browser/presentation_session.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/test/web_contents_tester.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+using ::testing::_; |
+using ::testing::Mock; |
+using ::testing::Return; |
+using ::testing::StrictMock; |
+ |
+namespace media_router { |
+ |
+class MockDelegateObserver |
+ : public content::PresentationServiceDelegate::Observer { |
+ public: |
+ MOCK_METHOD0(OnDelegateDestroyed, void()); |
+ MOCK_METHOD1(OnDefaultPresentationStarted, |
+ void(const content::PresentationSessionInfo&)); |
+}; |
+ |
+class MockDefaultMediaSourceObserver |
+ : public PresentationServiceDelegateImpl::DefaultMediaSourceObserver { |
+ public: |
+ MOCK_METHOD2(OnDefaultMediaSourceChanged, |
+ void(const MediaSource&, const std::string&)); |
+}; |
+ |
+class PresentationServiceDelegateImplTest |
+ : public ChromeRenderViewHostTestHarness { |
+ public: |
+ void SetUp() override { |
+ ChromeRenderViewHostTestHarness::SetUp(); |
+ content::WebContents* wc = web_contents(); |
+ ASSERT_TRUE(wc); |
+ PresentationServiceDelegateImpl::CreateForWebContents(wc); |
+ delegate_impl_ = PresentationServiceDelegateImpl::FromWebContents(wc); |
+ delegate_impl_->SetMediaRouterForTest(&router_); |
+ } |
+ |
+ PresentationServiceDelegateImpl* delegate_impl_; |
+ MockMediaRouter router_; |
+}; |
+ |
+TEST_F(PresentationServiceDelegateImplTest, AddScreenAvailabilityListener) { |
+ std::string presentation_url1("http://url1"); |
+ std::string presentation_url2("http://url2"); |
+ MediaSource source1 = MediaSourceForPresentationUrl(presentation_url1); |
+ MediaSource source2 = MediaSourceForPresentationUrl(presentation_url2); |
+ MockScreenAvailabilityListener listener1(presentation_url1); |
+ MockScreenAvailabilityListener listener2(presentation_url2); |
+ int render_process_id = 10; |
+ int render_frame_id1 = 1; |
+ int render_frame_id2 = 2; |
+ |
+ EXPECT_CALL(router_, RegisterMediaSinksObserver(_)).Times(2); |
+ EXPECT_TRUE(delegate_impl_->AddScreenAvailabilityListener( |
+ render_process_id, render_frame_id1, &listener1)); |
+ EXPECT_TRUE(delegate_impl_->AddScreenAvailabilityListener( |
+ render_process_id, render_frame_id2, &listener2)); |
+ EXPECT_TRUE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id1, source1.id())) |
+ << "Mapping not found for " << source1.ToString(); |
+ EXPECT_TRUE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id2, source2.id())) |
+ << "Mapping not found for " << source2.ToString(); |
+ |
+ EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(2); |
+ delegate_impl_->RemoveScreenAvailabilityListener( |
+ render_process_id, render_frame_id1, &listener1); |
+ delegate_impl_->RemoveScreenAvailabilityListener( |
+ render_process_id, render_frame_id2, &listener2); |
+ EXPECT_FALSE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id1, source1.id())); |
+ EXPECT_FALSE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id2, source2.id())); |
+} |
+ |
+TEST_F(PresentationServiceDelegateImplTest, AddSameListenerTwice) { |
+ std::string presentation_url1("http://url1"); |
+ MediaSource source1(MediaSourceForPresentationUrl(presentation_url1)); |
+ MockScreenAvailabilityListener listener1(presentation_url1); |
+ int render_process_id = 1; |
+ int render_frame_id = 0; |
+ |
+ EXPECT_CALL(router_, RegisterMediaSinksObserver(_)).Times(1); |
+ EXPECT_TRUE(delegate_impl_->AddScreenAvailabilityListener( |
+ render_process_id, render_frame_id, &listener1)); |
+ EXPECT_FALSE(delegate_impl_->AddScreenAvailabilityListener( |
+ render_process_id, render_frame_id, &listener1)); |
+ EXPECT_TRUE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id, source1.id())); |
+ |
+ EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(1); |
+ delegate_impl_->RemoveScreenAvailabilityListener(render_process_id, |
+ render_frame_id, &listener1); |
+ EXPECT_FALSE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id, source1.id())); |
+} |
+ |
+TEST_F(PresentationServiceDelegateImplTest, SetDefaultPresentationUrl) { |
+ content::WebContentsTester::For(web_contents()) |
+ ->NavigateAndCommit(GURL("http://www.google.com")); |
+ content::RenderFrameHost* main_frame = web_contents()->GetMainFrame(); |
+ ASSERT_TRUE(main_frame); |
+ int render_process_id = main_frame->GetProcess()->GetID(); |
+ int routing_id = main_frame->GetRoutingID(); |
+ |
+ std::string presentation_url1("http://foo"); |
+ delegate_impl_->SetDefaultPresentationUrl(render_process_id, routing_id, |
+ presentation_url1, |
+ "defaultPresentationId"); |
+ EXPECT_TRUE(delegate_impl_->default_source().Equals( |
+ MediaSourceForPresentationUrl(presentation_url1))); |
+ |
+ // Remove default presentation URL. |
+ delegate_impl_->SetDefaultPresentationUrl(render_process_id, routing_id, "", |
+ ""); |
+ EXPECT_TRUE(delegate_impl_->default_source().Empty()); |
+ |
+ // Set to a new default presentation URL |
+ std::string presentation_url2("https://youtube.com"); |
+ delegate_impl_->SetDefaultPresentationUrl(render_process_id, routing_id, |
+ presentation_url2, |
+ "defaultPresentationId"); |
+ EXPECT_TRUE(delegate_impl_->default_source().Equals( |
+ MediaSourceForPresentationUrl(presentation_url2))); |
+} |
+ |
+TEST_F(PresentationServiceDelegateImplTest, DefaultMediaSourceObserver) { |
+ content::WebContentsTester::For(web_contents()) |
+ ->NavigateAndCommit(GURL("http://www.google.com")); |
+ content::RenderFrameHost* main_frame = web_contents()->GetMainFrame(); |
+ ASSERT_TRUE(main_frame); |
+ int render_process_id = main_frame->GetProcess()->GetID(); |
+ int routing_id = main_frame->GetRoutingID(); |
+ StrictMock<MockDefaultMediaSourceObserver> observer1; |
+ StrictMock<MockDefaultMediaSourceObserver> observer2; |
+ delegate_impl_->AddDefaultMediaSourceObserver(&observer1); |
+ delegate_impl_->AddDefaultMediaSourceObserver(&observer2); |
+ std::string url1("http://foo"); |
+ EXPECT_CALL(observer1, OnDefaultMediaSourceChanged( |
+ Equals(MediaSourceForPresentationUrl(url1)), |
+ "google.com")).Times(1); |
+ EXPECT_CALL(observer2, OnDefaultMediaSourceChanged( |
+ Equals(MediaSourceForPresentationUrl(url1)), |
+ "google.com")).Times(1); |
+ delegate_impl_->SetDefaultPresentationUrl(render_process_id, routing_id, url1, |
+ "defaultPresentationId"); |
+ |
+ EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); |
+ EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer2)); |
+ |
+ delegate_impl_->RemoveDefaultMediaSourceObserver(&observer2); |
+ std::string url2("http://youtube.com"); |
+ EXPECT_CALL(observer1, OnDefaultMediaSourceChanged( |
+ Equals(MediaSourceForPresentationUrl(url2)), |
+ "google.com")).Times(1); |
+ delegate_impl_->SetDefaultPresentationUrl(render_process_id, routing_id, url2, |
+ "defaultPresentationId"); |
+ |
+ EXPECT_TRUE(Mock::VerifyAndClearExpectations(&observer1)); |
+ // Remove default presentation URL. |
+ EXPECT_CALL(observer1, OnDefaultMediaSourceChanged(Equals(MediaSource()), |
+ "google.com")).Times(1); |
+ delegate_impl_->SetDefaultPresentationUrl(render_process_id, routing_id, "", |
+ ""); |
+} |
+ |
+TEST_F(PresentationServiceDelegateImplTest, Reset) { |
+ std::string presentation_url1("http://url1"); |
+ MediaSource source = MediaSourceForPresentationUrl(presentation_url1); |
+ MockScreenAvailabilityListener listener1(presentation_url1); |
+ int render_process_id = 1; |
+ int render_frame_id = 0; |
+ |
+ EXPECT_TRUE(delegate_impl_->AddScreenAvailabilityListener( |
+ render_process_id, render_frame_id, &listener1)); |
+ EXPECT_TRUE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id, source.id())); |
+ EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(1); |
+ delegate_impl_->Reset(render_process_id, render_frame_id); |
+ EXPECT_FALSE(delegate_impl_->HasScreenAvailabilityListenerForTest( |
+ render_process_id, render_frame_id, source.id())); |
+} |
+ |
+TEST_F(PresentationServiceDelegateImplTest, DelegateObservers) { |
+ scoped_ptr<PresentationServiceDelegateImpl> manager( |
+ new PresentationServiceDelegateImpl(web_contents())); |
+ manager->SetMediaRouterForTest(&router_); |
+ |
+ StrictMock<MockDelegateObserver> delegate_observer1; |
+ StrictMock<MockDelegateObserver> delegate_observer2; |
+ |
+ manager->AddObserver(123, 234, &delegate_observer1); |
+ manager->AddObserver(345, 456, &delegate_observer2); |
+ |
+ // Removes |delegate_observer2|. |
+ manager->RemoveObserver(345, 456); |
+ |
+ EXPECT_CALL(delegate_observer1, OnDelegateDestroyed()).Times(1); |
+ manager.reset(); |
+} |
+ |
+} // namespace media_router |