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/memory/ref_counted.h" 6#include "base/path_service.h" 7#include "base/strings/stringprintf.h" 8#include "chrome/browser/extensions/extension_apitest.h" 9#include "chrome/browser/extensions/extension_service.h" 10#include "chrome/browser/ui/browser.h" 11#include "chrome/browser/ui/extensions/application_launch.h" 12#include "chrome/common/chrome_paths.h" 13#include "chrome/common/chrome_switches.h" 14#include "chrome/test/base/in_process_browser_test.h" 15#include "chrome/test/base/ui_test_utils.h" 16#include "extensions/browser/api/dns/host_resolver_wrapper.h" 17#include "extensions/browser/api/dns/mock_host_resolver_creator.h" 18#include "extensions/browser/api/sockets_udp/sockets_udp_api.h" 19#include "extensions/test/extension_test_message_listener.h" 20#include "extensions/test/result_catcher.h" 21#include "net/dns/mock_host_resolver.h" 22#include "net/test/spawned_test_server/spawned_test_server.h" 23 24using extensions::Extension; 25 26namespace { 27 28// TODO(jschuh): Hanging plugin tests. crbug.com/244653 29#if defined(OS_WIN) && defined(ARCH_CPU_X86_64) 30#define MAYBE(x) DISABLED_##x 31#else 32#define MAYBE(x) x 33#endif 34 35const std::string kHostname = "127.0.0.1"; 36const int kPort = 8888; 37 38class SocketsUdpApiTest : public ExtensionApiTest { 39 public: 40 SocketsUdpApiTest() : resolver_event_(true, false), 41 resolver_creator_( 42 new extensions::MockHostResolverCreator()) { 43 } 44 45 virtual void SetUpOnMainThread() OVERRIDE { 46 extensions::HostResolverWrapper::GetInstance()->SetHostResolverForTesting( 47 resolver_creator_->CreateMockHostResolver()); 48 } 49 50 virtual void TearDownOnMainThread() OVERRIDE { 51 extensions::HostResolverWrapper::GetInstance()-> 52 SetHostResolverForTesting(NULL); 53 resolver_creator_->DeleteMockHostResolver(); 54 } 55 56 private: 57 base::WaitableEvent resolver_event_; 58 59 // The MockHostResolver asserts that it's used on the same thread on which 60 // it's created, which is actually a stronger rule than its real counterpart. 61 // But that's fine; it's good practice. 62 scoped_refptr<extensions::MockHostResolverCreator> resolver_creator_; 63}; 64 65} // namespace 66 67IN_PROC_BROWSER_TEST_F(SocketsUdpApiTest, SocketsUdpExtension) { 68 scoped_ptr<net::SpawnedTestServer> test_server( 69 new net::SpawnedTestServer( 70 net::SpawnedTestServer::TYPE_UDP_ECHO, 71 net::SpawnedTestServer::kLocalhost, 72 base::FilePath(FILE_PATH_LITERAL("net/data")))); 73 EXPECT_TRUE(test_server->Start()); 74 75 net::HostPortPair host_port_pair = test_server->host_port_pair(); 76 int port = host_port_pair.port(); 77 ASSERT_TRUE(port > 0); 78 79 // Test that sendTo() is properly resolving hostnames. 80 host_port_pair.set_host("LOCALhost"); 81 82 extensions::ResultCatcher catcher; 83 catcher.RestrictToBrowserContext(browser()->profile()); 84 85 ExtensionTestMessageListener listener("info_please", true); 86 87 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("sockets_udp/api"))); 88 EXPECT_TRUE(listener.WaitUntilSatisfied()); 89 listener.Reply( 90 base::StringPrintf("udp:%s:%d", host_port_pair.host().c_str(), port)); 91 92 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 93} 94 95IN_PROC_BROWSER_TEST_F(SocketsUdpApiTest, DISABLED_SocketsUdpMulticast) { 96 extensions::ResultCatcher catcher; 97 catcher.RestrictToBrowserContext(browser()->profile()); 98 ExtensionTestMessageListener listener("info_please", true); 99 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("sockets_udp/api"))); 100 EXPECT_TRUE(listener.WaitUntilSatisfied()); 101 listener.Reply( 102 base::StringPrintf("multicast:%s:%d", kHostname.c_str(), kPort)); 103 104 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 105} 106