| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 | 188 |
| 189 TEST_F(MediaRouterMojoImplTest, CreateRoute) { | 189 TEST_F(MediaRouterMojoImplTest, CreateRoute) { |
| 190 MediaSource media_source(kSource); | 190 MediaSource media_source(kSource); |
| 191 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 191 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 192 false); | 192 false); |
| 193 | 193 |
| 194 // Use a lambda function as an invocation target here to work around | 194 // Use a lambda function as an invocation target here to work around |
| 195 // a limitation with GMock::Invoke that prevents it from using move-only types | 195 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 196 // in runnable parameter lists. | 196 // in runnable parameter lists. |
| 197 EXPECT_CALL(mock_media_route_provider_, | 197 EXPECT_CALL(mock_media_route_provider_, |
| 198 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), | 198 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _)) |
| 199 kInvalidTabId, _, _, _)) | |
| 200 .WillOnce(Invoke( | 199 .WillOnce(Invoke( |
| 201 [](const std::string& source, const std::string& sink, | 200 [](const std::string& source, const std::string& sink, |
| 202 const std::string& presentation_id, const url::Origin& origin, | 201 const std::string& presentation_id, const std::string& origin, |
| 203 int tab_id, base::TimeDelta timeout, bool incognito, | 202 int tab_id, base::TimeDelta timeout, bool incognito, |
| 204 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 203 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 205 cb.Run(CreateMojoRoute(), std::string(), | 204 cb.Run(CreateMojoRoute(), std::string(), |
| 206 mojom::RouteRequestResultCode::OK); | 205 mojom::RouteRequestResultCode::OK); |
| 207 })); | 206 })); |
| 208 | 207 |
| 209 base::RunLoop run_loop; | 208 base::RunLoop run_loop; |
| 210 RouteResponseCallbackHandler handler; | 209 RouteResponseCallbackHandler handler; |
| 211 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 210 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 212 RouteRequestResult::OK)) | 211 RouteRequestResult::OK)) |
| 213 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 212 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 214 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 213 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 215 route_response_callbacks.push_back(base::Bind( | 214 route_response_callbacks.push_back(base::Bind( |
| 216 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 215 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 217 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, | 216 router()->CreateRoute( |
| 218 route_response_callbacks, | 217 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 219 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 218 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 220 false); | |
| 221 run_loop.Run(); | 219 run_loop.Run(); |
| 222 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); | 220 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); |
| 223 } | 221 } |
| 224 | 222 |
| 225 TEST_F(MediaRouterMojoImplTest, CreateIncognitoRoute) { | 223 TEST_F(MediaRouterMojoImplTest, CreateIncognitoRoute) { |
| 226 MediaSource media_source(kSource); | 224 MediaSource media_source(kSource); |
| 227 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 225 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 228 false); | 226 false); |
| 229 expected_route.set_incognito(true); | 227 expected_route.set_incognito(true); |
| 230 | 228 |
| 231 // Use a lambda function as an invocation target here to work around | 229 // Use a lambda function as an invocation target here to work around |
| 232 // a limitation with GMock::Invoke that prevents it from using move-only types | 230 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 233 // in runnable parameter lists. | 231 // in runnable parameter lists. |
| 234 EXPECT_CALL(mock_media_route_provider_, | 232 EXPECT_CALL(mock_media_route_provider_, |
| 235 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), | 233 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _)) |
| 236 kInvalidTabId, _, _, _)) | |
| 237 .WillOnce(Invoke( | 234 .WillOnce(Invoke( |
| 238 [](const std::string& source, const std::string& sink, | 235 [](const std::string& source, const std::string& sink, |
| 239 const std::string& presentation_id, const url::Origin& origin, | 236 const std::string& presentation_id, const std::string& origin, |
| 240 int tab_id, base::TimeDelta timeout, bool incognito, | 237 int tab_id, base::TimeDelta timeout, bool incognito, |
| 241 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 238 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 242 mojom::MediaRoutePtr route = CreateMojoRoute(); | 239 mojom::MediaRoutePtr route = CreateMojoRoute(); |
| 243 route->custom_controller_path = | 240 route->custom_controller_path = |
| 244 std::string("custom/controller/path"); | 241 std::string("custom/controller/path"); |
| 245 route->is_incognito = true; | 242 route->is_incognito = true; |
| 246 cb.Run(std::move(route), std::string(), | 243 cb.Run(std::move(route), std::string(), |
| 247 mojom::RouteRequestResultCode::OK); | 244 mojom::RouteRequestResultCode::OK); |
| 248 })); | 245 })); |
| 249 | 246 |
| 250 base::RunLoop run_loop; | 247 base::RunLoop run_loop; |
| 251 RouteResponseCallbackHandler handler; | 248 RouteResponseCallbackHandler handler; |
| 252 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 249 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 253 RouteRequestResult::OK)) | 250 RouteRequestResult::OK)) |
| 254 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 251 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 255 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 252 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 256 route_response_callbacks.push_back(base::Bind( | 253 route_response_callbacks.push_back(base::Bind( |
| 257 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 254 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 258 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, | 255 router()->CreateRoute( |
| 259 route_response_callbacks, | 256 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 260 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 257 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 261 true); | |
| 262 run_loop.Run(); | 258 run_loop.Run(); |
| 263 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); | 259 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); |
| 264 } | 260 } |
| 265 | 261 |
| 266 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { | 262 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { |
| 267 EXPECT_CALL( | 263 EXPECT_CALL( |
| 268 mock_media_route_provider_, | 264 mock_media_route_provider_, |
| 269 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), | 265 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 270 kInvalidTabId, | |
| 271 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 266 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 272 .WillOnce(Invoke( | 267 .WillOnce(Invoke( |
| 273 [](const std::string& source, const std::string& sink, | 268 [](const std::string& source, const std::string& sink, |
| 274 const std::string& presentation_id, const url::Origin& origin, | 269 const std::string& presentation_id, const std::string& origin, |
| 275 int tab_id, base::TimeDelta timeout, bool incognito, | 270 int tab_id, base::TimeDelta timeout, bool incognito, |
| 276 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 271 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 277 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 272 cb.Run(mojom::MediaRoutePtr(), std::string(kError), |
| 278 mojom::RouteRequestResultCode::TIMED_OUT); | 273 mojom::RouteRequestResultCode::TIMED_OUT); |
| 279 })); | 274 })); |
| 280 | 275 |
| 281 RouteResponseCallbackHandler handler; | 276 RouteResponseCallbackHandler handler; |
| 282 base::RunLoop run_loop; | 277 base::RunLoop run_loop; |
| 283 EXPECT_CALL(handler, | 278 EXPECT_CALL(handler, |
| 284 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 279 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 285 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 280 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 286 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 281 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 287 route_response_callbacks.push_back(base::Bind( | 282 route_response_callbacks.push_back(base::Bind( |
| 288 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 283 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 289 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, | 284 router()->CreateRoute( |
| 290 route_response_callbacks, | 285 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 291 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 286 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 292 false); | |
| 293 run_loop.Run(); | 287 run_loop.Run(); |
| 294 ExpectResultBucketCount("CreateRoute", | 288 ExpectResultBucketCount("CreateRoute", |
| 295 RouteRequestResult::ResultCode::TIMED_OUT, 1); | 289 RouteRequestResult::ResultCode::TIMED_OUT, 1); |
| 296 } | 290 } |
| 297 | 291 |
| 298 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { | 292 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { |
| 299 EXPECT_CALL( | 293 EXPECT_CALL(mock_media_route_provider_, |
| 300 mock_media_route_provider_, | 294 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 301 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), | 295 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 302 kInvalidTabId, | 296 true, _)) |
| 303 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | |
| 304 .WillOnce(Invoke( | 297 .WillOnce(Invoke( |
| 305 [](const std::string& source, const std::string& sink, | 298 [](const std::string& source, const std::string& sink, |
| 306 const std::string& presentation_id, const url::Origin& origin, | 299 const std::string& presentation_id, const std::string& origin, |
| 307 int tab_id, base::TimeDelta timeout, bool incognito, | 300 int tab_id, base::TimeDelta timeout, bool incognito, |
| 308 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 301 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 309 cb.Run(CreateMojoRoute(), std::string(), | 302 cb.Run(CreateMojoRoute(), std::string(), |
| 310 mojom::RouteRequestResultCode::OK); | 303 mojom::RouteRequestResultCode::OK); |
| 311 })); | 304 })); |
| 312 | 305 |
| 313 RouteResponseCallbackHandler handler; | 306 RouteResponseCallbackHandler handler; |
| 314 base::RunLoop run_loop; | 307 base::RunLoop run_loop; |
| 315 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 308 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 316 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 309 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 317 RouteRequestResult::INCOGNITO_MISMATCH)) | 310 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 318 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 311 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 319 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 312 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 320 route_response_callbacks.push_back(base::Bind( | 313 route_response_callbacks.push_back(base::Bind( |
| 321 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 314 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 322 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, | 315 router()->CreateRoute( |
| 323 route_response_callbacks, | 316 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 324 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 317 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 325 true); | |
| 326 run_loop.Run(); | 318 run_loop.Run(); |
| 327 ExpectResultBucketCount( | 319 ExpectResultBucketCount( |
| 328 "CreateRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 320 "CreateRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); |
| 329 } | 321 } |
| 330 | 322 |
| 331 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { | 323 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { |
| 332 mojom::MediaRoutePtr route = CreateMojoRoute(); | 324 mojom::MediaRoutePtr route = CreateMojoRoute(); |
| 333 route->is_incognito = true; | 325 route->is_incognito = true; |
| 334 | 326 |
| 335 EXPECT_CALL( | 327 EXPECT_CALL(mock_media_route_provider_, |
| 336 mock_media_route_provider_, | 328 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 337 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), | 329 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 338 kInvalidTabId, | 330 true, _)) |
| 339 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | |
| 340 .WillOnce(Invoke( | 331 .WillOnce(Invoke( |
| 341 [](const std::string& source, const std::string& sink, | 332 [](const std::string& source, const std::string& sink, |
| 342 const std::string& presentation_id, const url::Origin& origin, | 333 const std::string& presentation_id, const std::string& origin, |
| 343 int tab_id, base::TimeDelta timeout, bool incognito, | 334 int tab_id, base::TimeDelta timeout, bool incognito, |
| 344 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 335 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 345 mojom::MediaRoutePtr route = CreateMojoRoute(); | 336 mojom::MediaRoutePtr route = CreateMojoRoute(); |
| 346 route->is_incognito = true; | 337 route->is_incognito = true; |
| 347 cb.Run(std::move(route), std::string(), | 338 cb.Run(std::move(route), std::string(), |
| 348 mojom::RouteRequestResultCode::OK); | 339 mojom::RouteRequestResultCode::OK); |
| 349 })); | 340 })); |
| 350 base::RunLoop run_loop; | 341 base::RunLoop run_loop; |
| 351 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, | 342 router()->CreateRoute(kSource, kSinkId, GURL(kOrigin), nullptr, |
| 352 std::vector<MediaRouteResponseCallback>(), | 343 std::vector<MediaRouteResponseCallback>(), |
| 353 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 344 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 354 true); | 345 true); |
| 355 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 346 std::vector<mojom::MediaRoutePtr> mojo_routes(1); |
| 356 mojo_routes[0] = route->Clone(); | 347 mojo_routes[0] = route->Clone(); |
| 357 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 348 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), |
| 358 std::vector<std::string>()); | 349 std::vector<std::string>()); |
| 359 | 350 |
| 360 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle | 351 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle |
| 361 // instead of manually calling Run/Quit on the run loop. | 352 // instead of manually calling Run/Quit on the run loop. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 385 mojo_routes[0] = route->Clone(); | 376 mojo_routes[0] = route->Clone(); |
| 386 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 377 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), |
| 387 std::vector<std::string>()); | 378 std::vector<std::string>()); |
| 388 EXPECT_TRUE(router()->HasJoinableRoute()); | 379 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 389 | 380 |
| 390 // Use a lambda function as an invocation target here to work around | 381 // Use a lambda function as an invocation target here to work around |
| 391 // a limitation with GMock::Invoke that prevents it from using move-only types | 382 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 392 // in runnable parameter lists. | 383 // in runnable parameter lists. |
| 393 EXPECT_CALL( | 384 EXPECT_CALL( |
| 394 mock_media_route_provider_, | 385 mock_media_route_provider_, |
| 395 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 386 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 396 kInvalidTabId, | |
| 397 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 387 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 398 .WillOnce(Invoke([&route]( | 388 .WillOnce(Invoke([&route]( |
| 399 const std::string& source, const std::string& presentation_id, | 389 const std::string& source, const std::string& presentation_id, |
| 400 const url::Origin& origin, int tab_id, base::TimeDelta timeout, | 390 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 401 bool incognito, | 391 bool incognito, |
| 402 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 392 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 403 cb.Run(std::move(route), std::string(), | 393 cb.Run(std::move(route), std::string(), |
| 404 mojom::RouteRequestResultCode::OK); | 394 mojom::RouteRequestResultCode::OK); |
| 405 })); | 395 })); |
| 406 | 396 |
| 407 RouteResponseCallbackHandler handler; | 397 RouteResponseCallbackHandler handler; |
| 408 base::RunLoop run_loop; | 398 base::RunLoop run_loop; |
| 409 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 399 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 410 RouteRequestResult::OK)) | 400 RouteRequestResult::OK)) |
| 411 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 401 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 412 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 402 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 413 route_response_callbacks.push_back(base::Bind( | 403 route_response_callbacks.push_back(base::Bind( |
| 414 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 404 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 415 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 405 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 416 nullptr, route_response_callbacks, | 406 route_response_callbacks, |
| 417 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 407 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 418 run_loop.Run(); | 408 run_loop.Run(); |
| 419 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); | 409 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); |
| 420 } | 410 } |
| 421 | 411 |
| 422 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { | 412 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { |
| 423 RouteResponseCallbackHandler handler; | 413 RouteResponseCallbackHandler handler; |
| 424 base::RunLoop run_loop; | 414 base::RunLoop run_loop; |
| 425 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", | 415 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", |
| 426 RouteRequestResult::ROUTE_NOT_FOUND)) | 416 RouteRequestResult::ROUTE_NOT_FOUND)) |
| 427 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 417 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 428 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 418 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 429 route_response_callbacks.push_back(base::Bind( | 419 route_response_callbacks.push_back(base::Bind( |
| 430 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 420 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 431 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 421 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 432 nullptr, route_response_callbacks, | 422 route_response_callbacks, |
| 433 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 423 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 434 run_loop.Run(); | 424 run_loop.Run(); |
| 435 ExpectResultBucketCount("JoinRoute", | 425 ExpectResultBucketCount("JoinRoute", |
| 436 RouteRequestResult::ResultCode::ROUTE_NOT_FOUND, 1); | 426 RouteRequestResult::ResultCode::ROUTE_NOT_FOUND, 1); |
| 437 } | 427 } |
| 438 | 428 |
| 439 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { | 429 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { |
| 440 // Make sure the MR has received an update with the route, so it knows there | 430 // Make sure the MR has received an update with the route, so it knows there |
| 441 // is a route to join. | 431 // is a route to join. |
| 442 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 432 std::vector<mojom::MediaRoutePtr> mojo_routes(1); |
| 443 mojo_routes[0] = CreateMojoRoute(); | 433 mojo_routes[0] = CreateMojoRoute(); |
| 444 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 434 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), |
| 445 std::vector<std::string>()); | 435 std::vector<std::string>()); |
| 446 EXPECT_TRUE(router()->HasJoinableRoute()); | 436 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 447 | 437 |
| 448 EXPECT_CALL( | 438 EXPECT_CALL( |
| 449 mock_media_route_provider_, | 439 mock_media_route_provider_, |
| 450 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 440 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 451 kInvalidTabId, | |
| 452 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 441 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 453 .WillOnce(Invoke( | 442 .WillOnce(Invoke( |
| 454 [](const std::string& source, const std::string& presentation_id, | 443 [](const std::string& source, const std::string& presentation_id, |
| 455 const url::Origin& origin, int tab_id, base::TimeDelta timeout, | 444 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 456 bool incognito, | 445 bool incognito, |
| 457 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 446 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 458 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 447 cb.Run(mojom::MediaRoutePtr(), std::string(kError), |
| 459 mojom::RouteRequestResultCode::TIMED_OUT); | 448 mojom::RouteRequestResultCode::TIMED_OUT); |
| 460 })); | 449 })); |
| 461 | 450 |
| 462 RouteResponseCallbackHandler handler; | 451 RouteResponseCallbackHandler handler; |
| 463 base::RunLoop run_loop; | 452 base::RunLoop run_loop; |
| 464 EXPECT_CALL(handler, | 453 EXPECT_CALL(handler, |
| 465 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 454 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 466 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 455 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 467 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 456 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 468 route_response_callbacks.push_back(base::Bind( | 457 route_response_callbacks.push_back(base::Bind( |
| 469 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 458 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 470 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 459 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 471 nullptr, route_response_callbacks, | 460 route_response_callbacks, |
| 472 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 461 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 473 run_loop.Run(); | 462 run_loop.Run(); |
| 474 ExpectResultBucketCount("JoinRoute", | 463 ExpectResultBucketCount("JoinRoute", |
| 475 RouteRequestResult::ResultCode::TIMED_OUT, 1); | 464 RouteRequestResult::ResultCode::TIMED_OUT, 1); |
| 476 } | 465 } |
| 477 | 466 |
| 478 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { | 467 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { |
| 479 mojom::MediaRoutePtr route = CreateMojoRoute(); | 468 mojom::MediaRoutePtr route = CreateMojoRoute(); |
| 480 | 469 |
| 481 // Make sure the MR has received an update with the route, so it knows there | 470 // Make sure the MR has received an update with the route, so it knows there |
| 482 // is a route to join. | 471 // is a route to join. |
| 483 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 472 std::vector<mojom::MediaRoutePtr> mojo_routes(1); |
| 484 mojo_routes[0] = route->Clone(); | 473 mojo_routes[0] = route->Clone(); |
| 485 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 474 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), |
| 486 std::vector<std::string>()); | 475 std::vector<std::string>()); |
| 487 EXPECT_TRUE(router()->HasJoinableRoute()); | 476 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 488 | 477 |
| 489 // Use a lambda function as an invocation target here to work around | 478 // Use a lambda function as an invocation target here to work around |
| 490 // a limitation with GMock::Invoke that prevents it from using move-only types | 479 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 491 // in runnable parameter lists. | 480 // in runnable parameter lists. |
| 492 EXPECT_CALL( | 481 EXPECT_CALL( |
| 493 mock_media_route_provider_, | 482 mock_media_route_provider_, |
| 494 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 483 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 495 kInvalidTabId, | |
| 496 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | 484 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 497 .WillOnce(Invoke([&route]( | 485 .WillOnce(Invoke([&route]( |
| 498 const std::string& source, const std::string& presentation_id, | 486 const std::string& source, const std::string& presentation_id, |
| 499 const url::Origin& origin, int tab_id, base::TimeDelta timeout, | 487 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 500 bool incognito, | 488 bool incognito, |
| 501 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 489 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 502 cb.Run(std::move(route), std::string(), | 490 cb.Run(std::move(route), std::string(), |
| 503 mojom::RouteRequestResultCode::OK); | 491 mojom::RouteRequestResultCode::OK); |
| 504 })); | 492 })); |
| 505 | 493 |
| 506 RouteResponseCallbackHandler handler; | 494 RouteResponseCallbackHandler handler; |
| 507 base::RunLoop run_loop; | 495 base::RunLoop run_loop; |
| 508 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 496 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 509 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 497 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 510 RouteRequestResult::INCOGNITO_MISMATCH)) | 498 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 511 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 499 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 512 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 500 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 513 route_response_callbacks.push_back(base::Bind( | 501 route_response_callbacks.push_back(base::Bind( |
| 514 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 502 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 515 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), | 503 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 516 nullptr, route_response_callbacks, | 504 route_response_callbacks, |
| 517 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 505 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 518 run_loop.Run(); | 506 run_loop.Run(); |
| 519 ExpectResultBucketCount( | 507 ExpectResultBucketCount( |
| 520 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 508 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); |
| 521 } | 509 } |
| 522 | 510 |
| 523 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { | 511 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { |
| 524 MediaSource media_source(kSource); | 512 MediaSource media_source(kSource); |
| 525 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 513 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 526 false); | 514 false); |
| 527 expected_route.set_incognito(false); | 515 expected_route.set_incognito(false); |
| 528 mojom::MediaRoutePtr route = CreateMojoRoute(); | 516 mojom::MediaRoutePtr route = CreateMojoRoute(); |
| 529 | 517 |
| 530 // Use a lambda function as an invocation target here to work around | 518 // Use a lambda function as an invocation target here to work around |
| 531 // a limitation with GMock::Invoke that prevents it from using move-only types | 519 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 532 // in runnable parameter lists. | 520 // in runnable parameter lists. |
| 533 EXPECT_CALL( | 521 EXPECT_CALL( |
| 534 mock_media_route_provider_, | 522 mock_media_route_provider_, |
| 535 ConnectRouteByRouteId( | 523 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 536 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId, | 524 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 537 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false, _)) | 525 false, _)) |
| 538 .WillOnce(Invoke([&route]( | 526 .WillOnce(Invoke([&route]( |
| 539 const std::string& source, const std::string& route_id, | 527 const std::string& source, const std::string& route_id, |
| 540 const std::string& presentation_id, const url::Origin& origin, | 528 const std::string& presentation_id, const std::string& origin, |
| 541 int tab_id, base::TimeDelta timeout, bool incognito, | 529 int tab_id, base::TimeDelta timeout, bool incognito, |
| 542 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 530 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 543 cb.Run(std::move(route), std::string(), | 531 cb.Run(std::move(route), std::string(), |
| 544 mojom::RouteRequestResultCode::OK); | 532 mojom::RouteRequestResultCode::OK); |
| 545 })); | 533 })); |
| 546 | 534 |
| 547 RouteResponseCallbackHandler handler; | 535 RouteResponseCallbackHandler handler; |
| 548 base::RunLoop run_loop; | 536 base::RunLoop run_loop; |
| 549 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 537 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 550 RouteRequestResult::OK)) | 538 RouteRequestResult::OK)) |
| 551 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 539 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 552 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 540 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 553 route_response_callbacks.push_back(base::Bind( | 541 route_response_callbacks.push_back(base::Bind( |
| 554 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 542 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 555 router()->ConnectRouteByRouteId( | 543 router()->ConnectRouteByRouteId( |
| 556 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr, | 544 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 557 route_response_callbacks, | |
| 558 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 545 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 559 run_loop.Run(); | 546 run_loop.Run(); |
| 560 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); | 547 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); |
| 561 } | 548 } |
| 562 | 549 |
| 563 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { | 550 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { |
| 564 EXPECT_CALL( | 551 EXPECT_CALL( |
| 565 mock_media_route_provider_, | 552 mock_media_route_provider_, |
| 566 ConnectRouteByRouteId( | 553 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 567 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId, | 554 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 568 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | 555 true, _)) |
| 569 .WillOnce(Invoke( | 556 .WillOnce(Invoke( |
| 570 [](const std::string& source, const std::string& route_id, | 557 [](const std::string& source, const std::string& route_id, |
| 571 const std::string& presentation_id, const url::Origin& origin, | 558 const std::string& presentation_id, const std::string& origin, |
| 572 int tab_id, base::TimeDelta timeout, bool incognito, | 559 int tab_id, base::TimeDelta timeout, bool incognito, |
| 573 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 560 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 574 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 561 cb.Run(mojom::MediaRoutePtr(), std::string(kError), |
| 575 mojom::RouteRequestResultCode::TIMED_OUT); | 562 mojom::RouteRequestResultCode::TIMED_OUT); |
| 576 })); | 563 })); |
| 577 | 564 |
| 578 RouteResponseCallbackHandler handler; | 565 RouteResponseCallbackHandler handler; |
| 579 base::RunLoop run_loop; | 566 base::RunLoop run_loop; |
| 580 EXPECT_CALL(handler, | 567 EXPECT_CALL(handler, |
| 581 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 568 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 582 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 569 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 583 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 570 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 584 route_response_callbacks.push_back(base::Bind( | 571 route_response_callbacks.push_back(base::Bind( |
| 585 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 572 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 586 router()->ConnectRouteByRouteId( | 573 router()->ConnectRouteByRouteId( |
| 587 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr, | 574 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 588 route_response_callbacks, | |
| 589 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 575 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 590 run_loop.Run(); | 576 run_loop.Run(); |
| 591 ExpectResultBucketCount("JoinRoute", | 577 ExpectResultBucketCount("JoinRoute", |
| 592 RouteRequestResult::ResultCode::TIMED_OUT, 1); | 578 RouteRequestResult::ResultCode::TIMED_OUT, 1); |
| 593 } | 579 } |
| 594 | 580 |
| 595 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { | 581 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { |
| 596 mojom::MediaRoutePtr route = CreateMojoRoute(); | 582 mojom::MediaRoutePtr route = CreateMojoRoute(); |
| 597 | 583 |
| 598 // Use a lambda function as an invocation target here to work around | 584 // Use a lambda function as an invocation target here to work around |
| 599 // a limitation with GMock::Invoke that prevents it from using move-only types | 585 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 600 // in runnable parameter lists. | 586 // in runnable parameter lists. |
| 601 EXPECT_CALL( | 587 EXPECT_CALL( |
| 602 mock_media_route_provider_, | 588 mock_media_route_provider_, |
| 603 ConnectRouteByRouteId( | 589 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 604 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId, | 590 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 605 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | 591 true, _)) |
| 606 .WillOnce(Invoke([&route]( | 592 .WillOnce(Invoke([&route]( |
| 607 const std::string& source, const std::string& route_id, | 593 const std::string& source, const std::string& route_id, |
| 608 const std::string& presentation_id, const url::Origin& origin, | 594 const std::string& presentation_id, const std::string& origin, |
| 609 int tab_id, base::TimeDelta timeout, bool incognito, | 595 int tab_id, base::TimeDelta timeout, bool incognito, |
| 610 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 596 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 611 cb.Run(std::move(route), std::string(), | 597 cb.Run(std::move(route), std::string(), |
| 612 mojom::RouteRequestResultCode::OK); | 598 mojom::RouteRequestResultCode::OK); |
| 613 })); | 599 })); |
| 614 | 600 |
| 615 RouteResponseCallbackHandler handler; | 601 RouteResponseCallbackHandler handler; |
| 616 base::RunLoop run_loop; | 602 base::RunLoop run_loop; |
| 617 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 603 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 618 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 604 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 619 RouteRequestResult::INCOGNITO_MISMATCH)) | 605 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 620 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 606 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 621 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 607 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 622 route_response_callbacks.push_back(base::Bind( | 608 route_response_callbacks.push_back(base::Bind( |
| 623 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 609 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 624 router()->ConnectRouteByRouteId( | 610 router()->ConnectRouteByRouteId( |
| 625 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr, | 611 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 626 route_response_callbacks, | |
| 627 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 612 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 628 run_loop.Run(); | 613 run_loop.Run(); |
| 629 ExpectResultBucketCount( | 614 ExpectResultBucketCount( |
| 630 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 615 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); |
| 631 } | 616 } |
| 632 | 617 |
| 633 TEST_F(MediaRouterMojoImplTest, DetachRoute) { | 618 TEST_F(MediaRouterMojoImplTest, DetachRoute) { |
| 634 base::RunLoop run_loop; | 619 base::RunLoop run_loop; |
| 635 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) | 620 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) |
| 636 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 621 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 router()->ClearIssue(issue_from_observer1.id()); | 689 router()->ClearIssue(issue_from_observer1.id()); |
| 705 | 690 |
| 706 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&issue_observer1)); | 691 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&issue_observer1)); |
| 707 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&issue_observer2)); | 692 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&issue_observer2)); |
| 708 } | 693 } |
| 709 | 694 |
| 710 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) { | 695 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) { |
| 711 router()->OnSinkAvailabilityUpdated( | 696 router()->OnSinkAvailabilityUpdated( |
| 712 mojom::MediaRouter::SinkAvailability::AVAILABLE); | 697 mojom::MediaRouter::SinkAvailability::AVAILABLE); |
| 713 MediaSource media_source(kSource); | 698 MediaSource media_source(kSource); |
| 699 GURL origin("https://google.com"); |
| 714 | 700 |
| 715 // These should only be called once even if there is more than one observer | 701 // These should only be called once even if there is more than one observer |
| 716 // for a given source. | 702 // for a given source. |
| 717 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)); | 703 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)); |
| 718 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)); | 704 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)); |
| 719 | 705 |
| 720 std::unique_ptr<MockMediaSinksObserver> sinks_observer( | 706 std::unique_ptr<MockMediaSinksObserver> sinks_observer( |
| 721 new MockMediaSinksObserver(router(), media_source, | 707 new MockMediaSinksObserver(router(), media_source, origin)); |
| 722 url::Origin(GURL(kOrigin)))); | |
| 723 EXPECT_TRUE(sinks_observer->Init()); | 708 EXPECT_TRUE(sinks_observer->Init()); |
| 724 std::unique_ptr<MockMediaSinksObserver> extra_sinks_observer( | 709 std::unique_ptr<MockMediaSinksObserver> extra_sinks_observer( |
| 725 new MockMediaSinksObserver(router(), media_source, | 710 new MockMediaSinksObserver(router(), media_source, origin)); |
| 726 url::Origin(GURL(kOrigin)))); | |
| 727 EXPECT_TRUE(extra_sinks_observer->Init()); | 711 EXPECT_TRUE(extra_sinks_observer->Init()); |
| 728 std::unique_ptr<MockMediaSinksObserver> unrelated_sinks_observer( | 712 std::unique_ptr<MockMediaSinksObserver> unrelated_sinks_observer( |
| 729 new MockMediaSinksObserver(router(), MediaSource(kSource2), | 713 new MockMediaSinksObserver(router(), MediaSource(kSource2), origin)); |
| 730 url::Origin(GURL(kOrigin)))); | |
| 731 EXPECT_TRUE(unrelated_sinks_observer->Init()); | 714 EXPECT_TRUE(unrelated_sinks_observer->Init()); |
| 732 ProcessEventLoop(); | 715 ProcessEventLoop(); |
| 733 | 716 |
| 734 std::vector<MediaSink> expected_sinks; | 717 std::vector<MediaSink> expected_sinks; |
| 735 expected_sinks.push_back( | 718 expected_sinks.push_back( |
| 736 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); | 719 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); |
| 737 expected_sinks.push_back( | 720 expected_sinks.push_back( |
| 738 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); | 721 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); |
| 739 | 722 |
| 740 std::vector<mojom::MediaSinkPtr> mojo_sinks(2); | 723 std::vector<mojom::MediaSinkPtr> mojo_sinks(2); |
| 741 mojo_sinks[0] = mojom::MediaSink::New(); | 724 mojo_sinks[0] = mojom::MediaSink::New(); |
| 742 mojo_sinks[0]->sink_id = kSinkId; | 725 mojo_sinks[0]->sink_id = kSinkId; |
| 743 mojo_sinks[0]->name = kSinkName; | 726 mojo_sinks[0]->name = kSinkName; |
| 744 mojo_sinks[0]->icon_type = | 727 mojo_sinks[0]->icon_type = |
| 745 media_router::mojom::MediaSink::IconType::CAST; | 728 media_router::mojom::MediaSink::IconType::CAST; |
| 746 mojo_sinks[1] = mojom::MediaSink::New(); | 729 mojo_sinks[1] = mojom::MediaSink::New(); |
| 747 mojo_sinks[1]->sink_id = kSinkId2; | 730 mojo_sinks[1]->sink_id = kSinkId2; |
| 748 mojo_sinks[1]->name = kSinkName; | 731 mojo_sinks[1]->name = kSinkName; |
| 749 mojo_sinks[1]->icon_type = | 732 mojo_sinks[1]->icon_type = |
| 750 media_router::mojom::MediaSink::IconType::CAST; | 733 media_router::mojom::MediaSink::IconType::CAST; |
| 751 | 734 |
| 752 base::RunLoop run_loop; | 735 base::RunLoop run_loop; |
| 753 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); | 736 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); |
| 754 EXPECT_CALL(*extra_sinks_observer, | 737 EXPECT_CALL(*extra_sinks_observer, |
| 755 OnSinksReceived(SequenceEquals(expected_sinks))) | 738 OnSinksReceived(SequenceEquals(expected_sinks))) |
| 756 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 739 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 757 media_router_proxy_->OnSinksReceived( | 740 media_router_proxy_->OnSinksReceived( |
| 758 media_source.id(), std::move(mojo_sinks), | 741 media_source.id(), std::move(mojo_sinks), |
| 759 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin)))); | 742 std::vector<std::string>(1, origin.spec())); |
| 760 run_loop.Run(); | 743 run_loop.Run(); |
| 761 | 744 |
| 762 // Since the MediaRouterMojoImpl has already received results for | 745 // Since the MediaRouterMojoImpl has already received results for |
| 763 // |media_source|, return cached results to observers that are subsequently | 746 // |media_source|, return cached results to observers that are subsequently |
| 764 // registered. | 747 // registered. |
| 765 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( | 748 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( |
| 766 new MockMediaSinksObserver(router(), media_source, | 749 new MockMediaSinksObserver(router(), media_source, origin)); |
| 767 url::Origin(GURL(kOrigin)))); | |
| 768 EXPECT_CALL(*cached_sinks_observer, | 750 EXPECT_CALL(*cached_sinks_observer, |
| 769 OnSinksReceived(SequenceEquals(expected_sinks))); | 751 OnSinksReceived(SequenceEquals(expected_sinks))); |
| 770 EXPECT_TRUE(cached_sinks_observer->Init()); | 752 EXPECT_TRUE(cached_sinks_observer->Init()); |
| 771 | 753 |
| 772 // Different origin from cached result. Empty list will be returned. | 754 // Different origin from cached result. Empty list will be returned. |
| 773 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer2( | 755 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer2( |
| 774 new MockMediaSinksObserver(router(), media_source, | 756 new MockMediaSinksObserver(router(), media_source, |
| 775 url::Origin(GURL("https://youtube.com")))); | 757 GURL("https://youtube.com"))); |
| 776 EXPECT_CALL(*cached_sinks_observer2, OnSinksReceived(IsEmpty())); | 758 EXPECT_CALL(*cached_sinks_observer2, OnSinksReceived(IsEmpty())); |
| 777 EXPECT_TRUE(cached_sinks_observer2->Init()); | 759 EXPECT_TRUE(cached_sinks_observer2->Init()); |
| 778 | 760 |
| 779 base::RunLoop run_loop2; | 761 base::RunLoop run_loop2; |
| 780 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource)); | 762 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource)); |
| 781 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2)) | 763 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2)) |
| 782 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); | 764 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); |
| 783 sinks_observer.reset(); | 765 sinks_observer.reset(); |
| 784 extra_sinks_observer.reset(); | 766 extra_sinks_observer.reset(); |
| 785 unrelated_sinks_observer.reset(); | 767 unrelated_sinks_observer.reset(); |
| 786 cached_sinks_observer.reset(); | 768 cached_sinks_observer.reset(); |
| 787 cached_sinks_observer2.reset(); | 769 cached_sinks_observer2.reset(); |
| 788 run_loop2.Run(); | 770 run_loop2.Run(); |
| 789 } | 771 } |
| 790 | 772 |
| 791 TEST_F(MediaRouterMojoImplTest, | 773 TEST_F(MediaRouterMojoImplTest, |
| 792 RegisterMediaSinksObserverWithAvailabilityChange) { | 774 RegisterMediaSinksObserverWithAvailabilityChange) { |
| 775 GURL origin("https://google.com"); |
| 793 | 776 |
| 794 // When availability is UNAVAILABLE, no calls should be made to MRPM. | 777 // When availability is UNAVAILABLE, no calls should be made to MRPM. |
| 795 router()->OnSinkAvailabilityUpdated( | 778 router()->OnSinkAvailabilityUpdated( |
| 796 mojom::MediaRouter::SinkAvailability::UNAVAILABLE); | 779 mojom::MediaRouter::SinkAvailability::UNAVAILABLE); |
| 797 MediaSource media_source(kSource); | 780 MediaSource media_source(kSource); |
| 798 std::unique_ptr<MockMediaSinksObserver> sinks_observer( | 781 std::unique_ptr<MockMediaSinksObserver> sinks_observer( |
| 799 new MockMediaSinksObserver(router(), media_source, | 782 new MockMediaSinksObserver(router(), media_source, origin)); |
| 800 url::Origin(GURL(kOrigin)))); | |
| 801 EXPECT_CALL(*sinks_observer, OnSinksReceived(IsEmpty())); | 783 EXPECT_CALL(*sinks_observer, OnSinksReceived(IsEmpty())); |
| 802 EXPECT_TRUE(sinks_observer->Init()); | 784 EXPECT_TRUE(sinks_observer->Init()); |
| 803 MediaSource media_source2(kSource2); | 785 MediaSource media_source2(kSource2); |
| 804 std::unique_ptr<MockMediaSinksObserver> sinks_observer2( | 786 std::unique_ptr<MockMediaSinksObserver> sinks_observer2( |
| 805 new MockMediaSinksObserver(router(), media_source2, | 787 new MockMediaSinksObserver(router(), media_source2, origin)); |
| 806 url::Origin(GURL(kOrigin)))); | |
| 807 EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty())); | 788 EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty())); |
| 808 EXPECT_TRUE(sinks_observer2->Init()); | 789 EXPECT_TRUE(sinks_observer2->Init()); |
| 809 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)) | 790 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)) |
| 810 .Times(0); | 791 .Times(0); |
| 811 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)) | 792 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)) |
| 812 .Times(0); | 793 .Times(0); |
| 813 ProcessEventLoop(); | 794 ProcessEventLoop(); |
| 814 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); | 795 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); |
| 815 | 796 |
| 816 // When availability transitions AVAILABLE, existing sink queries should be | 797 // When availability transitions AVAILABLE, existing sink queries should be |
| (...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1579 EXPECT_CALL(mock_media_route_provider_, | 1560 EXPECT_CALL(mock_media_route_provider_, |
| 1580 UpdateMediaSinks(MediaSourceForDesktop().id())) | 1561 UpdateMediaSinks(MediaSourceForDesktop().id())) |
| 1581 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1562 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1582 run_loop2.Quit(); | 1563 run_loop2.Quit(); |
| 1583 })); | 1564 })); |
| 1584 | 1565 |
| 1585 run_loop2.Run(); | 1566 run_loop2.Run(); |
| 1586 } | 1567 } |
| 1587 | 1568 |
| 1588 } // namespace media_router | 1569 } // namespace media_router |
| OLD | NEW |