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

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: Addressed Mark's comments 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 std::string(), true);
99 route->media_sink_id = kSinkId;
100 route->media_route_id = kRouteId;
101 route->description = kDescription;
102 route->is_local = true;
103 route->for_display = true;
104 route->is_incognito = false;
105 return route;
106 } 93 }
107 94
108 } // namespace 95 } // namespace
109 96
110 class RouteResponseCallbackHandler { 97 class RouteResponseCallbackHandler {
111 public: 98 public:
112 void Invoke(const RouteRequestResult& result) { 99 void Invoke(const RouteRequestResult& result) {
113 DoInvoke(result.route(), result.presentation_id(), result.error(), 100 DoInvoke(result.route(), result.presentation_id(), result.error(),
114 result.result_code()); 101 result.result_code());
115 } 102 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
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, _, url::Origin(GURL(kOrigin)), 185 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)),
199 kInvalidTabId, _, _, _)) 186 kInvalidTabId, _, _, _))
200 .WillOnce(Invoke( 187 .WillOnce(Invoke(
201 [](const std::string& source, const std::string& sink, 188 [](const std::string& source, const std::string& sink,
202 const std::string& presentation_id, const url::Origin& origin, 189 const std::string& presentation_id, const url::Origin& origin,
203 int tab_id, base::TimeDelta timeout, bool incognito, 190 int tab_id, base::TimeDelta timeout, bool incognito,
204 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { 191 const mojom::MediaRouteProvider::CreateRouteCallback& cb) {
205 cb.Run(CreateMojoRoute(), std::string(), 192 cb.Run(CreateMediaRoute(), std::string(), RouteRequestResult::OK);
206 mojom::RouteRequestResultCode::OK);
207 })); 193 }));
208 194
209 base::RunLoop run_loop; 195 base::RunLoop run_loop;
210 RouteResponseCallbackHandler handler; 196 RouteResponseCallbackHandler handler;
211 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", 197 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "",
212 RouteRequestResult::OK)) 198 RouteRequestResult::OK))
213 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 199 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
214 std::vector<MediaRouteResponseCallback> route_response_callbacks; 200 std::vector<MediaRouteResponseCallback> route_response_callbacks;
215 route_response_callbacks.push_back(base::Bind( 201 route_response_callbacks.push_back(base::Bind(
216 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 202 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
217 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, 203 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr,
218 route_response_callbacks, 204 route_response_callbacks,
219 base::TimeDelta::FromMilliseconds(kTimeoutMillis), 205 base::TimeDelta::FromMilliseconds(kTimeoutMillis),
220 false); 206 false);
221 run_loop.Run(); 207 run_loop.Run();
222 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); 208 ExpectResultBucketCount("CreateRoute", RouteRequestResult::OK, 1);
223 } 209 }
224 210
225 TEST_F(MediaRouterMojoImplTest, CreateIncognitoRoute) { 211 TEST_F(MediaRouterMojoImplTest, CreateIncognitoRoute) {
226 MediaSource media_source(kSource); 212 MediaSource media_source(kSource);
227 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", 213 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "",
228 false); 214 false);
229 expected_route.set_incognito(true); 215 expected_route.set_incognito(true);
230 216
231 // Use a lambda function as an invocation target here to work around 217 // Use a lambda function as an invocation target here to work around
232 // a limitation with GMock::Invoke that prevents it from using move-only types 218 // a limitation with GMock::Invoke that prevents it from using move-only types
233 // in runnable parameter lists. 219 // in runnable parameter lists.
234 EXPECT_CALL(mock_media_route_provider_, 220 EXPECT_CALL(mock_media_route_provider_,
235 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), 221 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)),
236 kInvalidTabId, _, _, _)) 222 kInvalidTabId, _, _, _))
237 .WillOnce(Invoke( 223 .WillOnce(Invoke([&expected_route](
238 [](const std::string& source, const std::string& sink, 224 const std::string& source, const std::string& sink,
239 const std::string& presentation_id, const url::Origin& origin, 225 const std::string& presentation_id, const url::Origin& origin,
240 int tab_id, base::TimeDelta timeout, bool incognito, 226 int tab_id, base::TimeDelta timeout, bool incognito,
241 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { 227 const mojom::MediaRouteProvider::CreateRouteCallback& cb) {
242 mojom::MediaRoutePtr route = CreateMojoRoute(); 228 cb.Run(expected_route, std::string(), RouteRequestResult::OK);
243 route->custom_controller_path = 229 }));
244 std::string("custom/controller/path");
245 route->is_incognito = true;
246 cb.Run(std::move(route), std::string(),
247 mojom::RouteRequestResultCode::OK);
248 }));
249 230
250 base::RunLoop run_loop; 231 base::RunLoop run_loop;
251 RouteResponseCallbackHandler handler; 232 RouteResponseCallbackHandler handler;
252 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", 233 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "",
253 RouteRequestResult::OK)) 234 RouteRequestResult::OK))
254 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 235 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
255 std::vector<MediaRouteResponseCallback> route_response_callbacks; 236 std::vector<MediaRouteResponseCallback> route_response_callbacks;
256 route_response_callbacks.push_back(base::Bind( 237 route_response_callbacks.push_back(base::Bind(
257 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 238 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
258 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, 239 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr,
259 route_response_callbacks, 240 route_response_callbacks,
260 base::TimeDelta::FromMilliseconds(kTimeoutMillis), 241 base::TimeDelta::FromMilliseconds(kTimeoutMillis),
261 true); 242 true);
262 run_loop.Run(); 243 run_loop.Run();
263 ExpectResultBucketCount("CreateRoute", RouteRequestResult::ResultCode::OK, 1); 244 ExpectResultBucketCount("CreateRoute", RouteRequestResult::OK, 1);
264 } 245 }
265 246
266 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { 247 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) {
267 EXPECT_CALL( 248 EXPECT_CALL(
268 mock_media_route_provider_, 249 mock_media_route_provider_,
269 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), 250 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)),
270 kInvalidTabId, 251 kInvalidTabId,
271 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) 252 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _))
272 .WillOnce(Invoke( 253 .WillOnce(Invoke(
273 [](const std::string& source, const std::string& sink, 254 [](const std::string& source, const std::string& sink,
274 const std::string& presentation_id, const url::Origin& origin, 255 const std::string& presentation_id, const url::Origin& origin,
275 int tab_id, base::TimeDelta timeout, bool incognito, 256 int tab_id, base::TimeDelta timeout, bool incognito,
276 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { 257 const mojom::MediaRouteProvider::CreateRouteCallback& cb) {
277 cb.Run(mojom::MediaRoutePtr(), std::string(kError), 258 cb.Run(base::nullopt, std::string(kError),
278 mojom::RouteRequestResultCode::TIMED_OUT); 259 RouteRequestResult::TIMED_OUT);
279 })); 260 }));
280 261
281 RouteResponseCallbackHandler handler; 262 RouteResponseCallbackHandler handler;
282 base::RunLoop run_loop; 263 base::RunLoop run_loop;
283 EXPECT_CALL(handler, 264 EXPECT_CALL(handler,
284 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) 265 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT))
285 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 266 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
286 std::vector<MediaRouteResponseCallback> route_response_callbacks; 267 std::vector<MediaRouteResponseCallback> route_response_callbacks;
287 route_response_callbacks.push_back(base::Bind( 268 route_response_callbacks.push_back(base::Bind(
288 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 269 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
289 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, 270 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr,
290 route_response_callbacks, 271 route_response_callbacks,
291 base::TimeDelta::FromMilliseconds(kTimeoutMillis), 272 base::TimeDelta::FromMilliseconds(kTimeoutMillis),
292 false); 273 false);
293 run_loop.Run(); 274 run_loop.Run();
294 ExpectResultBucketCount("CreateRoute", 275 ExpectResultBucketCount("CreateRoute", RouteRequestResult::TIMED_OUT, 1);
295 RouteRequestResult::ResultCode::TIMED_OUT, 1);
296 } 276 }
297 277
298 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) { 278 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) {
299 EXPECT_CALL( 279 EXPECT_CALL(
300 mock_media_route_provider_, 280 mock_media_route_provider_,
301 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), 281 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)),
302 kInvalidTabId, 282 kInvalidTabId,
303 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) 283 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _))
304 .WillOnce(Invoke( 284 .WillOnce(Invoke(
305 [](const std::string& source, const std::string& sink, 285 [](const std::string& source, const std::string& sink,
306 const std::string& presentation_id, const url::Origin& origin, 286 const std::string& presentation_id, const url::Origin& origin,
307 int tab_id, base::TimeDelta timeout, bool incognito, 287 int tab_id, base::TimeDelta timeout, bool incognito,
308 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { 288 const mojom::MediaRouteProvider::CreateRouteCallback& cb) {
mark a. foltz 2017/02/09 22:53:52 Can this callback be typemapped? Same comment app
309 cb.Run(CreateMojoRoute(), std::string(), 289 cb.Run(CreateMediaRoute(), std::string(), RouteRequestResult::OK);
310 mojom::RouteRequestResultCode::OK);
311 })); 290 }));
312 291
313 RouteResponseCallbackHandler handler; 292 RouteResponseCallbackHandler handler;
314 base::RunLoop run_loop; 293 base::RunLoop run_loop;
315 std::string error("Mismatch in incognito status: request = 1, response = 0"); 294 std::string error("Mismatch in incognito status: request = 1, response = 0");
316 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, 295 EXPECT_CALL(handler, DoInvoke(nullptr, "", error,
317 RouteRequestResult::INCOGNITO_MISMATCH)) 296 RouteRequestResult::INCOGNITO_MISMATCH))
318 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 297 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
319 std::vector<MediaRouteResponseCallback> route_response_callbacks; 298 std::vector<MediaRouteResponseCallback> route_response_callbacks;
320 route_response_callbacks.push_back(base::Bind( 299 route_response_callbacks.push_back(base::Bind(
321 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 300 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
322 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, 301 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr,
323 route_response_callbacks, 302 route_response_callbacks,
324 base::TimeDelta::FromMilliseconds(kTimeoutMillis), 303 base::TimeDelta::FromMilliseconds(kTimeoutMillis),
325 true); 304 true);
326 run_loop.Run(); 305 run_loop.Run();
327 ExpectResultBucketCount( 306 ExpectResultBucketCount("CreateRoute", RouteRequestResult::INCOGNITO_MISMATCH,
328 "CreateRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); 307 1);
329 } 308 }
330 309
331 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) { 310 TEST_F(MediaRouterMojoImplTest, IncognitoRoutesTerminatedOnProfileShutdown) {
332 mojom::MediaRoutePtr route = CreateMojoRoute(); 311 MediaRoute route = CreateMediaRoute();
333 route->is_incognito = true; 312 route.set_incognito(true);
334 313
335 EXPECT_CALL( 314 EXPECT_CALL(
336 mock_media_route_provider_, 315 mock_media_route_provider_,
337 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)), 316 CreateRoute(kSource, kSinkId, _, url::Origin(GURL(kOrigin)),
338 kInvalidTabId, 317 kInvalidTabId,
339 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) 318 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _))
340 .WillOnce(Invoke( 319 .WillOnce(Invoke([&route](
341 [](const std::string& source, const std::string& sink, 320 const std::string& source, const std::string& sink,
342 const std::string& presentation_id, const url::Origin& origin, 321 const std::string& presentation_id, const url::Origin& origin,
343 int tab_id, base::TimeDelta timeout, bool incognito, 322 int tab_id, base::TimeDelta timeout, bool incognito,
344 const mojom::MediaRouteProvider::CreateRouteCallback& cb) { 323 const mojom::MediaRouteProvider::CreateRouteCallback& cb) {
345 mojom::MediaRoutePtr route = CreateMojoRoute(); 324 cb.Run(route, std::string(), RouteRequestResult::OK);
346 route->is_incognito = true; 325 }));
347 cb.Run(std::move(route), std::string(),
348 mojom::RouteRequestResultCode::OK);
349 }));
350 base::RunLoop run_loop; 326 base::RunLoop run_loop;
351 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr, 327 router()->CreateRoute(kSource, kSinkId, url::Origin(GURL(kOrigin)), nullptr,
352 std::vector<MediaRouteResponseCallback>(), 328 std::vector<MediaRouteResponseCallback>(),
353 base::TimeDelta::FromMilliseconds(kTimeoutMillis), 329 base::TimeDelta::FromMilliseconds(kTimeoutMillis),
354 true); 330 true);
355 std::vector<mojom::MediaRoutePtr> mojo_routes(1); 331 std::vector<MediaRoute> routes;
mark a. foltz 2017/02/09 22:53:52 routes({route}). Or just create the vector in the
356 mojo_routes[0] = route->Clone(); 332 routes.push_back(route);
357 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), 333 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>());
358 std::vector<std::string>());
359 334
360 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle 335 // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle
361 // instead of manually calling Run/Quit on the run loop. 336 // instead of manually calling Run/Quit on the run loop.
362 run_loop.RunUntilIdle(); 337 run_loop.RunUntilIdle();
363 338
364 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) 339 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _))
365 .WillOnce(Invoke([]( 340 .WillOnce(Invoke(
366 const std::string& route_id, 341 [](const std::string& route_id,
367 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { 342 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) {
368 cb.Run(base::nullopt, mojom::RouteRequestResultCode::OK); 343 cb.Run(base::nullopt, RouteRequestResult::OK);
369 })); 344 }));
370 345
371 base::RunLoop run_loop2; 346 base::RunLoop run_loop2;
372 router()->OnIncognitoProfileShutdown(); 347 router()->OnIncognitoProfileShutdown();
373 run_loop2.RunUntilIdle(); 348 run_loop2.RunUntilIdle();
374 } 349 }
375 350
376 TEST_F(MediaRouterMojoImplTest, JoinRoute) { 351 TEST_F(MediaRouterMojoImplTest, JoinRoute) {
377 MediaSource media_source(kSource); 352 MediaSource media_source(kSource);
378 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", 353 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "",
379 false); 354 false);
380 355
381 mojom::MediaRoutePtr route = CreateMojoRoute(); 356 MediaRoute route = CreateMediaRoute();
382 // Make sure the MR has received an update with the route, so it knows there 357 // Make sure the MR has received an update with the route, so it knows there
383 // is a route to join. 358 // is a route to join.
384 std::vector<mojom::MediaRoutePtr> mojo_routes(1); 359 std::vector<MediaRoute> routes;
385 mojo_routes[0] = route->Clone(); 360 routes.push_back(route);
386 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), 361 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>());
387 std::vector<std::string>());
388 EXPECT_TRUE(router()->HasJoinableRoute()); 362 EXPECT_TRUE(router()->HasJoinableRoute());
389 363
390 // Use a lambda function as an invocation target here to work around 364 // Use a lambda function as an invocation target here to work around
391 // a limitation with GMock::Invoke that prevents it from using move-only types 365 // a limitation with GMock::Invoke that prevents it from using move-only types
392 // in runnable parameter lists. 366 // in runnable parameter lists.
393 EXPECT_CALL( 367 EXPECT_CALL(
394 mock_media_route_provider_, 368 mock_media_route_provider_,
395 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 369 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
396 kInvalidTabId, 370 kInvalidTabId,
397 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) 371 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _))
398 .WillOnce(Invoke([&route]( 372 .WillOnce(Invoke([&route](
399 const std::string& source, const std::string& presentation_id, 373 const std::string& source, const std::string& presentation_id,
400 const url::Origin& origin, int tab_id, base::TimeDelta timeout, 374 const url::Origin& origin, int tab_id, base::TimeDelta timeout,
401 bool incognito, 375 bool incognito,
402 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { 376 const mojom::MediaRouteProvider::JoinRouteCallback& cb) {
403 cb.Run(std::move(route), std::string(), 377 cb.Run(route, std::string(), RouteRequestResult::OK);
404 mojom::RouteRequestResultCode::OK);
405 })); 378 }));
406 379
407 RouteResponseCallbackHandler handler; 380 RouteResponseCallbackHandler handler;
408 base::RunLoop run_loop; 381 base::RunLoop run_loop;
409 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", 382 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "",
410 RouteRequestResult::OK)) 383 RouteRequestResult::OK))
411 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 384 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
412 std::vector<MediaRouteResponseCallback> route_response_callbacks; 385 std::vector<MediaRouteResponseCallback> route_response_callbacks;
413 route_response_callbacks.push_back(base::Bind( 386 route_response_callbacks.push_back(base::Bind(
414 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 387 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
415 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 388 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
416 nullptr, route_response_callbacks, 389 nullptr, route_response_callbacks,
417 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); 390 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false);
418 run_loop.Run(); 391 run_loop.Run();
419 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); 392 ExpectResultBucketCount("JoinRoute", RouteRequestResult::OK, 1);
420 } 393 }
421 394
422 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) { 395 TEST_F(MediaRouterMojoImplTest, JoinRouteNotFoundFails) {
423 RouteResponseCallbackHandler handler; 396 RouteResponseCallbackHandler handler;
424 base::RunLoop run_loop; 397 base::RunLoop run_loop;
425 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found", 398 EXPECT_CALL(handler, DoInvoke(nullptr, "", "Route not found",
426 RouteRequestResult::ROUTE_NOT_FOUND)) 399 RouteRequestResult::ROUTE_NOT_FOUND))
427 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 400 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
428 std::vector<MediaRouteResponseCallback> route_response_callbacks; 401 std::vector<MediaRouteResponseCallback> route_response_callbacks;
429 route_response_callbacks.push_back(base::Bind( 402 route_response_callbacks.push_back(base::Bind(
430 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 403 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
431 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 404 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
432 nullptr, route_response_callbacks, 405 nullptr, route_response_callbacks,
433 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); 406 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false);
434 run_loop.Run(); 407 run_loop.Run();
435 ExpectResultBucketCount("JoinRoute", 408 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ROUTE_NOT_FOUND, 1);
436 RouteRequestResult::ResultCode::ROUTE_NOT_FOUND, 1);
437 } 409 }
438 410
439 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) { 411 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) {
440 // Make sure the MR has received an update with the route, so it knows there 412 // Make sure the MR has received an update with the route, so it knows there
441 // is a route to join. 413 // is a route to join.
442 std::vector<mojom::MediaRoutePtr> mojo_routes(1); 414 std::vector<MediaRoute> routes;
443 mojo_routes[0] = CreateMojoRoute(); 415 routes.push_back(CreateMediaRoute());
444 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), 416 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>());
445 std::vector<std::string>());
446 EXPECT_TRUE(router()->HasJoinableRoute()); 417 EXPECT_TRUE(router()->HasJoinableRoute());
447 418
448 EXPECT_CALL( 419 EXPECT_CALL(
449 mock_media_route_provider_, 420 mock_media_route_provider_,
450 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 421 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
451 kInvalidTabId, 422 kInvalidTabId,
452 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _)) 423 base::TimeDelta::FromMilliseconds(kTimeoutMillis), _, _))
453 .WillOnce(Invoke( 424 .WillOnce(Invoke(
454 [](const std::string& source, const std::string& presentation_id, 425 [](const std::string& source, const std::string& presentation_id,
455 const url::Origin& origin, int tab_id, base::TimeDelta timeout, 426 const url::Origin& origin, int tab_id, base::TimeDelta timeout,
456 bool incognito, 427 bool incognito,
457 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { 428 const mojom::MediaRouteProvider::JoinRouteCallback& cb) {
458 cb.Run(mojom::MediaRoutePtr(), std::string(kError), 429 cb.Run(base::nullopt, std::string(kError),
459 mojom::RouteRequestResultCode::TIMED_OUT); 430 RouteRequestResult::TIMED_OUT);
460 })); 431 }));
461 432
462 RouteResponseCallbackHandler handler; 433 RouteResponseCallbackHandler handler;
463 base::RunLoop run_loop; 434 base::RunLoop run_loop;
464 EXPECT_CALL(handler, 435 EXPECT_CALL(handler,
465 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) 436 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT))
466 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 437 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
467 std::vector<MediaRouteResponseCallback> route_response_callbacks; 438 std::vector<MediaRouteResponseCallback> route_response_callbacks;
468 route_response_callbacks.push_back(base::Bind( 439 route_response_callbacks.push_back(base::Bind(
469 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 440 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
470 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 441 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
471 nullptr, route_response_callbacks, 442 nullptr, route_response_callbacks,
472 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); 443 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false);
473 run_loop.Run(); 444 run_loop.Run();
474 ExpectResultBucketCount("JoinRoute", 445 ExpectResultBucketCount("JoinRoute", RouteRequestResult::TIMED_OUT, 1);
475 RouteRequestResult::ResultCode::TIMED_OUT, 1);
476 } 446 }
477 447
478 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) { 448 TEST_F(MediaRouterMojoImplTest, JoinRouteIncognitoMismatchFails) {
479 mojom::MediaRoutePtr route = CreateMojoRoute(); 449 MediaRoute route = CreateMediaRoute();
480 450
481 // Make sure the MR has received an update with the route, so it knows there 451 // Make sure the MR has received an update with the route, so it knows there
482 // is a route to join. 452 // is a route to join.
483 std::vector<mojom::MediaRoutePtr> mojo_routes(1); 453 std::vector<MediaRoute> routes;
484 mojo_routes[0] = route->Clone(); 454 routes.push_back(route);
485 router()->OnRoutesUpdated(std::move(mojo_routes), std::string(), 455 router()->OnRoutesUpdated(routes, std::string(), std::vector<std::string>());
486 std::vector<std::string>());
487 EXPECT_TRUE(router()->HasJoinableRoute()); 456 EXPECT_TRUE(router()->HasJoinableRoute());
488 457
489 // Use a lambda function as an invocation target here to work around 458 // Use a lambda function as an invocation target here to work around
490 // a limitation with GMock::Invoke that prevents it from using move-only types 459 // a limitation with GMock::Invoke that prevents it from using move-only types
491 // in runnable parameter lists. 460 // in runnable parameter lists.
492 EXPECT_CALL( 461 EXPECT_CALL(
493 mock_media_route_provider_, 462 mock_media_route_provider_,
494 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 463 JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
495 kInvalidTabId, 464 kInvalidTabId,
496 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) 465 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _))
497 .WillOnce(Invoke([&route]( 466 .WillOnce(Invoke([&route](
498 const std::string& source, const std::string& presentation_id, 467 const std::string& source, const std::string& presentation_id,
499 const url::Origin& origin, int tab_id, base::TimeDelta timeout, 468 const url::Origin& origin, int tab_id, base::TimeDelta timeout,
500 bool incognito, 469 bool incognito,
501 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { 470 const mojom::MediaRouteProvider::JoinRouteCallback& cb) {
502 cb.Run(std::move(route), std::string(), 471 cb.Run(route, std::string(), RouteRequestResult::OK);
503 mojom::RouteRequestResultCode::OK);
504 })); 472 }));
505 473
506 RouteResponseCallbackHandler handler; 474 RouteResponseCallbackHandler handler;
507 base::RunLoop run_loop; 475 base::RunLoop run_loop;
508 std::string error("Mismatch in incognito status: request = 1, response = 0"); 476 std::string error("Mismatch in incognito status: request = 1, response = 0");
509 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, 477 EXPECT_CALL(handler, DoInvoke(nullptr, "", error,
510 RouteRequestResult::INCOGNITO_MISMATCH)) 478 RouteRequestResult::INCOGNITO_MISMATCH))
511 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 479 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
512 std::vector<MediaRouteResponseCallback> route_response_callbacks; 480 std::vector<MediaRouteResponseCallback> route_response_callbacks;
513 route_response_callbacks.push_back(base::Bind( 481 route_response_callbacks.push_back(base::Bind(
514 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 482 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
515 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)), 483 router()->JoinRoute(kSource, kPresentationId, url::Origin(GURL(kOrigin)),
516 nullptr, route_response_callbacks, 484 nullptr, route_response_callbacks,
517 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); 485 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true);
518 run_loop.Run(); 486 run_loop.Run();
519 ExpectResultBucketCount( 487 ExpectResultBucketCount("JoinRoute", RouteRequestResult::INCOGNITO_MISMATCH,
520 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); 488 1);
521 } 489 }
522 490
523 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) { 491 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteId) {
524 MediaSource media_source(kSource); 492 MediaSource media_source(kSource);
525 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", 493 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "",
526 false); 494 false);
527 expected_route.set_incognito(false); 495 expected_route.set_incognito(false);
528 mojom::MediaRoutePtr route = CreateMojoRoute(); 496 MediaRoute route = CreateMediaRoute();
529 497
530 // Use a lambda function as an invocation target here to work around 498 // Use a lambda function as an invocation target here to work around
531 // a limitation with GMock::Invoke that prevents it from using move-only types 499 // a limitation with GMock::Invoke that prevents it from using move-only types
532 // in runnable parameter lists. 500 // in runnable parameter lists.
533 EXPECT_CALL( 501 EXPECT_CALL(
534 mock_media_route_provider_, 502 mock_media_route_provider_,
535 ConnectRouteByRouteId( 503 ConnectRouteByRouteId(
536 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId, 504 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId,
537 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false, _)) 505 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false, _))
538 .WillOnce(Invoke([&route]( 506 .WillOnce(Invoke([&route](
539 const std::string& source, const std::string& route_id, 507 const std::string& source, const std::string& route_id,
540 const std::string& presentation_id, const url::Origin& origin, 508 const std::string& presentation_id, const url::Origin& origin,
541 int tab_id, base::TimeDelta timeout, bool incognito, 509 int tab_id, base::TimeDelta timeout, bool incognito,
542 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { 510 const mojom::MediaRouteProvider::JoinRouteCallback& cb) {
543 cb.Run(std::move(route), std::string(), 511 cb.Run(route, std::string(), RouteRequestResult::OK);
544 mojom::RouteRequestResultCode::OK);
545 })); 512 }));
546 513
547 RouteResponseCallbackHandler handler; 514 RouteResponseCallbackHandler handler;
548 base::RunLoop run_loop; 515 base::RunLoop run_loop;
549 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "", 516 EXPECT_CALL(handler, DoInvoke(Pointee(Equals(expected_route)), Not(""), "",
550 RouteRequestResult::OK)) 517 RouteRequestResult::OK))
551 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 518 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
552 std::vector<MediaRouteResponseCallback> route_response_callbacks; 519 std::vector<MediaRouteResponseCallback> route_response_callbacks;
553 route_response_callbacks.push_back(base::Bind( 520 route_response_callbacks.push_back(base::Bind(
554 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 521 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
555 router()->ConnectRouteByRouteId( 522 router()->ConnectRouteByRouteId(
556 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr, 523 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr,
557 route_response_callbacks, 524 route_response_callbacks,
558 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false); 525 base::TimeDelta::FromMilliseconds(kTimeoutMillis), false);
559 run_loop.Run(); 526 run_loop.Run();
560 ExpectResultBucketCount("JoinRoute", RouteRequestResult::ResultCode::OK, 1); 527 ExpectResultBucketCount("JoinRoute", RouteRequestResult::OK, 1);
561 } 528 }
562 529
563 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) { 530 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) {
564 EXPECT_CALL( 531 EXPECT_CALL(
565 mock_media_route_provider_, 532 mock_media_route_provider_,
566 ConnectRouteByRouteId( 533 ConnectRouteByRouteId(
567 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId, 534 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId,
568 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) 535 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _))
569 .WillOnce(Invoke( 536 .WillOnce(Invoke(
570 [](const std::string& source, const std::string& route_id, 537 [](const std::string& source, const std::string& route_id,
571 const std::string& presentation_id, const url::Origin& origin, 538 const std::string& presentation_id, const url::Origin& origin,
572 int tab_id, base::TimeDelta timeout, bool incognito, 539 int tab_id, base::TimeDelta timeout, bool incognito,
573 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { 540 const mojom::MediaRouteProvider::JoinRouteCallback& cb) {
574 cb.Run(mojom::MediaRoutePtr(), std::string(kError), 541 cb.Run(base::nullopt, std::string(kError),
575 mojom::RouteRequestResultCode::TIMED_OUT); 542 RouteRequestResult::TIMED_OUT);
576 })); 543 }));
577 544
578 RouteResponseCallbackHandler handler; 545 RouteResponseCallbackHandler handler;
579 base::RunLoop run_loop; 546 base::RunLoop run_loop;
580 EXPECT_CALL(handler, 547 EXPECT_CALL(handler,
581 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT)) 548 DoInvoke(nullptr, "", kError, RouteRequestResult::TIMED_OUT))
582 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 549 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
583 std::vector<MediaRouteResponseCallback> route_response_callbacks; 550 std::vector<MediaRouteResponseCallback> route_response_callbacks;
584 route_response_callbacks.push_back(base::Bind( 551 route_response_callbacks.push_back(base::Bind(
585 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 552 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
586 router()->ConnectRouteByRouteId( 553 router()->ConnectRouteByRouteId(
587 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr, 554 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr,
588 route_response_callbacks, 555 route_response_callbacks,
589 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); 556 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true);
590 run_loop.Run(); 557 run_loop.Run();
591 ExpectResultBucketCount("JoinRoute", 558 ExpectResultBucketCount("JoinRoute", RouteRequestResult::TIMED_OUT, 1);
592 RouteRequestResult::ResultCode::TIMED_OUT, 1);
593 } 559 }
594 560
595 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) { 561 TEST_F(MediaRouterMojoImplTest, ConnectRouteByIdIncognitoMismatchFails) {
596 mojom::MediaRoutePtr route = CreateMojoRoute(); 562 MediaRoute route = CreateMediaRoute();
597 563
598 // Use a lambda function as an invocation target here to work around 564 // Use a lambda function as an invocation target here to work around
599 // a limitation with GMock::Invoke that prevents it from using move-only types 565 // a limitation with GMock::Invoke that prevents it from using move-only types
600 // in runnable parameter lists. 566 // in runnable parameter lists.
601 EXPECT_CALL( 567 EXPECT_CALL(
602 mock_media_route_provider_, 568 mock_media_route_provider_,
603 ConnectRouteByRouteId( 569 ConnectRouteByRouteId(
604 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId, 570 kSource, kRouteId, _, url::Origin(GURL(kOrigin)), kInvalidTabId,
605 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _)) 571 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true, _))
606 .WillOnce(Invoke([&route]( 572 .WillOnce(Invoke([&route](
607 const std::string& source, const std::string& route_id, 573 const std::string& source, const std::string& route_id,
608 const std::string& presentation_id, const url::Origin& origin, 574 const std::string& presentation_id, const url::Origin& origin,
609 int tab_id, base::TimeDelta timeout, bool incognito, 575 int tab_id, base::TimeDelta timeout, bool incognito,
610 const mojom::MediaRouteProvider::JoinRouteCallback& cb) { 576 const mojom::MediaRouteProvider::JoinRouteCallback& cb) {
611 cb.Run(std::move(route), std::string(), 577 cb.Run(route, std::string(), RouteRequestResult::OK);
612 mojom::RouteRequestResultCode::OK);
613 })); 578 }));
614 579
615 RouteResponseCallbackHandler handler; 580 RouteResponseCallbackHandler handler;
616 base::RunLoop run_loop; 581 base::RunLoop run_loop;
617 std::string error("Mismatch in incognito status: request = 1, response = 0"); 582 std::string error("Mismatch in incognito status: request = 1, response = 0");
618 EXPECT_CALL(handler, DoInvoke(nullptr, "", error, 583 EXPECT_CALL(handler, DoInvoke(nullptr, "", error,
619 RouteRequestResult::INCOGNITO_MISMATCH)) 584 RouteRequestResult::INCOGNITO_MISMATCH))
620 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 585 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
621 std::vector<MediaRouteResponseCallback> route_response_callbacks; 586 std::vector<MediaRouteResponseCallback> route_response_callbacks;
622 route_response_callbacks.push_back(base::Bind( 587 route_response_callbacks.push_back(base::Bind(
623 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); 588 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler)));
624 router()->ConnectRouteByRouteId( 589 router()->ConnectRouteByRouteId(
625 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr, 590 kSource, kRouteId, url::Origin(GURL(kOrigin)), nullptr,
626 route_response_callbacks, 591 route_response_callbacks,
627 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true); 592 base::TimeDelta::FromMilliseconds(kTimeoutMillis), true);
628 run_loop.Run(); 593 run_loop.Run();
629 ExpectResultBucketCount( 594 ExpectResultBucketCount("JoinRoute", RouteRequestResult::INCOGNITO_MISMATCH,
630 "JoinRoute", RouteRequestResult::ResultCode::INCOGNITO_MISMATCH, 1); 595 1);
631 } 596 }
632 597
633 TEST_F(MediaRouterMojoImplTest, DetachRoute) { 598 TEST_F(MediaRouterMojoImplTest, DetachRoute) {
634 base::RunLoop run_loop; 599 base::RunLoop run_loop;
635 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) 600 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId))
636 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 601 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
637 router()->DetachRoute(kRouteId); 602 router()->DetachRoute(kRouteId);
638 run_loop.Run(); 603 run_loop.Run();
639 } 604 }
640 605
641 TEST_F(MediaRouterMojoImplTest, TerminateRoute) { 606 TEST_F(MediaRouterMojoImplTest, TerminateRoute) {
642 base::RunLoop run_loop; 607 base::RunLoop run_loop;
643 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) 608 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _))
644 .WillOnce(Invoke([]( 609 .WillOnce(Invoke(
645 const std::string& route_id, 610 [](const std::string& route_id,
646 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { 611 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) {
647 cb.Run(base::nullopt, mojom::RouteRequestResultCode::OK); 612 cb.Run(base::nullopt, RouteRequestResult::OK);
648 })); 613 }));
649 router()->TerminateRoute(kRouteId); 614 router()->TerminateRoute(kRouteId);
650 run_loop.RunUntilIdle(); 615 run_loop.RunUntilIdle();
651 ExpectResultBucketCount("TerminateRoute", 616 ExpectResultBucketCount("TerminateRoute", RouteRequestResult::OK, 1);
652 RouteRequestResult::ResultCode::OK,
653 1);
654 } 617 }
655 618
656 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) { 619 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) {
657 base::RunLoop run_loop; 620 base::RunLoop run_loop;
658 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _)) 621 EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _))
659 .WillOnce(Invoke([]( 622 .WillOnce(Invoke(
660 const std::string& route_id, 623 [](const std::string& route_id,
661 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) { 624 const mojom::MediaRouteProvider::TerminateRouteCallback& cb) {
662 cb.Run(std::string("timed out"), 625 cb.Run(std::string("timed out"), RouteRequestResult::TIMED_OUT);
663 mojom::RouteRequestResultCode::TIMED_OUT); 626 }));
664 }));
665 router()->TerminateRoute(kRouteId); 627 router()->TerminateRoute(kRouteId);
666 run_loop.RunUntilIdle(); 628 run_loop.RunUntilIdle();
667 ExpectResultBucketCount("TerminateRoute", 629 ExpectResultBucketCount("TerminateRoute", RouteRequestResult::OK, 0);
668 RouteRequestResult::ResultCode::OK, 630 ExpectResultBucketCount("TerminateRoute", RouteRequestResult::TIMED_OUT, 1);
669 0);
670 ExpectResultBucketCount("TerminateRoute",
671 RouteRequestResult::ResultCode::TIMED_OUT,
672 1);
673 } 631 }
674 632
675 TEST_F(MediaRouterMojoImplTest, HandleIssue) { 633 TEST_F(MediaRouterMojoImplTest, HandleIssue) {
676 MockIssuesObserver issue_observer1(router()); 634 MockIssuesObserver issue_observer1(router());
677 MockIssuesObserver issue_observer2(router()); 635 MockIssuesObserver issue_observer2(router());
678 issue_observer1.Init(); 636 issue_observer1.Init();
679 issue_observer2.Init(); 637 issue_observer2.Init();
680 638
681 IssueInfo issue_info = CreateIssueInfo("title 1"); 639 IssueInfo issue_info = CreateIssueInfo("title 1");
682 640
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 url::Origin(GURL(kOrigin)))); 688 url::Origin(GURL(kOrigin))));
731 EXPECT_TRUE(unrelated_sinks_observer->Init()); 689 EXPECT_TRUE(unrelated_sinks_observer->Init());
732 ProcessEventLoop(); 690 ProcessEventLoop();
733 691
734 std::vector<MediaSink> expected_sinks; 692 std::vector<MediaSink> expected_sinks;
735 expected_sinks.push_back( 693 expected_sinks.push_back(
736 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); 694 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST));
737 expected_sinks.push_back( 695 expected_sinks.push_back(
738 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); 696 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST));
739 697
740 std::vector<mojom::MediaSinkPtr> mojo_sinks(2);
741 mojo_sinks[0] = mojom::MediaSink::New();
742 mojo_sinks[0]->sink_id = kSinkId;
743 mojo_sinks[0]->name = kSinkName;
744 mojo_sinks[0]->icon_type =
745 media_router::mojom::MediaSink::IconType::CAST;
746 mojo_sinks[1] = mojom::MediaSink::New();
747 mojo_sinks[1]->sink_id = kSinkId2;
748 mojo_sinks[1]->name = kSinkName;
749 mojo_sinks[1]->icon_type =
750 media_router::mojom::MediaSink::IconType::CAST;
751
752 base::RunLoop run_loop; 698 base::RunLoop run_loop;
753 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); 699 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks)));
754 EXPECT_CALL(*extra_sinks_observer, 700 EXPECT_CALL(*extra_sinks_observer,
755 OnSinksReceived(SequenceEquals(expected_sinks))) 701 OnSinksReceived(SequenceEquals(expected_sinks)))
756 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 702 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
757 media_router_proxy_->OnSinksReceived( 703 media_router_proxy_->OnSinksReceived(
758 media_source.id(), std::move(mojo_sinks), 704 media_source.id(), expected_sinks,
759 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin)))); 705 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin))));
760 run_loop.Run(); 706 run_loop.Run();
761 707
762 // Since the MediaRouterMojoImpl has already received results for 708 // Since the MediaRouterMojoImpl has already received results for
763 // |media_source|, return cached results to observers that are subsequently 709 // |media_source|, return cached results to observers that are subsequently
764 // registered. 710 // registered.
765 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( 711 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer(
766 new MockMediaSinksObserver(router(), media_source, 712 new MockMediaSinksObserver(router(), media_source,
767 url::Origin(GURL(kOrigin)))); 713 url::Origin(GURL(kOrigin))));
768 EXPECT_CALL(*cached_sinks_observer, 714 EXPECT_CALL(*cached_sinks_observer,
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 expected_routes.push_back(MediaRoute(kRouteId, media_source, kSinkId, 831 expected_routes.push_back(MediaRoute(kRouteId, media_source, kSinkId,
886 kDescription, false, "", false)); 832 kDescription, false, "", false));
887 MediaRoute incognito_expected_route(kRouteId2, media_source, kSinkId, 833 MediaRoute incognito_expected_route(kRouteId2, media_source, kSinkId,
888 kDescription, false, "", false); 834 kDescription, false, "", false);
889 incognito_expected_route.set_incognito(true); 835 incognito_expected_route.set_incognito(true);
890 expected_routes.push_back(incognito_expected_route); 836 expected_routes.push_back(incognito_expected_route);
891 std::vector<MediaRoute::Id> expected_joinable_route_ids; 837 std::vector<MediaRoute::Id> expected_joinable_route_ids;
892 expected_joinable_route_ids.push_back(kJoinableRouteId); 838 expected_joinable_route_ids.push_back(kJoinableRouteId);
893 expected_joinable_route_ids.push_back(kJoinableRouteId2); 839 expected_joinable_route_ids.push_back(kJoinableRouteId2);
894 840
895 std::vector<std::string> mojo_joinable_routes(2);
896 mojo_joinable_routes[0] = kJoinableRouteId;
897 mojo_joinable_routes[1] = kJoinableRouteId2;
898
899 std::vector<mojom::MediaRoutePtr> mojo_routes(2);
900 mojo_routes[0] = CreateMojoRoute();
901 mojo_routes[1] = CreateMojoRoute();
902 mojo_routes[1]->media_route_id = kRouteId2;
903 mojo_routes[1]->is_incognito = true;
904
905 EXPECT_CALL(routes_observer, OnRoutesUpdated(SequenceEquals(expected_routes), 841 EXPECT_CALL(routes_observer, OnRoutesUpdated(SequenceEquals(expected_routes),
906 expected_joinable_route_ids)); 842 expected_joinable_route_ids));
907 EXPECT_CALL(extra_routes_observer, 843 EXPECT_CALL(extra_routes_observer,
908 OnRoutesUpdated(SequenceEquals(expected_routes), 844 OnRoutesUpdated(SequenceEquals(expected_routes),
909 expected_joinable_route_ids)); 845 expected_joinable_route_ids));
910 EXPECT_CALL(different_routes_observer, 846 EXPECT_CALL(different_routes_observer,
911 OnRoutesUpdated(SequenceEquals(expected_routes), 847 OnRoutesUpdated(SequenceEquals(expected_routes),
912 expected_joinable_route_ids)) 848 expected_joinable_route_ids))
913 .Times(0); 849 .Times(0);
914 media_router_proxy_->OnRoutesUpdated(std::move(mojo_routes), 850 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(),
915 media_source.id(), 851 expected_joinable_route_ids);
916 std::move(mojo_joinable_routes));
917 ProcessEventLoop(); 852 ProcessEventLoop();
918 853
919 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer)); 854 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer));
920 EXPECT_CALL(mock_router, 855 EXPECT_CALL(mock_router,
921 UnregisterMediaRoutesObserver(&extra_routes_observer)); 856 UnregisterMediaRoutesObserver(&extra_routes_observer));
922 EXPECT_CALL(mock_router, 857 EXPECT_CALL(mock_router,
923 UnregisterMediaRoutesObserver(&different_routes_observer)); 858 UnregisterMediaRoutesObserver(&different_routes_observer));
924 router()->UnregisterMediaRoutesObserver(&routes_observer); 859 router()->UnregisterMediaRoutesObserver(&routes_observer);
925 router()->UnregisterMediaRoutesObserver(&extra_routes_observer); 860 router()->UnregisterMediaRoutesObserver(&extra_routes_observer);
926 router()->UnregisterMediaRoutesObserver(&different_routes_observer); 861 router()->UnregisterMediaRoutesObserver(&different_routes_observer);
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 base::RunLoop run_loop; 1046 base::RunLoop run_loop;
1112 content::PresentationConnectionStateChangeInfo closed_info( 1047 content::PresentationConnectionStateChangeInfo closed_info(
1113 content::PRESENTATION_CONNECTION_STATE_CLOSED); 1048 content::PRESENTATION_CONNECTION_STATE_CLOSED);
1114 closed_info.close_reason = 1049 closed_info.close_reason =
1115 content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY; 1050 content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY;
1116 closed_info.message = "Foo"; 1051 closed_info.message = "Foo";
1117 1052
1118 EXPECT_CALL(callback, Run(StateChangeInfoEquals(closed_info))) 1053 EXPECT_CALL(callback, Run(StateChangeInfoEquals(closed_info)))
1119 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 1054 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
1120 media_router_proxy_->OnPresentationConnectionClosed( 1055 media_router_proxy_->OnPresentationConnectionClosed(
1121 route_id, PresentationConnectionCloseReason::WENT_AWAY, "Foo"); 1056 route_id, content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY,
1057 "Foo");
1122 run_loop.Run(); 1058 run_loop.Run();
1123 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); 1059 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback));
1124 } 1060 }
1125 1061
1126 content::PresentationConnectionStateChangeInfo terminated_info( 1062 content::PresentationConnectionStateChangeInfo terminated_info(
1127 content::PRESENTATION_CONNECTION_STATE_TERMINATED); 1063 content::PRESENTATION_CONNECTION_STATE_TERMINATED);
1128 { 1064 {
1129 base::RunLoop run_loop; 1065 base::RunLoop run_loop;
1130 EXPECT_CALL(callback, Run(StateChangeInfoEquals(terminated_info))) 1066 EXPECT_CALL(callback, Run(StateChangeInfoEquals(terminated_info)))
1131 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 1067 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
1132 media_router_proxy_->OnPresentationConnectionStateChanged( 1068 media_router_proxy_->OnPresentationConnectionStateChanged(
1133 route_id, PresentationConnectionState::TERMINATED); 1069 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED);
1134 run_loop.Run(); 1070 run_loop.Run();
1135 1071
1136 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback)); 1072 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&callback));
1137 } 1073 }
1138 } 1074 }
1139 1075
1140 TEST_F(MediaRouterMojoImplTest, 1076 TEST_F(MediaRouterMojoImplTest,
1141 PresentationConnectionStateChangedCallbackRemoved) { 1077 PresentationConnectionStateChangedCallbackRemoved) {
1142 MediaRoute::Id route_id("route-id"); 1078 MediaRoute::Id route_id("route-id");
1143 MockPresentationConnectionStateChangedCallback callback; 1079 MockPresentationConnectionStateChangedCallback callback;
1144 std::unique_ptr<PresentationConnectionStateSubscription> subscription = 1080 std::unique_ptr<PresentationConnectionStateSubscription> subscription =
1145 router()->AddPresentationConnectionStateChangedCallback( 1081 router()->AddPresentationConnectionStateChangedCallback(
1146 route_id, 1082 route_id,
1147 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, 1083 base::Bind(&MockPresentationConnectionStateChangedCallback::Run,
1148 base::Unretained(&callback))); 1084 base::Unretained(&callback)));
1149 1085
1150 // Callback has been removed, so we don't expect it to be called anymore. 1086 // Callback has been removed, so we don't expect it to be called anymore.
1151 subscription.reset(); 1087 subscription.reset();
1152 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); 1088 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty());
1153 1089
1154 EXPECT_CALL(callback, Run(_)).Times(0); 1090 EXPECT_CALL(callback, Run(_)).Times(0);
1155 media_router_proxy_->OnPresentationConnectionStateChanged( 1091 media_router_proxy_->OnPresentationConnectionStateChanged(
1156 route_id, PresentationConnectionState::TERMINATED); 1092 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED);
1157 ProcessEventLoop(); 1093 ProcessEventLoop();
1158 } 1094 }
1159 1095
1160 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { 1096 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) {
1161 base::RunLoop run_loop; 1097 base::RunLoop run_loop;
1162 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) 1098 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id()))
1163 .Times(2) 1099 .Times(2)
1164 .WillRepeatedly(Return(true)); 1100 .WillRepeatedly(Return(true));
1165 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) 1101 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _))
1166 .Times(2) 1102 .Times(2)
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
1579 EXPECT_CALL(mock_media_route_provider_, 1515 EXPECT_CALL(mock_media_route_provider_,
1580 UpdateMediaSinks(MediaSourceForDesktop().id())) 1516 UpdateMediaSinks(MediaSourceForDesktop().id()))
1581 .WillOnce(InvokeWithoutArgs([&run_loop2]() { 1517 .WillOnce(InvokeWithoutArgs([&run_loop2]() {
1582 run_loop2.Quit(); 1518 run_loop2.Quit();
1583 })); 1519 }));
1584 1520
1585 run_loop2.Run(); 1521 run_loop2.Run();
1586 } 1522 }
1587 1523
1588 } // namespace media_router 1524 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698