Chromium Code Reviews| 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..775106eb01b68f506fab131b1db411f870fa1092 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,17 @@ 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) { |
| + std::unique_ptr<MediaSource> default_source = |
| + query_result_manager_.GetSourceForCastModeAndSink( |
| + MediaCastMode::DEFAULT, sink.id()); |
| + return (!(default_source || source)) || |
| + (default_source && source && *default_source.get() == *source); |
| } |
| content::TestBrowserThreadBundle thread_bundle_; |
| @@ -92,45 +102,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_EQ(source, 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_EQ(another_source, 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 +152,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"); |
|
mark a. foltz
2016/09/09 22:22:27
Nit: please use obviously valid URLs as test data,
takumif
2016/09/13 03:48:22
Done.
|
| + 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 +174,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 +208,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 +227,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 +263,80 @@ TEST_F(QueryResultManagerTest, MultipleQueries) { |
| EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1); |
| } |
| +TEST_F(QueryResultManagerTest, MultipleUrls) { |
|
mark a. foltz
2016/09/09 22:22:27
Can you update this test case to include at least
takumif
2016/09/13 03:48:22
Done.
|
| + 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(nullptr, sink1)); |
| + EXPECT_TRUE(IsDefaultSourceForSink(&sourceB, sink2)); |
| + EXPECT_TRUE(IsDefaultSourceForSink(nullptr, 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 |