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