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 |