| Index: chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc
|
| diff --git a/chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc b/chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc
|
| index c575d053b4b6ee9867ac763c59cc3e5f9b040aa9..94f158b8bb938d9b86493a4159c20b8146b23787 100644
|
| --- a/chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc
|
| +++ b/chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc
|
| @@ -46,7 +46,26 @@ class QueryResultManagerTest : public ::testing::Test {
|
| EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
|
| .WillOnce(Return(true));
|
| EXPECT_CALL(mock_observer_, OnResultsUpdated(_)).Times(1);
|
| - query_result_manager_.StartSinksQuery(cast_mode, source, GURL(kOrigin));
|
| + query_result_manager_.StartSinksQuery(
|
| + cast_mode, {source}, GURL(kOrigin));
|
| + }
|
| +
|
| + bool IsDefaultSourceForSink(
|
| + const MediaSource& source, const MediaSink& sink) {
|
| + return query_result_manager_.GetSourceForCastModeAndSink(
|
| + MediaCastMode::DEFAULT, sink.id()).Equals(source);
|
| + }
|
| +
|
| + bool SinkObserversMatchSources(
|
| + const std::vector<std::unique_ptr<MediaSinksObserver>>& observers,
|
| + const std::vector<MediaSource>& sources) const {
|
| + if (observers.size() != sources.size())
|
| + return false;
|
| + for (size_t i = 0; i < observers.size(); i++) {
|
| + if (!observers[i]->source().Equals(sources[i]))
|
| + return false;
|
| + }
|
| + return true;
|
| }
|
|
|
| content::TestBrowserThreadBundle thread_bundle_;
|
| @@ -92,45 +111,48 @@ TEST_F(QueryResultManagerTest, StartStopSinksQuery) {
|
| GURL origin(kOrigin);
|
| CastModeSet cast_modes = query_result_manager_.GetSupportedCastModes();
|
| EXPECT_TRUE(cast_modes.empty());
|
| - MediaSource actual_source =
|
| - query_result_manager_.GetSourceForCastMode(MediaCastMode::DEFAULT);
|
| - EXPECT_TRUE(actual_source.Empty());
|
| + std::vector<MediaSource> actual_sources =
|
| + query_result_manager_.GetSourcesForCastMode(MediaCastMode::DEFAULT);
|
| + EXPECT_EQ(0u, actual_sources.size());
|
|
|
| MediaSource source(MediaSourceForPresentationUrl("http://fooUrl"));
|
| EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
|
| .WillOnce(Return(true));
|
| - query_result_manager_.StartSinksQuery(MediaCastMode::DEFAULT, source, origin);
|
| + query_result_manager_.StartSinksQuery(
|
| + MediaCastMode::DEFAULT, {source}, origin);
|
|
|
| cast_modes = query_result_manager_.GetSupportedCastModes();
|
| EXPECT_EQ(1u, cast_modes.size());
|
| EXPECT_TRUE(base::ContainsKey(cast_modes, MediaCastMode::DEFAULT));
|
| - actual_source = query_result_manager_.GetSourceForCastMode(
|
| + actual_sources = query_result_manager_.GetSourcesForCastMode(
|
| MediaCastMode::DEFAULT);
|
| - EXPECT_TRUE(source.Equals(actual_source));
|
| + EXPECT_EQ(1u, actual_sources.size());
|
| + EXPECT_TRUE(source.Equals(actual_sources[0]));
|
|
|
| - // Register a different source for the same cast mode.
|
| + // Register a different set of sources for the same cast mode.
|
| MediaSource another_source(MediaSourceForPresentationUrl("http://barUrl"));
|
| EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
|
| EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
|
| .WillOnce(Return(true));
|
| - query_result_manager_.StartSinksQuery(MediaCastMode::DEFAULT, another_source,
|
| - origin);
|
| + query_result_manager_.StartSinksQuery(MediaCastMode::DEFAULT,
|
| + {another_source}, origin);
|
|
|
| cast_modes = query_result_manager_.GetSupportedCastModes();
|
| EXPECT_EQ(1u, cast_modes.size());
|
| EXPECT_TRUE(base::ContainsKey(cast_modes, MediaCastMode::DEFAULT));
|
| - actual_source = query_result_manager_.GetSourceForCastMode(
|
| + actual_sources = query_result_manager_.GetSourcesForCastMode(
|
| MediaCastMode::DEFAULT);
|
| - EXPECT_TRUE(another_source.Equals(actual_source));
|
| + EXPECT_EQ(1u, actual_sources.size());
|
| + EXPECT_TRUE(another_source.Equals(actual_sources[0]));
|
|
|
| EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
|
| query_result_manager_.StopSinksQuery(MediaCastMode::DEFAULT);
|
|
|
| cast_modes = query_result_manager_.GetSupportedCastModes();
|
| EXPECT_TRUE(cast_modes.empty());
|
| - actual_source = query_result_manager_.GetSourceForCastMode(
|
| + actual_sources = query_result_manager_.GetSourcesForCastMode(
|
| MediaCastMode::DEFAULT);
|
| - EXPECT_TRUE(actual_source.Empty());
|
| + EXPECT_EQ(0u, actual_sources.size());
|
| }
|
|
|
| TEST_F(QueryResultManagerTest, MultipleQueries) {
|
| @@ -139,12 +161,14 @@ TEST_F(QueryResultManagerTest, MultipleQueries) {
|
| MediaSink sink3("sinkId3", "Sink 3", MediaSink::IconType::CAST);
|
| MediaSink sink4("sinkId4", "Sink 4", MediaSink::IconType::CAST);
|
| MediaSink sink5("sinkId5", "Sink 5", MediaSink::IconType::CAST);
|
| + MediaSource defaultSource1 = MediaSourceForPresentationUrl("http://barUrl");
|
| + MediaSource defaultSource2 = MediaSourceForPresentationUrl("http://bazurl");
|
| + MediaSource tabSource = MediaSourceForTab(123);
|
| GURL origin(kOrigin);
|
|
|
| query_result_manager_.AddObserver(&mock_observer_);
|
| - DiscoverSinks(MediaCastMode::DEFAULT,
|
| - MediaSourceForPresentationUrl("http://barUrl"));
|
| - DiscoverSinks(MediaCastMode::TAB_MIRROR, MediaSourceForTab(123));
|
| + DiscoverSinks(MediaCastMode::DEFAULT, defaultSource1);
|
| + DiscoverSinks(MediaCastMode::TAB_MIRROR, tabSource);
|
|
|
| // Scenario (results in this order):
|
| // Action: DEFAULT -> [1, 2, 3]
|
| @@ -159,7 +183,7 @@ TEST_F(QueryResultManagerTest, MultipleQueries) {
|
| expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
|
|
|
| const auto& sinks_observers = query_result_manager_.sinks_observers_;
|
| - auto sinks_observer_it = sinks_observers.find(MediaCastMode::DEFAULT);
|
| + auto sinks_observer_it = sinks_observers.find(defaultSource1);
|
| ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
|
| ASSERT_TRUE(sinks_observer_it->second.get());
|
|
|
| @@ -193,13 +217,13 @@ TEST_F(QueryResultManagerTest, MultipleQueries) {
|
| sinks_query_result.push_back(sink3);
|
| sinks_query_result.push_back(sink4);
|
|
|
| - sinks_observer_it = sinks_observers.find(MediaCastMode::TAB_MIRROR);
|
| + sinks_observer_it = sinks_observers.find(tabSource);
|
| ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
|
| ASSERT_TRUE(sinks_observer_it->second.get());
|
| EXPECT_CALL(mock_observer_,
|
| OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
|
| sinks_observer_it->second->OnSinksUpdated(
|
| - sinks_query_result, std::vector<GURL>(1, GURL(kOrigin)));
|
| + sinks_query_result, {GURL(kOrigin)});
|
|
|
| // Action: Update default presentation URL
|
| // Expected result:
|
| @@ -212,28 +236,28 @@ TEST_F(QueryResultManagerTest, MultipleQueries) {
|
| expected_sinks.push_back(MediaSinkWithCastModes(sink4));
|
| expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
|
|
|
| + // The observer for the old source will be unregistered.
|
| EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
|
| + // The observer for the new source will be registered.
|
| EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
|
| .WillOnce(Return(true));
|
| EXPECT_CALL(mock_observer_,
|
| OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
|
| query_result_manager_.StartSinksQuery(
|
| - MediaCastMode::DEFAULT,
|
| - MediaSourceForPresentationUrl("http://bazurl.com"), origin);
|
| + MediaCastMode::DEFAULT, {defaultSource2}, origin);
|
|
|
| // Action: DEFAULT -> [1], origins don't match
|
| // Expected result: [2 -> {TAB_MIRROR}, 3 -> {TAB_MIRROR}, 4 -> {TAB_MIRROR}]
|
| // (No change)
|
| sinks_query_result.clear();
|
| sinks_query_result.push_back(sink1);
|
| - sinks_observer_it = sinks_observers.find(MediaCastMode::DEFAULT);
|
| + sinks_observer_it = sinks_observers.find(defaultSource2);
|
| ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
|
| ASSERT_TRUE(sinks_observer_it->second.get());
|
| EXPECT_CALL(mock_observer_, OnResultsUpdated(VectorEquals(expected_sinks)))
|
| .Times(1);
|
| sinks_observer_it->second->OnSinksUpdated(
|
| - sinks_query_result,
|
| - std::vector<GURL>(1, GURL("https://differentOrigin.com")));
|
| + sinks_query_result, {GURL("https://differentOrigin.com")});
|
|
|
| // Action: Remove TAB_MIRROR observer
|
| // Expected result:
|
| @@ -248,4 +272,80 @@ TEST_F(QueryResultManagerTest, MultipleQueries) {
|
| EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
|
| }
|
|
|
| +TEST_F(QueryResultManagerTest, MultipleUrls) {
|
| + const MediaSink sink1("sinkId1", "Sink 1", MediaSink::IconType::CAST);
|
| + const MediaSink sink2("sinkId2", "Sink 2", MediaSink::IconType::CAST);
|
| + const MediaSink sink3("sinkId3", "Sink 3", MediaSink::IconType::CAST);
|
| + const MediaSink sink4("sinkId4", "Sink 4", MediaSink::IconType::CAST);
|
| + const MediaSource sourceA(MediaSourceForPresentationUrl("http://urlA"));
|
| + const MediaSource sourceB(MediaSourceForPresentationUrl("http://urlB"));
|
| + const MediaSource sourceC(MediaSourceForPresentationUrl("http://urlC"));
|
| + // The sources are in decreasing order of priority.
|
| + const std::vector<MediaSource> sources = {sourceA, sourceB, sourceC};
|
| + const GURL origin(kOrigin);
|
| + const auto& sinks_observers = query_result_manager_.sinks_observers_;
|
| +
|
| + // There should be one MediaSinksObserver per source.
|
| + EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
|
| + .Times(3).WillRepeatedly(Return(true));
|
| + query_result_manager_.StartSinksQuery(
|
| + MediaCastMode::DEFAULT, sources, origin);
|
| +
|
| + // Scenario (results in this order):
|
| + // Action: URL_B -> [2, 4]
|
| + // Expected result:
|
| + // Sinks: [1 -> {},
|
| + // 2 -> {URL_B},
|
| + // 3 -> {},
|
| + // 4 -> {URL_B}]
|
| + auto sinks_observer_it = sinks_observers.find(sourceB);
|
| + ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
|
| + ASSERT_TRUE(sinks_observer_it->second.get());
|
| +
|
| + auto& source_b_observer = sinks_observer_it->second;
|
| + source_b_observer->OnSinksUpdated({sink2, sink4}, std::vector<GURL>());
|
| + EXPECT_TRUE(IsDefaultSourceForSink(MediaSource(), sink1));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceB, sink2));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(MediaSource(), sink3));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceB, sink4));
|
| +
|
| + // Action: URL_C -> [1, 2, 3]
|
| + // Expected result:
|
| + // Sinks: [1 -> {URL_C},
|
| + // 2 -> {URL_B, URL_C},
|
| + // 3 -> {URL_C},
|
| + // 4 -> {URL_B}]
|
| + sinks_observer_it = sinks_observers.find(sourceC);
|
| + ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
|
| + ASSERT_TRUE(sinks_observer_it->second.get());
|
| +
|
| + auto& source_c_observer = sinks_observer_it->second;
|
| + source_c_observer->OnSinksUpdated({sink1, sink2, sink3}, std::vector<GURL>());
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceC, sink1));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceB, sink2));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceC, sink3));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceB, sink4));
|
| +
|
| + // Action: URL_A -> [2, 3, 4]
|
| + // Expected result:
|
| + // Sinks: [1 -> {URL_C},
|
| + // 2 -> {URL_A, URL_B, URL_C},
|
| + // 3 -> {URL_A, URL_C},
|
| + // 4 -> {URL_A, URL_B}]
|
| + sinks_observer_it = sinks_observers.find(sourceA);
|
| + ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
|
| + ASSERT_TRUE(sinks_observer_it->second.get());
|
| +
|
| + auto& source_a_observer = sinks_observer_it->second;
|
| + source_a_observer->OnSinksUpdated({sink2, sink3, sink4}, std::vector<GURL>());
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceC, sink1));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceA, sink2));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceA, sink3));
|
| + EXPECT_TRUE(IsDefaultSourceForSink(sourceA, sink4));
|
| +
|
| + // The observers for the three sources should get unregistered.
|
| + EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(3);
|
| + query_result_manager_.StopSinksQuery(MediaCastMode::DEFAULT);
|
| +}
|
| +
|
| } // namespace media_router
|
|
|