| 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..3087c27bbb192db26209c13bf7402ac8f61733fb 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,118 @@ 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:
|
| + extensions::EventRouter* CreateEventRouter_() override {
|
| + return new MockEventRouter(
|
| + browser_context(),
|
| + ExtensionPrefsFactory::GetInstance()->GetForBrowserContext(
|
| + browser_context()));
|
| + }
|
| +};
|
| +
|
| +class EventServiceListSizeMatcher :
|
| + public testing::MatcherInterface<const Event&> {
|
| + public:
|
| + explicit EventServiceListSizeMatcher(size_t expected_size)
|
| + : expected_size_(expected_size) {}
|
| +
|
| + 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 static_cast<testing::Matcher<size_t>>(testing::Eq(expected_size_))
|
| + .MatchAndExplain(services->GetSize(), listener);
|
| + }
|
| +
|
| + virtual void DescribeTo(::std::ostream* os) const {
|
| + *os << "is an onServiceList event where the number of services is "
|
| + << expected_size_;
|
| + }
|
| +
|
| + virtual void DescribeNegationTo(::std::ostream* os) const {
|
| + *os << "isn't an onServiceList event where the number of services is "
|
| + << expected_size_;
|
| + }
|
| + private:
|
| + size_t expected_size_;
|
| +};
|
| +
|
| +inline testing::Matcher<const Event&> EventServiceListSize(
|
| + size_t expected_size) {
|
| + return MakeMatcher(new EventServiceListSizeMatcher(expected_size));
|
| +}
|
| +
|
| +TEST_F(MDnsAPIMaxServicesTest, OnServiceListDoesNotExceedLimit) {
|
| + // Get the max number of service instances per event.
|
| + scoped_refptr<MdnsGetMaxServiceInstancesPerEventFunction> f(
|
| + new MdnsGetMaxServiceInstancesPerEventFunction);
|
| + f->Run();
|
| + int max = -1;
|
| + EXPECT_EQ(true, f->GetResultList()->GetInteger(0, &max));
|
| +
|
| + // Dispatch an mDNS event with more service instances than the max, and ensure
|
| + // that the list is truncated by inspecting the argument to MockEventRouter's
|
| + // BroadcastEvent method.
|
| + DnsSdRegistry::DnsSdServiceList services;
|
| + for (int i=0; i < max + 10; ++i) {
|
| + services.push_back(DnsSdService());
|
| + }
|
| + EXPECT_CALL(
|
| + *event_router(),
|
| + BroadcastEventPtr(
|
| + testing::Pointee(EventServiceListSize(size_t(64)))))
|
| + .Times(1);
|
| + dns_sd_registry()->DispatchMDnsEvent("_testing._tcp.local", services);
|
| +}
|
| +
|
| +TEST_F(MDnsAPIMaxServicesTest, MdnsGetMaxServiceInstancesPerEventReturns64) {
|
| + scoped_refptr<MdnsGetMaxServiceInstancesPerEventFunction> f(
|
| + new MdnsGetMaxServiceInstancesPerEventFunction);
|
| + f->Run();
|
| + EXPECT_TRUE(f->GetResultList());
|
| + EXPECT_EQ(static_cast<const unsigned long>(1), f->GetResultList()->GetSize());
|
| + int max = -1;
|
| + EXPECT_EQ(true, f->GetResultList()->GetInteger(0, &max));
|
| + EXPECT_EQ(64, max);
|
| +}
|
| +
|
| } // empty namespace
|
|
|
| } // namespace extensions
|
|
|