Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |