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

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

Powered by Google App Engine
This is Rietveld 408576698