Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / mdns / mdns_apitest.cc
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 }