| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "net/test/embedded_test_server/embedded_test_server.h" | 5 #include "net/test/embedded_test_server/embedded_test_server.h" | 
| 6 | 6 | 
| 7 #include "base/path_service.h" | 7 #include "base/path_service.h" | 
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" | 
| 9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" | 
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" | 
| 11 #include "base/synchronization/lock.h" | 11 #include "base/synchronization/lock.h" | 
| 12 #include "base/threading/thread.h" | 12 #include "base/threading/thread.h" | 
|  | 13 #include "crypto/nss_util.h" | 
| 13 #include "net/base/test_completion_callback.h" | 14 #include "net/base/test_completion_callback.h" | 
| 14 #include "net/http/http_response_headers.h" | 15 #include "net/http/http_response_headers.h" | 
| 15 #include "net/log/test_net_log.h" | 16 #include "net/log/test_net_log.h" | 
| 16 #include "net/socket/client_socket_factory.h" | 17 #include "net/socket/client_socket_factory.h" | 
| 17 #include "net/socket/stream_socket.h" | 18 #include "net/socket/stream_socket.h" | 
| 18 #include "net/test/embedded_test_server/embedded_test_server_connection_listener
     .h" | 19 #include "net/test/embedded_test_server/embedded_test_server_connection_listener
     .h" | 
| 19 #include "net/test/embedded_test_server/http_request.h" | 20 #include "net/test/embedded_test_server/http_request.h" | 
| 20 #include "net/test/embedded_test_server/http_response.h" | 21 #include "net/test/embedded_test_server/http_response.h" | 
| 21 #include "net/test/spawned_test_server/base_test_server.h" |  | 
| 22 #include "net/url_request/url_fetcher.h" | 22 #include "net/url_request/url_fetcher.h" | 
| 23 #include "net/url_request/url_fetcher_delegate.h" | 23 #include "net/url_request/url_fetcher_delegate.h" | 
| 24 #include "net/url_request/url_request_test_util.h" | 24 #include "net/url_request/url_request_test_util.h" | 
| 25 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" | 
| 26 | 26 | 
|  | 27 #if defined(USE_NSS_CERTS) || defined(OS_IOS) | 
|  | 28 #include "net/cert_net/nss_ocsp.h" | 
|  | 29 #endif | 
|  | 30 | 
| 27 namespace net { | 31 namespace net { | 
| 28 namespace test_server { | 32 namespace test_server { | 
| 29 | 33 | 
| 30 namespace { | 34 namespace { | 
| 31 | 35 | 
| 32 // Gets the content from the given URLFetcher. | 36 // Gets the content from the given URLFetcher. | 
| 33 std::string GetContentFromFetcher(const URLFetcher& fetcher) { | 37 std::string GetContentFromFetcher(const URLFetcher& fetcher) { | 
| 34   std::string result; | 38   std::string result; | 
| 35   const bool success = fetcher.GetResponseAsString(&result); | 39   const bool success = fetcher.GetResponseAsString(&result); | 
| 36   EXPECT_TRUE(success); | 40   EXPECT_TRUE(success); | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 94   bool did_read_from_socket_; | 98   bool did_read_from_socket_; | 
| 95 | 99 | 
| 96   base::RunLoop accept_loop_; | 100   base::RunLoop accept_loop_; | 
| 97   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 101   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 
| 98 | 102 | 
| 99   mutable base::Lock lock_; | 103   mutable base::Lock lock_; | 
| 100 | 104 | 
| 101   DISALLOW_COPY_AND_ASSIGN(TestConnectionListener); | 105   DISALLOW_COPY_AND_ASSIGN(TestConnectionListener); | 
| 102 }; | 106 }; | 
| 103 | 107 | 
| 104 class EmbeddedTestServerTest: public testing::Test, | 108 class EmbeddedTestServerTest | 
| 105                               public URLFetcherDelegate { | 109     : public testing::TestWithParam<EmbeddedTestServer::Type>, | 
|  | 110       public URLFetcherDelegate { | 
| 106  public: | 111  public: | 
| 107   EmbeddedTestServerTest() | 112   EmbeddedTestServerTest() | 
| 108       : num_responses_received_(0), | 113       : num_responses_received_(0), | 
| 109         num_responses_expected_(0), | 114         num_responses_expected_(0), | 
| 110         io_thread_("io_thread") { | 115         io_thread_("io_thread") { | 
| 111   } | 116   } | 
| 112 | 117 | 
| 113   void SetUp() override { | 118   void SetUp() override { | 
|  | 119 #if defined(USE_NSS_CERTS) || defined(OS_IOS) | 
|  | 120     // This is needed so NSS's HTTP client functions are initialized on the | 
|  | 121     // right thread. These tests create SSLClientSockets on a different thread. | 
|  | 122     // TODO(davidben): Initialization should not happen deep in | 
|  | 123     // SSLClientSocket. See https://crbug.com/539520. | 
|  | 124     crypto::EnsureNSSInit(); | 
|  | 125     EnsureNSSHttpIOInit(); | 
|  | 126 #endif | 
|  | 127 | 
| 114     base::Thread::Options thread_options; | 128     base::Thread::Options thread_options; | 
| 115     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 129     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 
| 116     ASSERT_TRUE(io_thread_.StartWithOptions(thread_options)); | 130     ASSERT_TRUE(io_thread_.StartWithOptions(thread_options)); | 
| 117 | 131 | 
| 118     request_context_getter_ = | 132     request_context_getter_ = | 
| 119         new TestURLRequestContextGetter(io_thread_.task_runner()); | 133         new TestURLRequestContextGetter(io_thread_.task_runner()); | 
| 120 | 134 | 
| 121     server_.reset(new EmbeddedTestServer); | 135     server_.reset(new EmbeddedTestServer(GetParam())); | 
| 122     server_->SetConnectionListener(&connection_listener_); | 136     server_->SetConnectionListener(&connection_listener_); | 
| 123     ASSERT_TRUE(server_->InitializeAndWaitUntilReady()); | 137     ASSERT_TRUE(server_->Start()); | 
| 124   } | 138   } | 
| 125 | 139 | 
| 126   void TearDown() override { | 140   void TearDown() override { | 
|  | 141 #if defined(USE_NSS_CERTS) || defined(OS_IOS) | 
|  | 142     ShutdownNSSHttpIO(); | 
|  | 143 #endif | 
| 127     ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete()); | 144     ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete()); | 
| 128   } | 145   } | 
| 129 | 146 | 
| 130   // URLFetcherDelegate override. | 147   // URLFetcherDelegate override. | 
| 131   void OnURLFetchComplete(const URLFetcher* source) override { | 148   void OnURLFetchComplete(const URLFetcher* source) override { | 
| 132     ++num_responses_received_; | 149     ++num_responses_received_; | 
| 133     if (num_responses_received_ == num_responses_expected_) | 150     if (num_responses_received_ == num_responses_expected_) | 
| 134       base::MessageLoop::current()->QuitWhenIdle(); | 151       base::MessageLoop::current()->QuitWhenIdle(); | 
| 135   } | 152   } | 
| 136 | 153 | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 166  protected: | 183  protected: | 
| 167   int num_responses_received_; | 184   int num_responses_received_; | 
| 168   int num_responses_expected_; | 185   int num_responses_expected_; | 
| 169   std::string request_relative_url_; | 186   std::string request_relative_url_; | 
| 170   base::Thread io_thread_; | 187   base::Thread io_thread_; | 
| 171   scoped_refptr<TestURLRequestContextGetter> request_context_getter_; | 188   scoped_refptr<TestURLRequestContextGetter> request_context_getter_; | 
| 172   TestConnectionListener connection_listener_; | 189   TestConnectionListener connection_listener_; | 
| 173   scoped_ptr<EmbeddedTestServer> server_; | 190   scoped_ptr<EmbeddedTestServer> server_; | 
| 174 }; | 191 }; | 
| 175 | 192 | 
| 176 TEST_F(EmbeddedTestServerTest, GetBaseURL) { | 193 TEST_P(EmbeddedTestServerTest, GetBaseURL) { | 
| 177   EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()), | 194   if (server_->use_ssl()) { | 
| 178                                server_->base_url().spec()); | 195     EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/", server_->port()), | 
|  | 196               server_->base_url().spec()); | 
|  | 197   } else { | 
|  | 198     EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()), | 
|  | 199               server_->base_url().spec()); | 
|  | 200   } | 
| 179 } | 201 } | 
| 180 | 202 | 
| 181 TEST_F(EmbeddedTestServerTest, GetURL) { | 203 TEST_P(EmbeddedTestServerTest, GetURL) { | 
| 182   EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/path?query=foo", | 204   if (server_->use_ssl()) { | 
| 183                                server_->port()), | 205     EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/path?query=foo", | 
| 184             server_->GetURL("/path?query=foo").spec()); | 206                                  server_->port()), | 
|  | 207               server_->GetURL("/path?query=foo").spec()); | 
|  | 208   } else { | 
|  | 209     EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/path?query=foo", | 
|  | 210                                  server_->port()), | 
|  | 211               server_->GetURL("/path?query=foo").spec()); | 
|  | 212   } | 
| 185 } | 213 } | 
| 186 | 214 | 
| 187 TEST_F(EmbeddedTestServerTest, GetURLWithHostname) { | 215 TEST_P(EmbeddedTestServerTest, GetURLWithHostname) { | 
| 188   EXPECT_EQ(base::StringPrintf("http://foo.com:%d/path?query=foo", | 216   if (server_->use_ssl()) { | 
| 189                                server_->port()), | 217     EXPECT_EQ(base::StringPrintf("https://foo.com:%d/path?query=foo", | 
| 190             server_->GetURL("foo.com", "/path?query=foo").spec()); | 218                                  server_->port()), | 
|  | 219               server_->GetURL("foo.com", "/path?query=foo").spec()); | 
|  | 220   } else { | 
|  | 221     EXPECT_EQ( | 
|  | 222         base::StringPrintf("http://foo.com:%d/path?query=foo", server_->port()), | 
|  | 223         server_->GetURL("foo.com", "/path?query=foo").spec()); | 
|  | 224   } | 
| 191 } | 225 } | 
| 192 | 226 | 
| 193 TEST_F(EmbeddedTestServerTest, RegisterRequestHandler) { | 227 TEST_P(EmbeddedTestServerTest, RegisterRequestHandler) { | 
| 194   server_->RegisterRequestHandler( | 228   server_->RegisterRequestHandler( | 
| 195       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 229       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 196                  base::Unretained(this), | 230                  base::Unretained(this), | 
| 197                  "/test", | 231                  "/test", | 
| 198                  "<b>Worked!</b>", | 232                  "<b>Worked!</b>", | 
| 199                  "text/html", | 233                  "text/html", | 
| 200                  HTTP_OK)); | 234                  HTTP_OK)); | 
| 201 | 235 | 
| 202   scoped_ptr<URLFetcher> fetcher = | 236   scoped_ptr<URLFetcher> fetcher = | 
| 203       URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this); | 237       URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this); | 
| 204   fetcher->SetRequestContext(request_context_getter_.get()); | 238   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 205   fetcher->Start(); | 239   fetcher->Start(); | 
| 206   WaitForResponses(1); | 240   WaitForResponses(1); | 
| 207 | 241 | 
| 208   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 242   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 
| 209   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 243   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 
| 210   EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); | 244   EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); | 
| 211   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 245   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 
| 212 | 246 | 
| 213   EXPECT_EQ("/test?q=foo", request_relative_url_); | 247   EXPECT_EQ("/test?q=foo", request_relative_url_); | 
| 214 } | 248 } | 
| 215 | 249 | 
| 216 TEST_F(EmbeddedTestServerTest, ServeFilesFromDirectory) { | 250 TEST_P(EmbeddedTestServerTest, ServeFilesFromDirectory) { | 
| 217   base::FilePath src_dir; | 251   base::FilePath src_dir; | 
| 218   ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 252   ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 
| 219   server_->ServeFilesFromDirectory( | 253   server_->ServeFilesFromDirectory( | 
| 220       src_dir.AppendASCII("net").AppendASCII("data")); | 254       src_dir.AppendASCII("net").AppendASCII("data")); | 
| 221 | 255 | 
| 222   scoped_ptr<URLFetcher> fetcher = | 256   scoped_ptr<URLFetcher> fetcher = | 
| 223       URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this); | 257       URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this); | 
| 224   fetcher->SetRequestContext(request_context_getter_.get()); | 258   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 225   fetcher->Start(); | 259   fetcher->Start(); | 
| 226   WaitForResponses(1); | 260   WaitForResponses(1); | 
| 227 | 261 | 
| 228   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 262   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 
| 229   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 263   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 
| 230   EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher)); | 264   EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher)); | 
| 231   EXPECT_EQ("", GetContentTypeFromFetcher(*fetcher)); | 265   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 
| 232 } | 266 } | 
| 233 | 267 | 
| 234 TEST_F(EmbeddedTestServerTest, DefaultNotFoundResponse) { | 268 TEST_P(EmbeddedTestServerTest, DefaultNotFoundResponse) { | 
| 235   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 269   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 
| 236       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 270       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 
| 237   fetcher->SetRequestContext(request_context_getter_.get()); | 271   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 238 | 272 | 
| 239   fetcher->Start(); | 273   fetcher->Start(); | 
| 240   WaitForResponses(1); | 274   WaitForResponses(1); | 
| 241   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 275   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 
| 242   EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode()); | 276   EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode()); | 
| 243 } | 277 } | 
| 244 | 278 | 
| 245 TEST_F(EmbeddedTestServerTest, ConnectionListenerAccept) { | 279 TEST_P(EmbeddedTestServerTest, ConnectionListenerAccept) { | 
| 246   TestNetLog net_log; | 280   TestNetLog net_log; | 
| 247   net::AddressList address_list; | 281   net::AddressList address_list; | 
| 248   EXPECT_TRUE(server_->GetAddressList(&address_list)); | 282   EXPECT_TRUE(server_->GetAddressList(&address_list)); | 
| 249 | 283 | 
| 250   scoped_ptr<StreamSocket> socket = | 284   scoped_ptr<StreamSocket> socket = | 
| 251       ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket( | 285       ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket( | 
| 252           address_list, &net_log, NetLog::Source()); | 286           address_list, &net_log, NetLog::Source()); | 
| 253   TestCompletionCallback callback; | 287   TestCompletionCallback callback; | 
| 254   ASSERT_EQ(OK, callback.GetResult(socket->Connect(callback.callback()))); | 288   ASSERT_EQ(OK, callback.GetResult(socket->Connect(callback.callback()))); | 
| 255 | 289 | 
| 256   connection_listener_.WaitUntilFirstConnectionAccepted(); | 290   connection_listener_.WaitUntilFirstConnectionAccepted(); | 
| 257 | 291 | 
| 258   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 292   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 
| 259   EXPECT_FALSE(connection_listener_.DidReadFromSocket()); | 293   EXPECT_FALSE(connection_listener_.DidReadFromSocket()); | 
| 260 } | 294 } | 
| 261 | 295 | 
| 262 TEST_F(EmbeddedTestServerTest, ConnectionListenerRead) { | 296 TEST_P(EmbeddedTestServerTest, ConnectionListenerRead) { | 
| 263   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 297   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 
| 264       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 298       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 
| 265   fetcher->SetRequestContext(request_context_getter_.get()); | 299   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 266 | 300 | 
| 267   fetcher->Start(); | 301   fetcher->Start(); | 
| 268   WaitForResponses(1); | 302   WaitForResponses(1); | 
| 269   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 303   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 
| 270   EXPECT_TRUE(connection_listener_.DidReadFromSocket()); | 304   EXPECT_TRUE(connection_listener_.DidReadFromSocket()); | 
| 271 } | 305 } | 
| 272 | 306 | 
| 273 TEST_F(EmbeddedTestServerTest, ConcurrentFetches) { | 307 TEST_P(EmbeddedTestServerTest, ConcurrentFetches) { | 
| 274   server_->RegisterRequestHandler( | 308   server_->RegisterRequestHandler( | 
| 275       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 309       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 276                  base::Unretained(this), | 310                  base::Unretained(this), | 
| 277                  "/test1", | 311                  "/test1", | 
| 278                  "Raspberry chocolate", | 312                  "Raspberry chocolate", | 
| 279                  "text/html", | 313                  "text/html", | 
| 280                  HTTP_OK)); | 314                  HTTP_OK)); | 
| 281   server_->RegisterRequestHandler( | 315   server_->RegisterRequestHandler( | 
| 282       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 316       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 283                  base::Unretained(this), | 317                  base::Unretained(this), | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 318   EXPECT_EQ(HTTP_OK, fetcher2->GetResponseCode()); | 352   EXPECT_EQ(HTTP_OK, fetcher2->GetResponseCode()); | 
| 319   EXPECT_EQ("Vanilla chocolate", GetContentFromFetcher(*fetcher2)); | 353   EXPECT_EQ("Vanilla chocolate", GetContentFromFetcher(*fetcher2)); | 
| 320   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); | 354   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); | 
| 321 | 355 | 
| 322   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher3->GetStatus().status()); | 356   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher3->GetStatus().status()); | 
| 323   EXPECT_EQ(HTTP_NOT_FOUND, fetcher3->GetResponseCode()); | 357   EXPECT_EQ(HTTP_NOT_FOUND, fetcher3->GetResponseCode()); | 
| 324   EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); | 358   EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); | 
| 325   EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); | 359   EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); | 
| 326 } | 360 } | 
| 327 | 361 | 
|  | 362 INSTANTIATE_TEST_CASE_P(EmbeddedTestServerTestInstantiation, | 
|  | 363                         EmbeddedTestServerTest, | 
|  | 364                         testing::Values(EmbeddedTestServer::TYPE_HTTP, | 
|  | 365                                         EmbeddedTestServer::TYPE_HTTPS)); | 
|  | 366 | 
| 328 // Below test exercises EmbeddedTestServer's ability to cope with the situation | 367 // Below test exercises EmbeddedTestServer's ability to cope with the situation | 
| 329 // where there is no MessageLoop available on the thread at EmbeddedTestServer | 368 // where there is no MessageLoop available on the thread at EmbeddedTestServer | 
| 330 // initialization and/or destruction. | 369 // initialization and/or destruction. | 
| 331 | 370 | 
| 332 typedef std::tr1::tuple<bool, bool> ThreadingTestParams; | 371 typedef std::tr1::tuple<bool, bool, EmbeddedTestServer::Type> | 
|  | 372     ThreadingTestParams; | 
| 333 | 373 | 
| 334 class EmbeddedTestServerThreadingTest | 374 class EmbeddedTestServerThreadingTest | 
| 335     : public testing::TestWithParam<ThreadingTestParams> {}; | 375     : public testing::TestWithParam<ThreadingTestParams> { | 
|  | 376   void SetUp() override { | 
|  | 377 // This is needed so NSS's HTTP client functions are initialized on the | 
|  | 378 // right thread. These tests create SSLClientSockets on a different thread. | 
|  | 379 // TODO(davidben): Initialization should not happen deep in | 
|  | 380 // SSLClientSocket. See https://crbug.com/539520. | 
|  | 381 #if defined(USE_NSS_CERTS) || defined(OS_IOS) | 
|  | 382     crypto::EnsureNSSInit(); | 
|  | 383     EnsureNSSHttpIOInit(); | 
|  | 384 #endif | 
|  | 385   } | 
|  | 386 | 
|  | 387   void TearDown() override { | 
|  | 388 #if defined(USE_NSS_CERTS) || defined(OS_IOS) | 
|  | 389     ShutdownNSSHttpIO(); | 
|  | 390 #endif | 
|  | 391   } | 
|  | 392 }; | 
| 336 | 393 | 
| 337 class EmbeddedTestServerThreadingTestDelegate | 394 class EmbeddedTestServerThreadingTestDelegate | 
| 338     : public base::PlatformThread::Delegate, | 395     : public base::PlatformThread::Delegate, | 
| 339       public URLFetcherDelegate { | 396       public URLFetcherDelegate { | 
| 340  public: | 397  public: | 
| 341   EmbeddedTestServerThreadingTestDelegate( | 398   EmbeddedTestServerThreadingTestDelegate( | 
| 342       bool message_loop_present_on_initialize, | 399       bool message_loop_present_on_initialize, | 
| 343       bool message_loop_present_on_shutdown) | 400       bool message_loop_present_on_shutdown, | 
|  | 401       EmbeddedTestServer::Type type) | 
| 344       : message_loop_present_on_initialize_(message_loop_present_on_initialize), | 402       : message_loop_present_on_initialize_(message_loop_present_on_initialize), | 
| 345         message_loop_present_on_shutdown_(message_loop_present_on_shutdown) {} | 403         message_loop_present_on_shutdown_(message_loop_present_on_shutdown), | 
|  | 404         type_(type) {} | 
| 346 | 405 | 
| 347   // base::PlatformThread::Delegate: | 406   // base::PlatformThread::Delegate: | 
| 348   void ThreadMain() override { | 407   void ThreadMain() override { | 
| 349     scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner; | 408     scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner; | 
| 350     base::Thread io_thread("io_thread"); | 409     base::Thread io_thread("io_thread"); | 
| 351     base::Thread::Options thread_options; | 410     base::Thread::Options thread_options; | 
| 352     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 411     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 
| 353     ASSERT_TRUE(io_thread.StartWithOptions(thread_options)); | 412     ASSERT_TRUE(io_thread.StartWithOptions(thread_options)); | 
| 354     io_thread_runner = io_thread.task_runner(); | 413     io_thread_runner = io_thread.task_runner(); | 
| 355 | 414 | 
| 356     scoped_ptr<base::MessageLoop> loop; | 415     scoped_ptr<base::MessageLoop> loop; | 
| 357     if (message_loop_present_on_initialize_) | 416     if (message_loop_present_on_initialize_) | 
| 358       loop.reset(new base::MessageLoopForIO); | 417       loop.reset(new base::MessageLoopForIO); | 
| 359 | 418 | 
| 360     // Create the test server instance. | 419     // Create the test server instance. | 
| 361     EmbeddedTestServer server; | 420     EmbeddedTestServer server(type_); | 
| 362     base::FilePath src_dir; | 421     base::FilePath src_dir; | 
| 363     ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 422     ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 
| 364     ASSERT_TRUE(server.InitializeAndWaitUntilReady()); | 423     ASSERT_TRUE(server.Start()); | 
| 365 | 424 | 
| 366     // Make a request and wait for the reply. | 425     // Make a request and wait for the reply. | 
| 367     if (!loop) | 426     if (!loop) | 
| 368       loop.reset(new base::MessageLoopForIO); | 427       loop.reset(new base::MessageLoopForIO); | 
| 369 | 428 | 
| 370     scoped_ptr<URLFetcher> fetcher = | 429     scoped_ptr<URLFetcher> fetcher = | 
| 371         URLFetcher::Create(server.GetURL("/test?q=foo"), URLFetcher::GET, this); | 430         URLFetcher::Create(server.GetURL("/test?q=foo"), URLFetcher::GET, this); | 
| 372     fetcher->SetRequestContext( | 431     fetcher->SetRequestContext( | 
| 373         new TestURLRequestContextGetter(loop->task_runner())); | 432         new TestURLRequestContextGetter(loop->task_runner())); | 
| 374     fetcher->Start(); | 433     fetcher->Start(); | 
| 375     loop->Run(); | 434     loop->Run(); | 
| 376     fetcher.reset(); | 435     fetcher.reset(); | 
| 377 | 436 | 
| 378     // Shut down. | 437     // Shut down. | 
| 379     if (message_loop_present_on_shutdown_) | 438     if (message_loop_present_on_shutdown_) | 
| 380       loop.reset(); | 439       loop.reset(); | 
| 381 | 440 | 
| 382     ASSERT_TRUE(server.ShutdownAndWaitUntilComplete()); | 441     ASSERT_TRUE(server.ShutdownAndWaitUntilComplete()); | 
| 383   } | 442   } | 
| 384 | 443 | 
| 385   // URLFetcherDelegate override. | 444   // URLFetcherDelegate override. | 
| 386   void OnURLFetchComplete(const URLFetcher* source) override { | 445   void OnURLFetchComplete(const URLFetcher* source) override { | 
| 387     base::MessageLoop::current()->QuitWhenIdle(); | 446     base::MessageLoop::current()->QuitWhenIdle(); | 
| 388   } | 447   } | 
| 389 | 448 | 
| 390  private: | 449  private: | 
| 391   bool message_loop_present_on_initialize_; | 450   bool message_loop_present_on_initialize_; | 
| 392   bool message_loop_present_on_shutdown_; | 451   bool message_loop_present_on_shutdown_; | 
|  | 452   EmbeddedTestServer::Type type_; | 
| 393 | 453 | 
| 394   DISALLOW_COPY_AND_ASSIGN(EmbeddedTestServerThreadingTestDelegate); | 454   DISALLOW_COPY_AND_ASSIGN(EmbeddedTestServerThreadingTestDelegate); | 
| 395 }; | 455 }; | 
| 396 | 456 | 
| 397 TEST_P(EmbeddedTestServerThreadingTest, RunTest) { | 457 TEST_P(EmbeddedTestServerThreadingTest, RunTest) { | 
| 398   // The actual test runs on a separate thread so it can screw with the presence | 458   // The actual test runs on a separate thread so it can screw with the presence | 
| 399   // of a MessageLoop - the test suite already sets up a MessageLoop for the | 459   // of a MessageLoop - the test suite already sets up a MessageLoop for the | 
| 400   // main test thread. | 460   // main test thread. | 
| 401   base::PlatformThreadHandle thread_handle; | 461   base::PlatformThreadHandle thread_handle; | 
| 402   EmbeddedTestServerThreadingTestDelegate delegate( | 462   EmbeddedTestServerThreadingTestDelegate delegate( | 
| 403       std::tr1::get<0>(GetParam()), | 463       std::tr1::get<0>(GetParam()), std::tr1::get<1>(GetParam()), | 
| 404       std::tr1::get<1>(GetParam())); | 464       std::tr1::get<2>(GetParam())); | 
| 405   ASSERT_TRUE(base::PlatformThread::Create(0, &delegate, &thread_handle)); | 465   ASSERT_TRUE(base::PlatformThread::Create(0, &delegate, &thread_handle)); | 
| 406   base::PlatformThread::Join(thread_handle); | 466   base::PlatformThread::Join(thread_handle); | 
| 407 } | 467 } | 
| 408 | 468 | 
| 409 INSTANTIATE_TEST_CASE_P(EmbeddedTestServerThreadingTestInstantiation, | 469 INSTANTIATE_TEST_CASE_P( | 
| 410                         EmbeddedTestServerThreadingTest, | 470     EmbeddedTestServerThreadingTestInstantiation, | 
| 411                         testing::Combine(testing::Bool(), testing::Bool())); | 471     EmbeddedTestServerThreadingTest, | 
|  | 472     testing::Combine(testing::Bool(), | 
|  | 473                      testing::Bool(), | 
|  | 474                      testing::Values(EmbeddedTestServer::TYPE_HTTP, | 
|  | 475                                      EmbeddedTestServer::TYPE_HTTPS))); | 
| 412 | 476 | 
| 413 }  // namespace test_server | 477 }  // namespace test_server | 
| 414 }  // namespace net | 478 }  // namespace net | 
| OLD | NEW | 
|---|