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

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

Powered by Google App Engine
This is Rietveld 408576698