| 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 std::string(), true); |
| 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", RouteRequestResult::TIMED_OUT, 1); |
| 289 RouteRequestResult::ResultCode::TIMED_OUT, 1); | |
| 290 } | 270 } |
| 291 | 271 |
| 292 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { | 272 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { |
| 293 EXPECT_CALL(mock_media_route_provider_, | 273 EXPECT_CALL( |
| 294 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, | 274 mock_media_route_provider_, |
| 295 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 275 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 296 true, _)) | 276 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 297 .WillOnce(Invoke( | 277 .WillOnce(Invoke( |
| 298 [](const std::string& source, const std::string& sink, | 278 [](const std::string& source, const std::string& sink, |
| 299 const std::string& presentation_id, const std::string& origin, | 279 const std::string& presentation_id, const std::string& origin, |
| 300 int tab_id, base::TimeDelta timeout, bool incognito, | 280 int tab_id, base::TimeDelta timeout, bool incognito, |
| 301 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 281 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 302 cb.Run(CreateMojoRoute(), std::string(), | 282 cb.Run(CreateMediaRoute(), std::string(), RouteRequestResult::OK); |
| 303 mojom::RouteRequestResultCode::OK); | |
| 304 })); | 283 })); |
| 305 | 284 |
| 306 RouteResponseCallbackHandler handler; | 285 RouteResponseCallbackHandler handler; |
| 307 base::RunLoop run_loop; | 286 base::RunLoop run_loop; |
| 308 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 287 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 309 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 288 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 310 RouteRequestResult::INCOGNITO_MISMATCH)) | 289 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 311 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 290 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 312 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 291 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 313 route_response_callbacks.push_back(base::Bind( | 292 route_response_callbacks.push_back(base::Bind( |
| 314 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 293 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 315 router()->CreateRoute( | 294 router()->CreateRoute( |
| 316 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, | 295 kSource, kSinkId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 317 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 296 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 318 run_loop.Run(); | 297 run_loop.Run(); |
| 319 ExpectResultBucketCount( | 298 ExpectResultBucketCount("CreateRoute", RouteRequestResult::INCOGNITO_MISMATCH, |
| 320 "CreateRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 299 1); |
| 321 } | 300 } |
| 322 | 301 |
| 323 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { | 302 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { |
| 324 mojom::MediaRoutePtr route = CreateMojoRoute(); | 303 MediaRoute route = CreateMediaRoute(); |
| 325 route->is_incognito = true; | 304 route.set_incognito(true); |
| 326 | 305 |
| 327 EXPECT_CALL(mock_media_route_provider_, | 306 EXPECT_CALL( |
| 328 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, | 307 mock_media_route_provider_, |
| 329 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 308 CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, |
| 330 true, _)) | 309 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 331 .WillOnce(Invoke( | 310 .WillOnce(Invoke([&route]( |
| 332 [](const std::string& source, const std::string& sink, | 311 const std::string& source, const std::string& sink, |
| 333 const std::string& presentation_id, const std::string& origin, | 312 const std::string& presentation_id, const std::string& origin, |
| 334 int tab_id, base::TimeDelta timeout, bool incognito, | 313 int tab_id, base::TimeDelta timeout, bool incognito, |
| 335 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { | 314 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { |
| 336 mojom::MediaRoutePtr route = CreateMojoRoute(); | 315 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 337 route->is_incognito = true; | 316 })); |
| 338 cb.Run(std::move(route), std::string(), | |
| 339 mojom::RouteRequestResultCode::OK); | |
| 340 })); | |
| 341 base::RunLoop run_loop; | 317 base::RunLoop run_loop; |
| 342 router()->CreateRoute(kSource, kSinkId, GURL(kOrigin), nullptr, | 318 router()->CreateRoute(kSource, kSinkId, GURL(kOrigin), nullptr, |
| 343 std::vector<MediaRouteResponseCallback>(), | 319 std::vector<MediaRouteResponseCallback>(), |
| 344 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 320 base::TimeDelta::FromMilliseconds(kTimeoutMillis), |
| 345 true); | 321 true); |
| 346 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 322 std::vector<MediaRoute> routes; |
| 347 mojo_routes[0] = route->Clone(); | 323 routes.push_back(route); |
| 348 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 324 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 349 std::vector<std::string>()); | |
| 350 | 325 |
| 351 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle | 326 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle |
| 352 // instead of manually calling Run/Quit on the run loop. | 327 // instead of manually calling Run/Quit on the run loop. |
| 353 run_loop.RunUntilIdle(); | 328 run_loop.RunUntilIdle(); |
| 354 | 329 |
| 355 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) | 330 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) |
| 356 .WillOnce(Invoke([]( | 331 .WillOnce(Invoke( |
| 357 const std::string& route_id, | 332 [](const std::string& route_id, |
| 358 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { | 333 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { |
| 359 cb.Run(base::nullopt, mojom::RouteRequestResultCode::OK); | 334 cb.Run(base::nullopt, RouteRequestResult::OK); |
| 360 })); | 335 })); |
| 361 | 336 |
| 362 base::RunLoop run_loop2; | 337 base::RunLoop run_loop2; |
| 363 router()->OnIncognitoProfileShutdown(); | 338 router()->OnIncognitoProfileShutdown(); |
| 364 run_loop2.RunUntilIdle(); | 339 run_loop2.RunUntilIdle(); |
| 365 } | 340 } |
| 366 | 341 |
| 367 TEST_F(MediaRouterMojoImplTest, JoinRoute) { | 342 TEST_F(MediaRouterMojoImplTest, JoinRoute) { |
| 368 MediaSource media_source(kSource); | 343 MediaSource media_source(kSource); |
| 369 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 344 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 370 false); | 345 false); |
| 371 | 346 |
| 372 mojom::MediaRoutePtr route = CreateMojoRoute(); | 347 MediaRoute route = CreateMediaRoute(); |
| 373 // Make sure the MR has received an update with the route, so it knows there | 348 // Make sure the MR has received an update with the route, so it knows there |
| 374 // is a route to join. | 349 // is a route to join. |
| 375 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 350 std::vector<MediaRoute> routes; |
| 376 mojo_routes[0] = route->Clone(); | 351 routes.push_back(route); |
| 377 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 352 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 378 std::vector<std::string>()); | |
| 379 EXPECT_TRUE(router()->HasJoinableRoute()); | 353 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 380 | 354 |
| 381 // Use a lambda function as an invocation target here to work around | 355 // 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 | 356 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 383 // in runnable parameter lists. | 357 // in runnable parameter lists. |
| 384 EXPECT_CALL( | 358 EXPECT_CALL( |
| 385 mock_media_route_provider_, | 359 mock_media_route_provider_, |
| 386 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, | 360 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 387 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 361 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 388 .WillOnce(Invoke([&route]( | 362 .WillOnce(Invoke([&route]( |
| 389 const std::string& source, const std::string& presentation_id, | 363 const std::string& source, const std::string& presentation_id, |
| 390 const std::string& origin, int tab_id, base::TimeDelta timeout, | 364 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 391 bool incognito, | 365 bool incognito, |
| 392 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 366 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 393 cb.Run(std::move(route), std::string(), | 367 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 394 mojom::RouteRequestResultCode::OK); | |
| 395 })); | 368 })); |
| 396 | 369 |
| 397 RouteResponseCallbackHandler handler; | 370 RouteResponseCallbackHandler handler; |
| 398 base::RunLoop run_loop; | 371 base::RunLoop run_loop; |
| 399 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 372 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 400 RouteRequestResult::OK)) | 373 RouteRequestResult::OK)) |
| 401 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 374 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 402 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 375 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 403 route_response_callbacks.push_back(base::Bind( | 376 route_response_callbacks.push_back(base::Bind( |
| 404 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 377 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 405 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 378 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 406 route_response_callbacks, | 379 route_response_callbacks, |
| 407 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 380 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 408 run_loop.Run(); | 381 run_loop.Run(); |
| 409 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); | 382 ExpectResultBucketCount("JoinRoute", RouteRequestResult::OK, 1); |
| 410 } | 383 } |
| 411 | 384 |
| 412 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { | 385 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { |
| 413 RouteResponseCallbackHandler handler; | 386 RouteResponseCallbackHandler handler; |
| 414 base::RunLoop run_loop; | 387 base::RunLoop run_loop; |
| 415 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", | 388 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", |
| 416 RouteRequestResult::ROUTE_NOT_FOUND)) | 389 RouteRequestResult::ROUTE_NOT_FOUND)) |
| 417 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 390 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 418 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 391 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 419 route_response_callbacks.push_back(base::Bind( | 392 route_response_callbacks.push_back(base::Bind( |
| 420 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 393 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 421 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 394 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 422 route_response_callbacks, | 395 route_response_callbacks, |
| 423 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 396 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 424 run_loop.Run(); | 397 run_loop.Run(); |
| 425 ExpectResultBucketCount("JoinRoute", | 398 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ROUTE_NOT_FOUND, 1); |
| 426 RouteRequestResult::ResultCode::ROUTE_NOT_FOUND, 1); | |
| 427 } | 399 } |
| 428 | 400 |
| 429 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { | 401 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { |
| 430 // Make sure the MR has received an update with the route, so it knows there | 402 // Make sure the MR has received an update with the route, so it knows there |
| 431 // is a route to join. | 403 // is a route to join. |
| 432 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 404 std::vector<MediaRoute> routes; |
| 433 mojo_routes[0] = CreateMojoRoute(); | 405 routes.push_back(CreateMediaRoute()); |
| 434 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 406 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 435 std::vector<std::string>()); | |
| 436 EXPECT_TRUE(router()->HasJoinableRoute()); | 407 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 437 | 408 |
| 438 EXPECT_CALL( | 409 EXPECT_CALL( |
| 439 mock_media_route_provider_, | 410 mock_media_route_provider_, |
| 440 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, | 411 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 441 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) | 412 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) |
| 442 .WillOnce(Invoke( | 413 .WillOnce(Invoke( |
| 443 [](const std::string& source, const std::string& presentation_id, | 414 [](const std::string& source, const std::string& presentation_id, |
| 444 const std::string& origin, int tab_id, base::TimeDelta timeout, | 415 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 445 bool incognito, | 416 bool incognito, |
| 446 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 417 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 447 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 418 cb.Run(base::nullopt, std::string(kError), |
| 448 mojom::RouteRequestResultCode::TIMED_OUT); | 419 RouteRequestResult::TIMED_OUT); |
| 449 })); | 420 })); |
| 450 | 421 |
| 451 RouteResponseCallbackHandler handler; | 422 RouteResponseCallbackHandler handler; |
| 452 base::RunLoop run_loop; | 423 base::RunLoop run_loop; |
| 453 EXPECT_CALL(handler, | 424 EXPECT_CALL(handler, |
| 454 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 425 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 455 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 426 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 456 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 427 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 457 route_response_callbacks.push_back(base::Bind( | 428 route_response_callbacks.push_back(base::Bind( |
| 458 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 429 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 459 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 430 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 460 route_response_callbacks, | 431 route_response_callbacks, |
| 461 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 432 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 462 run_loop.Run(); | 433 run_loop.Run(); |
| 463 ExpectResultBucketCount("JoinRoute", | 434 ExpectResultBucketCount("JoinRoute", RouteRequestResult::TIMED_OUT, 1); |
| 464 RouteRequestResult::ResultCode::TIMED_OUT, 1); | |
| 465 } | 435 } |
| 466 | 436 |
| 467 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { | 437 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { |
| 468 mojom::MediaRoutePtr route = CreateMojoRoute(); | 438 MediaRoute route = CreateMediaRoute(); |
| 469 | 439 |
| 470 // 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 |
| 471 // is a route to join. | 441 // is a route to join. |
| 472 std::vector<mojom::MediaRoutePtr> mojo_routes(1); | 442 std::vector<MediaRoute> routes; |
| 473 mojo_routes[0] = route->Clone(); | 443 routes.push_back(route); |
| 474 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), | 444 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>()); |
| 475 std::vector<std::string>()); | |
| 476 EXPECT_TRUE(router()->HasJoinableRoute()); | 445 EXPECT_TRUE(router()->HasJoinableRoute()); |
| 477 | 446 |
| 478 // Use a lambda function as an invocation target here to work around | 447 // 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 | 448 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 480 // in runnable parameter lists. | 449 // in runnable parameter lists. |
| 481 EXPECT_CALL( | 450 EXPECT_CALL( |
| 482 mock_media_route_provider_, | 451 mock_media_route_provider_, |
| 483 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, | 452 JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId, |
| 484 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) | 453 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 485 .WillOnce(Invoke([&route]( | 454 .WillOnce(Invoke([&route]( |
| 486 const std::string& source, const std::string& presentation_id, | 455 const std::string& source, const std::string& presentation_id, |
| 487 const std::string& origin, int tab_id, base::TimeDelta timeout, | 456 const std::string& origin, int tab_id, base::TimeDelta timeout, |
| 488 bool incognito, | 457 bool incognito, |
| 489 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 458 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 490 cb.Run(std::move(route), std::string(), | 459 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 491 mojom::RouteRequestResultCode::OK); | |
| 492 })); | 460 })); |
| 493 | 461 |
| 494 RouteResponseCallbackHandler handler; | 462 RouteResponseCallbackHandler handler; |
| 495 base::RunLoop run_loop; | 463 base::RunLoop run_loop; |
| 496 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 464 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 497 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 465 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 498 RouteRequestResult::INCOGNITO_MISMATCH)) | 466 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 499 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 467 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 500 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 468 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 501 route_response_callbacks.push_back(base::Bind( | 469 route_response_callbacks.push_back(base::Bind( |
| 502 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 470 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 503 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 471 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
| 504 route_response_callbacks, | 472 route_response_callbacks, |
| 505 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 473 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 506 run_loop.Run(); | 474 run_loop.Run(); |
| 507 ExpectResultBucketCount( | 475 ExpectResultBucketCount("JoinRoute", RouteRequestResult::INCOGNITO_MISMATCH, |
| 508 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 476 1); |
| 509 } | 477 } |
| 510 | 478 |
| 511 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { | 479 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { |
| 512 MediaSource media_source(kSource); | 480 MediaSource media_source(kSource); |
| 513 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 481 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 514 false); | 482 false); |
| 515 expected_route.set_incognito(false); | 483 expected_route.set_incognito(false); |
| 516 mojom::MediaRoutePtr route = CreateMojoRoute(); | 484 MediaRoute route = CreateMediaRoute(); |
| 517 | 485 |
| 518 // Use a lambda function as an invocation target here to work around | 486 // 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 | 487 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 520 // in runnable parameter lists. | 488 // in runnable parameter lists. |
| 521 EXPECT_CALL( | 489 EXPECT_CALL(mock_media_route_provider_, |
| 522 mock_media_route_provider_, | 490 ConnectRouteByRouteId( |
| 523 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, | 491 kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 524 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 492 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false, _)) |
| 525 false, _)) | |
| 526 .WillOnce(Invoke([&route]( | 493 .WillOnce(Invoke([&route]( |
| 527 const std::string& source, const std::string& route_id, | 494 const std::string& source, const std::string& route_id, |
| 528 const std::string& presentation_id, const std::string& origin, | 495 const std::string& presentation_id, const std::string& origin, |
| 529 int tab_id, base::TimeDelta timeout, bool incognito, | 496 int tab_id, base::TimeDelta timeout, bool incognito, |
| 530 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 497 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 531 cb.Run(std::move(route), std::string(), | 498 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 532 mojom::RouteRequestResultCode::OK); | |
| 533 })); | 499 })); |
| 534 | 500 |
| 535 RouteResponseCallbackHandler handler; | 501 RouteResponseCallbackHandler handler; |
| 536 base::RunLoop run_loop; | 502 base::RunLoop run_loop; |
| 537 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", | 503 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", |
| 538 RouteRequestResult::OK)) | 504 RouteRequestResult::OK)) |
| 539 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 505 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 540 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 506 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 541 route_response_callbacks.push_back(base::Bind( | 507 route_response_callbacks.push_back(base::Bind( |
| 542 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 508 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 543 router()->ConnectRouteByRouteId( | 509 router()->ConnectRouteByRouteId( |
| 544 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, | 510 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 545 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); | 511 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); |
| 546 run_loop.Run(); | 512 run_loop.Run(); |
| 547 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); | 513 ExpectResultBucketCount("JoinRoute", RouteRequestResult::OK, 1); |
| 548 } | 514 } |
| 549 | 515 |
| 550 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { | 516 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { |
| 551 EXPECT_CALL( | 517 EXPECT_CALL(mock_media_route_provider_, |
| 552 mock_media_route_provider_, | 518 ConnectRouteByRouteId( |
| 553 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, | 519 kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 554 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 520 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 555 true, _)) | |
| 556 .WillOnce(Invoke( | 521 .WillOnce(Invoke( |
| 557 [](const std::string& source, const std::string& route_id, | 522 [](const std::string& source, const std::string& route_id, |
| 558 const std::string& presentation_id, const std::string& origin, | 523 const std::string& presentation_id, const std::string& origin, |
| 559 int tab_id, base::TimeDelta timeout, bool incognito, | 524 int tab_id, base::TimeDelta timeout, bool incognito, |
| 560 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 525 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 561 cb.Run(mojom::MediaRoutePtr(), std::string(kError), | 526 cb.Run(base::nullopt, std::string(kError), |
| 562 mojom::RouteRequestResultCode::TIMED_OUT); | 527 RouteRequestResult::TIMED_OUT); |
| 563 })); | 528 })); |
| 564 | 529 |
| 565 RouteResponseCallbackHandler handler; | 530 RouteResponseCallbackHandler handler; |
| 566 base::RunLoop run_loop; | 531 base::RunLoop run_loop; |
| 567 EXPECT_CALL(handler, | 532 EXPECT_CALL(handler, |
| 568 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) | 533 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) |
| 569 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 534 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 570 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 535 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 571 route_response_callbacks.push_back(base::Bind( | 536 route_response_callbacks.push_back(base::Bind( |
| 572 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 537 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 573 router()->ConnectRouteByRouteId( | 538 router()->ConnectRouteByRouteId( |
| 574 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, | 539 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 575 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 540 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 576 run_loop.Run(); | 541 run_loop.Run(); |
| 577 ExpectResultBucketCount("JoinRoute", | 542 ExpectResultBucketCount("JoinRoute", RouteRequestResult::TIMED_OUT, 1); |
| 578 RouteRequestResult::ResultCode::TIMED_OUT, 1); | |
| 579 } | 543 } |
| 580 | 544 |
| 581 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { | 545 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { |
| 582 mojom::MediaRoutePtr route = CreateMojoRoute(); | 546 MediaRoute route = CreateMediaRoute(); |
| 583 | 547 |
| 584 // Use a lambda function as an invocation target here to work around | 548 // 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 | 549 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 586 // in runnable parameter lists. | 550 // in runnable parameter lists. |
| 587 EXPECT_CALL( | 551 EXPECT_CALL(mock_media_route_provider_, |
| 588 mock_media_route_provider_, | 552 ConnectRouteByRouteId( |
| 589 ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId, | 553 kSource, kRouteId, _, kOrigin, kInvalidTabId, |
| 590 base::TimeDelta::FromMilliseconds(kTimeoutMillis), | 554 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) |
| 591 true, _)) | |
| 592 .WillOnce(Invoke([&route]( | 555 .WillOnce(Invoke([&route]( |
| 593 const std::string& source, const std::string& route_id, | 556 const std::string& source, const std::string& route_id, |
| 594 const std::string& presentation_id, const std::string& origin, | 557 const std::string& presentation_id, const std::string& origin, |
| 595 int tab_id, base::TimeDelta timeout, bool incognito, | 558 int tab_id, base::TimeDelta timeout, bool incognito, |
| 596 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { | 559 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { |
| 597 cb.Run(std::move(route), std::string(), | 560 cb.Run(route, std::string(), RouteRequestResult::OK); |
| 598 mojom::RouteRequestResultCode::OK); | |
| 599 })); | 561 })); |
| 600 | 562 |
| 601 RouteResponseCallbackHandler handler; | 563 RouteResponseCallbackHandler handler; |
| 602 base::RunLoop run_loop; | 564 base::RunLoop run_loop; |
| 603 std::string error("Mismatch in incognito status: request = 1, response = 0"); | 565 std::string error("Mismatch in incognito status: request = 1, response = 0"); |
| 604 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, | 566 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, |
| 605 RouteRequestResult::INCOGNITO_MISMATCH)) | 567 RouteRequestResult::INCOGNITO_MISMATCH)) |
| 606 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 568 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 607 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 569 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 608 route_response_callbacks.push_back(base::Bind( | 570 route_response_callbacks.push_back(base::Bind( |
| 609 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 571 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 610 router()->ConnectRouteByRouteId( | 572 router()->ConnectRouteByRouteId( |
| 611 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, | 573 kSource, kRouteId, GURL(kOrigin), nullptr, route_response_callbacks, |
| 612 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); | 574 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); |
| 613 run_loop.Run(); | 575 run_loop.Run(); |
| 614 ExpectResultBucketCount( | 576 ExpectResultBucketCount("JoinRoute", RouteRequestResult::INCOGNITO_MISMATCH, |
| 615 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); | 577 1); |
| 616 } | 578 } |
| 617 | 579 |
| 618 TEST_F(MediaRouterMojoImplTest, DetachRoute) { | 580 TEST_F(MediaRouterMojoImplTest, DetachRoute) { |
| 619 base::RunLoop run_loop; | 581 base::RunLoop run_loop; |
| 620 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) | 582 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) |
| 621 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 583 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 622 router()->DetachRoute(kRouteId); | 584 router()->DetachRoute(kRouteId); |
| 623 run_loop.Run(); | 585 run_loop.Run(); |
| 624 } | 586 } |
| 625 | 587 |
| 626 TEST_F(MediaRouterMojoImplTest, TerminateRoute) { | 588 TEST_F(MediaRouterMojoImplTest, TerminateRoute) { |
| 627 base::RunLoop run_loop; | 589 base::RunLoop run_loop; |
| 628 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) | 590 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) |
| 629 .WillOnce(Invoke([]( | 591 .WillOnce(Invoke( |
| 630 const std::string& route_id, | 592 [](const std::string& route_id, |
| 631 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { | 593 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { |
| 632 cb.Run(base::nullopt, mojom::RouteRequestResultCode::OK); | 594 cb.Run(base::nullopt, RouteRequestResult::OK); |
| 633 })); | 595 })); |
| 634 router()->TerminateRoute(kRouteId); | 596 router()->TerminateRoute(kRouteId); |
| 635 run_loop.RunUntilIdle(); | 597 run_loop.RunUntilIdle(); |
| 636 ExpectResultBucketCount("TerminateRoute", | 598 ExpectResultBucketCount("TerminateRoute", RouteRequestResult::OK, 1); |
| 637 RouteRequestResult::ResultCode::OK, | |
| 638 1); | |
| 639 } | 599 } |
| 640 | 600 |
| 641 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) { | 601 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) { |
| 642 base::RunLoop run_loop; | 602 base::RunLoop run_loop; |
| 643 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) | 603 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) |
| 644 .WillOnce(Invoke([]( | 604 .WillOnce(Invoke( |
| 645 const std::string& route_id, | 605 [](const std::string& route_id, |
| 646 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { | 606 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { |
| 647 cb.Run(std::string("timed out"), | 607 cb.Run(std::string("timed out"), RouteRequestResult::TIMED_OUT); |
| 648 mojom::RouteRequestResultCode::TIMED_OUT); | 608 })); |
| 649 })); | |
| 650 router()->TerminateRoute(kRouteId); | 609 router()->TerminateRoute(kRouteId); |
| 651 run_loop.RunUntilIdle(); | 610 run_loop.RunUntilIdle(); |
| 652 ExpectResultBucketCount("TerminateRoute", | 611 ExpectResultBucketCount("TerminateRoute", RouteRequestResult::OK, 0); |
| 653 RouteRequestResult::ResultCode::OK, | 612 ExpectResultBucketCount("TerminateRoute", RouteRequestResult::TIMED_OUT, 1); |
| 654 0); | |
| 655 ExpectResultBucketCount("TerminateRoute", | |
| 656 RouteRequestResult::ResultCode::TIMED_OUT, | |
| 657 1); | |
| 658 } | 613 } |
| 659 | 614 |
| 660 TEST_F(MediaRouterMojoImplTest, HandleIssue) { | 615 TEST_F(MediaRouterMojoImplTest, HandleIssue) { |
| 661 MockIssuesObserver issue_observer1(router()); | 616 MockIssuesObserver issue_observer1(router()); |
| 662 MockIssuesObserver issue_observer2(router()); | 617 MockIssuesObserver issue_observer2(router()); |
| 663 issue_observer1.Init(); | 618 issue_observer1.Init(); |
| 664 issue_observer2.Init(); | 619 issue_observer2.Init(); |
| 665 | 620 |
| 666 IssueInfo issue_info = CreateIssueInfo("title 1"); | 621 IssueInfo issue_info = CreateIssueInfo("title 1"); |
| 667 | 622 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 new MockMediaSinksObserver(router(), MediaSource(kSource2), origin)); | 668 new MockMediaSinksObserver(router(), MediaSource(kSource2), origin)); |
| 714 EXPECT_TRUE(unrelated_sinks_observer->Init()); | 669 EXPECT_TRUE(unrelated_sinks_observer->Init()); |
| 715 ProcessEventLoop(); | 670 ProcessEventLoop(); |
| 716 | 671 |
| 717 std::vector<MediaSink> expected_sinks; | 672 std::vector<MediaSink> expected_sinks; |
| 718 expected_sinks.push_back( | 673 expected_sinks.push_back( |
| 719 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); | 674 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); |
| 720 expected_sinks.push_back( | 675 expected_sinks.push_back( |
| 721 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); | 676 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); |
| 722 | 677 |
| 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; | 678 base::RunLoop run_loop; |
| 736 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); | 679 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); |
| 737 EXPECT_CALL(*extra_sinks_observer, | 680 EXPECT_CALL(*extra_sinks_observer, |
| 738 OnSinksReceived(SequenceEquals(expected_sinks))) | 681 OnSinksReceived(SequenceEquals(expected_sinks))) |
| 739 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 682 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 740 media_router_proxy_->OnSinksReceived( | 683 media_router_proxy_->OnSinksReceived( |
| 741 media_source.id(), std::move(mojo_sinks), | 684 media_source.id(), expected_sinks, |
| 742 std::vector<std::string>(1, origin.spec())); | 685 std::vector<std::string>(1, origin.spec())); |
| 743 run_loop.Run(); | 686 run_loop.Run(); |
| 744 | 687 |
| 745 // Since the MediaRouterMojoImpl has already received results for | 688 // Since the MediaRouterMojoImpl has already received results for |
| 746 // |media_source|, return cached results to observers that are subsequently | 689 // |media_source|, return cached results to observers that are subsequently |
| 747 // registered. | 690 // registered. |
| 748 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( | 691 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( |
| 749 new MockMediaSinksObserver(router(), media_source, origin)); | 692 new MockMediaSinksObserver(router(), media_source, origin)); |
| 750 EXPECT_CALL(*cached_sinks_observer, | 693 EXPECT_CALL(*cached_sinks_observer, |
| 751 OnSinksReceived(SequenceEquals(expected_sinks))); | 694 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, | 809 expected_routes.push_back(MediaRoute(kRouteId, media_source, kSinkId, |
| 867 kDescription, false, "", false)); | 810 kDescription, false, "", false)); |
| 868 MediaRoute incognito_expected_route(kRouteId2, media_source, kSinkId, | 811 MediaRoute incognito_expected_route(kRouteId2, media_source, kSinkId, |
| 869 kDescription, false, "", false); | 812 kDescription, false, "", false); |
| 870 incognito_expected_route.set_incognito(true); | 813 incognito_expected_route.set_incognito(true); |
| 871 expected_routes.push_back(incognito_expected_route); | 814 expected_routes.push_back(incognito_expected_route); |
| 872 std::vector<MediaRoute::Id> expected_joinable_route_ids; | 815 std::vector<MediaRoute::Id> expected_joinable_route_ids; |
| 873 expected_joinable_route_ids.push_back(kJoinableRouteId); | 816 expected_joinable_route_ids.push_back(kJoinableRouteId); |
| 874 expected_joinable_route_ids.push_back(kJoinableRouteId2); | 817 expected_joinable_route_ids.push_back(kJoinableRouteId2); |
| 875 | 818 |
| 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), | 819 EXPECT_CALL(routes_observer, OnRoutesUpdated(SequenceEquals(expected_routes), |
| 887 expected_joinable_route_ids)); | 820 expected_joinable_route_ids)); |
| 888 EXPECT_CALL(extra_routes_observer, | 821 EXPECT_CALL(extra_routes_observer, |
| 889 OnRoutesUpdated(SequenceEquals(expected_routes), | 822 OnRoutesUpdated(SequenceEquals(expected_routes), |
| 890 expected_joinable_route_ids)); | 823 expected_joinable_route_ids)); |
| 891 EXPECT_CALL(different_routes_observer, | 824 EXPECT_CALL(different_routes_observer, |
| 892 OnRoutesUpdated(SequenceEquals(expected_routes), | 825 OnRoutesUpdated(SequenceEquals(expected_routes), |
| 893 expected_joinable_route_ids)) | 826 expected_joinable_route_ids)) |
| 894 .Times(0); | 827 .Times(0); |
| 895 media_router_proxy_->OnRoutesUpdated(std::move(mojo_routes), | 828 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(), |
| 896 media_source.id(), | 829 expected_joinable_route_ids); |
| 897 std::move(mojo_joinable_routes)); | |
| 898 ProcessEventLoop(); | 830 ProcessEventLoop(); |
| 899 | 831 |
| 900 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer)); | 832 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer)); |
| 901 EXPECT_CALL(mock_router, | 833 EXPECT_CALL(mock_router, |
| 902 UnregisterMediaRoutesObserver(&extra_routes_observer)); | 834 UnregisterMediaRoutesObserver(&extra_routes_observer)); |
| 903 EXPECT_CALL(mock_router, | 835 EXPECT_CALL(mock_router, |
| 904 UnregisterMediaRoutesObserver(&different_routes_observer)); | 836 UnregisterMediaRoutesObserver(&different_routes_observer)); |
| 905 router()->UnregisterMediaRoutesObserver(&routes_observer); | 837 router()->UnregisterMediaRoutesObserver(&routes_observer); |
| 906 router()->UnregisterMediaRoutesObserver(&extra_routes_observer); | 838 router()->UnregisterMediaRoutesObserver(&extra_routes_observer); |
| 907 router()->UnregisterMediaRoutesObserver(&different_routes_observer); | 839 router()->UnregisterMediaRoutesObserver(&different_routes_observer); |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 base::RunLoop run_loop; | 1024 base::RunLoop run_loop; |
| 1093 content::PresentationConnectionStateChangeInfo closed_info( | 1025 content::PresentationConnectionStateChangeInfo closed_info( |
| 1094 content::PRESENTATION_CONNECTION_STATE_CLOSED); | 1026 content::PRESENTATION_CONNECTION_STATE_CLOSED); |
| 1095 closed_info.close_reason = | 1027 closed_info.close_reason = |
| 1096 content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY; | 1028 content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY; |
| 1097 closed_info.message = "Foo"; | 1029 closed_info.message = "Foo"; |
| 1098 | 1030 |
| 1099 EXPECT_CALL(callback, Run(StateChangeInfoEquals(closed_info))) | 1031 EXPECT_CALL(callback, Run(StateChangeInfoEquals(closed_info))) |
| 1100 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 1032 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 1101 media_router_proxy_->OnPresentationConnectionClosed( | 1033 media_router_proxy_->OnPresentationConnectionClosed( |
| 1102 route_id, PresentationConnectionCloseReason::WENT_AWAY, "Foo"); | 1034 route_id, content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY, |
| 1035 "Foo"); |
| 1103 run_loop.Run(); | 1036 run_loop.Run(); |
| 1104 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); | 1037 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); |
| 1105 } | 1038 } |
| 1106 | 1039 |
| 1107 content::PresentationConnectionStateChangeInfo terminated_info( | 1040 content::PresentationConnectionStateChangeInfo terminated_info( |
| 1108 content::PRESENTATION_CONNECTION_STATE_TERMINATED); | 1041 content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1109 { | 1042 { |
| 1110 base::RunLoop run_loop; | 1043 base::RunLoop run_loop; |
| 1111 EXPECT_CALL(callback, Run(StateChangeInfoEquals(terminated_info))) | 1044 EXPECT_CALL(callback, Run(StateChangeInfoEquals(terminated_info))) |
| 1112 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 1045 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 1113 media_router_proxy_->OnPresentationConnectionStateChanged( | 1046 media_router_proxy_->OnPresentationConnectionStateChanged( |
| 1114 route_id, PresentationConnectionState::TERMINATED); | 1047 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1115 run_loop.Run(); | 1048 run_loop.Run(); |
| 1116 | 1049 |
| 1117 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); | 1050 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); |
| 1118 } | 1051 } |
| 1119 } | 1052 } |
| 1120 | 1053 |
| 1121 TEST_F(MediaRouterMojoImplTest, | 1054 TEST_F(MediaRouterMojoImplTest, |
| 1122 PresentationConnectionStateChangedCallbackRemoved) { | 1055 PresentationConnectionStateChangedCallbackRemoved) { |
| 1123 MediaRoute::Id route_id("route-id"); | 1056 MediaRoute::Id route_id("route-id"); |
| 1124 MockPresentationConnectionStateChangedCallback callback; | 1057 MockPresentationConnectionStateChangedCallback callback; |
| 1125 std::unique_ptr<PresentationConnectionStateSubscription> subscription = | 1058 std::unique_ptr<PresentationConnectionStateSubscription> subscription = |
| 1126 router()->AddPresentationConnectionStateChangedCallback( | 1059 router()->AddPresentationConnectionStateChangedCallback( |
| 1127 route_id, | 1060 route_id, |
| 1128 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, | 1061 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, |
| 1129 base::Unretained(&callback))); | 1062 base::Unretained(&callback))); |
| 1130 | 1063 |
| 1131 // Callback has been removed, so we don't expect it to be called anymore. | 1064 // Callback has been removed, so we don't expect it to be called anymore. |
| 1132 subscription.reset(); | 1065 subscription.reset(); |
| 1133 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); | 1066 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); |
| 1134 | 1067 |
| 1135 EXPECT_CALL(callback, Run(_)).Times(0); | 1068 EXPECT_CALL(callback, Run(_)).Times(0); |
| 1136 media_router_proxy_->OnPresentationConnectionStateChanged( | 1069 media_router_proxy_->OnPresentationConnectionStateChanged( |
| 1137 route_id, PresentationConnectionState::TERMINATED); | 1070 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1138 ProcessEventLoop(); | 1071 ProcessEventLoop(); |
| 1139 } | 1072 } |
| 1140 | 1073 |
| 1141 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { | 1074 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { |
| 1142 base::RunLoop run_loop; | 1075 base::RunLoop run_loop; |
| 1143 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | 1076 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) |
| 1144 .Times(2) | 1077 .Times(2) |
| 1145 .WillRepeatedly(Return(true)); | 1078 .WillRepeatedly(Return(true)); |
| 1146 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) | 1079 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) |
| 1147 .Times(2) | 1080 .Times(2) |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1560 EXPECT_CALL(mock_media_route_provider_, | 1493 EXPECT_CALL(mock_media_route_provider_, |
| 1561 UpdateMediaSinks(MediaSourceForDesktop().id())) | 1494 UpdateMediaSinks(MediaSourceForDesktop().id())) |
| 1562 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1495 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1563 run_loop2.Quit(); | 1496 run_loop2.Quit(); |
| 1564 })); | 1497 })); |
| 1565 | 1498 |
| 1566 run_loop2.Run(); | 1499 run_loop2.Run(); |
| 1567 } | 1500 } |
| 1568 | 1501 |
| 1569 } // namespace media_router | 1502 } // namespace media_router |
| OLD | NEW |