| 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..8770ed263d9feae21dba0f4d4d6b58bc3d5c5bbe
|
| --- /dev/null
|
| +++ b/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc
|
| @@ -0,0 +1,260 @@
|
| +// Copyright 2014 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/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 PresentationServiceDelegateImplTest
|
| + : public ChromeRenderViewHostTestHarness {
|
| + public:
|
| + void SetUp() override {
|
| + ChromeRenderViewHostTestHarness::SetUp();
|
| + content::WebContents* wc = web_contents();
|
| + ASSERT_TRUE(wc);
|
| + PresentationServiceDelegateImpl::CreateForWebContents(wc);
|
| + source_manager_ = PresentationServiceDelegateImpl::FromWebContents(wc);
|
| + source_manager_->SetMediaRouterForTest(&router_);
|
| + }
|
| +
|
| + PresentationServiceDelegateImpl* source_manager_;
|
| + MockMediaRouter router_;
|
| +};
|
| +
|
| +TEST_F(PresentationServiceDelegateImplTest, AddScreenAvailabilityListener) {
|
| + std::string presentation_url1("http://url1");
|
| + std::string presentation_url2("http://url2");
|
| + std::string presentation_url3("http://url3");
|
| +
|
| + std::vector<MediaSource> sources;
|
| + sources.push_back(ForPresentationUrl(presentation_url1));
|
| + sources.push_back(ForPresentationUrl(presentation_url2));
|
| + sources.push_back(ForPresentationUrl(presentation_url3));
|
| +
|
| + MockScreenAvailabilityListener listener1(presentation_url1);
|
| + MockScreenAvailabilityListener listener2(presentation_url2);
|
| + MockScreenAvailabilityListener listener3(presentation_url3);
|
| +
|
| + PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
|
| +
|
| + EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
|
| + .Times(3)
|
| + .WillRepeatedly(Return(true));
|
| +
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener1));
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener2));
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener3));
|
| +
|
| + // Should be able to find observers for MediaSources corresponding
|
| + // to presentation URLs.
|
| + auto it = source_manager_->observers_.find(rfh_id);
|
| + ASSERT_TRUE(it != source_manager_->observers_.end());
|
| + const auto& source_map = it->second;
|
| + for (const auto& source : sources) {
|
| + auto observer_it = source_map.find(source.id());
|
| + EXPECT_TRUE(observer_it != source_map.end()) << "Mapping not found for "
|
| + << source.ToString();
|
| + }
|
| +
|
| + EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(3);
|
| +
|
| + source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
|
| + &listener1);
|
| + source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
|
| + &listener2);
|
| + source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
|
| + &listener3);
|
| +
|
| + // The RFH entry should have been removed since all of its listeners have
|
| + // been removed.
|
| + it = source_manager_->observers_.find(rfh_id);
|
| + EXPECT_TRUE(it == source_manager_->observers_.end());
|
| +}
|
| +
|
| +TEST_F(PresentationServiceDelegateImplTest, AddListenerSameUrlTwice) {
|
| + std::string presentation_url1("http://url1");
|
| + MediaSource source1(ForPresentationUrl(presentation_url1));
|
| + MockScreenAvailabilityListener listener1(presentation_url1);
|
| +
|
| + EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
|
| + .Times(1)
|
| + .WillRepeatedly(Return(true));
|
| + PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener1));
|
| +
|
| + // Register same source for same frame again shouldn't add an observer.
|
| + EXPECT_FALSE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener1));
|
| +
|
| + auto it = source_manager_->observers_.find(rfh_id);
|
| + ASSERT_TRUE(it != source_manager_->observers_.end());
|
| + const auto& source_map = it->second;
|
| + EXPECT_EQ(1u, source_map.size());
|
| +
|
| + EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(1);
|
| + source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
|
| + &listener1);
|
| +
|
| + // The RFH entry should have been removed since all of its listeners have
|
| + // been removed.
|
| + it = source_manager_->observers_.find(rfh_id);
|
| + EXPECT_TRUE(it == source_manager_->observers_.end());
|
| +}
|
| +
|
| +TEST_F(PresentationServiceDelegateImplTest, MaxNumObservers) {
|
| + std::vector<MediaSource> sources;
|
| + ScopedVector<content::PresentationScreenAvailabilityListener> listeners;
|
| + for (size_t i = 0; i < PresentationServiceDelegateImpl::kMaxNumSources; i++) {
|
| + std::string presentation_url(base::StringPrintf("http://url%zu", i));
|
| + sources.push_back(ForPresentationUrl(presentation_url));
|
| + listeners.push_back(new MockScreenAvailabilityListener(presentation_url));
|
| + }
|
| +
|
| + PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
|
| +
|
| + EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
|
| + .Times(PresentationServiceDelegateImpl::kMaxNumSources)
|
| + .WillRepeatedly(Return(true));
|
| + for (const auto& listener_ptr : listeners) {
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, listener_ptr));
|
| + }
|
| +
|
| + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&router_));
|
| +
|
| + // Already reached maximum number of observers for that frame.
|
| + // No new listener will be added.
|
| + MockScreenAvailabilityListener extra_listener("http://extraUrl");
|
| + EXPECT_FALSE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &extra_listener));
|
| +
|
| + EXPECT_CALL(router_, UnregisterMediaSinksObserver(_))
|
| + .Times(PresentationServiceDelegateImpl::kMaxNumSources);
|
| + for (const auto& listener_ptr : listeners) {
|
| + source_manager_->RemoveScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, listener_ptr);
|
| + }
|
| +
|
| + // The RFH entry should have been removed since all of its listeners have
|
| + // been removed.
|
| + auto it = source_manager_->observers_.find(rfh_id);
|
| + EXPECT_TRUE(it == source_manager_->observers_.end());
|
| +}
|
| +
|
| +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_url("http://foo");
|
| + source_manager_->SetDefaultPresentationUrl(
|
| + render_process_id, routing_id, presentation_url, "defaultPresentationId");
|
| +
|
| + EXPECT_TRUE(source_manager_->GetDefaultMediaSource().Equals(
|
| + ForPresentationUrl(presentation_url)));
|
| + EXPECT_EQ("google.com", source_manager_->default_source_host());
|
| +}
|
| +
|
| +TEST_F(PresentationServiceDelegateImplTest, Reset) {
|
| + std::string presentation_url1("http://url1");
|
| + std::string presentation_url2("http://url2");
|
| + std::string presentation_url3("http://url3");
|
| +
|
| + std::vector<MediaSource> sources;
|
| + sources.push_back(ForPresentationUrl(presentation_url1));
|
| + sources.push_back(ForPresentationUrl(presentation_url2));
|
| + sources.push_back(ForPresentationUrl(presentation_url3));
|
| +
|
| + MockScreenAvailabilityListener listener1(presentation_url1);
|
| + MockScreenAvailabilityListener listener2(presentation_url2);
|
| + MockScreenAvailabilityListener listener3(presentation_url3);
|
| +
|
| + PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
|
| +
|
| + EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
|
| + .Times(3)
|
| + .WillRepeatedly(Return(true));
|
| +
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener1));
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener2));
|
| + EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
|
| + rfh_id.first, rfh_id.second, &listener3));
|
| +
|
| + // Should be able to find observers for MediaSources corresponding
|
| + // to presentation URLs.
|
| + auto it = source_manager_->observers_.find(rfh_id);
|
| + ASSERT_TRUE(it != source_manager_->observers_.end());
|
| + const auto& source_map = it->second;
|
| + for (const auto& source : sources) {
|
| + auto observer_it = source_map.find(source.id());
|
| + EXPECT_TRUE(observer_it != source_map.end()) << "Mapping not found for "
|
| + << source.id();
|
| + }
|
| +
|
| + EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(3);
|
| +
|
| + source_manager_->Reset(rfh_id.first, rfh_id.second);
|
| +
|
| + // The RFH entry should have been removed since all of its listeners have
|
| + // been removed.
|
| + it = source_manager_->observers_.find(rfh_id);
|
| + EXPECT_TRUE(it == source_manager_->observers_.end());
|
| +}
|
| +
|
| +TEST_F(PresentationServiceDelegateImplTest, DelegateObservers) {
|
| + scoped_ptr<PresentationServiceDelegateImpl> manager(
|
| + new PresentationServiceDelegateImpl(web_contents()));
|
| +
|
| + 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
|
|
|