sockets_tcp_apitest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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/test/base/in_process_browser_test.h" 14#include "chrome/test/base/ui_test_utils.h" 15#include "extensions/browser/api/dns/host_resolver_wrapper.h" 16#include "extensions/browser/api/dns/mock_host_resolver_creator.h" 17#include "extensions/browser/api/sockets_tcp/sockets_tcp_api.h" 18#include "extensions/test/extension_test_message_listener.h" 19#include "extensions/test/result_catcher.h" 20#include "net/dns/mock_host_resolver.h" 21#include "net/test/spawned_test_server/spawned_test_server.h" 22 23namespace { 24 25// TODO(jschuh): Hanging plugin tests. crbug.com/244653 26#if defined(OS_WIN) && defined(ARCH_CPU_X86_64) 27#define MAYBE(x) DISABLED_##x 28#else 29#define MAYBE(x) x 30#endif 31 32const std::string kHostname = "127.0.0.1"; 33 34class SocketsTcpApiTest : public ExtensionApiTest { 35 public: 36 SocketsTcpApiTest() : resolver_event_(true, false), 37 resolver_creator_( 38 new extensions::MockHostResolverCreator()) { 39 } 40 41 virtual void SetUpOnMainThread() OVERRIDE { 42 extensions::HostResolverWrapper::GetInstance()->SetHostResolverForTesting( 43 resolver_creator_->CreateMockHostResolver()); 44 } 45 46 virtual void TearDownOnMainThread() OVERRIDE { 47 extensions::HostResolverWrapper::GetInstance()-> 48 SetHostResolverForTesting(NULL); 49 resolver_creator_->DeleteMockHostResolver(); 50 } 51 52 private: 53 base::WaitableEvent resolver_event_; 54 55 // The MockHostResolver asserts that it's used on the same thread on which 56 // it's created, which is actually a stronger rule than its real counterpart. 57 // But that's fine; it's good practice. 58 scoped_refptr<extensions::MockHostResolverCreator> resolver_creator_; 59}; 60 61} // namespace 62 63IN_PROC_BROWSER_TEST_F(SocketsTcpApiTest, SocketTcpExtension) { 64 scoped_ptr<net::SpawnedTestServer> test_server( 65 new net::SpawnedTestServer( 66 net::SpawnedTestServer::TYPE_TCP_ECHO, 67 net::SpawnedTestServer::kLocalhost, 68 base::FilePath(FILE_PATH_LITERAL("net/data")))); 69 EXPECT_TRUE(test_server->Start()); 70 71 net::HostPortPair host_port_pair = test_server->host_port_pair(); 72 int port = host_port_pair.port(); 73 ASSERT_TRUE(port > 0); 74 75 // Test that connect() is properly resolving hostnames. 76 host_port_pair.set_host("lOcAlHoSt"); 77 78 extensions::ResultCatcher catcher; 79 catcher.RestrictToBrowserContext(browser()->profile()); 80 81 ExtensionTestMessageListener listener("info_please", true); 82 83 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("sockets_tcp/api"))); 84 EXPECT_TRUE(listener.WaitUntilSatisfied()); 85 listener.Reply( 86 base::StringPrintf("tcp:%s:%d", host_port_pair.host().c_str(), port)); 87 88 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 89} 90 91IN_PROC_BROWSER_TEST_F(SocketsTcpApiTest, SocketTcpExtensionTLS) { 92 scoped_ptr<net::SpawnedTestServer> test_https_server( 93 new net::SpawnedTestServer( 94 net::SpawnedTestServer::TYPE_HTTPS, 95 net::BaseTestServer::SSLOptions(), 96 base::FilePath(FILE_PATH_LITERAL("net/data")))); 97 EXPECT_TRUE(test_https_server->Start()); 98 99 net::HostPortPair https_host_port_pair = test_https_server->host_port_pair(); 100 int https_port = https_host_port_pair.port(); 101 ASSERT_GT(https_port, 0); 102 103 extensions::ResultCatcher catcher; 104 catcher.RestrictToBrowserContext(browser()->profile()); 105 106 ExtensionTestMessageListener listener("info_please", true); 107 108 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("sockets_tcp/api"))); 109 EXPECT_TRUE(listener.WaitUntilSatisfied()); 110 listener.Reply(base::StringPrintf( 111 "https:%s:%d", https_host_port_pair.host().c_str(), https_port)); 112 113 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 114} 115