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

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: Created 4 years 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 "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 };
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::GetProxy(&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 }
129 }
130
131 void StartListening(MockPresentationAvailabilityObserver* observer) {
132 client_->startListening(observer);
133 }
134
135 void StopListening(MockPresentationAvailabilityObserver* observer) {
136 client_->stopListening(observer);
137 }
138
139 void TestGetAvailabilityKUrls(
140 size_t k,
141 std::vector<URLState> states,
142 MockPresentationAvailabilityCallbacks* mock_callback) {
143 blink::WebVector<blink::WebURL> urls(k);
144
145 for (size_t i = 0; i < k; i++) {
146 GURL url("http://example" + std::to_string(i) + ".com/");
147 urls[i] = url;
148 EXPECT_CALL(mock_presentation_service_, ListenForScreenAvailability(url))
149 .Times(1);
150 if (states.size() == k) {
151 EXPECT_CALL(mock_presentation_service_,
152 StopListeningForScreenAvailability(url))
153 .Times(1);
154 }
155 }
156
157 base::RunLoop run_loop;
158
159 client()->getAvailability(urls, base::WrapUnique(mock_callback));
160 for (size_t i = 0; i < std::min(k, states.size()); i++)
161 ChangeURLState(urls[i], states[i]);
162
163 run_loop.RunUntilIdle();
164 }
165
166 void StartListeningToMultipleRequests() {
167 for (const auto& url : urls_) {
168 EXPECT_CALL(mock_presentation_service_, ListenForScreenAvailability(url))
169 .Times(1);
170 EXPECT_CALL(mock_presentation_service_,
171 StopListeningForScreenAvailability(url))
172 .Times(1);
173 }
174
175 base::RunLoop run_loop;
176
177 for (const auto& urls : urls_set_) {
178 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
179 EXPECT_CALL(*mock_callback, onSuccess(false)).Times(1);
180 client()->getAvailability(urls, base::WrapUnique(mock_callback));
181 }
182
183 // Clean up callbacks.
184 for (const auto& url : urls_)
185 ChangeURLState(url, URLState::Unavailable);
186
187 run_loop.RunUntilIdle();
188
189 for (const auto& url : urls_) {
190 EXPECT_CALL(mock_presentation_service_, ListenForScreenAvailability(url))
191 .Times(1);
192 }
193
194 base::RunLoop run_loop_2;
195 for (const auto& mock_observer : mock_observers_)
196 StartListening(mock_observer.get());
197 run_loop_2.RunUntilIdle();
198 }
199
200 blink::WebPresentationClient* client() { return client_.get(); }
201
202 std::unique_ptr<PresentationDispatcher> client_;
203 MockPresentationService mock_presentation_service_;
204 mojo::Binding<blink::mojom::PresentationService>* service_binding_;
205 base::MessageLoop message_loop_;
206
207 std::vector<GURL> urls_;
208 std::vector<blink::WebVector<blink::WebURL>> urls_set_;
209 std::vector<std::unique_ptr<MockPresentationAvailabilityObserver>>
210 mock_observers_;
211
212 DISALLOW_COPY_AND_ASSIGN(PresentationDispatcherTest);
213 };
214
215 TEST_F(PresentationDispatcherTest, GetAvailabilityNoUrl) {
216 EXPECT_CALL(mock_presentation_service_, ListenForScreenAvailability(_))
217 .Times(0);
218
219 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
220 EXPECT_CALL(*mock_callback, onError(_));
221 std::vector<URLState> states;
222 TestGetAvailabilityKUrls(0, states, mock_callback);
223 }
224
225 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlNoAvailabilityChange) {
226 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
227 std::vector<URLState> states;
228 TestGetAvailabilityKUrls(1, states, mock_callback);
229 }
230
231 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlBecomesAvailable) {
232 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
233 EXPECT_CALL(*mock_callback, onSuccess(true));
234 std::vector<URLState> states = {URLState::Available};
235 TestGetAvailabilityKUrls(1, states, mock_callback);
236 }
237
238 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlBecomesUnavailable) {
239 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
240 EXPECT_CALL(*mock_callback, onSuccess(false));
241
242 std::vector<URLState> states = {URLState::Unavailable};
243 TestGetAvailabilityKUrls(1, states, mock_callback);
244 }
245
246 TEST_F(PresentationDispatcherTest, GetAvailabilityOneUrlBecomesNotSupported) {
247 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
248 EXPECT_CALL(*mock_callback, onError(_));
249
250 std::vector<URLState> states = {URLState::Unsupported};
251 TestGetAvailabilityKUrls(1, states, mock_callback);
252 }
253
254 TEST_F(PresentationDispatcherTest,
255 GetAvailabilityMultipleUrlsAllBecomesAvailable) {
256 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
257 EXPECT_CALL(*mock_callback, onSuccess(true)).Times(1);
258
259 std::vector<URLState> state_seq = {URLState::Available, URLState::Available};
260 TestGetAvailabilityKUrls(2, state_seq, mock_callback);
261 }
262
263 TEST_F(PresentationDispatcherTest,
264 GetAvailabilityMultipleUrlsAllBecomesUnavailable) {
265 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
266 EXPECT_CALL(*mock_callback, onSuccess(false)).Times(1);
267
268 std::vector<URLState> state_seq = {URLState::Unavailable,
269 URLState::Unavailable};
270 TestGetAvailabilityKUrls(2, state_seq, mock_callback);
271 }
272
273 TEST_F(PresentationDispatcherTest,
274 GetAvailabilityMultipleUrlsAllBecomesUnsupported) {
275 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
276 EXPECT_CALL(*mock_callback, onError(_)).Times(1);
277
278 std::vector<URLState> state_seq = {URLState::Unsupported,
279 URLState::Unsupported};
280 TestGetAvailabilityKUrls(2, state_seq, mock_callback);
281 }
282
283 TEST_F(PresentationDispatcherTest,
284 GetAvailabilityMultipleUrlsOneBecomesAvailable) {
285 auto* mock_callback = new MockPresentationAvailabilityCallbacks();
286 EXPECT_CALL(*mock_callback, onSuccess(true)).Times(1);
287
288 std::vector<URLState> state_seq = {URLState::Unsupported,
289 URLState::Available};
290 TestGetAvailabilityKUrls(2, state_seq, mock_callback);
291 }
292
293 TEST_F(PresentationDispatcherTest,
294 GetAvailabilityReturnsDirectlyForAlreadyListeningUrls) {
295 auto* mock_callback_1 = new MockPresentationAvailabilityCallbacks();
296 EXPECT_CALL(*mock_callback_1, onSuccess(true)).Times(1);
297
298 std::vector<URLState> state_seq = {URLState::Available, URLState::Unavailable,
299 URLState::Unsupported};
300 TestGetAvailabilityKUrls(3, state_seq, mock_callback_1);
301
302 base::RunLoop run_loop;
303
304 blink::WebVector<blink::WebURL> urls(static_cast<size_t>(2));
305 urls[0] = GURL("http://example0.com");
306 urls[1] = GURL("http://example1.com");
307
308 auto* mock_callback_2 = new MockPresentationAvailabilityCallbacks();
309 EXPECT_CALL(*mock_callback_2, onSuccess(true)).Times(1);
310
311 client()->getAvailability(urls, base::WrapUnique(mock_callback_2));
312
313 run_loop.RunUntilIdle();
314 }
315
316 TEST_F(PresentationDispatcherTest, StartListeningListenToEachURLOnce) {
317 StartListeningToMultipleRequests();
318 }
319
320 TEST_F(PresentationDispatcherTest, StopListeningListenToEachURLOnce) {
321 StartListeningToMultipleRequests();
322
323 for (const auto& url : urls_) {
324 EXPECT_CALL(mock_presentation_service_,
325 StopListeningForScreenAvailability(url))
326 .Times(1);
327 }
328
329 base::RunLoop run_loop;
330 for (const auto& mock_observer : mock_observers_)
331 StopListening(mock_observer.get());
332 run_loop.RunUntilIdle();
333 }
334
335 TEST_F(PresentationDispatcherTest,
336 StopListeningDoesNotStopIfURLListenedByOthers) {
337 StartListeningToMultipleRequests();
338
339 EXPECT_CALL(mock_presentation_service_,
340 StopListeningForScreenAvailability(urls_[0]))
341 .Times(1);
342
343 base::RunLoop run_loop;
344 StopListening(mock_observers_[0].get());
345 run_loop.RunUntilIdle();
346 }
347
348 TEST_F(PresentationDispatcherTest,
349 OnScreenAvailabilityUpdatedInvokesAvailabilityChanged) {
350 StartListeningToMultipleRequests();
351
352 EXPECT_CALL(*(mock_observers_[0]), availabilityChanged(true));
353
354 base::RunLoop run_loop;
355 ChangeURLState(urls_[0], URLState::Available);
356 run_loop.RunUntilIdle();
357 }
358
359 TEST_F(PresentationDispatcherTest,
360 OnScreenAvailabilityUpdatedInvokesMultipleAvailabilityChanged) {
361 StartListeningToMultipleRequests();
362
363 for (const auto& mock_observer : mock_observers_)
364 EXPECT_CALL(*mock_observer, availabilityChanged(true));
365
366 base::RunLoop run_loop;
367 ChangeURLState(urls_[1], URLState::Available);
368 run_loop.RunUntilIdle();
369 }
370
371 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698