Chromium Code Reviews| Index: chrome/browser/extensions/api/mdns/mdns_api_unittest.cc |
| diff --git a/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc b/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc |
| index ede2a2b50d4a03491f54e9f4e8e34ff72d3e852d..6ad54dc541fe67b8e120f497b029213a5c21b48b 100644 |
| --- a/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc |
| +++ b/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc |
| @@ -63,10 +63,7 @@ class MDnsAPITest : public extensions::ExtensionServiceTestBase { |
| MDnsAPITestingFactoryFunction); |
| // Create an event router and associate it with the context. |
| - extensions::EventRouter* event_router = new extensions::EventRouter( |
| - browser_context(), |
| - ExtensionPrefsFactory::GetInstance()->GetForBrowserContext( |
| - browser_context())); |
| + extensions::EventRouter* event_router = CreateEventRouter_(); |
| static_cast<TestExtensionSystem*>( |
| ExtensionSystem::Get(browser_context()))->SetEventRouter( |
| scoped_ptr<extensions::EventRouter>(event_router)); |
| @@ -133,6 +130,14 @@ class MDnsAPITest : public extensions::ExtensionServiceTestBase { |
| return render_process_host_.get(); |
| } |
| + protected: |
| + virtual extensions::EventRouter* CreateEventRouter_() { |
| + return new extensions::EventRouter( |
| + browser_context(), |
| + ExtensionPrefsFactory::GetInstance()->GetForBrowserContext( |
| + browser_context())); |
| + } |
| + |
| private: |
| // The registry is owned by MDnsAPI, but MDnsAPI does not have an accessor |
| // for it, so use a private member. |
| @@ -212,6 +217,100 @@ TEST_F(MDnsAPITest, PlatformAppsNotSubjectToWhitelist) { |
| filter, false); |
| } |
| +class MockEventRouter : public EventRouter { |
| + public: |
| + explicit MockEventRouter(content::BrowserContext* browser_context, |
| + ExtensionPrefs* extension_prefs) : |
| + EventRouter(browser_context, extension_prefs) {} |
| + virtual ~MockEventRouter() {} |
| + |
| + virtual void BroadcastEvent(scoped_ptr<Event> event) { |
| + BroadcastEventPtr(event.get()); |
| + } |
| + MOCK_METHOD1(BroadcastEventPtr, void(Event* event)); |
| +}; |
| + |
| +class MDnsAPIMaxServicesTest : public MDnsAPITest { |
| + public: |
| + MockEventRouter* event_router() { |
| + return static_cast<MockEventRouter*>(EventRouter::Get(browser_context())); |
| + } |
| + protected: |
| + virtual extensions::EventRouter* CreateEventRouter_() override { |
| + return new MockEventRouter( |
| + browser_context(), |
| + ExtensionPrefsFactory::GetInstance()->GetForBrowserContext( |
| + browser_context())); |
| + } |
| +}; |
| + |
| +class EventServiceListSizeMatcher : |
| + public testing::MatcherInterface<const Event&> { |
| + public: |
| + explicit EventServiceListSizeMatcher(const testing::Matcher<size_t>& m) |
| + : service_count_matcher_(m) {} |
| + |
| + virtual bool MatchAndExplain(const Event& e, |
| + testing::MatchResultListener* listener) const { |
| + if (e.event_args.get() == nullptr) { |
| + *listener << "event.event_arg is null when it shouldn't be"; |
| + return false; |
| + } |
| + if (e.event_args->GetSize() != 1) { |
| + *listener << "event.event_arg.GetSize() should be 1 but is " |
| + << e.event_args->GetSize(); |
| + return false; |
| + } |
| + const base::ListValue* services = nullptr; |
| + { |
| + const base::Value* out; |
| + e.event_args->Get(0, &out); |
| + services = static_cast<const base::ListValue*>(out); |
| + } |
| + if (services == nullptr) { |
| + *listener << "event's service list argument is not a ListValue"; |
| + return false; |
| + } |
| + *listener << "number of services is " |
| + << services->GetSize() |
| + return service_count_matcher_.MatchAndExplain(services->GetSize(), |
|
mark a. foltz
2015/03/30 17:57:22
It seems like all you really care about is whether
Red Daly
2015/03/31 19:23:50
I think SizeIs() only works with stl containers, n
|
| + listener); |
| + } |
| + |
| + virtual void DescribeTo(::std::ostream* os) const { |
| + *os << "is an onServiceList event where the number of services "; |
| + service_count_matcher_.DescribeTo(os); |
| + } |
| + |
| + virtual void DescribeNegationTo(::std::ostream* os) const { |
| + *os << "isn't an onServiceList event where the number of services "; |
| + service_count_matcher_.DescribeTo(os); |
| + } |
| + private: |
| + testing::Matcher<size_t> service_count_matcher_; |
| +}; |
| + |
| +inline testing::Matcher<const Event&> EventServiceListSize( |
| + const testing::Matcher<size_t>& m) { |
| + return MakeMatcher(new EventServiceListSizeMatcher(m)); |
| +} |
| + |
| +TEST_F(MDnsAPIMaxServicesTest, OnServiceListDoesNotExceedLimit) { |
| + // Dispatch an mDNS event with more service instances than |
| + // kMaxServicesPerOnServiceListEvent, and ensure that the list is truncated by |
| + // inspecting the argument to MockEventRouter's BroadcastEvent method. |
| + DnsSdRegistry::DnsSdServiceList services; |
| + for (int i=0; i < 80; ++i) { |
|
not at google - send to devlin
2015/03/30 17:08:50
when it's a shared constant, use that rather than
Red Daly
2015/03/31 19:23:50
Done, except it is a new function rather than a sh
|
| + services.push_back(DnsSdService()); |
| + } |
| + EXPECT_CALL( |
| + *event_router(), |
| + BroadcastEventPtr( |
| + testing::Pointee(EventServiceListSize(testing::Eq(size_t(64)))))) |
| + .Times(1); |
|
not at google - send to devlin
2015/03/30 17:08:50
I dunno - a mock here seems pretty complex and ove
Red Daly
2015/03/31 19:23:50
The MDnsAPI object does not hold onto the event it
|
| + dns_sd_registry()->DispatchMDnsEvent("_testing._tcp.local", services); |
| +} |
| + |
| } // empty namespace |
| } // namespace extensions |