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