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

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

Issue 1131913003: Adds QueryResultManager support class for Media Router Dialog WebUI (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove unnecessary #include Created 5 years, 7 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "base/containers/hash_tables.h"
7 #include "base/json/json_writer.h"
8 #include "base/memory/scoped_vector.h"
9 #include "base/strings/stringprintf.h"
10 #include "chrome/browser/media/router/media_sinks_observer.h"
11 #include "chrome/browser/media/router/media_source_helper.h"
12 #include "chrome/browser/media/router/mock_media_router.h"
13 #include "chrome/browser/ui/webui/media_router/query_result_manager.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using testing::ContainerEq;
18 using testing::Eq;
19 using testing::IsEmpty;
20 using testing::Eq;
21 using testing::Mock;
22 using testing::Return;
23 using testing::_;
24
25 namespace media_router {
26
27 namespace {
28
29 class MockObserver : public QueryResultManager::Observer {
30 public:
31 MOCK_METHOD1(OnResultsUpdated, void(
32 const std::vector<MediaSinkWithCastModes>& sinks));
33 };
34
35 } // namespace
36
37 class QueryResultManagerTest : public ::testing::Test {
38 public:
39 QueryResultManagerTest()
40 : mock_router_(), query_result_manager_(&mock_router_) {
41 }
42
43 void DiscoverSinks(MediaCastMode cast_mode, const MediaSource& source) {
44 EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
45 .WillOnce(Return(true));
46 EXPECT_CALL(mock_observer_, OnResultsUpdated(_)).Times(1);
47 query_result_manager_.StartSinksQuery(cast_mode, source);
48 }
49
50 MockMediaRouter mock_router_;
51 QueryResultManager query_result_manager_;
52 MockObserver mock_observer_;
53
54 private:
55 DISALLOW_COPY_AND_ASSIGN(QueryResultManagerTest);
56 };
57
58 MATCHER_P(VectorEquals, expected, "") {
59 if (expected.size() != arg.size()) {
60 return false;
61 }
62 for (int i = 0; i < static_cast<int>(expected.size()); i++) {
63 if (!expected[i].Equals(arg[i])) {
64 return false;
65 }
66 }
67 return true;
68 }
69
70 TEST_F(QueryResultManagerTest, Observers) {
71 MockObserver ob1;
72 MockObserver ob2;
73 query_result_manager_.AddObserver(&ob1);
74 query_result_manager_.AddObserver(&ob2);
75
76 EXPECT_CALL(ob1, OnResultsUpdated(_)).Times(1);
77 EXPECT_CALL(ob2, OnResultsUpdated(_)).Times(1);
78 query_result_manager_.NotifyOnResultsUpdated();
79
80 query_result_manager_.RemoveObserver(&ob2);
81 EXPECT_CALL(ob1, OnResultsUpdated(_)).Times(1);
82 query_result_manager_.NotifyOnResultsUpdated();
83
84 query_result_manager_.RemoveObserver(&ob1);
85 query_result_manager_.NotifyOnResultsUpdated();
86 }
87
88 TEST_F(QueryResultManagerTest, StartStopSinksQuery) {
89 CastModeSet cast_modes;
90
91 query_result_manager_.GetSupportedCastModes(&cast_modes);
92 EXPECT_TRUE(cast_modes.empty());
93 MediaSource actual_source =
94 query_result_manager_.GetSourceForCastMode(MediaCastMode::DEFAULT);
95 EXPECT_TRUE(actual_source.Empty());
96
97 MediaSource source(ForPresentationUrl("http://fooUrl"));
98 EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
99 .WillOnce(Return(true));
100 query_result_manager_.StartSinksQuery(MediaCastMode::DEFAULT, source);
101
102 query_result_manager_.GetSupportedCastModes(&cast_modes);
103 EXPECT_EQ(1u, cast_modes.size());
104 EXPECT_TRUE(ContainsKey(cast_modes, MediaCastMode::DEFAULT));
105 actual_source = query_result_manager_.GetSourceForCastMode(
106 MediaCastMode::DEFAULT);
107 EXPECT_TRUE(source.Equals(actual_source));
108
109 // Register a different source for the same cast mode.
110 MediaSource another_source(ForPresentationUrl("http://barUrl"));
111 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
112 EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
113 .WillOnce(Return(true));
114 query_result_manager_.StartSinksQuery(
115 MediaCastMode::DEFAULT, another_source);
116
117 query_result_manager_.GetSupportedCastModes(&cast_modes);
118 EXPECT_EQ(1u, cast_modes.size());
119 EXPECT_TRUE(ContainsKey(cast_modes, MediaCastMode::DEFAULT));
120 actual_source = query_result_manager_.GetSourceForCastMode(
121 MediaCastMode::DEFAULT);
122 EXPECT_TRUE(another_source.Equals(actual_source));
123
124 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
125 query_result_manager_.StopSinksQuery(MediaCastMode::DEFAULT);
126
127 query_result_manager_.GetSupportedCastModes(&cast_modes);
128 EXPECT_TRUE(cast_modes.empty());
129 actual_source = query_result_manager_.GetSourceForCastMode(
130 MediaCastMode::DEFAULT);
131 EXPECT_TRUE(actual_source.Empty());
132 }
133
134 TEST_F(QueryResultManagerTest, MultipleQueries) {
135 MediaSink sink1("sinkId1", "Sink 1");
136 MediaSink sink2("sinkId2", "Sink 2");
137 MediaSink sink3("sinkId3", "Sink 3");
138 MediaSink sink4("sinkId4", "Sink 4");
139 MediaSink sink5("sinkId5", "Sink 5");
140
141 query_result_manager_.AddObserver(&mock_observer_);
142 DiscoverSinks(MediaCastMode::DEFAULT, ForPresentationUrl("http://barUrl"));
143 DiscoverSinks(MediaCastMode::TAB_MIRROR, ForTabMediaSource(123));
144
145 // Scenario (results in this order):
146 // Action: DEFAULT -> [1, 2, 3]
147 // Expected result:
148 // Sinks: [1 -> {DEFAULT}, 2 -> {DEFAULT}, 3 -> {DEFAULT}]
149 std::vector<MediaSinkWithCastModes> expected_sinks;
150 expected_sinks.push_back(MediaSinkWithCastModes(sink1));
151 expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
152 expected_sinks.push_back(MediaSinkWithCastModes(sink2));
153 expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
154 expected_sinks.push_back(MediaSinkWithCastModes(sink3));
155 expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
156
157 const auto& sinks_observers = query_result_manager_.sinks_observers_;
158 auto sinks_observer_it = sinks_observers.find(MediaCastMode::DEFAULT);
159 ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
160 ASSERT_TRUE(sinks_observer_it->second.get());
161
162 std::vector<MediaSink> sinks_query_result;
163 sinks_query_result.push_back(sink1);
164 sinks_query_result.push_back(sink2);
165 sinks_query_result.push_back(sink3);
166 EXPECT_CALL(mock_observer_,
167 OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
168 sinks_observer_it->second->OnSinksReceived(sinks_query_result);
169
170 // Action: TAB_MIRROR -> [2, 3, 4]
171 // Expected result:
172 // Sinks: [1 -> {DEFAULT}, 2 -> {DEFAULT, TAB_MIRROR},
173 // 3 -> {DEFAULT, TAB_MIRROR}, 4 -> {TAB_MIRROR}]
174 expected_sinks.clear();
175 expected_sinks.push_back(MediaSinkWithCastModes(sink1));
176 expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
177 expected_sinks.push_back(MediaSinkWithCastModes(sink2));
178 expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
179 expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
180 expected_sinks.push_back(MediaSinkWithCastModes(sink3));
181 expected_sinks.back().cast_modes.insert(MediaCastMode::DEFAULT);
182 expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
183 expected_sinks.push_back(MediaSinkWithCastModes(sink4));
184 expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
185
186 sinks_query_result.clear();
187 sinks_query_result.push_back(sink2);
188 sinks_query_result.push_back(sink3);
189 sinks_query_result.push_back(sink4);
190
191 sinks_observer_it = sinks_observers.find(MediaCastMode::TAB_MIRROR);
192 ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
193 ASSERT_TRUE(sinks_observer_it->second.get());
194 EXPECT_CALL(mock_observer_,
195 OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
196 sinks_observer_it->second->OnSinksReceived(sinks_query_result);
197
198 // Action: Update default presentation URL
199 // Expected result:
200 // Sinks: [2 -> {TAB_MIRROR}, 3 -> {TAB_MIRROR}, 4 -> {TAB_MIRROR}]
201 expected_sinks.clear();
202 expected_sinks.push_back(MediaSinkWithCastModes(sink2));
203 expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
204 expected_sinks.push_back(MediaSinkWithCastModes(sink3));
205 expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
206 expected_sinks.push_back(MediaSinkWithCastModes(sink4));
207 expected_sinks.back().cast_modes.insert(MediaCastMode::TAB_MIRROR);
208
209 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
210 EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
211 .WillOnce(Return(true));
212 EXPECT_CALL(mock_observer_,
213 OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
214 query_result_manager_.StartSinksQuery(
215 MediaCastMode::DEFAULT,
216 ForPresentationUrl("http://bazurl.com"));
217
218 // Action: Remove TAB_MIRROR observer
219 // Expected result:
220 // Sinks: []
221 expected_sinks.clear();
222 EXPECT_CALL(mock_observer_,
223 OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
224 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
225 query_result_manager_.StopSinksQuery(MediaCastMode::TAB_MIRROR);
226
227 // Remaining observers: DEFAULT observer, which will be removed on destruction
228 EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
229 }
230
231 } // namespace media_router
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/media_router/query_result_manager.cc ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698