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

Side by Side Diff: chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc

Issue 2040873002: [Media Router] Assign each route a current cast mode if possible (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 "chrome/browser/ui/webui/media_router/media_router_ui.h" 5 #include "chrome/browser/ui/webui/media_router/media_router_ui.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/media/router/media_route.h" 10 #include "chrome/browser/media/router/media_route.h"
(...skipping 10 matching lines...) Expand all
21 #include "extensions/common/extension.h" 21 #include "extensions/common/extension.h"
22 #include "extensions/common/extension_builder.h" 22 #include "extensions/common/extension_builder.h"
23 #include "extensions/common/test_util.h" 23 #include "extensions/common/test_util.h"
24 #include "extensions/common/value_builder.h" 24 #include "extensions/common/value_builder.h"
25 #include "testing/gmock/include/gmock/gmock.h" 25 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
27 #include "ui/base/l10n/l10n_util.h" 27 #include "ui/base/l10n/l10n_util.h"
28 28
29 using testing::_; 29 using testing::_;
30 using testing::AnyNumber; 30 using testing::AnyNumber;
31 using testing::DoAll;
31 using testing::SaveArg; 32 using testing::SaveArg;
32 using testing::Return; 33 using testing::Return;
33 34
34 namespace media_router { 35 namespace media_router {
35 36
36 class MockRoutesUpdatedCallback { 37 class MockRoutesUpdatedCallback {
37 public: 38 public:
38 MOCK_METHOD2(OnRoutesUpdated, 39 MOCK_METHOD0(GetAvailableSourceMap,
40 std::unordered_map<MediaSource::Id, MediaCastMode>());
41 MOCK_METHOD3(OnRoutesUpdated,
39 void(const std::vector<MediaRoute>& routes, 42 void(const std::vector<MediaRoute>& routes,
40 const std::vector<MediaRoute::Id>& joinable_route_ids)); 43 const std::vector<MediaRoute::Id>& joinable_route_ids,
44 const std::unordered_map<MediaRoute::Id, MediaCastMode>&
45 current_cast_mode));
41 }; 46 };
42 47
43 class MediaRouterUITest : public ::testing::Test { 48 class MediaRouterUITest : public ::testing::Test {
44 public: 49 public:
45 ~MediaRouterUITest() override { 50 ~MediaRouterUITest() override {
46 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)) 51 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_))
47 .Times(AnyNumber()); 52 .Times(AnyNumber());
48 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)) 53 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_))
49 .Times(AnyNumber()); 54 .Times(AnyNumber());
50 } 55 }
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 EXPECT_EQ(sink_id1, sorted_sinks[2].sink.id()); 200 EXPECT_EQ(sink_id1, sorted_sinks[2].sink.id());
196 } 201 }
197 202
198 TEST_F(MediaRouterUITest, UIMediaRoutesObserverFiltersNonDisplayRoutes) { 203 TEST_F(MediaRouterUITest, UIMediaRoutesObserverFiltersNonDisplayRoutes) {
199 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)).Times(1); 204 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)).Times(1);
200 MediaSource media_source("mediaSource"); 205 MediaSource media_source("mediaSource");
201 MockRoutesUpdatedCallback mock_callback; 206 MockRoutesUpdatedCallback mock_callback;
202 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer( 207 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer(
203 new MediaRouterUI::UIMediaRoutesObserver( 208 new MediaRouterUI::UIMediaRoutesObserver(
204 &mock_router_, media_source.id(), 209 &mock_router_, media_source.id(),
210 base::Bind(&MockRoutesUpdatedCallback::GetAvailableSourceMap,
211 base::Unretained(&mock_callback)),
205 base::Bind(&MockRoutesUpdatedCallback::OnRoutesUpdated, 212 base::Bind(&MockRoutesUpdatedCallback::OnRoutesUpdated,
206 base::Unretained(&mock_callback)))); 213 base::Unretained(&mock_callback))));
207 214
208 MediaRoute display_route_1("routeId1", media_source, "sinkId1", "desc 1", 215 MediaRoute display_route_1("routeId1", media_source, "sinkId1", "desc 1",
209 true, "", true); 216 true, "", true);
210 MediaRoute non_display_route_1("routeId2", media_source, "sinkId2", "desc 2", 217 MediaRoute non_display_route_1("routeId2", media_source, "sinkId2", "desc 2",
211 true, "", false); 218 true, "", false);
212 MediaRoute display_route_2("routeId3", media_source, "sinkId2", "desc 2", 219 MediaRoute display_route_2("routeId3", media_source, "sinkId2", "desc 2",
213 true, "", true); 220 true, "", true);
214 std::vector<MediaRoute> routes; 221 std::vector<MediaRoute> routes;
215 routes.push_back(display_route_1); 222 routes.push_back(display_route_1);
216 routes.push_back(non_display_route_1); 223 routes.push_back(non_display_route_1);
217 routes.push_back(display_route_2); 224 routes.push_back(display_route_2);
218 225
219 std::vector<MediaRoute> filtered_routes; 226 std::vector<MediaRoute> filtered_routes;
220 EXPECT_CALL(mock_callback, OnRoutesUpdated(_, _)).WillOnce( 227 std::unordered_map<MediaSource::Id, MediaCastMode> available_source_map;
221 SaveArg<0>(&filtered_routes)); 228 available_source_map.insert(
229 std::make_pair(media_source.id(), MediaCastMode::DEFAULT));
230 std::unordered_map<MediaRoute::Id, MediaCastMode> current_cast_modes;
231 ON_CALL(mock_callback, GetAvailableSourceMap())
232 .WillByDefault(Return(available_source_map));
233 EXPECT_CALL(mock_callback, OnRoutesUpdated(_, _, _)).WillOnce(
234 DoAll(SaveArg<0>(&filtered_routes), SaveArg<2>(&current_cast_modes)));
222 observer->OnRoutesUpdated(routes, 235 observer->OnRoutesUpdated(routes,
223 std::vector<MediaRoute::Id>()); 236 std::vector<MediaRoute::Id>());
224 237
225 ASSERT_EQ(2u, filtered_routes.size()); 238 ASSERT_EQ(2u, filtered_routes.size());
226 EXPECT_TRUE(display_route_1.Equals(filtered_routes[0])); 239 EXPECT_TRUE(display_route_1.Equals(filtered_routes[0]));
227 EXPECT_TRUE(filtered_routes[0].for_display()); 240 EXPECT_TRUE(filtered_routes[0].for_display());
228 EXPECT_TRUE(display_route_2.Equals(filtered_routes[1])); 241 EXPECT_TRUE(display_route_2.Equals(filtered_routes[1]));
229 EXPECT_TRUE(filtered_routes[1].for_display()); 242 EXPECT_TRUE(filtered_routes[1].for_display());
230 243
244 ASSERT_EQ(2u, current_cast_modes.size());
245 auto cast_mode_entry =
246 current_cast_modes.find(display_route_1.media_route_id());
247 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
248 EXPECT_EQ(MediaCastMode::DEFAULT, cast_mode_entry->second);
249 cast_mode_entry =
250 current_cast_modes.find(non_display_route_1.media_route_id());
251 EXPECT_EQ(end(current_cast_modes), cast_mode_entry);
252 cast_mode_entry = current_cast_modes.find(display_route_2.media_route_id());
253 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
254 EXPECT_EQ(MediaCastMode::DEFAULT, cast_mode_entry->second);
255
231 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1); 256 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1);
232 observer.reset(); 257 observer.reset();
233 } 258 }
234 259
235 TEST_F(MediaRouterUITest, 260 TEST_F(MediaRouterUITest,
236 UIMediaRoutesObserverFiltersNonDisplayJoinableRoutes) { 261 UIMediaRoutesObserverFiltersNonDisplayJoinableRoutes) {
237 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)).Times(1); 262 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)).Times(1);
238 MediaSource media_source("mediaSource"); 263 MediaSource media_source("mediaSource");
239 MockRoutesUpdatedCallback mock_callback; 264 MockRoutesUpdatedCallback mock_callback;
240 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer( 265 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer(
241 new MediaRouterUI::UIMediaRoutesObserver( 266 new MediaRouterUI::UIMediaRoutesObserver(
242 &mock_router_, media_source.id(), 267 &mock_router_, media_source.id(),
268 base::Bind(&MockRoutesUpdatedCallback::GetAvailableSourceMap,
269 base::Unretained(&mock_callback)),
243 base::Bind(&MockRoutesUpdatedCallback::OnRoutesUpdated, 270 base::Bind(&MockRoutesUpdatedCallback::OnRoutesUpdated,
244 base::Unretained(&mock_callback)))); 271 base::Unretained(&mock_callback))));
245 272
246 MediaRoute display_route_1("routeId1", media_source, "sinkId1", "desc 1", 273 MediaRoute display_route_1("routeId1", media_source, "sinkId1", "desc 1",
247 true, "", true); 274 true, "", true);
248 MediaRoute non_display_route_1("routeId2", media_source, "sinkId2", "desc 2", 275 MediaRoute non_display_route_1("routeId2", media_source, "sinkId2", "desc 2",
249 true, "", false); 276 true, "", false);
250 MediaRoute display_route_2("routeId3", media_source, "sinkId2", "desc 2", 277 MediaRoute display_route_2("routeId3", media_source, "sinkId2", "desc 2",
251 true, "", true); 278 true, "", true);
252 std::vector<MediaRoute> routes; 279 std::vector<MediaRoute> routes;
253 routes.push_back(display_route_1); 280 routes.push_back(display_route_1);
254 routes.push_back(non_display_route_1); 281 routes.push_back(non_display_route_1);
255 routes.push_back(display_route_2); 282 routes.push_back(display_route_2);
256 283
257 std::vector<MediaRoute::Id> joinable_route_ids; 284 std::vector<MediaRoute::Id> joinable_route_ids;
258 joinable_route_ids.push_back("routeId1"); 285 joinable_route_ids.push_back("routeId1");
259 joinable_route_ids.push_back("routeId2"); 286 joinable_route_ids.push_back("routeId2");
260 joinable_route_ids.push_back("routeId3"); 287 joinable_route_ids.push_back("routeId3");
261 288
262 std::vector<MediaRoute::Id> filtered_joinable_route_ids; 289 std::vector<MediaRoute::Id> filtered_joinable_route_ids;
290 std::unordered_map<MediaSource::Id, MediaCastMode> available_source_map;
291 available_source_map.insert(
292 std::make_pair(media_source.id(), MediaCastMode::DEFAULT));
293 std::unordered_map<MediaRoute::Id, MediaCastMode> current_cast_modes;
294 ON_CALL(mock_callback, GetAvailableSourceMap())
295 .WillByDefault(Return(available_source_map));
263 // Save the filtered joinable routes. 296 // Save the filtered joinable routes.
264 EXPECT_CALL(mock_callback, OnRoutesUpdated(_, _)).WillOnce( 297 EXPECT_CALL(mock_callback, OnRoutesUpdated(_, _, _)).WillOnce(
265 SaveArg<1>(&filtered_joinable_route_ids)); 298 DoAll(SaveArg<1>(&filtered_joinable_route_ids),
299 SaveArg<2>(&current_cast_modes)));
266 observer->OnRoutesUpdated(routes, 300 observer->OnRoutesUpdated(routes,
267 joinable_route_ids); 301 joinable_route_ids);
268 302
269 ASSERT_EQ(2u, filtered_joinable_route_ids.size()); 303 ASSERT_EQ(2u, filtered_joinable_route_ids.size());
270 EXPECT_EQ(display_route_1.media_route_id(), filtered_joinable_route_ids[0]); 304 EXPECT_EQ(display_route_1.media_route_id(), filtered_joinable_route_ids[0]);
271 EXPECT_EQ(display_route_2.media_route_id(), filtered_joinable_route_ids[1]); 305 EXPECT_EQ(display_route_2.media_route_id(), filtered_joinable_route_ids[1]);
272 306
307 ASSERT_EQ(2u, current_cast_modes.size());
308 auto cast_mode_entry =
309 current_cast_modes.find(display_route_1.media_route_id());
310 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
311 EXPECT_EQ(MediaCastMode::DEFAULT, cast_mode_entry->second);
312 cast_mode_entry =
313 current_cast_modes.find(non_display_route_1.media_route_id());
314 EXPECT_EQ(end(current_cast_modes), cast_mode_entry);
315 cast_mode_entry = current_cast_modes.find(display_route_2.media_route_id());
316 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
317 EXPECT_EQ(MediaCastMode::DEFAULT, cast_mode_entry->second);
318
273 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1); 319 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1);
274 observer.reset(); 320 observer.reset();
275 } 321 }
322
323 TEST_F(MediaRouterUITest, UIMediaRoutesObserverAssignsCurrentCastModes) {
324 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)).Times(1);
325 MediaSource media_source_1("mediaSource1");
326 MediaSource media_source_2("mediaSource2");
327 MediaSource media_source_3("mediaSource3");
328 MockRoutesUpdatedCallback mock_callback;
329 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer(
330 new MediaRouterUI::UIMediaRoutesObserver(
331 &mock_router_, MediaSource::Id(),
332 base::Bind(&MockRoutesUpdatedCallback::GetAvailableSourceMap,
333 base::Unretained(&mock_callback)),
334 base::Bind(&MockRoutesUpdatedCallback::OnRoutesUpdated,
335 base::Unretained(&mock_callback))));
336
337 MediaRoute display_route_1("routeId1", media_source_1, "sinkId1", "desc 1",
338 true, "", true);
339 MediaRoute non_display_route_1("routeId2", media_source_2, "sinkId2",
340 "desc 2", true, "", false);
341 MediaRoute display_route_2("routeId3", media_source_3, "sinkId2", "desc 2",
342 true, "", true);
343 std::vector<MediaRoute> routes;
344 routes.push_back(display_route_1);
345 routes.push_back(non_display_route_1);
346 routes.push_back(display_route_2);
347
348 std::vector<MediaRoute> filtered_routes;
349 std::unordered_map<MediaSource::Id, MediaCastMode> available_source_map;
350 available_source_map.insert(std::make_pair(
351 display_route_1.media_source().id(), MediaCastMode::DEFAULT));
352 available_source_map.insert(std::make_pair(
353 non_display_route_1.media_source().id(), MediaCastMode::TAB_MIRROR));
354 available_source_map.insert(std::make_pair(
355 display_route_2.media_source().id(), MediaCastMode::DESKTOP_MIRROR));
356 std::unordered_map<MediaRoute::Id, MediaCastMode> current_cast_modes;
357 ON_CALL(mock_callback, GetAvailableSourceMap())
358 .WillByDefault(Return(available_source_map));
359 EXPECT_CALL(mock_callback, OnRoutesUpdated(_, _, _)).WillOnce(
360 DoAll(SaveArg<0>(&filtered_routes), SaveArg<2>(&current_cast_modes)));
361 observer->OnRoutesUpdated(routes,
362 std::vector<MediaRoute::Id>());
363
364 ASSERT_EQ(2u, filtered_routes.size());
365 EXPECT_TRUE(display_route_1.Equals(filtered_routes[0]));
366 EXPECT_TRUE(filtered_routes[0].for_display());
367 EXPECT_TRUE(display_route_2.Equals(filtered_routes[1]));
368 EXPECT_TRUE(filtered_routes[1].for_display());
369
370 ASSERT_EQ(2u, current_cast_modes.size());
371 auto cast_mode_entry =
372 current_cast_modes.find(display_route_1.media_route_id());
373 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
374 EXPECT_EQ(MediaCastMode::DEFAULT, cast_mode_entry->second);
375 cast_mode_entry =
376 current_cast_modes.find(non_display_route_1.media_route_id());
377 EXPECT_EQ(end(current_cast_modes), cast_mode_entry);
378 cast_mode_entry = current_cast_modes.find(display_route_2.media_route_id());
379 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
380 EXPECT_EQ(MediaCastMode::DESKTOP_MIRROR, cast_mode_entry->second);
381
382 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1);
383 observer.reset();
384 }
385
386 TEST_F(MediaRouterUITest, UIMediaRoutesObserverSkipsUnavailableCastModes) {
387 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)).Times(1);
388 MediaSource media_source_1("mediaSource1");
389 MediaSource media_source_2("mediaSource2");
390 MediaSource media_source_3("mediaSource3");
391 MockRoutesUpdatedCallback mock_callback;
392 std::unique_ptr<MediaRouterUI::UIMediaRoutesObserver> observer(
393 new MediaRouterUI::UIMediaRoutesObserver(
394 &mock_router_, MediaSource::Id(),
395 base::Bind(&MockRoutesUpdatedCallback::GetAvailableSourceMap,
396 base::Unretained(&mock_callback)),
397 base::Bind(&MockRoutesUpdatedCallback::OnRoutesUpdated,
398 base::Unretained(&mock_callback))));
399
400 MediaRoute display_route_1("routeId1", media_source_1, "sinkId1", "desc 1",
401 true, "", true);
402 MediaRoute non_display_route_1("routeId2", media_source_2, "sinkId2",
403 "desc 2", true, "", false);
404 MediaRoute display_route_2("routeId3", media_source_3, "sinkId2", "desc 2",
405 true, "", true);
406 std::vector<MediaRoute> routes;
407 routes.push_back(display_route_1);
408 routes.push_back(non_display_route_1);
409 routes.push_back(display_route_2);
410
411 std::vector<MediaRoute> filtered_routes;
412 std::unordered_map<MediaSource::Id, MediaCastMode> available_source_map;
413 available_source_map.insert(std::make_pair(
414 non_display_route_1.media_source().id(), MediaCastMode::TAB_MIRROR));
415 available_source_map.insert(std::make_pair(
416 display_route_2.media_source().id(), MediaCastMode::DESKTOP_MIRROR));
417 std::unordered_map<MediaRoute::Id, MediaCastMode> current_cast_modes;
418 ON_CALL(mock_callback, GetAvailableSourceMap())
419 .WillByDefault(Return(available_source_map));
420 EXPECT_CALL(mock_callback, OnRoutesUpdated(_, _, _)).WillOnce(
421 DoAll(SaveArg<0>(&filtered_routes), SaveArg<2>(&current_cast_modes)));
422 observer->OnRoutesUpdated(routes,
423 std::vector<MediaRoute::Id>());
424
425 ASSERT_EQ(2u, filtered_routes.size());
426 EXPECT_TRUE(display_route_1.Equals(filtered_routes[0]));
427 EXPECT_TRUE(filtered_routes[0].for_display());
428 EXPECT_TRUE(display_route_2.Equals(filtered_routes[1]));
429 EXPECT_TRUE(filtered_routes[1].for_display());
430
431 ASSERT_EQ(1u, current_cast_modes.size());
432 auto cast_mode_entry =
433 current_cast_modes.find(display_route_1.media_route_id());
434 EXPECT_EQ(end(current_cast_modes), cast_mode_entry);
435 cast_mode_entry =
436 current_cast_modes.find(non_display_route_1.media_route_id());
437 EXPECT_EQ(end(current_cast_modes), cast_mode_entry);
438 cast_mode_entry = current_cast_modes.find(display_route_2.media_route_id());
439 EXPECT_NE(end(current_cast_modes), cast_mode_entry);
440 EXPECT_EQ(MediaCastMode::DESKTOP_MIRROR, cast_mode_entry->second);
441
442 EXPECT_CALL(mock_router_, UnregisterMediaRoutesObserver(_)).Times(1);
443 observer.reset();
444 }
276 445
277 TEST_F(MediaRouterUITest, GetExtensionNameExtensionPresent) { 446 TEST_F(MediaRouterUITest, GetExtensionNameExtensionPresent) {
278 std::string id = "extensionid"; 447 std::string id = "extensionid";
279 GURL url = GURL("chrome-extension://" + id); 448 GURL url = GURL("chrome-extension://" + id);
280 std::unique_ptr<extensions::ExtensionRegistry> registry = 449 std::unique_ptr<extensions::ExtensionRegistry> registry =
281 base::WrapUnique(new extensions::ExtensionRegistry(nullptr)); 450 base::WrapUnique(new extensions::ExtensionRegistry(nullptr));
282 scoped_refptr<extensions::Extension> app = 451 scoped_refptr<extensions::Extension> app =
283 extensions::test_util::BuildApp(extensions::ExtensionBuilder()) 452 extensions::test_util::BuildApp(extensions::ExtensionBuilder())
284 .MergeManifest(extensions::DictionaryBuilder() 453 .MergeManifest(extensions::DictionaryBuilder()
285 .Set("name", "test app name") 454 .Set("name", "test app name")
(...skipping 16 matching lines...) Expand all
302 } 471 }
303 472
304 TEST_F(MediaRouterUITest, GetExtensionNameEmptyWhenNotExtensionURL) { 473 TEST_F(MediaRouterUITest, GetExtensionNameEmptyWhenNotExtensionURL) {
305 GURL url = GURL("https://www.google.com"); 474 GURL url = GURL("https://www.google.com");
306 std::unique_ptr<extensions::ExtensionRegistry> registry = 475 std::unique_ptr<extensions::ExtensionRegistry> registry =
307 base::WrapUnique(new extensions::ExtensionRegistry(nullptr)); 476 base::WrapUnique(new extensions::ExtensionRegistry(nullptr));
308 477
309 EXPECT_EQ("", MediaRouterUI::GetExtensionName(url, registry.get())); 478 EXPECT_EQ("", MediaRouterUI::GetExtensionName(url, registry.get()));
310 } 479 }
311 } // namespace media_router 480 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698