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