Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc

Issue 2666873006: [Media Router] Convert to use typemaps for media_router.mojom. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698