OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/memory/weak_ptr.h" | 5 #include "base/memory/weak_ptr.h" |
6 #include "base/run_loop.h" | 6 #include "base/run_loop.h" |
7 #include "chrome/utility/local_discovery/service_discovery_client_impl.h" | 7 #include "chrome/utility/local_discovery/service_discovery_client_impl.h" |
8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
9 #include "net/dns/dns_protocol.h" | 9 #include "net/dns/dns_protocol.h" |
10 #include "net/dns/mdns_client_impl.h" | 10 #include "net/dns/mdns_client_impl.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 | 176 |
177 ServiceWatcher::UpdatedCallback GetCallback() { | 177 ServiceWatcher::UpdatedCallback GetCallback() { |
178 return base::Bind(&MockServiceWatcherClient::OnServiceUpdated, | 178 return base::Bind(&MockServiceWatcherClient::OnServiceUpdated, |
179 base::Unretained(this)); | 179 base::Unretained(this)); |
180 } | 180 } |
181 }; | 181 }; |
182 | 182 |
183 class ServiceDiscoveryTest : public ::testing::Test { | 183 class ServiceDiscoveryTest : public ::testing::Test { |
184 public: | 184 public: |
185 ServiceDiscoveryTest() | 185 ServiceDiscoveryTest() |
186 : socket_factory_(new net::MockMDnsSocketFactory), | 186 : service_discovery_client_(&mdns_client_) { |
187 mdns_client_( | 187 mdns_client_.StartListening(&socket_factory_); |
188 scoped_ptr<net::MDnsConnection::SocketFactory>( | |
189 socket_factory_)), | |
190 service_discovery_client_(&mdns_client_) { | |
191 mdns_client_.StartListening(); | |
192 } | 188 } |
193 | 189 |
194 virtual ~ServiceDiscoveryTest() { | 190 virtual ~ServiceDiscoveryTest() { |
195 } | 191 } |
196 | 192 |
197 protected: | 193 protected: |
198 void RunFor(base::TimeDelta time_period) { | 194 void RunFor(base::TimeDelta time_period) { |
199 base::CancelableCallback<void()> callback(base::Bind( | 195 base::CancelableCallback<void()> callback(base::Bind( |
200 &ServiceDiscoveryTest::Stop, base::Unretained(this))); | 196 &ServiceDiscoveryTest::Stop, base::Unretained(this))); |
201 base::MessageLoop::current()->PostDelayedTask( | 197 base::MessageLoop::current()->PostDelayedTask( |
202 FROM_HERE, callback.callback(), time_period); | 198 FROM_HERE, callback.callback(), time_period); |
203 | 199 |
204 base::MessageLoop::current()->Run(); | 200 base::MessageLoop::current()->Run(); |
205 callback.Cancel(); | 201 callback.Cancel(); |
206 } | 202 } |
207 | 203 |
208 void Stop() { | 204 void Stop() { |
209 base::MessageLoop::current()->Quit(); | 205 base::MessageLoop::current()->Quit(); |
210 } | 206 } |
211 | 207 |
212 net::MockMDnsSocketFactory* socket_factory_; | 208 net::MockMDnsSocketFactory socket_factory_; |
213 net::MDnsClientImpl mdns_client_; | 209 net::MDnsClientImpl mdns_client_; |
214 ServiceDiscoveryClientImpl service_discovery_client_; | 210 ServiceDiscoveryClientImpl service_discovery_client_; |
215 base::MessageLoop loop_; | 211 base::MessageLoop loop_; |
216 }; | 212 }; |
217 | 213 |
218 TEST_F(ServiceDiscoveryTest, AddRemoveService) { | 214 TEST_F(ServiceDiscoveryTest, AddRemoveService) { |
219 StrictMock<MockServiceWatcherClient> delegate; | 215 StrictMock<MockServiceWatcherClient> delegate; |
220 | 216 |
221 scoped_ptr<ServiceWatcher> watcher( | 217 scoped_ptr<ServiceWatcher> watcher( |
222 service_discovery_client_.CreateServiceWatcher( | 218 service_discovery_client_.CreateServiceWatcher( |
223 "_privet._tcp.local", delegate.GetCallback())); | 219 "_privet._tcp.local", delegate.GetCallback())); |
224 | 220 |
225 watcher->Start(); | 221 watcher->Start(); |
226 | 222 |
227 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, | 223 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, |
228 "hello._privet._tcp.local")) | 224 "hello._privet._tcp.local")) |
229 .Times(Exactly(1)); | 225 .Times(Exactly(1)); |
230 | 226 |
231 socket_factory_->SimulateReceive( | 227 socket_factory_.SimulateReceive(kSamplePacketPTR, sizeof(kSamplePacketPTR)); |
232 kSamplePacketPTR, sizeof(kSamplePacketPTR)); | |
233 | 228 |
234 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_REMOVED, | 229 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_REMOVED, |
235 "hello._privet._tcp.local")) | 230 "hello._privet._tcp.local")) |
236 .Times(Exactly(1)); | 231 .Times(Exactly(1)); |
237 | 232 |
238 RunFor(base::TimeDelta::FromSeconds(2)); | 233 RunFor(base::TimeDelta::FromSeconds(2)); |
239 }; | 234 }; |
240 | 235 |
241 TEST_F(ServiceDiscoveryTest, DiscoverNewServices) { | 236 TEST_F(ServiceDiscoveryTest, DiscoverNewServices) { |
242 StrictMock<MockServiceWatcherClient> delegate; | 237 StrictMock<MockServiceWatcherClient> delegate; |
243 | 238 |
244 scoped_ptr<ServiceWatcher> watcher( | 239 scoped_ptr<ServiceWatcher> watcher( |
245 service_discovery_client_.CreateServiceWatcher( | 240 service_discovery_client_.CreateServiceWatcher( |
246 "_privet._tcp.local", delegate.GetCallback())); | 241 "_privet._tcp.local", delegate.GetCallback())); |
247 | 242 |
248 watcher->Start(); | 243 watcher->Start(); |
249 | 244 |
250 EXPECT_CALL(*socket_factory_, OnSendTo(_)) | 245 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(2); |
251 .Times(2); | |
252 | 246 |
253 watcher->DiscoverNewServices(false); | 247 watcher->DiscoverNewServices(false); |
254 }; | 248 }; |
255 | 249 |
256 TEST_F(ServiceDiscoveryTest, ReadCachedServices) { | 250 TEST_F(ServiceDiscoveryTest, ReadCachedServices) { |
257 socket_factory_->SimulateReceive( | 251 socket_factory_.SimulateReceive(kSamplePacketPTR, sizeof(kSamplePacketPTR)); |
258 kSamplePacketPTR, sizeof(kSamplePacketPTR)); | |
259 | 252 |
260 StrictMock<MockServiceWatcherClient> delegate; | 253 StrictMock<MockServiceWatcherClient> delegate; |
261 | 254 |
262 scoped_ptr<ServiceWatcher> watcher( | 255 scoped_ptr<ServiceWatcher> watcher( |
263 service_discovery_client_.CreateServiceWatcher( | 256 service_discovery_client_.CreateServiceWatcher( |
264 "_privet._tcp.local", delegate.GetCallback())); | 257 "_privet._tcp.local", delegate.GetCallback())); |
265 | 258 |
266 watcher->Start(); | 259 watcher->Start(); |
267 | 260 |
268 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, | 261 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, |
269 "hello._privet._tcp.local")) | 262 "hello._privet._tcp.local")) |
270 .Times(Exactly(1)); | 263 .Times(Exactly(1)); |
271 | 264 |
272 base::MessageLoop::current()->RunUntilIdle(); | 265 base::MessageLoop::current()->RunUntilIdle(); |
273 }; | 266 }; |
274 | 267 |
275 | 268 |
276 TEST_F(ServiceDiscoveryTest, ReadCachedServicesMultiple) { | 269 TEST_F(ServiceDiscoveryTest, ReadCachedServicesMultiple) { |
277 socket_factory_->SimulateReceive( | 270 socket_factory_.SimulateReceive(kSamplePacketPTR2, sizeof(kSamplePacketPTR2)); |
278 kSamplePacketPTR2, sizeof(kSamplePacketPTR2)); | |
279 | 271 |
280 StrictMock<MockServiceWatcherClient> delegate; | 272 StrictMock<MockServiceWatcherClient> delegate; |
281 scoped_ptr<ServiceWatcher> watcher = | 273 scoped_ptr<ServiceWatcher> watcher = |
282 service_discovery_client_.CreateServiceWatcher( | 274 service_discovery_client_.CreateServiceWatcher( |
283 "_privet._tcp.local", delegate.GetCallback()); | 275 "_privet._tcp.local", delegate.GetCallback()); |
284 | 276 |
285 watcher->Start(); | 277 watcher->Start(); |
286 | 278 |
287 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, | 279 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, |
288 "hello._privet._tcp.local")) | 280 "hello._privet._tcp.local")) |
(...skipping 12 matching lines...) Expand all Loading... |
301 scoped_ptr<ServiceWatcher> watcher( | 293 scoped_ptr<ServiceWatcher> watcher( |
302 service_discovery_client_.CreateServiceWatcher( | 294 service_discovery_client_.CreateServiceWatcher( |
303 "_privet._tcp.local", delegate.GetCallback())); | 295 "_privet._tcp.local", delegate.GetCallback())); |
304 | 296 |
305 watcher->Start(); | 297 watcher->Start(); |
306 | 298 |
307 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, | 299 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, |
308 "hello._privet._tcp.local")) | 300 "hello._privet._tcp.local")) |
309 .Times(Exactly(1)); | 301 .Times(Exactly(1)); |
310 | 302 |
311 socket_factory_->SimulateReceive( | 303 socket_factory_.SimulateReceive(kSamplePacketPTR, sizeof(kSamplePacketPTR)); |
312 kSamplePacketPTR, sizeof(kSamplePacketPTR)); | |
313 | 304 |
314 base::MessageLoop::current()->RunUntilIdle(); | 305 base::MessageLoop::current()->RunUntilIdle(); |
315 | 306 |
316 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_CHANGED, | 307 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_CHANGED, |
317 "hello._privet._tcp.local")) | 308 "hello._privet._tcp.local")) |
318 .Times(Exactly(1)); | 309 .Times(Exactly(1)); |
319 | 310 |
320 socket_factory_->SimulateReceive( | 311 socket_factory_.SimulateReceive(kSamplePacketSRV, sizeof(kSamplePacketSRV)); |
321 kSamplePacketSRV, sizeof(kSamplePacketSRV)); | |
322 | 312 |
323 socket_factory_->SimulateReceive( | 313 socket_factory_.SimulateReceive(kSamplePacketTXT, sizeof(kSamplePacketTXT)); |
324 kSamplePacketTXT, sizeof(kSamplePacketTXT)); | |
325 | 314 |
326 base::MessageLoop::current()->RunUntilIdle(); | 315 base::MessageLoop::current()->RunUntilIdle(); |
327 }; | 316 }; |
328 | 317 |
329 TEST_F(ServiceDiscoveryTest, SinglePacket) { | 318 TEST_F(ServiceDiscoveryTest, SinglePacket) { |
330 StrictMock<MockServiceWatcherClient> delegate; | 319 StrictMock<MockServiceWatcherClient> delegate; |
331 scoped_ptr<ServiceWatcher> watcher( | 320 scoped_ptr<ServiceWatcher> watcher( |
332 service_discovery_client_.CreateServiceWatcher( | 321 service_discovery_client_.CreateServiceWatcher( |
333 "_privet._tcp.local", delegate.GetCallback())); | 322 "_privet._tcp.local", delegate.GetCallback())); |
334 | 323 |
335 watcher->Start(); | 324 watcher->Start(); |
336 | 325 |
337 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, | 326 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_ADDED, |
338 "hello._privet._tcp.local")) | 327 "hello._privet._tcp.local")) |
339 .Times(Exactly(1)); | 328 .Times(Exactly(1)); |
340 | 329 |
341 socket_factory_->SimulateReceive( | 330 socket_factory_.SimulateReceive(kSamplePacketPTR, sizeof(kSamplePacketPTR)); |
342 kSamplePacketPTR, sizeof(kSamplePacketPTR)); | |
343 | 331 |
344 // Reset the "already updated" flag. | 332 // Reset the "already updated" flag. |
345 base::MessageLoop::current()->RunUntilIdle(); | 333 base::MessageLoop::current()->RunUntilIdle(); |
346 | 334 |
347 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_CHANGED, | 335 EXPECT_CALL(delegate, OnServiceUpdated(ServiceWatcher::UPDATE_CHANGED, |
348 "hello._privet._tcp.local")) | 336 "hello._privet._tcp.local")) |
349 .Times(Exactly(1)); | 337 .Times(Exactly(1)); |
350 | 338 |
351 socket_factory_->SimulateReceive( | 339 socket_factory_.SimulateReceive(kSamplePacketSRV, sizeof(kSamplePacketSRV)); |
352 kSamplePacketSRV, sizeof(kSamplePacketSRV)); | |
353 | 340 |
354 socket_factory_->SimulateReceive( | 341 socket_factory_.SimulateReceive(kSamplePacketTXT, sizeof(kSamplePacketTXT)); |
355 kSamplePacketTXT, sizeof(kSamplePacketTXT)); | |
356 | 342 |
357 base::MessageLoop::current()->RunUntilIdle(); | 343 base::MessageLoop::current()->RunUntilIdle(); |
358 }; | 344 }; |
359 | 345 |
360 class ServiceResolverTest : public ServiceDiscoveryTest { | 346 class ServiceResolverTest : public ServiceDiscoveryTest { |
361 public: | 347 public: |
362 ServiceResolverTest() { | 348 ServiceResolverTest() { |
363 metadata_expected_.push_back("hello"); | 349 metadata_expected_.push_back("hello"); |
364 address_expected_ = net::HostPortPair("myhello.local", 8888); | 350 address_expected_ = net::HostPortPair("myhello.local", 8888); |
365 ip_address_expected_.push_back(1); | 351 ip_address_expected_.push_back(1); |
(...skipping 28 matching lines...) Expand all Loading... |
394 | 380 |
395 protected: | 381 protected: |
396 scoped_ptr<ServiceResolver> resolver_; | 382 scoped_ptr<ServiceResolver> resolver_; |
397 net::IPAddressNumber ip_address_; | 383 net::IPAddressNumber ip_address_; |
398 net::HostPortPair address_expected_; | 384 net::HostPortPair address_expected_; |
399 std::vector<std::string> metadata_expected_; | 385 std::vector<std::string> metadata_expected_; |
400 net::IPAddressNumber ip_address_expected_; | 386 net::IPAddressNumber ip_address_expected_; |
401 }; | 387 }; |
402 | 388 |
403 TEST_F(ServiceResolverTest, TxtAndSrvButNoA) { | 389 TEST_F(ServiceResolverTest, TxtAndSrvButNoA) { |
404 EXPECT_CALL(*socket_factory_, OnSendTo(_)) | 390 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(4); |
405 .Times(4); | |
406 | 391 |
407 resolver_->StartResolving(); | 392 resolver_->StartResolving(); |
408 | 393 |
409 socket_factory_->SimulateReceive( | 394 socket_factory_.SimulateReceive(kSamplePacketSRV, sizeof(kSamplePacketSRV)); |
410 kSamplePacketSRV, sizeof(kSamplePacketSRV)); | |
411 | 395 |
412 base::MessageLoop::current()->RunUntilIdle(); | 396 base::MessageLoop::current()->RunUntilIdle(); |
413 | 397 |
414 EXPECT_CALL(*this, | 398 EXPECT_CALL(*this, |
415 OnFinishedResolvingInternal(ServiceResolver::STATUS_SUCCESS, | 399 OnFinishedResolvingInternal(ServiceResolver::STATUS_SUCCESS, |
416 address_expected_.ToString(), | 400 address_expected_.ToString(), |
417 metadata_expected_, | 401 metadata_expected_, |
418 net::IPAddressNumber())); | 402 net::IPAddressNumber())); |
419 | 403 |
420 socket_factory_->SimulateReceive( | 404 socket_factory_.SimulateReceive(kSamplePacketTXT, sizeof(kSamplePacketTXT)); |
421 kSamplePacketTXT, sizeof(kSamplePacketTXT)); | |
422 }; | 405 }; |
423 | 406 |
424 TEST_F(ServiceResolverTest, TxtSrvAndA) { | 407 TEST_F(ServiceResolverTest, TxtSrvAndA) { |
425 EXPECT_CALL(*socket_factory_, OnSendTo(_)) | 408 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(4); |
426 .Times(4); | |
427 | 409 |
428 resolver_->StartResolving(); | 410 resolver_->StartResolving(); |
429 | 411 |
430 EXPECT_CALL(*this, | 412 EXPECT_CALL(*this, |
431 OnFinishedResolvingInternal(ServiceResolver::STATUS_SUCCESS, | 413 OnFinishedResolvingInternal(ServiceResolver::STATUS_SUCCESS, |
432 address_expected_.ToString(), | 414 address_expected_.ToString(), |
433 metadata_expected_, | 415 metadata_expected_, |
434 ip_address_expected_)); | 416 ip_address_expected_)); |
435 | 417 |
436 socket_factory_->SimulateReceive( | 418 socket_factory_.SimulateReceive(kSamplePacketTXT, sizeof(kSamplePacketTXT)); |
437 kSamplePacketTXT, sizeof(kSamplePacketTXT)); | |
438 | 419 |
439 socket_factory_->SimulateReceive( | 420 socket_factory_.SimulateReceive(kSamplePacketSRVA, sizeof(kSamplePacketSRVA)); |
440 kSamplePacketSRVA, sizeof(kSamplePacketSRVA)); | |
441 }; | 421 }; |
442 | 422 |
443 TEST_F(ServiceResolverTest, JustSrv) { | 423 TEST_F(ServiceResolverTest, JustSrv) { |
444 EXPECT_CALL(*socket_factory_, OnSendTo(_)) | 424 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(4); |
445 .Times(4); | |
446 | 425 |
447 resolver_->StartResolving(); | 426 resolver_->StartResolving(); |
448 | 427 |
449 EXPECT_CALL(*this, | 428 EXPECT_CALL(*this, |
450 OnFinishedResolvingInternal(ServiceResolver::STATUS_SUCCESS, | 429 OnFinishedResolvingInternal(ServiceResolver::STATUS_SUCCESS, |
451 address_expected_.ToString(), | 430 address_expected_.ToString(), |
452 std::vector<std::string>(), | 431 std::vector<std::string>(), |
453 ip_address_expected_)); | 432 ip_address_expected_)); |
454 | 433 |
455 socket_factory_->SimulateReceive( | 434 socket_factory_.SimulateReceive(kSamplePacketSRVA, sizeof(kSamplePacketSRVA)); |
456 kSamplePacketSRVA, sizeof(kSamplePacketSRVA)); | |
457 | 435 |
458 // TODO(noamsml): When NSEC record support is added, change this to use an | 436 // TODO(noamsml): When NSEC record support is added, change this to use an |
459 // NSEC record. | 437 // NSEC record. |
460 RunFor(base::TimeDelta::FromSeconds(4)); | 438 RunFor(base::TimeDelta::FromSeconds(4)); |
461 }; | 439 }; |
462 | 440 |
463 TEST_F(ServiceResolverTest, WithNothing) { | 441 TEST_F(ServiceResolverTest, WithNothing) { |
464 EXPECT_CALL(*socket_factory_, OnSendTo(_)) | 442 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(4); |
465 .Times(4); | |
466 | 443 |
467 resolver_->StartResolving(); | 444 resolver_->StartResolving(); |
468 | 445 |
469 EXPECT_CALL(*this, OnFinishedResolvingInternal( | 446 EXPECT_CALL(*this, OnFinishedResolvingInternal( |
470 ServiceResolver::STATUS_REQUEST_TIMEOUT, _, _, _)); | 447 ServiceResolver::STATUS_REQUEST_TIMEOUT, _, _, _)); |
471 | 448 |
472 // TODO(noamsml): When NSEC record support is added, change this to use an | 449 // TODO(noamsml): When NSEC record support is added, change this to use an |
473 // NSEC record. | 450 // NSEC record. |
474 RunFor(base::TimeDelta::FromSeconds(4)); | 451 RunFor(base::TimeDelta::FromSeconds(4)); |
475 }; | 452 }; |
476 | 453 |
477 } // namespace | 454 } // namespace |
478 | 455 |
479 } // namespace local_discovery | 456 } // namespace local_discovery |
OLD | NEW |