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