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

Side by Side Diff: content/renderer/presentation/presentation_dispatcher_unittest.cc

Issue 2598063002: [Presentation API] Handle multiple Presentation URLs in PresentationRequest::getAvailability() (Closed)
Patch Set: seperate AvailabilityStatus from ListeningStatus and simplify book keeping code Created 3 years, 11 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.
mark a. foltz 2017/01/13 19:01:15 s/2014/2017/
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 "base/macros.h"
6 #include "base/run_loop.h"
7 #include "content/renderer/presentation/presentation_dispatcher.h"
8 #include "mojo/public/cpp/bindings/interface_ptr.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h"
12 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nClient.h"
13 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h"
14 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h"
15
16 using ::testing::_;
17
18 namespace content {
19
20 class MockPresentationService : public blink::mojom::PresentationService {
21 public:
22 void SetClient(blink::mojom::PresentationServiceClientPtr client) override {
23 SetClient(*client);
24 }
25 MOCK_METHOD1(SetClient, void(const blink::mojom::PresentationServiceClient&));
26 MOCK_METHOD1(SetDefaultPresentationUrls, void(const std::vector<GURL>&));
27 MOCK_METHOD1(ListenForScreenAvailability, void(const GURL&));
28 MOCK_METHOD1(StopListeningForScreenAvailability, void(const GURL&));
29 MOCK_METHOD2(StartSession,
30 void(const std::vector<GURL>&, const StartSessionCallback&));
31 MOCK_METHOD3(JoinSession,
32 void(const std::vector<GURL>&,
33 const base::Optional<std::string>&,
34 const JoinSessionCallback&));
35 void SendConnectionMessage(
36 blink::mojom::PresentationSessionInfoPtr sessionInfo,
37 blink::mojom::ConnectionMessagePtr message_request,
38 const SendConnectionMessageCallback& callback) override {
39 SendConnectionMessage(*sessionInfo, *message_request, callback);
40 }
41 MOCK_METHOD3(SendConnectionMessage,
42 void(blink::mojom::PresentationSessionInfo,
43 blink::mojom::ConnectionMessage,
44 const SendConnectionMessageCallback&));
45 MOCK_METHOD2(CloseConnection, void(const GURL&, const std::string&));
46 MOCK_METHOD2(Terminate, void(const GURL&, const std::string&));
47 void ListenForConnectionMessages(
48 blink::mojom::PresentationSessionInfoPtr sessionInfo) override {
49 ListenForConnectionMessages(*sessionInfo);
50 }
51 MOCK_METHOD1(ListenForConnectionMessages,
52 void(const blink::mojom::PresentationSessionInfo&));
53 };
54
55 class MockPresentationAvailabilityCallbacks final
56 : public blink::WebCallbacks<bool, const blink::WebPresentationError&> {
57 public:
58 MOCK_METHOD1(onSuccess, void(bool value));
59 MOCK_METHOD1(onError, void(const blink::WebPresentationError&));
60 };
61
62 class MockPresentationAvailabilityObserver
63 : public blink::WebPresentationAvailabilityObserver {
64 public:
65 MockPresentationAvailabilityObserver(
66 const blink::WebVector<blink::WebURL>& urls)
67 : urls_(urls) {}
68
69 MOCK_METHOD1(availabilityChanged, void(bool));
70
71 const blink::WebVector<blink::WebURL>& urls() const override { return urls_; }
72
73 blink::WebVector<blink::WebURL> urls_;
74 };
75
76 class PresentationDispatcherTest : public testing::Test {
77 public:
78 enum class URLState { Available, Unavailable, Unsupported, Unknown };
79
80 PresentationDispatcherTest() {
81 urls_ = {GURL("http://example0.com/"), GURL("http://example1.com/"),
82 GURL("http://example2.com/"), GURL("http://example3.com/")};
83
84 blink::WebVector<blink::WebURL> urls_1(static_cast<size_t>(3));
85 urls_1[0] = urls_[0];
86 urls_1[1] = urls_[1];
87 urls_1[2] = urls_[2];
88
89 blink::WebVector<blink::WebURL> urls_2(static_cast<size_t>(3));
90 urls_2[0] = urls_[1];
91 urls_2[1] = urls_[2];
92 urls_2[2] = urls_[3];
93
94 blink::WebVector<blink::WebURL> urls_3(static_cast<size_t>(2));
95 urls_3[0] = urls_[1];
96 urls_3[1] = urls_[3];
97
98 urls_set_ = {urls_1, urls_2, urls_3};
99 }
100
101 ~PresentationDispatcherTest() override {}
102
103 void SetUp() override {
104 client_ = base::MakeUnique<PresentationDispatcher>(nullptr);
105
106 blink::mojom::PresentationServicePtr service_ptr;
107 service_binding_ = new mojo::Binding<blink::mojom::PresentationService>(
108 &mock_presentation_service_, mojo::MakeRequest(&service_ptr));
109 client_->SetPresentationServiceForTest(std::move(service_ptr));
110
111 for (const auto& urls : urls_set_) {
112 mock_observers_.push_back(
113 base::MakeUnique<MockPresentationAvailabilityObserver>(urls));
114 }
115 }
116
117 void ChangeURLState(const GURL& url, URLState state) {
118 switch (state) {
119 case URLState::Available:
120 client_->OnScreenAvailabilityUpdated(url, true);
121 break;
122 case URLState::Unavailable:
123 client_->OnScreenAvailabilityUpdated(url, false);
124 break;
125 case URLState::Unsupported:
126 client_->OnScreenAvailabilityNotSupported(url);
127 break;
128 case URLState::Unknown:
129 break;
130 }
131 }
132
133 void StartListening(MockPresentationAvailabilityObserver* observer) {
134 client_->startListening(observer);
135 }
136
137 void StopListening(MockPresentationAvailabilityObserver* observer) {
138 client_->stopListening(observer);
139 }
140
141 void TestGetAvailabilityKUrls(
142 std::vector<URLState> states,
143 MockPresentationAvailabilityCallbacks* mock_callback) {
144 blink::WebVector<blink::WebURL> urls(states.size());
145
146 for (size_t i = 0; i < states.size(); i++) {
147 GURL url("http://example" + std::to_string(i) + ".com/");
148 urls[i] = url;
149 EXPECT_CALL(mock_presentation_service_, ListenForScreenAvailability(url))
150 .Times(1);
151 EXPECT_CALL(mock_presentation_service_,
152 StopListeningForScreenAvailability(url))
153 .Times(1);
154 }
155
156 base::RunLoop run_loop;
157
158 client_->getAvailability(urls, base::WrapUnique(mock_callback));
159 for (size_t i = 0; i < states.size(); i++)
160 ChangeURLState(urls[i], states[i]);
161
162 for (const auto& url : urls)
163 client_->StopListening(url);
164
165 run_loop.RunUntilIdle();
166 }
167
168 void StartListeningToMultipleRequests() {
169 for (const auto& url : urls_) {
170 EXPECT_CALL(mock_presentation_service_, ListenForScreenAvailability(url))
171 .Times(1);
172 }
173
174 base::RunLoop run_loop;
175
176 for (const auto& urls : urls_set_) {
177 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
178 EXPECT_CALL(*mock_callback, onSuccess(false)).Times(1);
179 client_->getAvailability(urls, base::WrapUnique(mock_callback));
180 }
181
182 for (const auto& url : urls_)
183 ChangeURLState(url, URLState::Unavailable);
184
185 for (const auto& mock_observer : mock_observers_)
186 StartListening(mock_observer.get());
187
188 run_loop.RunUntilIdle();
189 }
190
191 blink::WebPresentationClient* client() { return client_.get(); }
192
193 std::unique_ptr<PresentationDispatcher> client_;
194 MockPresentationService mock_presentation_service_;
195 mojo::Binding<blink::mojom::PresentationService>* service_binding_;
196 base::MessageLoop message_loop_;
197
198 std::vector<GURL> urls_;
199 std::vector<blink::WebVector<blink::WebURL>> urls_set_;
200 std::vector<std::unique_ptr<MockPresentationAvailabilityObserver>>
201 mock_observers_;
202
203 DISALLOW_COPY_AND_ASSIGN(PresentationDispatcherTest);
204 };
205
206 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlBecomesAvailable) {
207 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
208 EXPECT_CALL(*mock_callback, onSuccess(true));
209 std::vector<URLState> states = {URLState::Available};
210 TestGetAvailabilityKUrls(states, mock_callback);
211 }
212
213 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlBecomesUnavailable) {
214 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
215 EXPECT_CALL(*mock_callback, onSuccess(false));
216
217 std::vector<URLState> states = {URLState::Unavailable};
218 TestGetAvailabilityKUrls(states, mock_callback);
219 }
220
221 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlBecomesNotSupported) {
222 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
223 EXPECT_CALL(*mock_callback, onError(_));
224
225 std::vector<URLState> states = {URLState::Unsupported};
226 TestGetAvailabilityKUrls(states, mock_callback);
227 }
228
229 TEST_F(PresentationDispatcherTest,
230 GetAvailabilityMultipleUrlsAllBecomesAvailable) {
231 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
232 EXPECT_CALL(*mock_callback, onSuccess(true)).Times(1);
233
234 std::vector<URLState> state_seq = {URLState::Available, URLState::Available};
235 TestGetAvailabilityKUrls(state_seq, mock_callback);
236 }
237
238 TEST_F(PresentationDispatcherTest,
239 GetAvailabilityMultipleUrlsOneBecomesUnavailable) {
240 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
241 EXPECT_CALL(*mock_callback, onSuccess(false)).Times(1);
242
243 std::vector<URLState> state_seq = {URLState::Unavailable, URLState::Unknown};
244 TestGetAvailabilityKUrls(state_seq, mock_callback);
245 }
246
247 TEST_F(PresentationDispatcherTest,
248 GetAvailabilityMultipleUrlsOneBecomesUnsupported) {
249 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
250 EXPECT_CALL(*mock_callback, onError(_)).Times(1);
251
252 std::vector<URLState> state_seq = {URLState::Unsupported,
253 URLState::Unavailable, URLState::Unknown};
254 TestGetAvailabilityKUrls(state_seq, mock_callback);
255 }
256
257 TEST_F(PresentationDispatcherTest,
258 GetAvailabilityMultipleUrlsOneBecomesAvailable) {
259 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
260 EXPECT_CALL(*mock_callback, onSuccess(true)).Times(1);
261
262 std::vector<URLState> state_seq = {URLState::Available, URLState::Unavailable,
263 URLState::Unknown};
264 TestGetAvailabilityKUrls(state_seq, mock_callback);
265 }
266
267 TEST_F(PresentationDispatcherTest,
268 GetAvailabilityInvokesOnSuccessForAlreadyListeningUrls) {
269 // For first getAvailability() call.
270 blink::WebVector<blink::WebURL> urls_1(static_cast<size_t>(3));
271 urls_1[0] = urls_[0];
272 urls_1[1] = urls_[1];
273 urls_1[2] = urls_[2];
274
275 for (const auto& url : urls_1) {
276 EXPECT_CALL(mock_presentation_service_,
277 ListenForScreenAvailability(static_cast<GURL>(url)))
278 .Times(1);
279 }
280
281 auto* mock_callback_1 = new MockPresentationAvailabilityCallbacks();
282 EXPECT_CALL(*mock_callback_1, onSuccess(true)).Times(1);
283
284 // For second getAvailability() call.
285 blink::WebVector<blink::WebURL> urls_2(static_cast<size_t>(2));
286 urls_2[0] = urls_[0];
287 urls_2[1] = urls_[1];
288
289 auto* mock_callback_2 = new MockPresentationAvailabilityCallbacks();
290 EXPECT_CALL(*mock_callback_2, onSuccess(true)).Times(1);
291
292 base::RunLoop run_loop;
293
294 client()->getAvailability(urls_1, base::WrapUnique(mock_callback_1));
295
296 ChangeURLState(urls_1[0], URLState::Available);
297 ChangeURLState(urls_1[1], URLState::Unavailable);
298 ChangeURLState(urls_1[2], URLState::Available);
299
300 client()->getAvailability(urls_2, base::WrapUnique(mock_callback_2));
301
302 run_loop.RunUntilIdle();
303 }
304
305 TEST_F(PresentationDispatcherTest,
306 GetAvailabilityInvokesOnErrorForAlreadyListeningUrls) {
307 // For first getAvailability() call.
308 blink::WebVector<blink::WebURL> urls_1(static_cast<size_t>(3));
309 urls_1[0] = urls_[0];
310 urls_1[1] = urls_[1];
311
312 for (const auto& url : urls_1) {
313 EXPECT_CALL(mock_presentation_service_,
314 ListenForScreenAvailability(static_cast<GURL>(url)))
315 .Times(1);
316 EXPECT_CALL(mock_presentation_service_,
317 StopListeningForScreenAvailability(static_cast<GURL>(url)))
318 .Times(1);
319 }
320
321 auto* mock_callback_1 = new MockPresentationAvailabilityCallbacks();
322 EXPECT_CALL(*mock_callback_1, onError(_)).Times(1);
323
324 // For second getAvailability() call.
325 blink::WebVector<blink::WebURL> urls_2(static_cast<size_t>(2));
326 urls_2[0] = urls_[1];
327 urls_2[1] = urls_[3];
328
329 EXPECT_CALL(mock_presentation_service_,
330 ListenForScreenAvailability(static_cast<GURL>(urls_[3])))
331 .Times(0);
332
333 auto* mock_callback_2 = new MockPresentationAvailabilityCallbacks();
334 EXPECT_CALL(*mock_callback_2, onError(_)).Times(1);
335
336 base::RunLoop run_loop;
337
338 client()->getAvailability(urls_1, base::WrapUnique(mock_callback_1));
339
340 ChangeURLState(urls_1[0], URLState::Unknown);
341 ChangeURLState(urls_1[1], URLState::Unsupported);
342
343 client()->getAvailability(urls_2, base::WrapUnique(mock_callback_2));
344
345 run_loop.RunUntilIdle();
346 }
347
348 TEST_F(PresentationDispatcherTest, StartListeningListenToEachURLOnce) {
349 StartListeningToMultipleRequests();
350 }
351
352 TEST_F(PresentationDispatcherTest, StopListeningListenToEachURLOnce) {
353 StartListeningToMultipleRequests();
354
355 for (const auto& url : urls_) {
356 EXPECT_CALL(mock_presentation_service_,
357 StopListeningForScreenAvailability(url))
358 .Times(1);
359 }
360
361 base::RunLoop run_loop;
362 for (const auto& mock_observer : mock_observers_)
363 StopListening(mock_observer.get());
364 run_loop.RunUntilIdle();
365 }
366
367 TEST_F(PresentationDispatcherTest,
368 StopListeningDoesNotStopIfURLListenedByOthers) {
369 StartListeningToMultipleRequests();
370
371 EXPECT_CALL(mock_presentation_service_,
372 StopListeningForScreenAvailability(urls_[0]))
373 .Times(1);
374
375 base::RunLoop run_loop;
376 StopListening(mock_observers_[0].get());
377 run_loop.RunUntilIdle();
378 }
379
380 TEST_F(PresentationDispatcherTest,
381 OnScreenAvailabilityUpdatedInvokesAvailabilityChanged) {
382 StartListeningToMultipleRequests();
383
384 EXPECT_CALL(*(mock_observers_[0]), availabilityChanged(true));
385
386 base::RunLoop run_loop;
387 ChangeURLState(urls_[0], URLState::Available);
388 run_loop.RunUntilIdle();
389 }
390
391 TEST_F(PresentationDispatcherTest,
392 OnScreenAvailabilityUpdatedInvokesMultipleAvailabilityChanged) {
393 StartListeningToMultipleRequests();
394
395 for (const auto& mock_observer : mock_observers_)
396 EXPECT_CALL(*mock_observer, availabilityChanged(true));
397
398 base::RunLoop run_loop;
399 ChangeURLState(urls_[1], URLState::Available);
400 run_loop.RunUntilIdle();
401 }
402
403 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698