14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/ref_counted.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/path_service.h" 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/stringprintf.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/browser/api/dns/host_resolver_wrapper.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/api/dns/mock_host_resolver_creator.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/sockets_tcp/sockets_tcp_api.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h" 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(jschuh): Hanging plugin tests. crbug.com/244653 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) && defined(ARCH_CPU_X86_64) 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE(x) DISABLED_##x 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE(x) x 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const std::string kHostname = "127.0.0.1"; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SocketsTcpApiTest : public ExtensionApiTest { 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SocketsTcpApiTest() : resolver_event_(true, false), 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resolver_creator_( 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new extensions::MockHostResolverCreator()) { 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::HostResolverWrapper::GetInstance()->SetHostResolverForTesting( 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resolver_creator_->CreateMockHostResolver()); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE { 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::HostResolverWrapper::GetInstance()-> 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetHostResolverForTesting(NULL); 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resolver_creator_->DeleteMockHostResolver(); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::WaitableEvent resolver_event_; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The MockHostResolver asserts that it's used on the same thread on which 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // it's created, which is actually a stronger rule than its real counterpart. 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // But that's fine; it's good practice. 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<extensions::MockHostResolverCreator> resolver_creator_; 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SocketsTcpApiTest, SocketTcpExtension) { 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<net::SpawnedTestServer> test_server( 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new net::SpawnedTestServer( 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_TCP_ECHO, 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data")))); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(test_server->Start()); 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::HostPortPair host_port_pair = test_server->host_port_pair(); 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int port = host_port_pair.port(); 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(port > 0); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Test that connect() is properly resolving hostnames. 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_port_pair.set_host("lOcAlHoSt"); 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::ResultCatcher catcher; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci catcher.RestrictToBrowserContext(browser()->profile()); 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ExtensionTestMessageListener listener("info_please", true); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("sockets_tcp/api"))); 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(listener.WaitUntilSatisfied()); 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) listener.Reply( 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::StringPrintf("tcp:%s:%d", host_port_pair.host().c_str(), port)); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SocketsTcpApiTest, SocketTcpExtensionTLS) { 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<net::SpawnedTestServer> test_https_server( 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new net::SpawnedTestServer( 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::BaseTestServer::SSLOptions(), 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data")))); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(test_https_server->Start()); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::HostPortPair https_host_port_pair = test_https_server->host_port_pair(); 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int https_port = https_host_port_pair.port(); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_GT(https_port, 0); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::ResultCatcher catcher; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci catcher.RestrictToBrowserContext(browser()->profile()); 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionTestMessageListener listener("info_please", true); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("sockets_tcp/api"))); 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.WaitUntilSatisfied()); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reply(base::StringPrintf( 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "https:%s:%d", https_host_port_pair.host().c_str(), https_port)); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 115