OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/extensions/api/mdns/mdns_api.h" | 5 #include "chrome/browser/extensions/api/mdns/mdns_api.h" |
6 #include "chrome/browser/extensions/extension_service.h" | 6 #include "chrome/browser/extensions/extension_service.h" |
7 #include "chrome/browser/extensions/extension_service_test_base.h" | 7 #include "chrome/browser/extensions/extension_service_test_base.h" |
8 #include "chrome/browser/extensions/test_extension_system.h" | 8 #include "chrome/browser/extensions/test_extension_system.h" |
9 #include "chrome/common/extensions/api/mdns.h" | 9 #include "chrome/common/extensions/api/mdns.h" |
10 #include "content/public/browser/browser_context.h" | 10 #include "content/public/browser/browser_context.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
56 // Set up browser_context(). | 56 // Set up browser_context(). |
57 InitializeEmptyExtensionService(); | 57 InitializeEmptyExtensionService(); |
58 | 58 |
59 // A custom TestingFactoryFunction is required for an MDnsAPI to actually be | 59 // A custom TestingFactoryFunction is required for an MDnsAPI to actually be |
60 // constructed. | 60 // constructed. |
61 MDnsAPI::GetFactoryInstance()->SetTestingFactory( | 61 MDnsAPI::GetFactoryInstance()->SetTestingFactory( |
62 browser_context(), | 62 browser_context(), |
63 MDnsAPITestingFactoryFunction); | 63 MDnsAPITestingFactoryFunction); |
64 | 64 |
65 // Create an event router and associate it with the context. | 65 // Create an event router and associate it with the context. |
66 extensions::EventRouter* event_router = new extensions::EventRouter( | 66 extensions::EventRouter* event_router = CreateEventRouter_(); |
67 browser_context(), | |
68 ExtensionPrefsFactory::GetInstance()->GetForBrowserContext( | |
69 browser_context())); | |
70 static_cast<TestExtensionSystem*>( | 67 static_cast<TestExtensionSystem*>( |
71 ExtensionSystem::Get(browser_context()))->SetEventRouter( | 68 ExtensionSystem::Get(browser_context()))->SetEventRouter( |
72 scoped_ptr<extensions::EventRouter>(event_router)); | 69 scoped_ptr<extensions::EventRouter>(event_router)); |
73 | 70 |
74 // Do some sanity checking | 71 // Do some sanity checking |
75 ASSERT_EQ(event_router, EventRouter::Get(browser_context())); | 72 ASSERT_EQ(event_router, EventRouter::Get(browser_context())); |
76 ASSERT_TRUE(MDnsAPI::Get(browser_context())); // constructs MDnsAPI | 73 ASSERT_TRUE(MDnsAPI::Get(browser_context())); // constructs MDnsAPI |
77 | 74 |
78 registry_ = new MockDnsSdRegistry(MDnsAPI::Get(browser_context())); | 75 registry_ = new MockDnsSdRegistry(MDnsAPI::Get(browser_context())); |
79 EXPECT_CALL(*dns_sd_registry(), | 76 EXPECT_CALL(*dns_sd_registry(), |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 manifest, | 123 manifest, |
127 Extension::NO_FLAGS, | 124 Extension::NO_FLAGS, |
128 extension_id, | 125 extension_id, |
129 &error); | 126 &error); |
130 } | 127 } |
131 | 128 |
132 content::RenderProcessHost* render_process_host() const { | 129 content::RenderProcessHost* render_process_host() const { |
133 return render_process_host_.get(); | 130 return render_process_host_.get(); |
134 } | 131 } |
135 | 132 |
133 protected: | |
134 virtual extensions::EventRouter* CreateEventRouter_() { | |
135 return new extensions::EventRouter( | |
136 browser_context(), | |
137 ExtensionPrefsFactory::GetInstance()->GetForBrowserContext( | |
138 browser_context())); | |
139 } | |
140 | |
136 private: | 141 private: |
137 // The registry is owned by MDnsAPI, but MDnsAPI does not have an accessor | 142 // The registry is owned by MDnsAPI, but MDnsAPI does not have an accessor |
138 // for it, so use a private member. | 143 // for it, so use a private member. |
139 MockDnsSdRegistry* registry_; | 144 MockDnsSdRegistry* registry_; |
140 | 145 |
141 scoped_ptr<content::RenderProcessHost> render_process_host_; | 146 scoped_ptr<content::RenderProcessHost> render_process_host_; |
142 | 147 |
143 }; | 148 }; |
144 | 149 |
145 TEST_F(MDnsAPITest, ExtensionRespectsWhitelist) { | 150 TEST_F(MDnsAPITest, ExtensionRespectsWhitelist) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 EventRouter::Get(browser_context())->AddFilteredEventListener( | 210 EventRouter::Get(browser_context())->AddFilteredEventListener( |
206 api::mdns::OnServiceList::kEventName, render_process_host(), ext_id, | 211 api::mdns::OnServiceList::kEventName, render_process_host(), ext_id, |
207 filter, false); | 212 filter, false); |
208 | 213 |
209 EXPECT_CALL(*dns_sd_registry(), UnregisterDnsSdListener("_trex._tcp.local")); | 214 EXPECT_CALL(*dns_sd_registry(), UnregisterDnsSdListener("_trex._tcp.local")); |
210 EventRouter::Get(browser_context())->RemoveFilteredEventListener( | 215 EventRouter::Get(browser_context())->RemoveFilteredEventListener( |
211 api::mdns::OnServiceList::kEventName, render_process_host(), ext_id, | 216 api::mdns::OnServiceList::kEventName, render_process_host(), ext_id, |
212 filter, false); | 217 filter, false); |
213 } | 218 } |
214 | 219 |
220 class MockEventRouter : public EventRouter { | |
221 public: | |
222 explicit MockEventRouter(content::BrowserContext* browser_context, | |
223 ExtensionPrefs* extension_prefs) : | |
224 EventRouter(browser_context, extension_prefs) {} | |
225 virtual ~MockEventRouter() {} | |
226 | |
227 virtual void BroadcastEvent(scoped_ptr<Event> event) { | |
228 BroadcastEventPtr(event.get()); | |
229 } | |
230 MOCK_METHOD1(BroadcastEventPtr, void(Event* event)); | |
231 }; | |
232 | |
233 class MDnsAPIMaxServicesTest : public MDnsAPITest { | |
234 public: | |
235 MockEventRouter* event_router() { | |
236 return static_cast<MockEventRouter*>(EventRouter::Get(browser_context())); | |
237 } | |
238 protected: | |
239 extensions::EventRouter* CreateEventRouter_() override { | |
240 return new MockEventRouter( | |
241 browser_context(), | |
242 ExtensionPrefsFactory::GetInstance()->GetForBrowserContext( | |
243 browser_context())); | |
244 } | |
245 }; | |
246 | |
247 class EventServiceListSizeMatcher : | |
248 public testing::MatcherInterface<const Event&> { | |
249 public: | |
250 explicit EventServiceListSizeMatcher(size_t expected_size) | |
251 : expected_size_(expected_size) {} | |
252 | |
253 virtual bool MatchAndExplain(const Event& e, | |
254 testing::MatchResultListener* listener) const { | |
255 if (e.event_args.get() == nullptr) { | |
256 *listener << "event.event_arg is null when it shouldn't be"; | |
257 return false; | |
258 } | |
259 if (e.event_args->GetSize() != 1) { | |
260 *listener << "event.event_arg.GetSize() should be 1 but is " | |
261 << e.event_args->GetSize(); | |
262 return false; | |
263 } | |
264 const base::ListValue* services = nullptr; | |
265 { | |
266 const base::Value* out; | |
267 e.event_args->Get(0, &out); | |
268 services = static_cast<const base::ListValue*>(out); | |
269 } | |
270 if (services == nullptr) { | |
271 *listener << "event's service list argument is not a ListValue"; | |
272 return false; | |
273 } | |
274 *listener << "number of services is " | |
275 << services->GetSize(); | |
276 return static_cast<testing::Matcher<size_t>>(testing::Eq(expected_size_)) | |
277 .MatchAndExplain(services->GetSize(), listener); | |
278 } | |
279 | |
280 virtual void DescribeTo(::std::ostream* os) const { | |
281 *os << "is an onServiceList event where the number of services is " | |
282 << expected_size_; | |
283 } | |
284 | |
285 virtual void DescribeNegationTo(::std::ostream* os) const { | |
286 *os << "isn't an onServiceList event where the number of services is " | |
287 << expected_size_; | |
288 } | |
289 private: | |
290 size_t expected_size_; | |
291 }; | |
292 | |
293 inline testing::Matcher<const Event&> EventServiceListSize( | |
294 size_t expected_size) { | |
295 return MakeMatcher(new EventServiceListSizeMatcher(expected_size)); | |
296 } | |
297 | |
298 TEST_F(MDnsAPIMaxServicesTest, OnServiceListDoesNotExceedLimit) { | |
299 // This check should change when the [value=64] changes in the IDL file. | |
300 EXPECT_EQ(64, api::mdns::MAX_SERVICE_INSTANCES_PER_EVENT); | |
301 | |
302 // Dispatch an mDNS event with more service instances than the max, and ensure | |
303 // that the list is truncated by inspecting the argument to MockEventRouter's | |
304 // BroadcastEvent method. | |
305 DnsSdRegistry::DnsSdServiceList services; | |
306 for (int i=0; i < api::mdns::MAX_SERVICE_INSTANCES_PER_EVENT + 10; ++i) { | |
307 services.push_back(DnsSdService()); | |
308 } | |
309 EXPECT_CALL( | |
310 *event_router(), | |
311 BroadcastEventPtr( | |
312 testing::Pointee(EventServiceListSize(size_t(64))))) | |
mark a. foltz
2015/04/03 23:26:40
I thought we just needed a regular matcher like te
Red Daly
2015/04/04 00:56:15
I would prefer a simpler matcher but couldn't figu
| |
313 .Times(1); | |
314 dns_sd_registry()->DispatchMDnsEvent("_testing._tcp.local", services); | |
315 } | |
316 | |
215 } // empty namespace | 317 } // empty namespace |
216 | 318 |
217 } // namespace extensions | 319 } // namespace extensions |
OLD | NEW |