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 "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 extensions::switches::kWhitelistedExtensionID, 48 "ddchlicdkolnonkihahngkmmmjnjlkkf"); 49 } 50 51 void SetUpTestDnsSdRegistry() { 52 extensions::MDnsAPI* api = extensions::MDnsAPI::Get(profile()); 53 dns_sd_registry_ = new MockDnsSdRegistry(api); 54 // Transfers ownership of the registry instance. 55 api->SetDnsSdRegistryForTesting( 56 make_scoped_ptr<DnsSdRegistry>(dns_sd_registry_).Pass()); 57 } 58 59 protected: 60 MockDnsSdRegistry* dns_sd_registry_; 61 }; 62 63 } // namespace 64 65 // TODO(justinlin): Win Dbg has a workaround that makes RunExtensionSubtest 66 // always return true without actually running the test. Remove when fixed. 67 #if defined(OS_WIN) && !defined(NDEBUG) 68 #define MAYBE_RegisterListener DISABLED_RegisterListener 69 #else 70 #define MAYBE_RegisterListener RegisterListener 71 #endif 72 // Test loading extension, registering an MDNS listener and dispatching events. 73 IN_PROC_BROWSER_TEST_F(MDnsAPITest, MAYBE_RegisterListener) { 74 const std::string& service_type = "_googlecast._tcp.local"; 75 SetUpTestDnsSdRegistry(); 76 77 EXPECT_CALL(*dns_sd_registry_, RegisterDnsSdListener(service_type)) 78 .Times(1); 79 EXPECT_CALL(*dns_sd_registry_, UnregisterDnsSdListener(service_type)) 80 .Times(1); 81 EXPECT_CALL(*dns_sd_registry_, 82 RemoveObserver(A<extensions::DnsSdRegistry::DnsSdObserver*>())) 83 .Times(1); 84 85 EXPECT_TRUE(RunExtensionSubtest("mdns/api", "register_listener.html")) 86 << message_; 87 88 ResultCatcher catcher; 89 // Dispatch 3 events, one of which should not be sent to the test extension. 90 DnsSdRegistry::DnsSdServiceList services; 91 92 extensions::DnsSdService service; 93 service.service_name = service_type; 94 services.push_back(service); 95 96 dns_sd_registry_->DispatchMDnsEvent(service_type, services); 97 dns_sd_registry_->DispatchMDnsEvent("_uninteresting._tcp.local", services); 98 dns_sd_registry_->DispatchMDnsEvent(service_type, services); 99 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 100 } 101 102 // TODO(justinlin): Win Dbg has a workaround that makes RunExtensionSubtest 103 // always return true without actually running the test. Remove when fixed. 104 #if defined(OS_WIN) && !defined(NDEBUG) 105 #define MAYBE_RegisterMultipleListeners DISABLED_RegisterMultipleListeners 106 #else 107 #define MAYBE_RegisterMultipleListeners RegisterMultipleListeners 108 #endif 109 // Test loading extension and registering multiple listeners. 110 IN_PROC_BROWSER_TEST_F(MDnsAPITest, MAYBE_RegisterMultipleListeners) { 111 const std::string& service_type = "_googlecast._tcp.local"; 112 const std::string& test_service_type = "_testing._tcp.local"; 113 SetUpTestDnsSdRegistry(); 114 115 EXPECT_CALL(*dns_sd_registry_, RegisterDnsSdListener(service_type)) 116 .Times(1); 117 EXPECT_CALL(*dns_sd_registry_, UnregisterDnsSdListener(service_type)) 118 .Times(1); 119 EXPECT_CALL(*dns_sd_registry_, RegisterDnsSdListener(test_service_type)) 120 .Times(1); 121 EXPECT_CALL(*dns_sd_registry_, UnregisterDnsSdListener(test_service_type)) 122 .Times(1); 123 EXPECT_CALL(*dns_sd_registry_, 124 RemoveObserver(A<extensions::DnsSdRegistry::DnsSdObserver*>())) 125 .Times(1); 126 127 EXPECT_TRUE(RunExtensionSubtest("mdns/api", 128 "register_multiple_listeners.html")) 129 << message_; 130 131 ResultCatcher catcher; 132 DnsSdRegistry::DnsSdServiceList services; 133 134 extensions::DnsSdService service; 135 service.service_name = service_type; 136 services.push_back(service); 137 138 dns_sd_registry_->DispatchMDnsEvent(service_type, services); 139 dns_sd_registry_->DispatchMDnsEvent(test_service_type, services); 140 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 141 } 142