| Index: net/test/embedded_test_server/embedded_test_server_unittest.cc
|
| diff --git a/net/test/embedded_test_server/embedded_test_server_unittest.cc b/net/test/embedded_test_server/embedded_test_server_unittest.cc
|
| index e008ac23db86b9e9be5626ef8a030629f8c5789c..91cb16f3f4c91f9810b6aaa270b7a3fc20d6eda6 100644
|
| --- a/net/test/embedded_test_server/embedded_test_server_unittest.cc
|
| +++ b/net/test/embedded_test_server/embedded_test_server_unittest.cc
|
| @@ -4,14 +4,12 @@
|
|
|
| #include "net/test/embedded_test_server/embedded_test_server.h"
|
|
|
| -#include "base/memory/weak_ptr.h"
|
| #include "base/path_service.h"
|
| #include "base/run_loop.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/synchronization/lock.h"
|
| #include "base/threading/thread.h"
|
| -#include "crypto/nss_util.h"
|
| #include "net/base/test_completion_callback.h"
|
| #include "net/http/http_response_headers.h"
|
| #include "net/log/test_net_log.h"
|
| @@ -20,16 +18,11 @@
|
| #include "net/test/embedded_test_server/embedded_test_server_connection_listener.h"
|
| #include "net/test/embedded_test_server/http_request.h"
|
| #include "net/test/embedded_test_server/http_response.h"
|
| -#include "net/test/embedded_test_server/request_handler_util.h"
|
| +#include "net/test/spawned_test_server/base_test_server.h"
|
| #include "net/url_request/url_fetcher.h"
|
| #include "net/url_request/url_fetcher_delegate.h"
|
| -#include "net/url_request/url_request.h"
|
| #include "net/url_request/url_request_test_util.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS)
|
| -#include "net/cert_net/nss_ocsp.h"
|
| -#endif
|
|
|
| namespace net {
|
| namespace test_server {
|
| @@ -108,9 +101,8 @@
|
| DISALLOW_COPY_AND_ASSIGN(TestConnectionListener);
|
| };
|
|
|
| -class EmbeddedTestServerTest
|
| - : public testing::TestWithParam<EmbeddedTestServer::Type>,
|
| - public URLFetcherDelegate {
|
| +class EmbeddedTestServerTest: public testing::Test,
|
| + public URLFetcherDelegate {
|
| public:
|
| EmbeddedTestServerTest()
|
| : num_responses_received_(0),
|
| @@ -119,15 +111,6 @@
|
| }
|
|
|
| void SetUp() override {
|
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS)
|
| - // This is needed so NSS's HTTP client functions are initialized on the
|
| - // right thread. These tests create SSLClientSockets on a different thread.
|
| - // TODO(davidben): Initialization can't be deferred to SSLClientSocket. See
|
| - // https://crbug.com/539520.
|
| - crypto::EnsureNSSInit();
|
| - EnsureNSSHttpIOInit();
|
| -#endif
|
| -
|
| base::Thread::Options thread_options;
|
| thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
|
| ASSERT_TRUE(io_thread_.StartWithOptions(thread_options));
|
| @@ -135,16 +118,13 @@
|
| request_context_getter_ =
|
| new TestURLRequestContextGetter(io_thread_.task_runner());
|
|
|
| - server_.reset(new EmbeddedTestServer(GetParam()));
|
| + server_.reset(new EmbeddedTestServer);
|
| server_->SetConnectionListener(&connection_listener_);
|
| + ASSERT_TRUE(server_->InitializeAndWaitUntilReady());
|
| }
|
|
|
| void TearDown() override {
|
| - if (server_->Started())
|
| - ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete());
|
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS)
|
| - ShutdownNSSHttpIO();
|
| -#endif
|
| + ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete());
|
| }
|
|
|
| // URLFetcherDelegate override.
|
| @@ -193,44 +173,24 @@
|
| scoped_ptr<EmbeddedTestServer> server_;
|
| };
|
|
|
| -TEST_P(EmbeddedTestServerTest, GetBaseURL) {
|
| - ASSERT_TRUE(server_->Start());
|
| - if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) {
|
| - EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/", server_->port()),
|
| - server_->base_url().spec());
|
| - } else {
|
| - EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()),
|
| - server_->base_url().spec());
|
| - }
|
| -}
|
| -
|
| -TEST_P(EmbeddedTestServerTest, GetURL) {
|
| - ASSERT_TRUE(server_->Start());
|
| - if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) {
|
| - EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/path?query=foo",
|
| - server_->port()),
|
| - server_->GetURL("/path?query=foo").spec());
|
| - } else {
|
| - EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/path?query=foo",
|
| - server_->port()),
|
| - server_->GetURL("/path?query=foo").spec());
|
| - }
|
| -}
|
| -
|
| -TEST_P(EmbeddedTestServerTest, GetURLWithHostname) {
|
| - ASSERT_TRUE(server_->Start());
|
| - if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) {
|
| - EXPECT_EQ(base::StringPrintf("https://foo.com:%d/path?query=foo",
|
| - server_->port()),
|
| - server_->GetURL("foo.com", "/path?query=foo").spec());
|
| - } else {
|
| - EXPECT_EQ(
|
| - base::StringPrintf("http://foo.com:%d/path?query=foo", server_->port()),
|
| - server_->GetURL("foo.com", "/path?query=foo").spec());
|
| - }
|
| -}
|
| -
|
| -TEST_P(EmbeddedTestServerTest, RegisterRequestHandler) {
|
| +TEST_F(EmbeddedTestServerTest, GetBaseURL) {
|
| + EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()),
|
| + server_->base_url().spec());
|
| +}
|
| +
|
| +TEST_F(EmbeddedTestServerTest, GetURL) {
|
| + EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/path?query=foo",
|
| + server_->port()),
|
| + server_->GetURL("/path?query=foo").spec());
|
| +}
|
| +
|
| +TEST_F(EmbeddedTestServerTest, GetURLWithHostname) {
|
| + EXPECT_EQ(base::StringPrintf("http://foo.com:%d/path?query=foo",
|
| + server_->port()),
|
| + server_->GetURL("foo.com", "/path?query=foo").spec());
|
| +}
|
| +
|
| +TEST_F(EmbeddedTestServerTest, RegisterRequestHandler) {
|
| server_->RegisterRequestHandler(
|
| base::Bind(&EmbeddedTestServerTest::HandleRequest,
|
| base::Unretained(this),
|
| @@ -238,7 +198,6 @@
|
| "<b>Worked!</b>",
|
| "text/html",
|
| HTTP_OK));
|
| - ASSERT_TRUE(server_->Start());
|
|
|
| scoped_ptr<URLFetcher> fetcher =
|
| URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this);
|
| @@ -254,12 +213,11 @@
|
| EXPECT_EQ("/test?q=foo", request_relative_url_);
|
| }
|
|
|
| -TEST_P(EmbeddedTestServerTest, ServeFilesFromDirectory) {
|
| +TEST_F(EmbeddedTestServerTest, ServeFilesFromDirectory) {
|
| base::FilePath src_dir;
|
| ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
|
| server_->ServeFilesFromDirectory(
|
| src_dir.AppendASCII("net").AppendASCII("data"));
|
| - ASSERT_TRUE(server_->Start());
|
|
|
| scoped_ptr<URLFetcher> fetcher =
|
| URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this);
|
| @@ -270,12 +228,10 @@
|
| EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
|
| EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode());
|
| EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher));
|
| - EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher));
|
| -}
|
| -
|
| -TEST_P(EmbeddedTestServerTest, DefaultNotFoundResponse) {
|
| - ASSERT_TRUE(server_->Start());
|
| -
|
| + EXPECT_EQ("", GetContentTypeFromFetcher(*fetcher));
|
| +}
|
| +
|
| +TEST_F(EmbeddedTestServerTest, DefaultNotFoundResponse) {
|
| scoped_ptr<URLFetcher> fetcher = URLFetcher::Create(
|
| server_->GetURL("/non-existent"), URLFetcher::GET, this);
|
| fetcher->SetRequestContext(request_context_getter_.get());
|
| @@ -286,9 +242,7 @@
|
| EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode());
|
| }
|
|
|
| -TEST_P(EmbeddedTestServerTest, ConnectionListenerAccept) {
|
| - ASSERT_TRUE(server_->Start());
|
| -
|
| +TEST_F(EmbeddedTestServerTest, ConnectionListenerAccept) {
|
| TestNetLog net_log;
|
| net::AddressList address_list;
|
| EXPECT_TRUE(server_->GetAddressList(&address_list));
|
| @@ -305,9 +259,7 @@
|
| EXPECT_FALSE(connection_listener_.DidReadFromSocket());
|
| }
|
|
|
| -TEST_P(EmbeddedTestServerTest, ConnectionListenerRead) {
|
| - ASSERT_TRUE(server_->Start());
|
| -
|
| +TEST_F(EmbeddedTestServerTest, ConnectionListenerRead) {
|
| scoped_ptr<URLFetcher> fetcher = URLFetcher::Create(
|
| server_->GetURL("/non-existent"), URLFetcher::GET, this);
|
| fetcher->SetRequestContext(request_context_getter_.get());
|
| @@ -318,7 +270,7 @@
|
| EXPECT_TRUE(connection_listener_.DidReadFromSocket());
|
| }
|
|
|
| -TEST_P(EmbeddedTestServerTest, ConcurrentFetches) {
|
| +TEST_F(EmbeddedTestServerTest, ConcurrentFetches) {
|
| server_->RegisterRequestHandler(
|
| base::Bind(&EmbeddedTestServerTest::HandleRequest,
|
| base::Unretained(this),
|
| @@ -340,7 +292,6 @@
|
| "No chocolates",
|
| "text/plain",
|
| HTTP_NOT_FOUND));
|
| - ASSERT_TRUE(server_->Start());
|
|
|
| scoped_ptr<URLFetcher> fetcher1 =
|
| URLFetcher::Create(server_->GetURL("/test1"), URLFetcher::GET, this);
|
| @@ -374,141 +325,14 @@
|
| EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3));
|
| }
|
|
|
| -namespace {
|
| -
|
| -class CancelRequestDelegate : public TestDelegate {
|
| - public:
|
| - CancelRequestDelegate() {}
|
| - ~CancelRequestDelegate() override {}
|
| -
|
| - void OnResponseStarted(URLRequest* request) override {
|
| - TestDelegate::OnResponseStarted(request);
|
| - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| - FROM_HERE, run_loop_.QuitClosure(), base::TimeDelta::FromSeconds(1));
|
| - }
|
| -
|
| - void WaitUntilDone() { run_loop_.Run(); }
|
| -
|
| - private:
|
| - base::RunLoop run_loop_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CancelRequestDelegate);
|
| -};
|
| -
|
| -class InfiniteResponse : public BasicHttpResponse {
|
| - public:
|
| - InfiniteResponse() : weak_ptr_factory_(this) {}
|
| -
|
| - void SendResponse(const SendBytesCallback& send,
|
| - const SendCompleteCallback& done) override {
|
| - send.Run(ToResponseString(),
|
| - base::Bind(&InfiniteResponse::SendInfinite,
|
| - weak_ptr_factory_.GetWeakPtr(), send));
|
| - }
|
| -
|
| - private:
|
| - void SendInfinite(const SendBytesCallback& send) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(send, "echo",
|
| - base::Bind(&InfiniteResponse::SendInfinite,
|
| - weak_ptr_factory_.GetWeakPtr(), send)));
|
| - }
|
| -
|
| - base::WeakPtrFactory<InfiniteResponse> weak_ptr_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(InfiniteResponse);
|
| -};
|
| -
|
| -scoped_ptr<HttpResponse> HandleInfiniteRequest(const HttpRequest& request) {
|
| - return make_scoped_ptr(new InfiniteResponse);
|
| -}
|
| -}
|
| -
|
| -// Tests the case the connection is closed while the server is sending a
|
| -// response. May non-deterministically end up at one of three paths
|
| -// (Discover the close event synchronously, asynchronously, or server
|
| -// shutting down before it is discovered).
|
| -TEST_P(EmbeddedTestServerTest, CloseDuringWrite) {
|
| - CancelRequestDelegate cancel_delegate;
|
| - TestURLRequestContext context;
|
| - cancel_delegate.set_cancel_in_response_started(true);
|
| - server_->RegisterRequestHandler(base::Bind(
|
| - &HandlePrefixedRequest, "/infinite", base::Bind(&HandleInfiniteRequest)));
|
| - ASSERT_TRUE(server_->Start());
|
| -
|
| - scoped_ptr<URLRequest> request = context.CreateRequest(
|
| - server_->GetURL("/infinite"), DEFAULT_PRIORITY, &cancel_delegate);
|
| - request->Start();
|
| - cancel_delegate.WaitUntilDone();
|
| -}
|
| -
|
| -struct CertificateValuesEntry {
|
| - const EmbeddedTestServer::ServerCertificate server_cert;
|
| - const bool is_expired;
|
| - const char* common_name;
|
| - const char* root;
|
| -};
|
| -
|
| -const CertificateValuesEntry kCertificateValuesEntry[] = {
|
| - {EmbeddedTestServer::CERT_OK, false, "127.0.0.1", "Test Root CA"},
|
| - {EmbeddedTestServer::CERT_MISMATCHED_NAME, false, "127.0.0.1",
|
| - "Test Root CA"},
|
| - {EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN, false, "localhost",
|
| - "Test Root CA"},
|
| - {EmbeddedTestServer::CERT_EXPIRED, true, "127.0.0.1", "Test Root CA"},
|
| - {EmbeddedTestServer::CERT_CHAIN_WRONG_ROOT, false, "127.0.0.1", "B CA"},
|
| -#if !defined(OS_WIN)
|
| - {EmbeddedTestServer::CERT_BAD_VALIDITY, true, "Leaf Certificate",
|
| - "Test Root CA"},
|
| -#endif
|
| -};
|
| -
|
| -TEST_P(EmbeddedTestServerTest, GetCertificate) {
|
| - if (GetParam() != EmbeddedTestServer::TYPE_HTTPS)
|
| - return;
|
| -
|
| - for (const auto& certEntry : kCertificateValuesEntry) {
|
| - server_->SetSSLConfig(certEntry.server_cert);
|
| - scoped_refptr<X509Certificate> cert = server_->GetCertificate();
|
| - DCHECK(cert.get());
|
| - EXPECT_EQ(cert->HasExpired(), certEntry.is_expired);
|
| - EXPECT_EQ(cert->subject().common_name, certEntry.common_name);
|
| - EXPECT_EQ(cert->issuer().common_name, certEntry.root);
|
| - }
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(EmbeddedTestServerTestInstantiation,
|
| - EmbeddedTestServerTest,
|
| - testing::Values(EmbeddedTestServer::TYPE_HTTP,
|
| - EmbeddedTestServer::TYPE_HTTPS));
|
| -
|
| // Below test exercises EmbeddedTestServer's ability to cope with the situation
|
| // where there is no MessageLoop available on the thread at EmbeddedTestServer
|
| // initialization and/or destruction.
|
|
|
| -typedef std::tr1::tuple<bool, bool, EmbeddedTestServer::Type>
|
| - ThreadingTestParams;
|
| +typedef std::tr1::tuple<bool, bool> ThreadingTestParams;
|
|
|
| class EmbeddedTestServerThreadingTest
|
| - : public testing::TestWithParam<ThreadingTestParams> {
|
| - void SetUp() override {
|
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS)
|
| - // This is needed so NSS's HTTP client functions are initialized on the
|
| - // right thread. These tests create SSLClientSockets on a different thread.
|
| - // TODO(davidben): Initialization can't be deferred to SSLClientSocket. See
|
| - // https://crbug.com/539520.
|
| - crypto::EnsureNSSInit();
|
| - EnsureNSSHttpIOInit();
|
| -#endif
|
| - }
|
| -
|
| - void TearDown() override {
|
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS)
|
| - ShutdownNSSHttpIO();
|
| -#endif
|
| - }
|
| -};
|
| + : public testing::TestWithParam<ThreadingTestParams> {};
|
|
|
| class EmbeddedTestServerThreadingTestDelegate
|
| : public base::PlatformThread::Delegate,
|
| @@ -516,11 +340,9 @@
|
| public:
|
| EmbeddedTestServerThreadingTestDelegate(
|
| bool message_loop_present_on_initialize,
|
| - bool message_loop_present_on_shutdown,
|
| - EmbeddedTestServer::Type type)
|
| + bool message_loop_present_on_shutdown)
|
| : message_loop_present_on_initialize_(message_loop_present_on_initialize),
|
| - message_loop_present_on_shutdown_(message_loop_present_on_shutdown),
|
| - type_(type) {}
|
| + message_loop_present_on_shutdown_(message_loop_present_on_shutdown) {}
|
|
|
| // base::PlatformThread::Delegate:
|
| void ThreadMain() override {
|
| @@ -536,10 +358,10 @@
|
| loop.reset(new base::MessageLoopForIO);
|
|
|
| // Create the test server instance.
|
| - EmbeddedTestServer server(type_);
|
| + EmbeddedTestServer server;
|
| base::FilePath src_dir;
|
| ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
|
| - ASSERT_TRUE(server.Start());
|
| + ASSERT_TRUE(server.InitializeAndWaitUntilReady());
|
|
|
| // Make a request and wait for the reply.
|
| if (!loop)
|
| @@ -566,9 +388,8 @@
|
| }
|
|
|
| private:
|
| - const bool message_loop_present_on_initialize_;
|
| - const bool message_loop_present_on_shutdown_;
|
| - const EmbeddedTestServer::Type type_;
|
| + bool message_loop_present_on_initialize_;
|
| + bool message_loop_present_on_shutdown_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(EmbeddedTestServerThreadingTestDelegate);
|
| };
|
| @@ -579,19 +400,15 @@
|
| // main test thread.
|
| base::PlatformThreadHandle thread_handle;
|
| EmbeddedTestServerThreadingTestDelegate delegate(
|
| - std::tr1::get<0>(GetParam()), std::tr1::get<1>(GetParam()),
|
| - std::tr1::get<2>(GetParam()));
|
| + std::tr1::get<0>(GetParam()),
|
| + std::tr1::get<1>(GetParam()));
|
| ASSERT_TRUE(base::PlatformThread::Create(0, &delegate, &thread_handle));
|
| base::PlatformThread::Join(thread_handle);
|
| }
|
|
|
| -INSTANTIATE_TEST_CASE_P(
|
| - EmbeddedTestServerThreadingTestInstantiation,
|
| - EmbeddedTestServerThreadingTest,
|
| - testing::Combine(testing::Bool(),
|
| - testing::Bool(),
|
| - testing::Values(EmbeddedTestServer::TYPE_HTTP,
|
| - EmbeddedTestServer::TYPE_HTTPS)));
|
| +INSTANTIATE_TEST_CASE_P(EmbeddedTestServerThreadingTestInstantiation,
|
| + EmbeddedTestServerThreadingTest,
|
| + testing::Combine(testing::Bool(), testing::Bool()));
|
|
|
| } // namespace test_server
|
| } // namespace net
|
|
|