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