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

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

Powered by Google App Engine
This is Rietveld 408576698