158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/mdns/dns_sd_registry.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/mdns/dns_sd_delegate.h" 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/mdns/dns_sd_device_lister.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions { 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MockDnsSdDeviceLister : public DnsSdDeviceLister { 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockDnsSdDeviceLister() : DnsSdDeviceLister(NULL, NULL, "") {} 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~MockDnsSdDeviceLister() {} 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void Discover(bool force_update) OVERRIDE {} 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class TestDnsSdRegistry : public DnsSdRegistry { 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestDnsSdRegistry() : DnsSdRegistry(NULL), delegate_(NULL) {} 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~TestDnsSdRegistry() {} 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockDnsSdDeviceLister* GetListerForService(const std::string& service_type) { 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return listers_[service_type]; 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int GetServiceListenerCount(const std::string& service_type) { 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (service_data_map_.find(service_type) == service_data_map_.end()) 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 0; 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return service_data_map_[service_type].get()->GetListenerCount(); 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdDelegate* GetDelegate() { 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return delegate_; 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual DnsSdDeviceLister* CreateDnsSdDeviceLister( 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdDelegate* delegate, 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& service_type, 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) local_discovery::ServiceDiscoverySharedClient* discovery_client) 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) OVERRIDE { 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) delegate_ = delegate; 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockDnsSdDeviceLister* lister = new MockDnsSdDeviceLister(); 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) listers_[service_type] = lister; 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return lister; 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::map<std::string, MockDnsSdDeviceLister*> listers_; 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The last delegate used or NULL. 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdDelegate* delegate_; 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MockDnsSdObserver : public DnsSdRegistry::DnsSdObserver { 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MOCK_METHOD2(OnDnsSdEvent, void(const std::string&, 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const DnsSdRegistry::DnsSdServiceList&)); 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DnsSdRegistryTest : public testing::Test { 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistryTest() {} 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~DnsSdRegistryTest() {} 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetUp() OVERRIDE { 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_.reset(new TestDnsSdRegistry()); 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->AddObserver(&observer_); 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<TestDnsSdRegistry> registry_; 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockDnsSdObserver observer_; 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Tests registering 2 listeners and removing one. The device lister should 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// not be destroyed. 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DnsSdRegistryTest, RegisterUnregisterListeners) { 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string service_type = "_testing._tcp.local"; 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistry::DnsSdServiceList())).Times(2); 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->UnregisterDnsSdListener(service_type); 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, registry_->GetServiceListenerCount(service_type)); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->UnregisterDnsSdListener(service_type); 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, registry_->GetServiceListenerCount(service_type)); 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Tests registering a listener and receiving an added and updated event. 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DnsSdRegistryTest, AddAndUpdate) { 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string service_type = "_testing._tcp.local"; 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string ip_address1 = "192.168.0.100"; 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string ip_address2 = "192.168.0.101"; 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdService service; 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.service_name = "_myDevice." + service_type; 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = ip_address1; 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistry::DnsSdServiceList service_list; 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Add first service. 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_list.push_back(service); 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Clear services and add same one with different IP address. 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_list.clear(); 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = ip_address2; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_list.push_back(service); 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = ip_address1; 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service); 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = ip_address2; 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, false, service); 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Tests registering a listener and receiving an added and removed event. 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DnsSdRegistryTest, AddAndRemove) { 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string service_type = "_testing._tcp.local"; 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdService service; 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.service_name = "_myDevice." + service_type; 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = "192.168.0.100"; 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistry::DnsSdServiceList service_list; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect to be called twice with empty list (once on register, once after 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // removing). 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)).Times(2); 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_list.push_back(service); 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect to be called twice with 1 item (once after adding, once after adding 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // again after removal). 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)).Times(2); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service); 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceRemoved(service_type, service.service_name); 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service); 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Tests adding multiple services. 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DnsSdRegistryTest, AddMultipleServices) { 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string service_type = "_testing._tcp.local"; 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdService service; 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.service_name = "_myDevice." + service_type; 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = "192.168.0.100"; 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdService service2; 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.service_name = "_myDevice2." + service_type; 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service.ip_address = "192.168.0.101"; 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdRegistry::DnsSdServiceList service_list; 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_list.push_back(service); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service_list.push_back(service2); 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service); 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service2); 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Tests adding multiple services and handling a flush event. 1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DnsSdRegistryTest, FlushCache) { 1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) testing::InSequence s; 1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string service_type = "_testing._tcp.local"; 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DnsSdService service; 1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service.service_name = "_myDevice." + service_type; 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service.ip_address = "192.168.0.100"; 1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DnsSdService service2; 1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service.service_name = "_myDevice2." + service_type; 1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service.ip_address = "192.168.0.101"; 1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DnsSdRegistry::DnsSdServiceList service_list; 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service_list.push_back(service); 1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service_list.push_back(service2); 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service_list.clear(); 1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service); 1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service2); 2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) registry_->GetDelegate()->ServicesFlushed(service_type); 2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests receiving an update from the DnsSdDelegate that does not change the 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// service object does not notify the observer. 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DnsSdRegistryTest, UpdateOnlyIfChanged) { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string service_type = "_testing._tcp.local"; 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string ip_address = "192.168.0.100"; 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DnsSdService service; 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service.service_name = "_myDevice." + service_type; 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service.ip_address = ip_address; 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DnsSdRegistry::DnsSdServiceList service_list; 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Expect service_list with initial service. 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service_list.push_back(service); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Expect service_list with updated service. 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service_list.clear(); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service.ip_address = "192.168.0.101"; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service_list.push_back(service); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // No more calls to observer_. 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry_->RegisterDnsSdListener(service_type); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service.ip_address = "192.168.0.100"; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, true, service); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Update with changed ip address. 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service.ip_address = "192.168.0.101"; 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, false, service); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Update with no changes to the service. 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry_->GetDelegate()->ServiceChanged(service_type, false, service); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace extensions 238