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

Side by Side Diff: chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc

Issue 2965843002: [Media Router] Support dual discovery (Closed)
Patch Set: resovle code review comments from Derek and Mark Created 3 years, 5 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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/media/router/discovery/mdns/cast_media_sink_service.h" 5 #include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h"
6 #include "base/strings/stringprintf.h" 6 #include "base/strings/stringprintf.h"
7 #include "base/test/mock_callback.h" 7 #include "base/test/mock_callback.h"
8 #include "base/timer/mock_timer.h" 8 #include "base/timer/mock_timer.h"
9 #include "chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.h" 9 #include "chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.h"
10 #include "chrome/browser/media/router/test_helper.h" 10 #include "chrome/browser/media/router/test_helper.h"
11 #include "chrome/test/base/testing_profile.h" 11 #include "chrome/test/base/testing_profile.h"
12 #include "components/cast_channel/cast_socket.h" 12 #include "components/cast_channel/cast_socket.h"
13 #include "components/cast_channel/cast_socket_service.h" 13 #include "components/cast_channel/cast_socket_service.h"
14 #include "components/cast_channel/cast_test_util.h" 14 #include "components/cast_channel/cast_test_util.h"
15 #include "content/public/test/test_browser_thread_bundle.h" 15 #include "content/public/test/test_browser_thread_bundle.h"
16 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 18
19 using ::testing::_; 19 using ::testing::_;
20 using ::testing::Invoke;
20 using ::testing::Return; 21 using ::testing::Return;
21 using ::testing::SaveArg; 22 using ::testing::SaveArg;
23 using ::testing::WithArgs;
24
25 using cast_channel::CastSocket;
26 using cast_channel::ChannelError;
22 27
23 namespace { 28 namespace {
24 29
25 net::IPEndPoint CreateIPEndPoint(int num) { 30 // Test parameter structure holding mock strings for media sink and mDNS
31 // service.
32 // TODO(crbug.com/741932): use TestSinkParams to construct test data.
33 struct TestSinkParams {
34 std::string unique_id;
35 std::string model_name;
36 std::string friendly_name;
26 net::IPAddress ip_address; 37 net::IPAddress ip_address;
27 CHECK(ip_address.AssignFromIPLiteral( 38 net::IPEndPoint ip_endpoint;
28 base::StringPrintf("192.168.0.10%d", num))); 39 int channel_id;
29 return net::IPEndPoint(ip_address, 8009 + num); 40 bool audio_only;
30 }
31 41
32 media_router::DnsSdService CreateDnsService(int num) { 42 TestSinkParams() = default;
33 net::IPEndPoint ip_endpoint = CreateIPEndPoint(num); 43
44 explicit TestSinkParams(int num) {
45 unique_id = base::StringPrintf("service %d", num);
46 friendly_name = base::StringPrintf("friendly name %d", num);
47 model_name = base::StringPrintf("model name %d", num);
48 CHECK(ip_address.AssignFromIPLiteral(
49 base::StringPrintf("192.168.0.10%d", num)));
50 ip_endpoint = net::IPEndPoint(
51 ip_address, media_router::CastMediaSinkService::kCastControlPort + num);
52 channel_id = num;
53 audio_only = false;
54 }
55 };
56
57 media_router::DnsSdService CreateDnsService(const TestSinkParams& params) {
34 media_router::DnsSdService service; 58 media_router::DnsSdService service;
35 service.service_name = 59 service.service_name =
36 "_myDevice." + 60 "_myDevice." +
37 std::string(media_router::CastMediaSinkService::kCastServiceType); 61 std::string(media_router::CastMediaSinkService::kCastServiceType);
38 service.ip_address = ip_endpoint.address().ToString(); 62 service.ip_address = params.ip_address.ToString();
39 service.service_host_port = ip_endpoint.ToString(); 63 service.service_host_port = params.ip_endpoint.ToString();
40 service.service_data.push_back(base::StringPrintf("id=service %d", num)); 64 service.service_data.push_back("id=" + params.unique_id);
41 service.service_data.push_back( 65 service.service_data.push_back("fn=" + params.friendly_name);
42 base::StringPrintf("fn=friendly name %d", num)); 66 service.service_data.push_back("md=" + params.model_name);
43 service.service_data.push_back(base::StringPrintf("md=model name %d", num));
44
45 return service; 67 return service;
46 } 68 }
47 69
70 media_router::MediaSinkInternal CreateCastSink(const TestSinkParams& params) {
71 media_router::MediaSink sink(params.unique_id, params.friendly_name,
72 media_router::MediaSink::IconType::CAST);
73
74 media_router::CastSinkExtraData extra_data;
75 extra_data.ip_address = params.ip_address;
76 extra_data.port = params.ip_endpoint.port();
77 extra_data.model_name = params.model_name;
78 extra_data.cast_channel_id = params.channel_id;
79 extra_data.capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT |
80 cast_channel::CastDeviceCapability::VIDEO_OUT;
81 return media_router::MediaSinkInternal(sink, extra_data);
82 }
83
84 media_router::MediaSinkInternal CreateDialSink(const TestSinkParams& params) {
85 media_router::MediaSink sink(params.unique_id, params.friendly_name,
86 media_router::MediaSink::IconType::CAST);
87
88 media_router::DialSinkExtraData extra_data;
89 extra_data.ip_address = params.ip_address;
90 extra_data.model_name = params.model_name;
91 return media_router::MediaSinkInternal(sink, extra_data);
92 }
93
48 void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink, 94 void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink,
49 const media_router::DnsSdService& service, 95 const TestSinkParams& params) {
50 int channel_id, 96 EXPECT_EQ(params.unique_id, cast_sink.sink().id());
51 bool audio_only) { 97 EXPECT_EQ(params.friendly_name, cast_sink.sink().name());
52 std::string id = base::StringPrintf("service %d", channel_id); 98 EXPECT_EQ(params.model_name, cast_sink.cast_data().model_name);
53 std::string name = base::StringPrintf("friendly name %d", channel_id); 99 EXPECT_EQ(params.ip_address, cast_sink.cast_data().ip_address);
54 std::string model_name = base::StringPrintf("model name %d", channel_id); 100 EXPECT_TRUE(cast_channel::CastDeviceCapability::AUDIO_OUT &
55 EXPECT_EQ(id, cast_sink.sink().id()); 101 cast_sink.cast_data().capabilities);
56 EXPECT_EQ(name, cast_sink.sink().name());
57 EXPECT_EQ(model_name, cast_sink.cast_data().model_name);
58 EXPECT_EQ(service.ip_address, cast_sink.cast_data().ip_address.ToString());
59 102
60 int capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT; 103 int capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT;
61 if (!audio_only) 104 if (!params.audio_only)
62 capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT; 105 capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT;
63 EXPECT_EQ(capabilities, cast_sink.cast_data().capabilities); 106 EXPECT_EQ(capabilities, cast_sink.cast_data().capabilities);
64 EXPECT_EQ(channel_id, cast_sink.cast_data().cast_channel_id); 107 EXPECT_EQ(params.channel_id, cast_sink.cast_data().cast_channel_id);
65 } 108 }
66 109
67 } // namespace 110 } // namespace
68 111
69 namespace media_router { 112 namespace media_router {
70 113
71 class MockCastSocketService : public cast_channel::CastSocketService { 114 class MockCastSocketService : public cast_channel::CastSocketService {
72 public: 115 public:
73 MOCK_METHOD4(OpenSocket, 116 MOCK_METHOD4(OpenSocket,
74 int(const net::IPEndPoint& ip_endpoint, 117 int(const net::IPEndPoint& ip_endpoint,
75 net::NetLog* net_log, 118 net::NetLog* net_log,
76 const cast_channel::CastSocket::OnOpenCallback& open_cb, 119 const cast_channel::CastSocket::OnOpenCallback& open_cb,
77 cast_channel::CastSocket::Observer* observer)); 120 cast_channel::CastSocket::Observer* observer));
78 MOCK_CONST_METHOD1(GetSocket, cast_channel::CastSocket*(int channel_id)); 121 MOCK_CONST_METHOD1(GetSocket, cast_channel::CastSocket*(int channel_id));
79 122
80 private: 123 private:
81 ~MockCastSocketService() {} 124 ~MockCastSocketService() {}
82 }; 125 };
83 126
84 class CastMediaSinkServiceTest : public ::testing::Test { 127 class CastMediaSinkServiceTest : public ::testing::Test {
85 public: 128 public:
86 CastMediaSinkServiceTest() 129 CastMediaSinkServiceTest()
87 : mock_cast_socket_service_(new MockCastSocketService()), 130 : mock_cast_socket_service_(new MockCastSocketService()),
88 media_sink_service_( 131 media_sink_service_(
89 new CastMediaSinkService(mock_sink_discovered_cb_.Get(), 132 new CastMediaSinkService(mock_sink_discovered_cb_.Get(),
90 mock_cast_socket_service_.get())), 133 mock_cast_socket_service_.get())),
91 test_dns_sd_registry_(media_sink_service_.get()) {} 134 test_dns_sd_registry_(media_sink_service_.get()) {
135 for (int i = 1; i <= 3; i++) {
136 params_[i] = TestSinkParams(i);
137 services_[i] = CreateDnsService(params_[i]);
138 cast_sinks_[i] = CreateCastSink(params_[i]);
139 dial_sinks_[i] = CreateDialSink(params_[i]);
140 }
141 }
92 142
93 void SetUp() override { 143 void SetUp() override {
94 auto mock_timer = base::MakeUnique<base::MockTimer>( 144 auto mock_timer = base::MakeUnique<base::MockTimer>(
95 true /*retain_user_task*/, false /*is_repeating*/); 145 true /*retain_user_task*/, false /*is_repeating*/);
96 mock_timer_ = mock_timer.get(); 146 mock_timer_ = mock_timer.get();
97 media_sink_service_->SetTimerForTest(std::move(mock_timer)); 147 media_sink_service_->SetTimerForTest(std::move(mock_timer));
98 } 148 }
99 149
100 protected: 150 protected:
101 const content::TestBrowserThreadBundle thread_bundle_; 151 const content::TestBrowserThreadBundle thread_bundle_;
102 TestingProfile profile_; 152 TestingProfile profile_;
103 153
104 base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback> 154 base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback>
105 mock_sink_discovered_cb_; 155 mock_sink_discovered_cb_;
106 scoped_refptr<MockCastSocketService> mock_cast_socket_service_; 156 scoped_refptr<MockCastSocketService> mock_cast_socket_service_;
107 scoped_refptr<CastMediaSinkService> media_sink_service_; 157 scoped_refptr<CastMediaSinkService> media_sink_service_;
108 MockDnsSdRegistry test_dns_sd_registry_; 158 MockDnsSdRegistry test_dns_sd_registry_;
109 base::MockTimer* mock_timer_; 159 base::MockTimer* mock_timer_;
110 160
161 TestSinkParams params_[4];
162 DnsSdService services_[4];
163 MediaSinkInternal cast_sinks_[4];
164 MediaSinkInternal dial_sinks_[4];
165 cast_channel::MockCastSocket mock_sockets_[4];
166
111 DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest); 167 DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest);
112 }; 168 };
113 169
114 TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) { 170 TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) {
115 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())) 171 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get()))
116 .Times(2); 172 .Times(2);
117 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)).Times(2); 173 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)).Times(2);
118 EXPECT_FALSE(mock_timer_->IsRunning()); 174 EXPECT_FALSE(mock_timer_->IsRunning());
119 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); 175 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
120 media_sink_service_->Start(); 176 media_sink_service_->Start();
121 EXPECT_TRUE(mock_timer_->IsRunning()); 177 EXPECT_TRUE(mock_timer_->IsRunning());
122 178
123 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); 179 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get()));
124 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); 180 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_));
125 media_sink_service_->Stop(); 181 media_sink_service_->Stop();
126 182
127 mock_timer_ = 183 auto mock_timer = base::MakeUnique<base::MockTimer>(true /*retain_user_task*/,
128 new base::MockTimer(true /*retain_user_task*/, false /*is_repeating*/); 184 false /*is_repeating*/);
129 media_sink_service_->SetTimerForTest(base::WrapUnique(mock_timer_)); 185 mock_timer_ = mock_timer.get();
186 media_sink_service_->SetTimerForTest(std::move(mock_timer));
130 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); 187 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
131 media_sink_service_->Start(); 188 media_sink_service_->Start();
132 EXPECT_TRUE(mock_timer_->IsRunning()); 189 EXPECT_TRUE(mock_timer_->IsRunning());
133 } 190 }
134 191
135 TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) { 192 TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) {
136 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get())); 193 EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get()));
137 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)); 194 EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_));
138 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_); 195 media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
139 media_sink_service_->Start(); 196 media_sink_service_->Start();
140 media_sink_service_->Start(); 197 media_sink_service_->Start();
141 EXPECT_TRUE(mock_timer_->IsRunning()); 198 EXPECT_TRUE(mock_timer_->IsRunning());
142 199
143 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get())); 200 EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get()));
144 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_)); 201 EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_));
145 media_sink_service_->Stop(); 202 media_sink_service_->Stop();
146 media_sink_service_->Stop(); 203 media_sink_service_->Stop();
147 } 204 }
148 205
149 TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) { 206 TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) {
150 DnsSdService service = CreateDnsService(1); 207 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
151 cast_channel::MockCastSocket socket; 208 .WillOnce(Return(&mock_sockets_[1]));
152 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) 209
153 .WillOnce(Return(&socket)); 210 media_sink_service_->current_service_ip_endpoints_.insert(
154 211 params_[1].ip_endpoint);
155 media_sink_service_->current_services_.push_back(service); 212 media_sink_service_->OnChannelOpenedOnIOThread(
156 media_sink_service_->OnChannelOpenedOnIOThread( 213 cast_sinks_[1], 1, cast_channel::ChannelError::NONE);
157 service, 1, cast_channel::ChannelError::NONE); 214
158 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. 215 // Verify sink content.
159 base::RunLoop().RunUntilIdle(); 216 EXPECT_EQ(1u, media_sink_service_->current_sinks_by_mdns_.size());
160 217 for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_)
161 // Verify sink content 218 EXPECT_EQ(cast_sinks_[1], sink_it.second);
162 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
163 for (const auto& sink_it : media_sink_service_->current_sinks_)
164 VerifyMediaSinkInternal(sink_it, service, 1, false);
165 } 219 }
166 220
167 TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) { 221 TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) {
168 DnsSdService service1 = CreateDnsService(1);
169 DnsSdService service2 = CreateDnsService(2);
170 DnsSdService service3 = CreateDnsService(3);
171
172 cast_channel::MockCastSocket socket2;
173 cast_channel::MockCastSocket socket3;
174 // Fail to open channel 1. 222 // Fail to open channel 1.
175 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) 223 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
176 .WillOnce(Return(nullptr)); 224 .WillOnce(Return(nullptr));
177 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) 225 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
178 .WillOnce(Return(&socket2)); 226 .WillOnce(Return(&mock_sockets_[2]));
179 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3)) 227 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3))
180 .WillOnce(Return(&socket2)); 228 .WillOnce(Return(&mock_sockets_[3]));
181 229
182 // Current round of Dns discovery finds service1 and service 2. 230 // Current round of Dns discovery finds service1 and service 2.
183 media_sink_service_->current_services_.push_back(service1); 231 media_sink_service_->current_service_ip_endpoints_.insert(
184 media_sink_service_->current_services_.push_back(service2); 232 params_[1].ip_endpoint);
185 media_sink_service_->OnChannelOpenedOnIOThread( 233 media_sink_service_->current_service_ip_endpoints_.insert(
186 service1, 1, cast_channel::ChannelError::NONE); 234 params_[2].ip_endpoint);
187 media_sink_service_->OnChannelOpenedOnIOThread( 235 media_sink_service_->OnChannelOpenedOnIOThread(
188 service2, 2, cast_channel::ChannelError::NONE); 236 cast_sinks_[1], 1, cast_channel::ChannelError::NONE);
189 media_sink_service_->OnChannelOpenedOnIOThread( 237 media_sink_service_->OnChannelOpenedOnIOThread(
190 service3, 3, cast_channel::ChannelError::NONE); 238 cast_sinks_[2], 2, cast_channel::ChannelError::NONE);
191 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. 239 media_sink_service_->OnChannelOpenedOnIOThread(
192 base::RunLoop().RunUntilIdle(); 240 cast_sinks_[3], 3, cast_channel::ChannelError::NONE);
193 241
194 // Verify sink content 242 // Verify sink content.
195 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size()); 243 EXPECT_EQ(1u, media_sink_service_->current_sinks_by_mdns_.size());
196 for (const auto& sink_it : media_sink_service_->current_sinks_) 244 for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_)
197 VerifyMediaSinkInternal(sink_it, service2, 2, false); 245 EXPECT_EQ(cast_sinks_[2], sink_it.second);
198 } 246 }
199 247
200 TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) { 248 TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) {
201 DnsSdService service1 = CreateDnsService(1);
202 DnsSdService service2 = CreateDnsService(2);
203 net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
204 net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
205
206 // Add dns services. 249 // Add dns services.
207 DnsSdRegistry::DnsSdServiceList service_list{service1, service2}; 250 DnsSdRegistry::DnsSdServiceList service_list{services_[1], services_[2]};
208 251
209 cast_channel::CastSocket::OnOpenCallback callback1; 252 // Channel 1, 2 opened.
210 cast_channel::CastSocket::OnOpenCallback callback2; 253 EXPECT_CALL(*mock_cast_socket_service_,
211 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)) 254 OpenSocket(params_[1].ip_endpoint, _, _, _))
255 .WillOnce(DoAll(
256 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
257 std::move(callback).Run(1, ChannelError::NONE);
258 })),
259 Return(1)));
260 EXPECT_CALL(*mock_cast_socket_service_,
261 OpenSocket(params_[2].ip_endpoint, _, _, _))
262 .WillOnce(DoAll(
263 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
264 std::move(callback).Run(2, ChannelError::NONE);
265 })),
266 Return(2)));
267
268 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
269 .WillOnce(Return(&mock_sockets_[1]));
270 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
271 .WillOnce(Return(&mock_sockets_[2]));
272
273 // Invoke CastSocketService::OpenSocket on the IO thread.
274 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
275 service_list);
276 base::RunLoop().RunUntilIdle();
277
278 // Verify sink content.
279 EXPECT_EQ(2u, media_sink_service_->current_sinks_by_mdns_.size());
280 }
281
282 TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) {
283 // 1st round finds service 1 & 2.
284 DnsSdRegistry::DnsSdServiceList service_list1{services_[1], services_[2]};
285 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
286 service_list1);
287
288 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
289 .WillOnce(Return(&mock_sockets_[1]));
290 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
291 .WillOnce(Return(&mock_sockets_[2]));
292 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3))
293 .WillOnce(Return(&mock_sockets_[3]));
294
295 // Channel 2 opened.
296 CastSocket::OnOpenCallback callback1;
297 EXPECT_CALL(*mock_cast_socket_service_,
298 OpenSocket(params_[1].ip_endpoint, _, _, _))
212 .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1))); 299 .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1)));
213 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)) 300 EXPECT_CALL(*mock_cast_socket_service_,
214 .WillOnce(DoAll(SaveArg<2>(&callback2), Return(2))); 301 OpenSocket(params_[2].ip_endpoint, _, _, _))
215 302 .WillOnce(DoAll(
216 // Invoke CastSocketService::OpenSocket on the IO thread. 303 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
217 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, 304 std::move(callback).Run(2, ChannelError::NONE);
218 service_list); 305 })),
219 base::RunLoop().RunUntilIdle(); 306 Return(2)));
220 307 // Open cast channels on the IO thread.
221 cast_channel::MockCastSocket socket1; 308 base::RunLoop().RunUntilIdle();
222 cast_channel::MockCastSocket socket2; 309
223 310 // 2nd round finds service 2 & 3.
224 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1)) 311 DnsSdRegistry::DnsSdServiceList service_list2{services_[2], services_[3]};
225 .WillOnce(Return(&socket1)); 312 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
226 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2)) 313 service_list2);
227 .WillOnce(Return(&socket2)); 314
228 315 // Channel 3 opened.
229 callback1.Run(1, cast_channel::ChannelError::NONE); 316 EXPECT_CALL(*mock_cast_socket_service_,
230 callback2.Run(2, cast_channel::ChannelError::NONE); 317 OpenSocket(params_[2].ip_endpoint, _, _, _));
231 318 EXPECT_CALL(*mock_cast_socket_service_,
232 // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread. 319 OpenSocket(params_[3].ip_endpoint, _, _, _))
233 base::RunLoop().RunUntilIdle(); 320 .WillOnce(DoAll(
234 // Verify sink content 321 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
235 EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_.size()); 322 std::move(callback).Run(3, ChannelError::NONE);
236 } 323 })),
237 324 Return(3)));
238 TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) { 325 // Open cast channels on the IO thread.
239 DnsSdService service1 = CreateDnsService(1); 326 base::RunLoop().RunUntilIdle();
240 DnsSdService service2 = CreateDnsService(2); 327
241 DnsSdService service3 = CreateDnsService(3); 328 // Channel 1 opened.
242 net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1); 329 callback1.Run(1, ChannelError::NONE);
243 net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2); 330
244 net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3); 331 // Verify sink content.
245 332 EXPECT_EQ(1u, media_sink_service_->current_sinks_by_mdns_.size());
246 // 1st round finds service 1 & 2. 333 for (const auto& sink_it : media_sink_service_->current_sinks_by_mdns_)
247 DnsSdRegistry::DnsSdServiceList service_list1{service1, service2}; 334 VerifyMediaSinkInternal(sink_it.second, params_[3]);
335 }
336
337 TEST_F(CastMediaSinkServiceTest, TestTimer) {
338 EXPECT_FALSE(mock_timer_->IsRunning());
339
340 // finds service 1 & 2.
341 DnsSdRegistry::DnsSdServiceList service_list1{services_[1], services_[2]};
248 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType, 342 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
249 service_list1); 343 service_list1);
250 344 EXPECT_TRUE(mock_timer_->IsRunning());
251 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _)); 345
252 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _)); 346 EXPECT_CALL(*mock_cast_socket_service_,
253 base::RunLoop().RunUntilIdle(); 347 OpenSocket(params_[1].ip_endpoint, _, _, _));
254 348 EXPECT_CALL(*mock_cast_socket_service_,
255 // Channel 2 opened. 349 OpenSocket(params_[2].ip_endpoint, _, _, _));
256 media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false); 350 // Open sockets on the IO thread.
257
258 // 2nd round finds service 2 & 3.
259 DnsSdRegistry::DnsSdServiceList service_list2{service2, service3};
260 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
261 service_list2);
262
263 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
264 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint3, _, _, _));
265 base::RunLoop().RunUntilIdle();
266
267 // Channel 1 and 3 opened.
268 media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false);
269 media_sink_service_->OnChannelOpenedOnUIThread(service3, 3, false);
270
271 EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
272 for (const auto& sink_it : media_sink_service_->current_sinks_)
273 VerifyMediaSinkInternal(sink_it, service3, 3, false);
274 }
275
276 TEST_F(CastMediaSinkServiceTest, TestTimer) {
277 DnsSdService service1 = CreateDnsService(1);
278 DnsSdService service2 = CreateDnsService(2);
279 net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
280 net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
281
282 EXPECT_FALSE(mock_timer_->IsRunning());
283 // finds service 1 & 2.
284 DnsSdRegistry::DnsSdServiceList service_list1{service1, service2};
285 media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
286 service_list1);
287
288 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _));
289 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
290 base::RunLoop().RunUntilIdle(); 351 base::RunLoop().RunUntilIdle();
291 352
292 // Channel 2 is opened. 353 // Channel 2 is opened.
293 media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false); 354 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
355 .WillOnce(Return(&mock_sockets_[2]));
356
357 media_sink_service_->OnChannelOpenedOnIOThread(cast_sinks_[2], 2,
358 ChannelError::NONE);
359 base::RunLoop().RunUntilIdle();
294 360
295 std::vector<MediaSinkInternal> sinks; 361 std::vector<MediaSinkInternal> sinks;
296 EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks)); 362 EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks));
297 363
298 // Fire timer. 364 // Fire timer.
299 mock_timer_->Fire(); 365 mock_timer_->Fire();
300 EXPECT_EQ(size_t(1), sinks.size()); 366 base::RunLoop().RunUntilIdle();
301 VerifyMediaSinkInternal(sinks[0], service2, 2, false);
302 367
303 EXPECT_FALSE(mock_timer_->IsRunning()); 368 EXPECT_FALSE(mock_timer_->IsRunning());
369 EXPECT_EQ(1u, sinks.size());
370 VerifyMediaSinkInternal(sinks[0], params_[2]);
371
304 // Channel 1 is opened and timer is restarted. 372 // Channel 1 is opened and timer is restarted.
305 media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false); 373 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
374 .WillOnce(Return(&mock_sockets_[1]));
375
376 media_sink_service_->OnChannelOpenedOnIOThread(cast_sinks_[1], 1,
377 ChannelError::NONE);
378 base::RunLoop().RunUntilIdle();
306 EXPECT_TRUE(mock_timer_->IsRunning()); 379 EXPECT_TRUE(mock_timer_->IsRunning());
307 } 380 }
308 381
382 TEST_F(CastMediaSinkServiceTest, TestOnDialSinkAdded) {
383 net::IPEndPoint ip_endpoint1(params_[1].ip_address,
384 CastMediaSinkService::kCastControlPort);
385 net::IPEndPoint ip_endpoint2(params_[2].ip_address,
386 CastMediaSinkService::kCastControlPort);
387
388 // Channel 1, 2 opened.
389 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _))
390 .WillOnce(DoAll(
391 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
392 std::move(callback).Run(1, ChannelError::NONE);
393 })),
394 Return(1)));
395 EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _))
396 .WillOnce(DoAll(
397 WithArgs<2>(Invoke([&](const CastSocket::OnOpenCallback& callback) {
398 std::move(callback).Run(2, ChannelError::NONE);
399 })),
400 Return(2)));
401
402 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
403 .WillOnce(Return(&mock_sockets_[1]));
404 EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
405 .WillOnce(Return(&mock_sockets_[2]));
406
407 // Invoke CastSocketService::OpenSocket on the IO thread.
408 media_sink_service_->OnDialSinkAdded(dial_sinks_[1]);
409 base::RunLoop().RunUntilIdle();
410
411 // Invoke CastSocketService::OpenSocket on the IO thread.
412 media_sink_service_->OnDialSinkAdded(dial_sinks_[2]);
413 base::RunLoop().RunUntilIdle();
414 // Verify sink content.
415 EXPECT_EQ(2u, media_sink_service_->current_sinks_by_dial_.size());
416 }
417
418 TEST_F(CastMediaSinkServiceTest, TestOnFetchCompleted) {
419 std::vector<MediaSinkInternal> sinks;
420 EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks));
421
422 // Cast sink 1, 2 from mDNS discovery
423 media_sink_service_->current_sinks_by_mdns_[params_[1].ip_endpoint] =
424 cast_sinks_[1];
425 media_sink_service_->current_sinks_by_mdns_[params_[2].ip_endpoint] =
426 cast_sinks_[2];
427 // Cast sink 2, 3 from dial discovery
428 auto extra_data = cast_sinks_[2].cast_data();
429 extra_data.discovered_by_dial = true;
430 extra_data.model_name += " dial";
431
432 media_sink_service_->current_sinks_by_dial_[params_[2].ip_endpoint] =
433 cast_sinks_[2];
434 media_sink_service_->current_sinks_by_dial_[params_[3].ip_endpoint] =
435 cast_sinks_[3];
436
437 // Callback returns Cast sink 1, 2, 3
438 media_sink_service_->OnFetchCompleted();
439 base::RunLoop().RunUntilIdle();
440
441 EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[1]));
442 EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[2]));
443 EXPECT_TRUE(base::ContainsValue(sinks, cast_sinks_[3]));
444 }
445
309 } // namespace media_router 446 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698