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