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> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
| 18 #include "base/synchronization/waitable_event.h" | 18 #include "base/synchronization/waitable_event.h" |
| 19 #include "base/test/histogram_tester.h" | 19 #include "base/test/histogram_tester.h" |
| 20 #include "base/threading/thread_task_runner_handle.h" | 20 #include "base/threading/thread_task_runner_handle.h" |
| 21 #include "chrome/browser/media/router/issue.h" | 21 #include "chrome/browser/media/router/issue.h" |
| 22 #include "chrome/browser/media/router/media_route.h" | 22 #include "chrome/browser/media/router/media_route.h" |
| 23 #include "chrome/browser/media/router/media_source_helper.h" | 23 #include "chrome/browser/media/router/media_source_helper.h" |
| 24 #include "chrome/browser/media/router/mock_media_router.h" | 24 #include "chrome/browser/media/router/mock_media_router.h" |
| 25 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" | 25 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" |
| 26 #include "chrome/browser/media/router/mojo/media_router_mojo_test.h" | 26 #include "chrome/browser/media/router/mojo/media_router_mojo_test.h" |
| 27 #include "chrome/browser/media/router/mojo/media_router_type_converters.h" | |
| 28 #include "chrome/browser/media/router/route_message.h" | 27 #include "chrome/browser/media/router/route_message.h" |
| 29 #include "chrome/browser/media/router/route_message_observer.h" | 28 #include "chrome/browser/media/router/route_message_observer.h" |
| 30 #include "chrome/browser/media/router/test_helper.h" | 29 #include "chrome/browser/media/router/test_helper.h" |
| 31 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 30 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 32 #include "chrome/test/base/testing_browser_process.h" | 31 #include "chrome/test/base/testing_browser_process.h" |
| 33 #include "chrome/test/base/testing_profile.h" | 32 #include "chrome/test/base/testing_profile.h" |
| 34 #include "components/version_info/version_info.h" | 33 #include "components/version_info/version_info.h" |
| 35 #include "content/public/test/test_browser_thread_bundle.h" | 34 #include "content/public/test/test_browser_thread_bundle.h" |
| 36 #include "extensions/browser/extension_registry.h" | 35 #include "extensions/browser/extension_registry.h" |
| 37 #include "extensions/browser/process_manager.h" | 36 #include "extensions/browser/process_manager.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 52 using testing::IsEmpty; | 51 using testing::IsEmpty; |
| 53 using testing::Mock; | 52 using testing::Mock; |
| 54 using testing::Not; | 53 using testing::Not; |
| 55 using testing::Pointee; | 54 using testing::Pointee; |
| 56 using testing::Return; | 55 using testing::Return; |
| 57 using testing::ReturnRef; | 56 using testing::ReturnRef; |
| 58 using testing::SaveArg; | 57 using testing::SaveArg; |
| 59 | 58 |
| 60 namespace media_router { | 59 namespace media_router { |
| 61 | 60 |
| 62 using PresentationConnectionState = | |
| 63 mojom::MediaRouter::PresentationConnectionState; | |
| 64 using PresentationConnectionCloseReason = | |
| 65 mojom::MediaRouter::PresentationConnectionCloseReason; | |
| 66 | |
| 67 namespace { | 61 namespace { |
| 68 | 62 |
| 69 const char kDescription[] = "description"; | 63 const char kDescription[] = "description"; |
| 70 const char kError[] = "error"; | 64 const char kError[] = "error"; |
| 71 const char kMessage[] = "message"; | 65 const char kMessage[] = "message"; |
| 72 const char kSource[] = "source1"; | 66 const char kSource[] = "source1"; |
| 73 const char kSource2[] = "source2"; | 67 const char kSource2[] = "source2"; |
| 74 const char kRouteId[] = "routeId"; | 68 const char kRouteId[] = "routeId"; |
| 75 const char kRouteId2[] = "routeId2"; | 69 const char kRouteId2[] = "routeId2"; |
| 76 const char kJoinableRouteId[] = "joinableRouteId"; | 70 const char kJoinableRouteId[] = "joinableRouteId"; |
| 77 const char kJoinableRouteId2[] = "joinableRouteId2"; | 71 const char kJoinableRouteId2[] = "joinableRouteId2"; |
| 78 const char kSinkId[] = "sink"; | 72 const char kSinkId[] = "sink"; |
| 79 const char kSinkId2[] = "sink2"; | 73 const char kSinkId2[] = "sink2"; |
| 80 const char kSinkName[] = "sinkName"; | 74 const char kSinkName[] = "sinkName"; |
| 81 const char kPresentationId[] = "presentationId"; | 75 const char kPresentationId[] = "presentationId"; |
| 82 const char kOrigin[] = "http://origin/"; | 76 const char kOrigin[] = "http://origin/"; |
| 83 const int kInvalidTabId = -1; | 77 const int kInvalidTabId = -1; |
| 84 const uint8_t kBinaryMessage[] = {0x01, 0x02, 0x03, 0x04}; | 78 const uint8_t kBinaryMessage[] = {0x01, 0x02, 0x03, 0x04}; |
| 85 const int kTimeoutMillis = 5 * 1000; | 79 const int kTimeoutMillis = 5 * 1000; |
| 86 | 80 |
| 87 IssueInfo CreateIssueInfo(const std::string& title) { | 81 IssueInfo CreateIssueInfo(const std::string& title) { |
| 88 IssueInfo issue_info; | 82 IssueInfo issue_info; |
| 89 issue_info.title = title; | 83 issue_info.title = title; |
| 90 issue_info.message = std::string("msg"); | 84 issue_info.message = std::string("msg"); |
| 91 issue_info.default_action = IssueInfo::Action::DISMISS; | 85 issue_info.default_action = IssueInfo::Action::DISMISS; |
| 92 issue_info.severity = IssueInfo::Severity::WARNING; | 86 issue_info.severity = IssueInfo::Severity::WARNING; |
| 93 return issue_info; | 87 return issue_info; |
| 94 } | 88 } |
| 95 | 89 |
| 96 mojom::MediaRoutePtr CreateMojoRoute() { | 90 MediaRoute CreateMediaRoute() { |
| 97 mojom::MediaRoutePtr route = mojom::MediaRoute::New(); | 91 return MediaRoute(kRouteId, MediaSource(kSource), kSinkId, kDescription, true, |
| 98 route->media_source = std::string(kSource); | 92 "", true); |
|
dcheng
2017/02/01 22:51:08
Nit: std::string() instead of "".
imcheng
2017/02/02 21:20:37
Done.
| |
| 99 route->media_sink_id = kSinkId; | |
| 100 route->media_route_id = kRouteId; | |
| 101 route->description = kDescription; | |
| 102 route->is_local = true; | |
| 103 route->for_display = true; | |
| 104 route->is_incognito = false; | |
| 105 return route; | |
| 106 } | 93 } |
| 107 | 94 |
| 108 } // namespace | 95 } // namespace |
| 109 | 96 |
| 110 class RouteResponseCallbackHandler { | 97 class RouteResponseCallbackHandler { |
| 111 public: | 98 public: |
| 112 void Invoke(const RouteRequestResult& result) { | 99 void Invoke(const RouteRequestResult& result) { |
| 113 DoInvoke(result.route(), result.presentation_id(), result.error(), | 100 DoInvoke(result.route(), result.presentation_id(), result.error(), |
| 114 result.result_code()); | 101 result.result_code()); |
| 115 } | 102 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 // Use a lambda function as an invocation target here to work around | 181 // 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 | 182 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 196 // in runnable parameter lists. | 183 // in runnable parameter lists. |
| 197 EXPECT_CALL(mock_media_route_provider_, | 184 EXPECT_CALL(mock_media_route_provider_, |
| 198 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _)) | 185 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _)) |
| 199 .WillOnce(Invoke( | 186 .WillOnce(Invoke( |
| 200 [](const std::string& source, const std::string& sink, | 187 [](const std::string& source, const std::string& sink, |
| 201 const std::string& presentation_id, const std::string& origin, | 188 const std::string& presentation_id, const std::string& origin, |
| 202 int tab_id, base::TimeDelta timeout, bool incognito, | 189 int tab_id, base::TimeDelta timeout, bool incognito, |
| 203 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 190 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 204 cb.Run(CreateMojoRoute(), std::string(), | 191 cb.Run(CreateMediaRoute(), std::string(), RouteRequestResult::OK); |
| 205 mojom::RouteRequestResultCode::OK); | |
| 206 })); | 192 })); |
| 207 | 193 |
| 208 base::RunLoop run_loop; | 194 base::RunLoop run_loop; |
| 209 RouteResponseCallbackHandler handler; | 195 RouteResponseCallbackHandler handler; |
| 210 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 196 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 211 RouteRequestResult::OK)) | 197 RouteRequestResult::OK)) |
| 212 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 198 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 213 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 199 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 214 route_response_callbacks.push_back(base::Bind( | 200 route_response_callbacks.push_back(base::Bind( |
| 215 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 201 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 216 router()->CreateRoute( | 202 router()->CreateRoute( |
| 217 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, | 203 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 218 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 204 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 219 run_loop.Run(); | 205 run_loop.Run(); |
| 220 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); | 206 ExpectResultBucketCount("CreateRoute", RouteRequestResult::OK, 1); |
| 221 } | 207 } |
| 222 | 208 |
| 223 TEST_F(MediaRouterMojoImplTest, CreateIncognitoRoute) { | 209 TEST_F(MediaRouterMojoImplTest, CreateIncognitoRoute) { |
| 224 MediaSource media_source(kSource); | 210 MediaSource media_source(kSource); |
| 225 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 211 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 226 false); | 212 false); |
| 227 expected_route.set_incognito(true); | 213 expected_route.set_incognito(true); |
| 228 | 214 |
| 229 // Use a lambda function as an invocation target here to work around | 215 // 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 | 216 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 231 // in runnable parameter lists. | 217 // in runnable parameter lists. |
| 232 EXPECT_CALL(mock_media_route_provider_, | 218 EXPECT_CALL(mock_media_route_provider_, |
| 233 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _)) | 219 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _)) |
| 234 .WillOnce(Invoke( | 220 .WillOnce(Invoke([&expected_route]( |
| 235 [](const std::string& source, const std::string& sink, | 221 const std::string& source, const std::string& sink, |
| 236 const std::string& presentation_id, const std::string& origin, | 222 const std::string& presentation_id, const std::string& origin, |
| 237 int tab_id, base::TimeDelta timeout, bool incognito, | 223 int tab_id, base::TimeDelta timeout, bool incognito, |
| 238 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 224 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 239 mojom::MediaRoutePtr route = CreateMojoRoute(); | 225 cb.Run(expected_route, std::string(), RouteRequestResult::OK); |
| 240 route->custom_controller_path = | 226 })); |
| 241 std::string("custom/controller/path"); | |
| 242 route->is_incognito = true; | |
| 243 cb.Run(std::move(route), std::string(), | |
| 244 mojom::RouteRequestResultCode::OK); | |
| 245 })); | |
| 246 | 227 |
| 247 base::RunLoop run_loop; | 228 base::RunLoop run_loop; |
| 248 RouteResponseCallbackHandler handler; | 229 RouteResponseCallbackHandler handler; |
| 249 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 230 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 250 RouteRequestResult::OK)) | 231 RouteRequestResult::OK)) |
| 251 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 232 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 252 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 233 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 253 route_response_callbacks.push_back(base::Bind( | 234 route_response_callbacks.push_back(base::Bind( |
| 254 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 235 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 255 router()->CreateRoute( | 236 router()->CreateRoute( |
| 256 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, | 237 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 257 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 238 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 258 run_loop.Run(); | 239 run_loop.Run(); |
| 259 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); | 240 ExpectResultBucketCount("CreateRoute", RouteRequestResult::OK, 1); |
| 260 } | 241 } |
| 261 | 242 |
| 262 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { | 243 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { |
| 263 EXPECT_CALL( | 244 EXPECT_CALL( |
| 264 mock_media_route_provider_, | 245 mock_media_route_provider_, |
| 265 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, | 246 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 266 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 247 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 267 .WillOnce(Invoke( | 248 .WillOnce(Invoke( |
| 268 [](const std::string& source, const std::string& sink, | 249 [](const std::string& source, const std::string& sink, |
| 269 const std::string& presentation_id, const std::string& origin, | 250 const std::string& presentation_id, const std::string& origin, |
| 270 int tab_id, base::TimeDelta timeout, bool incognito, | 251 int tab_id, base::TimeDelta timeout, bool incognito, |
| 271 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 252 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 272 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 253 cb.Run(base::nullopt, std::string(kError), |
| 273 mojom::RouteRequestResultCode::TIMED_OUT); | 254 RouteRequestResult::TIMED_OUT); |
| 274 })); | 255 })); |
| 275 | 256 |
| 276 RouteResponseCallbackHandler handler; | 257 RouteResponseCallbackHandler handler; |
| 277 base::RunLoop run_loop; | 258 base::RunLoop run_loop; |
| 278 EXPECT_CALL(handler, | 259 EXPECT_CALL(handler, |
| 279 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 260 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 280 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 261 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 281 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 262 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 282 route_response_callbacks.push_back(base::Bind( | 263 route_response_callbacks.push_back(base::Bind( |
| 283 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 264 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 284 router()->CreateRoute( | 265 router()->CreateRoute( |
| 285 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, | 266 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 286 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 267 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 287 run_loop.Run(); | 268 run_loop.Run(); |
| 288 ExpectResultBucketCount("CreateRoute", | 269 ExpectResultBucketCount("CreateRoute", |
| 289 RouteRequestResult::ResultCode::TIMED_OUT, 1); | 270 RouteRequestResult::TIMED_OUT, 1); |
| 290 } | 271 } |
| 291 | 272 |
| 292 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { | 273 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { |
| 293 EXPECT_CALL(mock_media_route_provider_, | 274 EXPECT_CALL( |
| 294 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, | 275 mock_media_route_provider_, |
| 295 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 276 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 296 true, _)) | 277 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 297 .WillOnce(Invoke( | 278 .WillOnce(Invoke( |
| 298 [](const std::string& source, const std::string& sink, | 279 [](const std::string& source, const std::string& sink, |
| 299 const std::string& presentation_id, const std::string& origin, | 280 const std::string& presentation_id, const std::string& origin, |
| 300 int tab_id, base::TimeDelta timeout, bool incognito, | 281 int tab_id, base::TimeDelta timeout, bool incognito, |
| 301 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 282 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 302 cb.Run(CreateMojoRoute(), std::string(), | 283 cb.Run(CreateMediaRoute(), std::string(), RouteRequestResult::OK); |
| 303 mojom::RouteRequestResultCode::OK); | |
| 304 })); | 284 })); |
| 305 | 285 |
| 306 RouteResponseCallbackHandler handler; | 286 RouteResponseCallbackHandler handler; |
| 307 base::RunLoop run_loop; | 287 base::RunLoop run_loop; |
| 308 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 288 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 309 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 289 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 310 RouteRequestResult::INCOGNITO_MISMATCH)) | 290 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 311 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 291 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 312 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 292 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 313 route_response_callbacks.push_back(base::Bind( | 293 route_response_callbacks.push_back(base::Bind( |
| 314 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 294 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 315 router()->CreateRoute( | 295 router()->CreateRoute( |
| 316 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, | 296 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 317 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 297 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 318 run_loop.Run(); | 298 run_loop.Run(); |
| 319 ExpectResultBucketCount( | 299 ExpectResultBucketCount( |
| 320 "CreateRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 300 "CreateRoute", RouteRequestResult::INCOGNITO_MISMATCH, 1); |
| 321 } | 301 } |
| 322 | 302 |
| 323 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { | 303 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { |
| 324 mojom::MediaRoutePtr route = CreateMojoRoute(); | 304 MediaRoute route = CreateMediaRoute(); |
| 325 route->is_incognito = true; | 305 route.set_incognito(true); |
| 326 | 306 |
| 327 EXPECT_CALL(mock_media_route_provider_, | 307 EXPECT_CALL( |
| 328 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, | 308 mock_media_route_provider_, |
| 329 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 309 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 330 true, _)) | 310 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 331 .WillOnce(Invoke( | 311 .WillOnce(Invoke([&route]( |
| 332 [](const std::string& source, const std::string& sink, | 312 const std::string& source, const std::string& sink, |
| 333 const std::string& presentation_id, const std::string& origin, | 313 const std::string& presentation_id, const std::string& origin, |
| 334 int tab_id, base::TimeDelta timeout, bool incognito, | 314 int tab_id, base::TimeDelta timeout, bool incognito, |
| 335 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 315 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 336 mojom::MediaRoutePtr route = CreateMojoRoute(); | 316 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 337 route->is_incognito = true; | 317 })); |
| 338 cb.Run(std::move(route), std::string(), | |
| 339 mojom::RouteRequestResultCode::OK); | |
| 340 })); | |
| 341 base::RunLoop run_loop; | 318 base::RunLoop run_loop; |
| 342 router()->CreateRoute(kSource, kSinkId, GURL(kOrigin), nullptr, | 319 router()->CreateRoute(kSource, kSinkId, GURL(kOrigin), nullptr, |
| 343 std::vector<MediaRouteResponseCallback>(), | 320 std::vector<MediaRouteResponseCallback>(), |
| 344 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 321 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 345 true); | 322 true); |
| 346 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 323 std::vector<MediaRoute> routes; |
| 347 mojo_routes[0] = route->Clone(); | 324 routes.push_back(route); |
| 348 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 325 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 349 std::vector<std::string>()); | |
| 350 | 326 |
| 351 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle | 327 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle |
| 352 // instead of manually calling Run/Quit on the run loop. | 328 // instead of manually calling Run/Quit on the run loop. |
| 353 run_loop.RunUntilIdle(); | 329 run_loop.RunUntilIdle(); |
| 354 | 330 |
| 355 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) | 331 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) |
| 356 .WillOnce(Invoke([]( | 332 .WillOnce(Invoke( |
| 357 const std::string& route_id, | 333 [](const std::string& route_id, |
| 358 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { | 334 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { |
| 359 cb.Run(base::nullopt, mojom::RouteRequestResultCode::OK); | 335 cb.Run(base::nullopt, RouteRequestResult::OK); |
| 360 })); | 336 })); |
| 361 | 337 |
| 362 base::RunLoop run_loop2; | 338 base::RunLoop run_loop2; |
| 363 router()->OnIncognitoProfileShutdown(); | 339 router()->OnIncognitoProfileShutdown(); |
| 364 run_loop2.RunUntilIdle(); | 340 run_loop2.RunUntilIdle(); |
| 365 } | 341 } |
| 366 | 342 |
| 367 TEST_F(MediaRouterMojoImplTest, JoinRoute) { | 343 TEST_F(MediaRouterMojoImplTest, JoinRoute) { |
| 368 MediaSource media_source(kSource); | 344 MediaSource media_source(kSource); |
| 369 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 345 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 370 false); | 346 false); |
| 371 | 347 |
| 372 mojom::MediaRoutePtr route = CreateMojoRoute(); | 348 MediaRoute route = CreateMediaRoute(); |
| 373 // Make sure the MR has received an update with the route, so it knows there | 349 // Make sure the MR has received an update with the route, so it knows there |
| 374 // is a route to join. | 350 // is a route to join. |
| 375 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 351 std::vector<MediaRoute> routes; |
| 376 mojo_routes[0] = route->Clone(); | 352 routes.push_back(route); |
| 377 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 353 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 378 std::vector<std::string>()); | |
| 379 EXPECT_TRUE(router()->HasJoinableRoute()); | 354 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 380 | 355 |
| 381 // Use a lambda function as an invocation target here to work around | 356 // 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 | 357 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 383 // in runnable parameter lists. | 358 // in runnable parameter lists. |
| 384 EXPECT_CALL( | 359 EXPECT_CALL( |
| 385 mock_media_route_provider_, | 360 mock_media_route_provider_, |
| 386 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, | 361 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 387 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 362 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 388 .WillOnce(Invoke([&route]( | 363 .WillOnce(Invoke([&route]( |
| 389 const std::string& source, const std::string& presentation_id, | 364 const std::string& source, const std::string& presentation_id, |
| 390 const std::string& origin, int tab_id, base::TimeDelta timeout, | 365 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 391 bool incognito, | 366 bool incognito, |
| 392 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 367 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 393 cb.Run(std::move(route), std::string(), | 368 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 394 mojom::RouteRequestResultCode::OK); | |
| 395 })); | 369 })); |
| 396 | 370 |
| 397 RouteResponseCallbackHandler handler; | 371 RouteResponseCallbackHandler handler; |
| 398 base::RunLoop run_loop; | 372 base::RunLoop run_loop; |
| 399 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 373 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 400 RouteRequestResult::OK)) | 374 RouteRequestResult::OK)) |
| 401 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 375 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 402 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 376 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 403 route_response_callbacks.push_back(base::Bind( | 377 route_response_callbacks.push_back(base::Bind( |
| 404 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 378 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 405 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 379 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 406 route_response_callbacks, | 380 route_response_callbacks, |
| 407 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 381 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 408 run_loop.Run(); | 382 run_loop.Run(); |
| 409 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); | 383 ExpectResultBucketCount("JoinRoute", RouteRequestResult::OK, 1); |
| 410 } | 384 } |
| 411 | 385 |
| 412 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { | 386 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { |
| 413 RouteResponseCallbackHandler handler; | 387 RouteResponseCallbackHandler handler; |
| 414 base::RunLoop run_loop; | 388 base::RunLoop run_loop; |
| 415 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", | 389 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", |
| 416 RouteRequestResult::ROUTE_NOT_FOUND)) | 390 RouteRequestResult::ROUTE_NOT_FOUND)) |
| 417 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 391 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 418 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 392 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 419 route_response_callbacks.push_back(base::Bind( | 393 route_response_callbacks.push_back(base::Bind( |
| 420 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 394 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 421 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 395 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 422 route_response_callbacks, | 396 route_response_callbacks, |
| 423 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 397 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 424 run_loop.Run(); | 398 run_loop.Run(); |
| 425 ExpectResultBucketCount("JoinRoute", | 399 ExpectResultBucketCount("JoinRoute", |
| 426 RouteRequestResult::ResultCode::ROUTE_NOT_FOUND, 1); | 400 RouteRequestResult::ROUTE_NOT_FOUND, 1); |
| 427 } | 401 } |
| 428 | 402 |
| 429 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { | 403 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { |
| 430 // Make sure the MR has received an update with the route, so it knows there | 404 // Make sure the MR has received an update with the route, so it knows there |
| 431 // is a route to join. | 405 // is a route to join. |
| 432 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 406 std::vector<MediaRoute> routes; |
| 433 mojo_routes[0] = CreateMojoRoute(); | 407 routes.push_back(CreateMediaRoute()); |
| 434 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 408 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 435 std::vector<std::string>()); | |
| 436 EXPECT_TRUE(router()->HasJoinableRoute()); | 409 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 437 | 410 |
| 438 EXPECT_CALL( | 411 EXPECT_CALL( |
| 439 mock_media_route_provider_, | 412 mock_media_route_provider_, |
| 440 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, | 413 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 441 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 414 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 442 .WillOnce(Invoke( | 415 .WillOnce(Invoke( |
| 443 [](const std::string& source, const std::string& presentation_id, | 416 [](const std::string& source, const std::string& presentation_id, |
| 444 const std::string& origin, int tab_id, base::TimeDelta timeout, | 417 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 445 bool incognito, | 418 bool incognito, |
| 446 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 419 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 447 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 420 cb.Run(base::nullopt, std::string(kError), |
| 448 mojom::RouteRequestResultCode::TIMED_OUT); | 421 RouteRequestResult::TIMED_OUT); |
| 449 })); | 422 })); |
| 450 | 423 |
| 451 RouteResponseCallbackHandler handler; | 424 RouteResponseCallbackHandler handler; |
| 452 base::RunLoop run_loop; | 425 base::RunLoop run_loop; |
| 453 EXPECT_CALL(handler, | 426 EXPECT_CALL(handler, |
| 454 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 427 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 455 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 428 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 456 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 429 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 457 route_response_callbacks.push_back(base::Bind( | 430 route_response_callbacks.push_back(base::Bind( |
| 458 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 431 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 459 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 432 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 460 route_response_callbacks, | 433 route_response_callbacks, |
| 461 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 434 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 462 run_loop.Run(); | 435 run_loop.Run(); |
| 463 ExpectResultBucketCount("JoinRoute", | 436 ExpectResultBucketCount("JoinRoute", |
| 464 RouteRequestResult::ResultCode::TIMED_OUT, 1); | 437 RouteRequestResult::TIMED_OUT, 1); |
| 465 } | 438 } |
| 466 | 439 |
| 467 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { | 440 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { |
| 468 mojom::MediaRoutePtr route = CreateMojoRoute(); | 441 MediaRoute route = CreateMediaRoute(); |
| 469 | 442 |
| 470 // Make sure the MR has received an update with the route, so it knows there | 443 // Make sure the MR has received an update with the route, so it knows there |
| 471 // is a route to join. | 444 // is a route to join. |
| 472 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 445 std::vector<MediaRoute> routes; |
| 473 mojo_routes[0] = route->Clone(); | 446 routes.push_back(route); |
| 474 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 447 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 475 std::vector<std::string>()); | |
| 476 EXPECT_TRUE(router()->HasJoinableRoute()); | 448 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 477 | 449 |
| 478 // Use a lambda function as an invocation target here to work around | 450 // 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 | 451 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 480 // in runnable parameter lists. | 452 // in runnable parameter lists. |
| 481 EXPECT_CALL( | 453 EXPECT_CALL( |
| 482 mock_media_route_provider_, | 454 mock_media_route_provider_, |
| 483 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, | 455 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 484 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | 456 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 485 .WillOnce(Invoke([&route]( | 457 .WillOnce(Invoke([&route]( |
| 486 const std::string& source, const std::string& presentation_id, | 458 const std::string& source, const std::string& presentation_id, |
| 487 const std::string& origin, int tab_id, base::TimeDelta timeout, | 459 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 488 bool incognito, | 460 bool incognito, |
| 489 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 461 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 490 cb.Run(std::move(route), std::string(), | 462 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 491 mojom::RouteRequestResultCode::OK); | |
| 492 })); | 463 })); |
| 493 | 464 |
| 494 RouteResponseCallbackHandler handler; | 465 RouteResponseCallbackHandler handler; |
| 495 base::RunLoop run_loop; | 466 base::RunLoop run_loop; |
| 496 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 467 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 497 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 468 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 498 RouteRequestResult::INCOGNITO_MISMATCH)) | 469 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 499 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 470 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 500 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 471 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 501 route_response_callbacks.push_back(base::Bind( | 472 route_response_callbacks.push_back(base::Bind( |
| 502 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 473 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 503 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 474 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 504 route_response_callbacks, | 475 route_response_callbacks, |
| 505 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 476 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 506 run_loop.Run(); | 477 run_loop.Run(); |
| 507 ExpectResultBucketCount( | 478 ExpectResultBucketCount( |
| 508 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 479 "JoinRoute", RouteRequestResult::INCOGNITO_MISMATCH, 1); |
| 509 } | 480 } |
| 510 | 481 |
| 511 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { | 482 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { |
| 512 MediaSource media_source(kSource); | 483 MediaSource media_source(kSource); |
| 513 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 484 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 514 false); | 485 false); |
| 515 expected_route.set_incognito(false); | 486 expected_route.set_incognito(false); |
| 516 mojom::MediaRoutePtr route = CreateMojoRoute(); | 487 MediaRoute route = CreateMediaRoute(); |
| 517 | 488 |
| 518 // 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 |
| 519 // 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 |
| 520 // in runnable parameter lists. | 491 // in runnable parameter lists. |
| 521 EXPECT_CALL( | 492 EXPECT_CALL(mock_media_route_provider_, |
| 522 mock_media_route_provider_, | 493 ConnectRouteByRouteId( |
| 523 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, | 494 kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 524 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 495 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false, _)) |
| 525 false, _)) | |
| 526 .WillOnce(Invoke([&route]( | 496 .WillOnce(Invoke([&route]( |
| 527 const std::string& source, const std::string& route_id, | 497 const std::string& source, const std::string& route_id, |
| 528 const std::string& presentation_id, const std::string& origin, | 498 const std::string& presentation_id, const std::string& origin, |
| 529 int tab_id, base::TimeDelta timeout, bool incognito, | 499 int tab_id, base::TimeDelta timeout, bool incognito, |
| 530 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 500 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 531 cb.Run(std::move(route), std::string(), | 501 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 532 mojom::RouteRequestResultCode::OK); | |
| 533 })); | 502 })); |
| 534 | 503 |
| 535 RouteResponseCallbackHandler handler; | 504 RouteResponseCallbackHandler handler; |
| 536 base::RunLoop run_loop; | 505 base::RunLoop run_loop; |
| 537 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 506 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 538 RouteRequestResult::OK)) | 507 RouteRequestResult::OK)) |
| 539 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 508 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 540 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 509 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 541 route_response_callbacks.push_back(base::Bind( | 510 route_response_callbacks.push_back(base::Bind( |
| 542 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 511 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 543 router()->ConnectRouteByRouteId( | 512 router()->ConnectRouteByRouteId( |
| 544 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, | 513 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 545 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 514 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 546 run_loop.Run(); | 515 run_loop.Run(); |
| 547 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); | 516 ExpectResultBucketCount("JoinRoute", RouteRequestResult::OK, 1); |
| 548 } | 517 } |
| 549 | 518 |
| 550 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { | 519 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { |
| 551 EXPECT_CALL( | 520 EXPECT_CALL(mock_media_route_provider_, |
| 552 mock_media_route_provider_, | 521 ConnectRouteByRouteId( |
| 553 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, | 522 kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 554 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 523 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 555 true, _)) | |
| 556 .WillOnce(Invoke( | 524 .WillOnce(Invoke( |
| 557 [](const std::string& source, const std::string& route_id, | 525 [](const std::string& source, const std::string& route_id, |
| 558 const std::string& presentation_id, const std::string& origin, | 526 const std::string& presentation_id, const std::string& origin, |
| 559 int tab_id, base::TimeDelta timeout, bool incognito, | 527 int tab_id, base::TimeDelta timeout, bool incognito, |
| 560 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 528 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 561 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 529 cb.Run(base::nullopt, std::string(kError), |
| 562 mojom::RouteRequestResultCode::TIMED_OUT); | 530 RouteRequestResult::TIMED_OUT); |
| 563 })); | 531 })); |
| 564 | 532 |
| 565 RouteResponseCallbackHandler handler; | 533 RouteResponseCallbackHandler handler; |
| 566 base::RunLoop run_loop; | 534 base::RunLoop run_loop; |
| 567 EXPECT_CALL(handler, | 535 EXPECT_CALL(handler, |
| 568 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 536 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 569 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 537 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 570 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 538 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 571 route_response_callbacks.push_back(base::Bind( | 539 route_response_callbacks.push_back(base::Bind( |
| 572 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 540 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 573 router()->ConnectRouteByRouteId( | 541 router()->ConnectRouteByRouteId( |
| 574 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, | 542 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 575 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 543 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 576 run_loop.Run(); | 544 run_loop.Run(); |
| 577 ExpectResultBucketCount("JoinRoute", | 545 ExpectResultBucketCount("JoinRoute", |
| 578 RouteRequestResult::ResultCode::TIMED_OUT, 1); | 546 RouteRequestResult::TIMED_OUT, 1); |
| 579 } | 547 } |
| 580 | 548 |
| 581 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { | 549 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { |
| 582 mojom::MediaRoutePtr route = CreateMojoRoute(); | 550 MediaRoute route = CreateMediaRoute(); |
| 583 | 551 |
| 584 // Use a lambda function as an invocation target here to work around | 552 // 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 | 553 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 586 // in runnable parameter lists. | 554 // in runnable parameter lists. |
| 587 EXPECT_CALL( | 555 EXPECT_CALL(mock_media_route_provider_, |
| 588 mock_media_route_provider_, | 556 ConnectRouteByRouteId( |
| 589 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, | 557 kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 590 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 558 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 591 true, _)) | |
| 592 .WillOnce(Invoke([&route]( | 559 .WillOnce(Invoke([&route]( |
| 593 const std::string& source, const std::string& route_id, | 560 const std::string& source, const std::string& route_id, |
| 594 const std::string& presentation_id, const std::string& origin, | 561 const std::string& presentation_id, const std::string& origin, |
| 595 int tab_id, base::TimeDelta timeout, bool incognito, | 562 int tab_id, base::TimeDelta timeout, bool incognito, |
| 596 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 563 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 597 cb.Run(std::move(route), std::string(), | 564 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 598 mojom::RouteRequestResultCode::OK); | |
| 599 })); | 565 })); |
| 600 | 566 |
| 601 RouteResponseCallbackHandler handler; | 567 RouteResponseCallbackHandler handler; |
| 602 base::RunLoop run_loop; | 568 base::RunLoop run_loop; |
| 603 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 569 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 604 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 570 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 605 RouteRequestResult::INCOGNITO_MISMATCH)) | 571 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 606 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 572 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 607 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 573 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 608 route_response_callbacks.push_back(base::Bind( | 574 route_response_callbacks.push_back(base::Bind( |
| 609 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 575 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 610 router()->ConnectRouteByRouteId( | 576 router()->ConnectRouteByRouteId( |
| 611 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, | 577 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 612 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 578 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 613 run_loop.Run(); | 579 run_loop.Run(); |
| 614 ExpectResultBucketCount( | 580 ExpectResultBucketCount( |
| 615 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 581 "JoinRoute", RouteRequestResult::INCOGNITO_MISMATCH, 1); |
| 616 } | 582 } |
| 617 | 583 |
| 618 TEST_F(MediaRouterMojoImplTest, DetachRoute) { | 584 TEST_F(MediaRouterMojoImplTest, DetachRoute) { |
| 619 base::RunLoop run_loop; | 585 base::RunLoop run_loop; |
| 620 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) | 586 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) |
| 621 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 587 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 622 router()->DetachRoute(kRouteId); | 588 router()->DetachRoute(kRouteId); |
| 623 run_loop.Run(); | 589 run_loop.Run(); |
| 624 } | 590 } |
| 625 | 591 |
| 626 TEST_F(MediaRouterMojoImplTest, TerminateRoute) { | 592 TEST_F(MediaRouterMojoImplTest, TerminateRoute) { |
| 627 base::RunLoop run_loop; | 593 base::RunLoop run_loop; |
| 628 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) | 594 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) |
| 629 .WillOnce(Invoke([]( | 595 .WillOnce(Invoke( |
| 630 const std::string& route_id, | 596 [](const std::string& route_id, |
| 631 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { | 597 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { |
| 632 cb.Run(base::nullopt, mojom::RouteRequestResultCode::OK); | 598 cb.Run(base::nullopt, RouteRequestResult::OK); |
| 633 })); | 599 })); |
| 634 router()->TerminateRoute(kRouteId); | 600 router()->TerminateRoute(kRouteId); |
| 635 run_loop.RunUntilIdle(); | 601 run_loop.RunUntilIdle(); |
| 636 ExpectResultBucketCount("TerminateRoute", | 602 ExpectResultBucketCount("TerminateRoute", |
| 637 RouteRequestResult::ResultCode::OK, | 603 RouteRequestResult::OK, |
| 638 1); | 604 1); |
| 639 } | 605 } |
| 640 | 606 |
| 641 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) { | 607 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) { |
| 642 base::RunLoop run_loop; | 608 base::RunLoop run_loop; |
| 643 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) | 609 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) |
| 644 .WillOnce(Invoke([]( | 610 .WillOnce(Invoke( |
| 645 const std::string& route_id, | 611 [](const std::string& route_id, |
| 646 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { | 612 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { |
| 647 cb.Run(std::string("timed out"), | 613 cb.Run(std::string("timed out"), |
| 648 mojom::RouteRequestResultCode::TIMED_OUT); | 614 RouteRequestResult::TIMED_OUT); |
| 649 })); | 615 })); |
| 650 router()->TerminateRoute(kRouteId); | 616 router()->TerminateRoute(kRouteId); |
| 651 run_loop.RunUntilIdle(); | 617 run_loop.RunUntilIdle(); |
| 652 ExpectResultBucketCount("TerminateRoute", | 618 ExpectResultBucketCount("TerminateRoute", |
| 653 RouteRequestResult::ResultCode::OK, | 619 RouteRequestResult::OK, |
| 654 0); | 620 0); |
| 655 ExpectResultBucketCount("TerminateRoute", | 621 ExpectResultBucketCount("TerminateRoute", |
| 656 RouteRequestResult::ResultCode::TIMED_OUT, | 622 RouteRequestResult::TIMED_OUT, |
| 657 1); | 623 1); |
| 658 } | 624 } |
| 659 | 625 |
| 660 TEST_F(MediaRouterMojoImplTest, HandleIssue) { | 626 TEST_F(MediaRouterMojoImplTest, HandleIssue) { |
| 661 MockIssuesObserver issue_observer1(router()); | 627 MockIssuesObserver issue_observer1(router()); |
| 662 MockIssuesObserver issue_observer2(router()); | 628 MockIssuesObserver issue_observer2(router()); |
| 663 issue_observer1.Init(); | 629 issue_observer1.Init(); |
| 664 issue_observer2.Init(); | 630 issue_observer2.Init(); |
| 665 | 631 |
| 666 IssueInfo issue_info = CreateIssueInfo("title 1"); | 632 IssueInfo issue_info = CreateIssueInfo("title 1"); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 713 new MockMediaSinksObserver(router(), MediaSource(kSource2), origin)); | 679 new MockMediaSinksObserver(router(), MediaSource(kSource2), origin)); |
| 714 EXPECT_TRUE(unrelated_sinks_observer->Init()); | 680 EXPECT_TRUE(unrelated_sinks_observer->Init()); |
| 715 ProcessEventLoop(); | 681 ProcessEventLoop(); |
| 716 | 682 |
| 717 std::vector<MediaSink> expected_sinks; | 683 std::vector<MediaSink> expected_sinks; |
| 718 expected_sinks.push_back( | 684 expected_sinks.push_back( |
| 719 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); | 685 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); |
| 720 expected_sinks.push_back( | 686 expected_sinks.push_back( |
| 721 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); | 687 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); |
| 722 | 688 |
| 723 std::vector<mojom::MediaSinkPtr> mojo_sinks(2); | |
| 724 mojo_sinks[0] = mojom::MediaSink::New(); | |
| 725 mojo_sinks[0]->sink_id = kSinkId; | |
| 726 mojo_sinks[0]->name = kSinkName; | |
| 727 mojo_sinks[0]->icon_type = | |
| 728 media_router::mojom::MediaSink::IconType::CAST; | |
| 729 mojo_sinks[1] = mojom::MediaSink::New(); | |
| 730 mojo_sinks[1]->sink_id = kSinkId2; | |
| 731 mojo_sinks[1]->name = kSinkName; | |
| 732 mojo_sinks[1]->icon_type = | |
| 733 media_router::mojom::MediaSink::IconType::CAST; | |
| 734 | |
| 735 base::RunLoop run_loop; | 689 base::RunLoop run_loop; |
| 736 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); | 690 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); |
| 737 EXPECT_CALL(*extra_sinks_observer, | 691 EXPECT_CALL(*extra_sinks_observer, |
| 738 OnSinksReceived(SequenceEquals(expected_sinks))) | 692 OnSinksReceived(SequenceEquals(expected_sinks))) |
| 739 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 693 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 740 media_router_proxy_->OnSinksReceived( | 694 media_router_proxy_->OnSinksReceived( |
| 741 media_source.id(), std::move(mojo_sinks), | 695 media_source.id(), expected_sinks, |
| 742 std::vector<std::string>(1, origin.spec())); | 696 std::vector<std::string>(1, origin.spec())); |
| 743 run_loop.Run(); | 697 run_loop.Run(); |
| 744 | 698 |
| 745 // Since the MediaRouterMojoImpl has already received results for | 699 // Since the MediaRouterMojoImpl has already received results for |
| 746 // |media_source|, return cached results to observers that are subsequently | 700 // |media_source|, return cached results to observers that are subsequently |
| 747 // registered. | 701 // registered. |
| 748 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( | 702 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( |
| 749 new MockMediaSinksObserver(router(), media_source, origin)); | 703 new MockMediaSinksObserver(router(), media_source, origin)); |
| 750 EXPECT_CALL(*cached_sinks_observer, | 704 EXPECT_CALL(*cached_sinks_observer, |
| 751 OnSinksReceived(SequenceEquals(expected_sinks))); | 705 OnSinksReceived(SequenceEquals(expected_sinks))); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 866 expected_routes.push_back(MediaRoute(kRouteId, media_source, kSinkId, | 820 expected_routes.push_back(MediaRoute(kRouteId, media_source, kSinkId, |
| 867 kDescription, false, "", false)); | 821 kDescription, false, "", false)); |
| 868 MediaRoute incognito_expected_route(kRouteId2, media_source, kSinkId, | 822 MediaRoute incognito_expected_route(kRouteId2, media_source, kSinkId, |
| 869 kDescription, false, "", false); | 823 kDescription, false, "", false); |
| 870 incognito_expected_route.set_incognito(true); | 824 incognito_expected_route.set_incognito(true); |
| 871 expected_routes.push_back(incognito_expected_route); | 825 expected_routes.push_back(incognito_expected_route); |
| 872 std::vector<MediaRoute::Id> expected_joinable_route_ids; | 826 std::vector<MediaRoute::Id> expected_joinable_route_ids; |
| 873 expected_joinable_route_ids.push_back(kJoinableRouteId); | 827 expected_joinable_route_ids.push_back(kJoinableRouteId); |
| 874 expected_joinable_route_ids.push_back(kJoinableRouteId2); | 828 expected_joinable_route_ids.push_back(kJoinableRouteId2); |
| 875 | 829 |
| 876 std::vector<std::string> mojo_joinable_routes(2); | |
| 877 mojo_joinable_routes[0] = kJoinableRouteId; | |
| 878 mojo_joinable_routes[1] = kJoinableRouteId2; | |
| 879 | |
| 880 std::vector<mojom::MediaRoutePtr> mojo_routes(2); | |
| 881 mojo_routes[0] = CreateMojoRoute(); | |
| 882 mojo_routes[1] = CreateMojoRoute(); | |
| 883 mojo_routes[1]->media_route_id = kRouteId2; | |
| 884 mojo_routes[1]->is_incognito = true; | |
| 885 | |
| 886 EXPECT_CALL(routes_observer, OnRoutesUpdated(SequenceEquals(expected_routes), | 830 EXPECT_CALL(routes_observer, OnRoutesUpdated(SequenceEquals(expected_routes), |
| 887 expected_joinable_route_ids)); | 831 expected_joinable_route_ids)); |
| 888 EXPECT_CALL(extra_routes_observer, | 832 EXPECT_CALL(extra_routes_observer, |
| 889 OnRoutesUpdated(SequenceEquals(expected_routes), | 833 OnRoutesUpdated(SequenceEquals(expected_routes), |
| 890 expected_joinable_route_ids)); | 834 expected_joinable_route_ids)); |
| 891 EXPECT_CALL(different_routes_observer, | 835 EXPECT_CALL(different_routes_observer, |
| 892 OnRoutesUpdated(SequenceEquals(expected_routes), | 836 OnRoutesUpdated(SequenceEquals(expected_routes), |
| 893 expected_joinable_route_ids)) | 837 expected_joinable_route_ids)) |
| 894 .Times(0); | 838 .Times(0); |
| 895 media_router_proxy_->OnRoutesUpdated(std::move(mojo_routes), | 839 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(), |
| 896 media_source.id(), | 840 expected_joinable_route_ids); |
| 897 std::move(mojo_joinable_routes)); | |
| 898 ProcessEventLoop(); | 841 ProcessEventLoop(); |
| 899 | 842 |
| 900 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer)); | 843 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer)); |
| 901 EXPECT_CALL(mock_router, | 844 EXPECT_CALL(mock_router, |
| 902 UnregisterMediaRoutesObserver(&extra_routes_observer)); | 845 UnregisterMediaRoutesObserver(&extra_routes_observer)); |
| 903 EXPECT_CALL(mock_router, | 846 EXPECT_CALL(mock_router, |
| 904 UnregisterMediaRoutesObserver(&different_routes_observer)); | 847 UnregisterMediaRoutesObserver(&different_routes_observer)); |
| 905 router()->UnregisterMediaRoutesObserver(&routes_observer); | 848 router()->UnregisterMediaRoutesObserver(&routes_observer); |
| 906 router()->UnregisterMediaRoutesObserver(&extra_routes_observer); | 849 router()->UnregisterMediaRoutesObserver(&extra_routes_observer); |
| 907 router()->UnregisterMediaRoutesObserver(&different_routes_observer); | 850 router()->UnregisterMediaRoutesObserver(&different_routes_observer); |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1092 base::RunLoop run_loop; | 1035 base::RunLoop run_loop; |
| 1093 content::PresentationConnectionStateChangeInfo closed_info( | 1036 content::PresentationConnectionStateChangeInfo closed_info( |
| 1094 content::PRESENTATION_CONNECTION_STATE_CLOSED); | 1037 content::PRESENTATION_CONNECTION_STATE_CLOSED); |
| 1095 closed_info.close_reason = | 1038 closed_info.close_reason = |
| 1096 content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY; | 1039 content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY; |
| 1097 closed_info.message = "Foo"; | 1040 closed_info.message = "Foo"; |
| 1098 | 1041 |
| 1099 EXPECT_CALL(callback, Run(StateChangeInfoEquals(closed_info))) | 1042 EXPECT_CALL(callback, Run(StateChangeInfoEquals(closed_info))) |
| 1100 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 1043 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 1101 media_router_proxy_->OnPresentationConnectionClosed( | 1044 media_router_proxy_->OnPresentationConnectionClosed( |
| 1102 route_id, PresentationConnectionCloseReason::WENT_AWAY, "Foo"); | 1045 route_id, content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY, |
| 1046 "Foo"); | |
| 1103 run_loop.Run(); | 1047 run_loop.Run(); |
| 1104 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); | 1048 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); |
| 1105 } | 1049 } |
| 1106 | 1050 |
| 1107 content::PresentationConnectionStateChangeInfo terminated_info( | 1051 content::PresentationConnectionStateChangeInfo terminated_info( |
| 1108 content::PRESENTATION_CONNECTION_STATE_TERMINATED); | 1052 content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1109 { | 1053 { |
| 1110 base::RunLoop run_loop; | 1054 base::RunLoop run_loop; |
| 1111 EXPECT_CALL(callback, Run(StateChangeInfoEquals(terminated_info))) | 1055 EXPECT_CALL(callback, Run(StateChangeInfoEquals(terminated_info))) |
| 1112 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 1056 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 1113 media_router_proxy_->OnPresentationConnectionStateChanged( | 1057 media_router_proxy_->OnPresentationConnectionStateChanged( |
| 1114 route_id, PresentationConnectionState::TERMINATED); | 1058 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1115 run_loop.Run(); | 1059 run_loop.Run(); |
| 1116 | 1060 |
| 1117 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); | 1061 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); |
| 1118 } | 1062 } |
| 1119 } | 1063 } |
| 1120 | 1064 |
| 1121 TEST_F(MediaRouterMojoImplTest, | 1065 TEST_F(MediaRouterMojoImplTest, |
| 1122 PresentationConnectionStateChangedCallbackRemoved) { | 1066 PresentationConnectionStateChangedCallbackRemoved) { |
| 1123 MediaRoute::Id route_id("route-id"); | 1067 MediaRoute::Id route_id("route-id"); |
| 1124 MockPresentationConnectionStateChangedCallback callback; | 1068 MockPresentationConnectionStateChangedCallback callback; |
| 1125 std::unique_ptr<PresentationConnectionStateSubscription> subscription = | 1069 std::unique_ptr<PresentationConnectionStateSubscription> subscription = |
| 1126 router()->AddPresentationConnectionStateChangedCallback( | 1070 router()->AddPresentationConnectionStateChangedCallback( |
| 1127 route_id, | 1071 route_id, |
| 1128 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, | 1072 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, |
| 1129 base::Unretained(&callback))); | 1073 base::Unretained(&callback))); |
| 1130 | 1074 |
| 1131 // Callback has been removed, so we don't expect it to be called anymore. | 1075 // Callback has been removed, so we don't expect it to be called anymore. |
| 1132 subscription.reset(); | 1076 subscription.reset(); |
| 1133 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); | 1077 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); |
| 1134 | 1078 |
| 1135 EXPECT_CALL(callback, Run(_)).Times(0); | 1079 EXPECT_CALL(callback, Run(_)).Times(0); |
| 1136 media_router_proxy_->OnPresentationConnectionStateChanged( | 1080 media_router_proxy_->OnPresentationConnectionStateChanged( |
| 1137 route_id, PresentationConnectionState::TERMINATED); | 1081 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1138 ProcessEventLoop(); | 1082 ProcessEventLoop(); |
| 1139 } | 1083 } |
| 1140 | 1084 |
| 1141 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { | 1085 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { |
| 1142 base::RunLoop run_loop; | 1086 base::RunLoop run_loop; |
| 1143 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | 1087 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) |
| 1144 .Times(2) | 1088 .Times(2) |
| 1145 .WillRepeatedly(Return(true)); | 1089 .WillRepeatedly(Return(true)); |
| 1146 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) | 1090 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) |
| 1147 .Times(2) | 1091 .Times(2) |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1560 EXPECT_CALL(mock_media_route_provider_, | 1504 EXPECT_CALL(mock_media_route_provider_, |
| 1561 UpdateMediaSinks(MediaSourceForDesktop().id())) | 1505 UpdateMediaSinks(MediaSourceForDesktop().id())) |
| 1562 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1506 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1563 run_loop2.Quit(); | 1507 run_loop2.Quit(); |
| 1564 })); | 1508 })); |
| 1565 | 1509 |
| 1566 run_loop2.Run(); | 1510 run_loop2.Run(); |
| 1567 } | 1511 } |
| 1568 | 1512 |
| 1569 } // namespace media_router | 1513 } // namespace media_router |
| OLD | NEW |