Home | History | Annotate | Download | only in mdns
      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.
      4 
      5 #include "base/command_line.h"
      6 #include "chrome/browser/extensions/api/mdns/mdns_api.h"
      7 #include "chrome/browser/extensions/extension_apitest.h"
      8 #include "chrome/browser/extensions/extension_service.h"
      9 #include "chrome/common/chrome_switches.h"
     10 #include "chrome/common/extensions/api/mdns.h"
     11 #include "testing/gmock/include/gmock/gmock.h"
     12 
     13 using extensions::DnsSdRegistry;
     14 using ::testing::A;
     15 using ::testing::_;
     16 
     17 namespace api = extensions::api;
     18 
     19 namespace {
     20 
     21 class MockDnsSdRegistry : public DnsSdRegistry {
     22  public:
     23   explicit MockDnsSdRegistry(extensions::MDnsAPI* api) : api_(api) {}
     24   virtual ~MockDnsSdRegistry() {}
     25 
     26   MOCK_METHOD1(AddObserver, void(DnsSdObserver* observer));
     27   MOCK_METHOD1(RemoveObserver, void(DnsSdObserver* observer));
     28   MOCK_METHOD1(RegisterDnsSdListener, void(std::string service_type));
     29   MOCK_METHOD1(UnregisterDnsSdListener, void(std::string service_type));
     30 
     31   void DispatchMDnsEvent(const std::string& service_type,
     32                          const DnsSdServiceList& services) {
     33     api_->OnDnsSdEvent(service_type, services);
     34   }
     35 
     36  private:
     37   extensions::DnsSdRegistry::DnsSdObserver* api_;
     38 };
     39 
     40 class MDnsAPITest : public ExtensionApiTest {
     41  public:
     42   MDnsAPITest() {}
     43 
     44   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
     45     ExtensionApiTest::SetUpCommandLine(command_line);
     46     command_line->AppendSwitchASCII(
     47         switches::kWhitelistedExtensionID, "ddchlicdkolnonkihahngkmmmjnjlkkf");
     48   }
     49 
     50   void SetUpTestDnsSdRegistry() {
     51     extensions::MDnsAPI* api = extensions::MDnsAPI::Get(profile());
     52     dns_sd_registry_ = new MockDnsSdRegistry(api);
     53     // Transfers ownership of the registry instance.
     54     api->SetDnsSdRegistryForTesting(
     55         make_scoped_ptr<DnsSdRegistry>(dns_sd_registry_).Pass());
     56   }
     57 
     58  protected:
     59   MockDnsSdRegistry* dns_sd_registry_;
     60 };
     61 
     62 }  // namespace
     63 
     64 // TODO(justinlin): Win Dbg has a workaround that makes RunExtensionSubtest
     65 // always return true without actually running the test. Remove when fixed.
     66 #if defined(OS_WIN) && !defined(NDEBUG)
     67 #define MAYBE_RegisterListener DISABLED_RegisterListener
     68 #else
     69 #define MAYBE_RegisterListener RegisterListener
     70 #endif
     71 // Test loading extension, registering an MDNS listener and dispatching events.
     72 IN_PROC_BROWSER_TEST_F(MDnsAPITest, MAYBE_RegisterListener) {
     73   const std::string& service_type = "_googlecast._tcp.local";
     74   SetUpTestDnsSdRegistry();
     75 
     76   EXPECT_CALL(*dns_sd_registry_, RegisterDnsSdListener(service_type))
     77       .Times(1);
     78   EXPECT_CALL(*dns_sd_registry_, UnregisterDnsSdListener(service_type))
     79       .Times(1);
     80   EXPECT_CALL(*dns_sd_registry_,
     81               RemoveObserver(A<extensions::DnsSdRegistry::DnsSdObserver*>()))
     82       .Times(1);
     83 
     84   EXPECT_TRUE(RunExtensionSubtest("mdns/api", "register_listener.html"))
     85       << message_;
     86 
     87   ResultCatcher catcher;
     88   // Dispatch 3 events, one of which should not be sent to the test extension.
     89   DnsSdRegistry::DnsSdServiceList services;
     90 
     91   extensions::DnsSdService service;
     92   service.service_name = service_type;
     93   services.push_back(service);
     94 
     95   dns_sd_registry_->DispatchMDnsEvent(service_type, services);
     96   dns_sd_registry_->DispatchMDnsEvent("_uninteresting._tcp.local", services);
     97   dns_sd_registry_->DispatchMDnsEvent(service_type, services);
     98   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
     99 }
    100 
    101 // TODO(justinlin): Win Dbg has a workaround that makes RunExtensionSubtest
    102 // always return true without actually running the test. Remove when fixed.
    103 #if defined(OS_WIN) && !defined(NDEBUG)
    104 #define MAYBE_RegisterMultipleListeners DISABLED_RegisterMultipleListeners
    105 #else
    106 #define MAYBE_RegisterMultipleListeners RegisterMultipleListeners
    107 #endif
    108 // Test loading extension and registering multiple listeners.
    109 IN_PROC_BROWSER_TEST_F(MDnsAPITest, MAYBE_RegisterMultipleListeners) {
    110   const std::string& service_type = "_googlecast._tcp.local";
    111   const std::string& test_service_type = "_testing._tcp.local";
    112   SetUpTestDnsSdRegistry();
    113 
    114   EXPECT_CALL(*dns_sd_registry_, RegisterDnsSdListener(service_type))
    115       .Times(1);
    116   EXPECT_CALL(*dns_sd_registry_, UnregisterDnsSdListener(service_type))
    117       .Times(1);
    118   EXPECT_CALL(*dns_sd_registry_, RegisterDnsSdListener(test_service_type))
    119       .Times(1);
    120   EXPECT_CALL(*dns_sd_registry_, UnregisterDnsSdListener(test_service_type))
    121       .Times(1);
    122   EXPECT_CALL(*dns_sd_registry_,
    123               RemoveObserver(A<extensions::DnsSdRegistry::DnsSdObserver*>()))
    124       .Times(1);
    125 
    126   EXPECT_TRUE(RunExtensionSubtest("mdns/api",
    127                                   "register_multiple_listeners.html"))
    128       << message_;
    129 
    130   ResultCatcher catcher;
    131   DnsSdRegistry::DnsSdServiceList services;
    132 
    133   extensions::DnsSdService service;
    134   service.service_name = service_type;
    135   services.push_back(service);
    136 
    137   dns_sd_registry_->DispatchMDnsEvent(service_type, services);
    138   dns_sd_registry_->DispatchMDnsEvent(test_service_type, services);
    139   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
    140 }
    141