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
3 // found in the LICENSE file.
5 #include "chrome/browser/extensions/api/mdns/dns_sd_registry.h"
6 #include "chrome/browser/extensions/api/mdns/dns_sd_delegate.h"
7 #include "chrome/browser/extensions/api/mdns/dns_sd_device_lister.h"
8 #include "chrome/browser/local_discovery/service_discovery_host_client.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
12 namespace extensions {
14 class MockDnsSdDeviceLister : public DnsSdDeviceLister {
16 MockDnsSdDeviceLister() : DnsSdDeviceLister(NULL, NULL, "") {}
17 virtual ~MockDnsSdDeviceLister() {}
19 virtual void Discover(bool force_update) OVERRIDE {}
22 class TestDnsSdRegistry : public DnsSdRegistry {
24 TestDnsSdRegistry() : DnsSdRegistry(NULL), delegate_(NULL) {}
25 virtual ~TestDnsSdRegistry() {}
27 MockDnsSdDeviceLister* GetListerForService(const std::string& service_type) {
28 return listers_[service_type];
31 int GetServiceListenerCount(const std::string& service_type) {
32 if (service_data_map_.find(service_type) == service_data_map_.end())
35 return service_data_map_[service_type].get()->GetListenerCount();
38 DnsSdDelegate* GetDelegate() {
43 virtual DnsSdDeviceLister* CreateDnsSdDeviceLister(
44 DnsSdDelegate* delegate,
45 const std::string& service_type,
46 local_discovery::ServiceDiscoverySharedClient* discovery_client)
49 MockDnsSdDeviceLister* lister = new MockDnsSdDeviceLister();
50 listers_[service_type] = lister;
55 std::map<std::string, MockDnsSdDeviceLister*> listers_;
56 // The last delegate used or NULL.
57 DnsSdDelegate* delegate_;
60 class MockDnsSdObserver : public DnsSdRegistry::DnsSdObserver {
62 MOCK_METHOD2(OnDnsSdEvent, void(const std::string&,
63 const DnsSdRegistry::DnsSdServiceList&));
66 class DnsSdRegistryTest : public testing::Test {
68 DnsSdRegistryTest() {}
69 virtual ~DnsSdRegistryTest() {}
71 virtual void SetUp() OVERRIDE {
72 registry_.reset(new TestDnsSdRegistry());
73 registry_->AddObserver(&observer_);
77 scoped_ptr<TestDnsSdRegistry> registry_;
78 MockDnsSdObserver observer_;
81 // Tests registering 2 listeners and removing one. The device lister should
83 TEST_F(DnsSdRegistryTest, RegisterUnregisterListeners) {
84 const std::string service_type = "_testing._tcp.local";
86 EXPECT_CALL(observer_, OnDnsSdEvent(service_type,
87 DnsSdRegistry::DnsSdServiceList())).Times(2);
89 registry_->RegisterDnsSdListener(service_type);
90 registry_->RegisterDnsSdListener(service_type);
91 registry_->UnregisterDnsSdListener(service_type);
92 EXPECT_EQ(1, registry_->GetServiceListenerCount(service_type));
94 registry_->UnregisterDnsSdListener(service_type);
95 EXPECT_EQ(0, registry_->GetServiceListenerCount(service_type));
98 // Tests registering a listener and receiving an added and updated event.
99 TEST_F(DnsSdRegistryTest, AddAndUpdate) {
100 const std::string service_type = "_testing._tcp.local";
101 const std::string ip_address1 = "192.168.0.100";
102 const std::string ip_address2 = "192.168.0.101";
104 DnsSdService service;
105 service.service_name = "_myDevice." + service_type;
106 service.ip_address = ip_address1;
108 DnsSdRegistry::DnsSdServiceList service_list;
110 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
112 // Add first service.
113 service_list.push_back(service);
114 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
116 // Clear services and add same one with different IP address.
117 service_list.clear();
118 service.ip_address = ip_address2;
119 service_list.push_back(service);
120 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
122 registry_->RegisterDnsSdListener(service_type);
123 service.ip_address = ip_address1;
124 registry_->GetDelegate()->ServiceChanged(service_type, true, service);
125 service.ip_address = ip_address2;
126 registry_->GetDelegate()->ServiceChanged(service_type, false, service);
129 // Tests registering a listener and receiving an added and removed event.
130 TEST_F(DnsSdRegistryTest, AddAndRemove) {
131 const std::string service_type = "_testing._tcp.local";
133 DnsSdService service;
134 service.service_name = "_myDevice." + service_type;
135 service.ip_address = "192.168.0.100";
137 DnsSdRegistry::DnsSdServiceList service_list;
138 // Expect to be called twice with empty list (once on register, once after
140 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)).Times(2);
141 service_list.push_back(service);
142 // Expect to be called twice with 1 item (once after adding, once after adding
143 // again after removal).
144 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list)).Times(2);
146 registry_->RegisterDnsSdListener(service_type);
147 registry_->GetDelegate()->ServiceChanged(service_type, true, service);
148 registry_->GetDelegate()->ServiceRemoved(service_type, service.service_name);
149 registry_->GetDelegate()->ServiceChanged(service_type, true, service);
152 // Tests adding multiple services.
153 TEST_F(DnsSdRegistryTest, AddMultipleServices) {
154 const std::string service_type = "_testing._tcp.local";
156 DnsSdService service;
157 service.service_name = "_myDevice." + service_type;
158 service.ip_address = "192.168.0.100";
160 DnsSdService service2;
161 service.service_name = "_myDevice2." + service_type;
162 service.ip_address = "192.168.0.101";
164 DnsSdRegistry::DnsSdServiceList service_list;
165 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
166 service_list.push_back(service);
167 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
168 service_list.push_back(service2);
169 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
171 registry_->RegisterDnsSdListener(service_type);
172 registry_->GetDelegate()->ServiceChanged(service_type, true, service);
173 registry_->GetDelegate()->ServiceChanged(service_type, true, service2);
176 // Tests adding multiple services and handling a flush event.
177 TEST_F(DnsSdRegistryTest, FlushCache) {
178 testing::InSequence s;
179 const std::string service_type = "_testing._tcp.local";
181 DnsSdService service;
182 service.service_name = "_myDevice." + service_type;
183 service.ip_address = "192.168.0.100";
185 DnsSdService service2;
186 service.service_name = "_myDevice2." + service_type;
187 service.ip_address = "192.168.0.101";
189 DnsSdRegistry::DnsSdServiceList service_list;
190 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
191 service_list.push_back(service);
192 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
193 service_list.push_back(service2);
194 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
195 service_list.clear();
196 EXPECT_CALL(observer_, OnDnsSdEvent(service_type, service_list));
198 registry_->RegisterDnsSdListener(service_type);
199 registry_->GetDelegate()->ServiceChanged(service_type, true, service);
200 registry_->GetDelegate()->ServiceChanged(service_type, true, service2);
201 registry_->GetDelegate()->ServicesFlushed(service_type);
205 } // namespace extensions