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

Side by Side Diff: chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc

Issue 1132903002: [MediaRouter] Add implementation of PresentationServiceDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <vector>
6
7 #include "base/strings/stringprintf.h"
8 #include "chrome/browser/media/router/media_source.h"
9 #include "chrome/browser/media/router/media_source_helper.h"
10 #include "chrome/browser/media/router/mock_media_router.h"
11 #include "chrome/browser/media/router/mock_screen_availability_listener.h"
12 #include "chrome/browser/media/router/presentation_service_delegate_impl.h"
13 #include "chrome/grit/generated_resources.h"
14 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
15 #include "content/public/browser/presentation_screen_availability_listener.h"
16 #include "content/public/browser/presentation_session.h"
17 #include "content/public/browser/render_process_host.h"
18 #include "content/public/browser/web_contents.h"
19 #include "content/public/test/web_contents_tester.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "ui/base/l10n/l10n_util.h"
22
23 using ::testing::_;
24 using ::testing::Mock;
25 using ::testing::Return;
26 using ::testing::StrictMock;
27
28 namespace media_router {
29
30 class MockDelegateObserver
31 : public content::PresentationServiceDelegate::Observer {
32 public:
33 MOCK_METHOD0(OnDelegateDestroyed, void());
34 MOCK_METHOD1(OnDefaultPresentationStarted,
35 void(const content::PresentationSessionInfo&));
36 };
37
38 class PresentationServiceDelegateImplTest
39 : public ChromeRenderViewHostTestHarness {
40 public:
41 void SetUp() override {
42 ChromeRenderViewHostTestHarness::SetUp();
43 content::WebContents* wc = web_contents();
44 ASSERT_TRUE(wc);
45 PresentationServiceDelegateImpl::CreateForWebContents(wc);
46 source_manager_ = PresentationServiceDelegateImpl::FromWebContents(wc);
47 source_manager_->SetMediaRouterForTest(&router_);
48 }
49
50 PresentationServiceDelegateImpl* source_manager_;
51 MockMediaRouter router_;
52 };
53
54 TEST_F(PresentationServiceDelegateImplTest, AddScreenAvailabilityListener) {
55 std::string presentation_url1("http://url1");
56 std::string presentation_url2("http://url2");
57 std::string presentation_url3("http://url3");
58
59 std::vector<MediaSource> sources;
60 sources.push_back(ForPresentationUrl(presentation_url1));
61 sources.push_back(ForPresentationUrl(presentation_url2));
62 sources.push_back(ForPresentationUrl(presentation_url3));
63
64 MockScreenAvailabilityListener listener1(presentation_url1);
65 MockScreenAvailabilityListener listener2(presentation_url2);
66 MockScreenAvailabilityListener listener3(presentation_url3);
67
68 PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
69
70 EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
71 .Times(3)
72 .WillRepeatedly(Return(true));
73
74 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
75 rfh_id.first, rfh_id.second, &listener1));
76 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
77 rfh_id.first, rfh_id.second, &listener2));
78 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
79 rfh_id.first, rfh_id.second, &listener3));
80
81 // Should be able to find observers for MediaSources corresponding
82 // to presentation URLs.
83 auto it = source_manager_->observers_.find(rfh_id);
84 ASSERT_TRUE(it != source_manager_->observers_.end());
85 const auto& source_map = it->second;
86 for (const auto& source : sources) {
87 auto observer_it = source_map.find(source.id());
88 EXPECT_TRUE(observer_it != source_map.end()) << "Mapping not found for "
89 << source.ToString();
90 }
91
92 EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(3);
93
94 source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
95 &listener1);
96 source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
97 &listener2);
98 source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
99 &listener3);
100
101 // The RFH entry should have been removed since all of its listeners have
102 // been removed.
103 it = source_manager_->observers_.find(rfh_id);
104 EXPECT_TRUE(it == source_manager_->observers_.end());
105 }
106
107 TEST_F(PresentationServiceDelegateImplTest, AddListenerSameUrlTwice) {
108 std::string presentation_url1("http://url1");
109 MediaSource source1(ForPresentationUrl(presentation_url1));
110 MockScreenAvailabilityListener listener1(presentation_url1);
111
112 EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
113 .Times(1)
114 .WillRepeatedly(Return(true));
115 PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
116 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
117 rfh_id.first, rfh_id.second, &listener1));
118
119 // Register same source for same frame again shouldn't add an observer.
120 EXPECT_FALSE(source_manager_->AddScreenAvailabilityListener(
121 rfh_id.first, rfh_id.second, &listener1));
122
123 auto it = source_manager_->observers_.find(rfh_id);
124 ASSERT_TRUE(it != source_manager_->observers_.end());
125 const auto& source_map = it->second;
126 EXPECT_EQ(1u, source_map.size());
127
128 EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(1);
129 source_manager_->RemoveScreenAvailabilityListener(rfh_id.first, rfh_id.second,
130 &listener1);
131
132 // The RFH entry should have been removed since all of its listeners have
133 // been removed.
134 it = source_manager_->observers_.find(rfh_id);
135 EXPECT_TRUE(it == source_manager_->observers_.end());
136 }
137
138 TEST_F(PresentationServiceDelegateImplTest, MaxNumObservers) {
139 std::vector<MediaSource> sources;
140 ScopedVector<content::PresentationScreenAvailabilityListener> listeners;
141 for (size_t i = 0; i < PresentationServiceDelegateImpl::kMaxNumSources; i++) {
142 std::string presentation_url(base::StringPrintf("http://url%zu", i));
143 sources.push_back(ForPresentationUrl(presentation_url));
144 listeners.push_back(new MockScreenAvailabilityListener(presentation_url));
145 }
146
147 PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
148
149 EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
150 .Times(PresentationServiceDelegateImpl::kMaxNumSources)
151 .WillRepeatedly(Return(true));
152 for (const auto& listener_ptr : listeners) {
153 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
154 rfh_id.first, rfh_id.second, listener_ptr));
155 }
156
157 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&router_));
158
159 // Already reached maximum number of observers for that frame.
160 // No new listener will be added.
161 MockScreenAvailabilityListener extra_listener("http://extraUrl");
162 EXPECT_FALSE(source_manager_->AddScreenAvailabilityListener(
163 rfh_id.first, rfh_id.second, &extra_listener));
164
165 EXPECT_CALL(router_, UnregisterMediaSinksObserver(_))
166 .Times(PresentationServiceDelegateImpl::kMaxNumSources);
167 for (const auto& listener_ptr : listeners) {
168 source_manager_->RemoveScreenAvailabilityListener(
169 rfh_id.first, rfh_id.second, listener_ptr);
170 }
171
172 // The RFH entry should have been removed since all of its listeners have
173 // been removed.
174 auto it = source_manager_->observers_.find(rfh_id);
175 EXPECT_TRUE(it == source_manager_->observers_.end());
176 }
177
178 TEST_F(PresentationServiceDelegateImplTest, SetDefaultPresentationUrl) {
179 content::WebContentsTester::For(web_contents())
180 ->NavigateAndCommit(GURL("http://www.google.com"));
181 content::RenderFrameHost* main_frame = web_contents()->GetMainFrame();
182 ASSERT_TRUE(main_frame);
183
184 int render_process_id = main_frame->GetProcess()->GetID();
185 int routing_id = main_frame->GetRoutingID();
186 std::string presentation_url("http://foo");
187 source_manager_->SetDefaultPresentationUrl(
188 render_process_id, routing_id, presentation_url, "defaultPresentationId");
189
190 EXPECT_TRUE(source_manager_->GetDefaultMediaSource().Equals(
191 ForPresentationUrl(presentation_url)));
192 EXPECT_EQ("google.com", source_manager_->default_source_host());
193 }
194
195 TEST_F(PresentationServiceDelegateImplTest, Reset) {
196 std::string presentation_url1("http://url1");
197 std::string presentation_url2("http://url2");
198 std::string presentation_url3("http://url3");
199
200 std::vector<MediaSource> sources;
201 sources.push_back(ForPresentationUrl(presentation_url1));
202 sources.push_back(ForPresentationUrl(presentation_url2));
203 sources.push_back(ForPresentationUrl(presentation_url3));
204
205 MockScreenAvailabilityListener listener1(presentation_url1);
206 MockScreenAvailabilityListener listener2(presentation_url2);
207 MockScreenAvailabilityListener listener3(presentation_url3);
208
209 PresentationServiceDelegateImpl::RenderFrameHostId rfh_id(0, 0);
210
211 EXPECT_CALL(router_, RegisterMediaSinksObserver(_))
212 .Times(3)
213 .WillRepeatedly(Return(true));
214
215 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
216 rfh_id.first, rfh_id.second, &listener1));
217 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
218 rfh_id.first, rfh_id.second, &listener2));
219 EXPECT_TRUE(source_manager_->AddScreenAvailabilityListener(
220 rfh_id.first, rfh_id.second, &listener3));
221
222 // Should be able to find observers for MediaSources corresponding
223 // to presentation URLs.
224 auto it = source_manager_->observers_.find(rfh_id);
225 ASSERT_TRUE(it != source_manager_->observers_.end());
226 const auto& source_map = it->second;
227 for (const auto& source : sources) {
228 auto observer_it = source_map.find(source.id());
229 EXPECT_TRUE(observer_it != source_map.end()) << "Mapping not found for "
230 << source.id();
231 }
232
233 EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(3);
234
235 source_manager_->Reset(rfh_id.first, rfh_id.second);
236
237 // The RFH entry should have been removed since all of its listeners have
238 // been removed.
239 it = source_manager_->observers_.find(rfh_id);
240 EXPECT_TRUE(it == source_manager_->observers_.end());
241 }
242
243 TEST_F(PresentationServiceDelegateImplTest, DelegateObservers) {
244 scoped_ptr<PresentationServiceDelegateImpl> manager(
245 new PresentationServiceDelegateImpl(web_contents()));
246
247 StrictMock<MockDelegateObserver> delegate_observer1;
248 StrictMock<MockDelegateObserver> delegate_observer2;
249
250 manager->AddObserver(123, 234, &delegate_observer1);
251 manager->AddObserver(345, 456, &delegate_observer2);
252
253 // Removes |delegate_observer2|.
254 manager->RemoveObserver(345, 456);
255
256 EXPECT_CALL(delegate_observer1, OnDelegateDestroyed()).Times(1);
257 manager.reset();
258 }
259
260 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698