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.
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"
13 using extensions::DnsSdRegistry
;
17 namespace api
= extensions::api
;
21 class MockDnsSdRegistry
: public DnsSdRegistry
{
23 explicit MockDnsSdRegistry(extensions::MDnsAPI
* api
) : api_(api
) {}
24 virtual ~MockDnsSdRegistry() {}
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
));
31 void DispatchMDnsEvent(const std::string
& service_type
,
32 const DnsSdServiceList
& services
) {
33 api_
->OnDnsSdEvent(service_type
, services
);
37 extensions::DnsSdRegistry::DnsSdObserver
* api_
;
40 class MDnsAPITest
: public ExtensionApiTest
{
44 virtual void SetUpCommandLine(CommandLine
* command_line
) OVERRIDE
{
45 ExtensionApiTest::SetUpCommandLine(command_line
);
46 command_line
->AppendSwitchASCII(
47 extensions::switches::kWhitelistedExtensionID
,
48 "ddchlicdkolnonkihahngkmmmjnjlkkf");
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());
60 MockDnsSdRegistry
* dns_sd_registry_
;
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
70 #define MAYBE_RegisterListener RegisterListener
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();
77 EXPECT_CALL(*dns_sd_registry_
, RegisterDnsSdListener(service_type
))
79 EXPECT_CALL(*dns_sd_registry_
, UnregisterDnsSdListener(service_type
))
81 EXPECT_CALL(*dns_sd_registry_
,
82 RemoveObserver(A
<extensions::DnsSdRegistry::DnsSdObserver
*>()))
85 EXPECT_TRUE(RunExtensionSubtest("mdns/api", "register_listener.html"))
88 ResultCatcher catcher
;
89 // Dispatch 3 events, one of which should not be sent to the test extension.
90 DnsSdRegistry::DnsSdServiceList services
;
92 extensions::DnsSdService service
;
93 service
.service_name
= service_type
;
94 services
.push_back(service
);
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();
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
107 #define MAYBE_RegisterMultipleListeners RegisterMultipleListeners
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();
115 EXPECT_CALL(*dns_sd_registry_
, RegisterDnsSdListener(service_type
))
117 EXPECT_CALL(*dns_sd_registry_
, UnregisterDnsSdListener(service_type
))
119 EXPECT_CALL(*dns_sd_registry_
, RegisterDnsSdListener(test_service_type
))
121 EXPECT_CALL(*dns_sd_registry_
, UnregisterDnsSdListener(test_service_type
))
123 EXPECT_CALL(*dns_sd_registry_
,
124 RemoveObserver(A
<extensions::DnsSdRegistry::DnsSdObserver
*>()))
127 EXPECT_TRUE(RunExtensionSubtest("mdns/api",
128 "register_multiple_listeners.html"))
131 ResultCatcher catcher
;
132 DnsSdRegistry::DnsSdServiceList services
;
134 extensions::DnsSdService service
;
135 service
.service_name
= service_type
;
136 services
.push_back(service
);
138 dns_sd_registry_
->DispatchMDnsEvent(service_type
, services
);
139 dns_sd_registry_
->DispatchMDnsEvent(test_service_type
, services
);
140 EXPECT_TRUE(catcher
.GetNextResult()) << catcher
.message();