| 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/memory/weak_ptr.h" |  | 
| 8 #include "base/path_service.h" | 7 #include "base/path_service.h" | 
| 9 #include "base/run_loop.h" | 8 #include "base/run_loop.h" | 
| 10 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" | 
| 11 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" | 
| 12 #include "base/synchronization/lock.h" | 11 #include "base/synchronization/lock.h" | 
| 13 #include "base/threading/thread.h" | 12 #include "base/threading/thread.h" | 
| 14 #include "crypto/nss_util.h" |  | 
| 15 #include "net/base/test_completion_callback.h" | 13 #include "net/base/test_completion_callback.h" | 
| 16 #include "net/http/http_response_headers.h" | 14 #include "net/http/http_response_headers.h" | 
| 17 #include "net/log/test_net_log.h" | 15 #include "net/log/test_net_log.h" | 
| 18 #include "net/socket/client_socket_factory.h" | 16 #include "net/socket/client_socket_factory.h" | 
| 19 #include "net/socket/stream_socket.h" | 17 #include "net/socket/stream_socket.h" | 
| 20 #include "net/test/embedded_test_server/embedded_test_server_connection_listener
     .h" | 18 #include "net/test/embedded_test_server/embedded_test_server_connection_listener
     .h" | 
| 21 #include "net/test/embedded_test_server/http_request.h" | 19 #include "net/test/embedded_test_server/http_request.h" | 
| 22 #include "net/test/embedded_test_server/http_response.h" | 20 #include "net/test/embedded_test_server/http_response.h" | 
| 23 #include "net/test/embedded_test_server/request_handler_util.h" | 21 #include "net/test/spawned_test_server/base_test_server.h" | 
| 24 #include "net/url_request/url_fetcher.h" | 22 #include "net/url_request/url_fetcher.h" | 
| 25 #include "net/url_request/url_fetcher_delegate.h" | 23 #include "net/url_request/url_fetcher_delegate.h" | 
| 26 #include "net/url_request/url_request.h" |  | 
| 27 #include "net/url_request/url_request_test_util.h" | 24 #include "net/url_request/url_request_test_util.h" | 
| 28 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" | 
| 29 | 26 | 
| 30 #if defined(USE_NSS_CERTS) || defined(OS_IOS) |  | 
| 31 #include "net/cert_net/nss_ocsp.h" |  | 
| 32 #endif |  | 
| 33 |  | 
| 34 namespace net { | 27 namespace net { | 
| 35 namespace test_server { | 28 namespace test_server { | 
| 36 | 29 | 
| 37 namespace { | 30 namespace { | 
| 38 | 31 | 
| 39 // Gets the content from the given URLFetcher. | 32 // Gets the content from the given URLFetcher. | 
| 40 std::string GetContentFromFetcher(const URLFetcher& fetcher) { | 33 std::string GetContentFromFetcher(const URLFetcher& fetcher) { | 
| 41   std::string result; | 34   std::string result; | 
| 42   const bool success = fetcher.GetResponseAsString(&result); | 35   const bool success = fetcher.GetResponseAsString(&result); | 
| 43   EXPECT_TRUE(success); | 36   EXPECT_TRUE(success); | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 101   bool did_read_from_socket_; | 94   bool did_read_from_socket_; | 
| 102 | 95 | 
| 103   base::RunLoop accept_loop_; | 96   base::RunLoop accept_loop_; | 
| 104   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 97   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 
| 105 | 98 | 
| 106   mutable base::Lock lock_; | 99   mutable base::Lock lock_; | 
| 107 | 100 | 
| 108   DISALLOW_COPY_AND_ASSIGN(TestConnectionListener); | 101   DISALLOW_COPY_AND_ASSIGN(TestConnectionListener); | 
| 109 }; | 102 }; | 
| 110 | 103 | 
| 111 class EmbeddedTestServerTest | 104 class EmbeddedTestServerTest: public testing::Test, | 
| 112     : public testing::TestWithParam<EmbeddedTestServer::Type>, | 105                               public URLFetcherDelegate { | 
| 113       public URLFetcherDelegate { |  | 
| 114  public: | 106  public: | 
| 115   EmbeddedTestServerTest() | 107   EmbeddedTestServerTest() | 
| 116       : num_responses_received_(0), | 108       : num_responses_received_(0), | 
| 117         num_responses_expected_(0), | 109         num_responses_expected_(0), | 
| 118         io_thread_("io_thread") { | 110         io_thread_("io_thread") { | 
| 119   } | 111   } | 
| 120 | 112 | 
| 121   void SetUp() override { | 113   void SetUp() override { | 
| 122 #if defined(USE_NSS_CERTS) || defined(OS_IOS) |  | 
| 123     // This is needed so NSS's HTTP client functions are initialized on the |  | 
| 124     // right thread. These tests create SSLClientSockets on a different thread. |  | 
| 125     // TODO(davidben): Initialization can't be deferred to SSLClientSocket. See |  | 
| 126     // https://crbug.com/539520. |  | 
| 127     crypto::EnsureNSSInit(); |  | 
| 128     EnsureNSSHttpIOInit(); |  | 
| 129 #endif |  | 
| 130 |  | 
| 131     base::Thread::Options thread_options; | 114     base::Thread::Options thread_options; | 
| 132     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 115     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 
| 133     ASSERT_TRUE(io_thread_.StartWithOptions(thread_options)); | 116     ASSERT_TRUE(io_thread_.StartWithOptions(thread_options)); | 
| 134 | 117 | 
| 135     request_context_getter_ = | 118     request_context_getter_ = | 
| 136         new TestURLRequestContextGetter(io_thread_.task_runner()); | 119         new TestURLRequestContextGetter(io_thread_.task_runner()); | 
| 137 | 120 | 
| 138     server_.reset(new EmbeddedTestServer(GetParam())); | 121     server_.reset(new EmbeddedTestServer); | 
| 139     server_->SetConnectionListener(&connection_listener_); | 122     server_->SetConnectionListener(&connection_listener_); | 
|  | 123     ASSERT_TRUE(server_->InitializeAndWaitUntilReady()); | 
| 140   } | 124   } | 
| 141 | 125 | 
| 142   void TearDown() override { | 126   void TearDown() override { | 
| 143     if (server_->Started()) | 127     ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete()); | 
| 144       ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete()); |  | 
| 145 #if defined(USE_NSS_CERTS) || defined(OS_IOS) |  | 
| 146     ShutdownNSSHttpIO(); |  | 
| 147 #endif |  | 
| 148   } | 128   } | 
| 149 | 129 | 
| 150   // URLFetcherDelegate override. | 130   // URLFetcherDelegate override. | 
| 151   void OnURLFetchComplete(const URLFetcher* source) override { | 131   void OnURLFetchComplete(const URLFetcher* source) override { | 
| 152     ++num_responses_received_; | 132     ++num_responses_received_; | 
| 153     if (num_responses_received_ == num_responses_expected_) | 133     if (num_responses_received_ == num_responses_expected_) | 
| 154       base::MessageLoop::current()->QuitWhenIdle(); | 134       base::MessageLoop::current()->QuitWhenIdle(); | 
| 155   } | 135   } | 
| 156 | 136 | 
| 157   // Waits until the specified number of responses are received. | 137   // Waits until the specified number of responses are received. | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 186  protected: | 166  protected: | 
| 187   int num_responses_received_; | 167   int num_responses_received_; | 
| 188   int num_responses_expected_; | 168   int num_responses_expected_; | 
| 189   std::string request_relative_url_; | 169   std::string request_relative_url_; | 
| 190   base::Thread io_thread_; | 170   base::Thread io_thread_; | 
| 191   scoped_refptr<TestURLRequestContextGetter> request_context_getter_; | 171   scoped_refptr<TestURLRequestContextGetter> request_context_getter_; | 
| 192   TestConnectionListener connection_listener_; | 172   TestConnectionListener connection_listener_; | 
| 193   scoped_ptr<EmbeddedTestServer> server_; | 173   scoped_ptr<EmbeddedTestServer> server_; | 
| 194 }; | 174 }; | 
| 195 | 175 | 
| 196 TEST_P(EmbeddedTestServerTest, GetBaseURL) { | 176 TEST_F(EmbeddedTestServerTest, GetBaseURL) { | 
| 197   ASSERT_TRUE(server_->Start()); | 177   EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()), | 
| 198   if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) { | 178                                server_->base_url().spec()); | 
| 199     EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/", server_->port()), |  | 
| 200               server_->base_url().spec()); |  | 
| 201   } else { |  | 
| 202     EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()), |  | 
| 203               server_->base_url().spec()); |  | 
| 204   } |  | 
| 205 } | 179 } | 
| 206 | 180 | 
| 207 TEST_P(EmbeddedTestServerTest, GetURL) { | 181 TEST_F(EmbeddedTestServerTest, GetURL) { | 
| 208   ASSERT_TRUE(server_->Start()); | 182   EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/path?query=foo", | 
| 209   if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) { | 183                                server_->port()), | 
| 210     EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/path?query=foo", | 184             server_->GetURL("/path?query=foo").spec()); | 
| 211                                  server_->port()), |  | 
| 212               server_->GetURL("/path?query=foo").spec()); |  | 
| 213   } else { |  | 
| 214     EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/path?query=foo", |  | 
| 215                                  server_->port()), |  | 
| 216               server_->GetURL("/path?query=foo").spec()); |  | 
| 217   } |  | 
| 218 } | 185 } | 
| 219 | 186 | 
| 220 TEST_P(EmbeddedTestServerTest, GetURLWithHostname) { | 187 TEST_F(EmbeddedTestServerTest, GetURLWithHostname) { | 
| 221   ASSERT_TRUE(server_->Start()); | 188   EXPECT_EQ(base::StringPrintf("http://foo.com:%d/path?query=foo", | 
| 222   if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) { | 189                                server_->port()), | 
| 223     EXPECT_EQ(base::StringPrintf("https://foo.com:%d/path?query=foo", | 190             server_->GetURL("foo.com", "/path?query=foo").spec()); | 
| 224                                  server_->port()), |  | 
| 225               server_->GetURL("foo.com", "/path?query=foo").spec()); |  | 
| 226   } else { |  | 
| 227     EXPECT_EQ( |  | 
| 228         base::StringPrintf("http://foo.com:%d/path?query=foo", server_->port()), |  | 
| 229         server_->GetURL("foo.com", "/path?query=foo").spec()); |  | 
| 230   } |  | 
| 231 } | 191 } | 
| 232 | 192 | 
| 233 TEST_P(EmbeddedTestServerTest, RegisterRequestHandler) { | 193 TEST_F(EmbeddedTestServerTest, RegisterRequestHandler) { | 
| 234   server_->RegisterRequestHandler( | 194   server_->RegisterRequestHandler( | 
| 235       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 195       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 236                  base::Unretained(this), | 196                  base::Unretained(this), | 
| 237                  "/test", | 197                  "/test", | 
| 238                  "<b>Worked!</b>", | 198                  "<b>Worked!</b>", | 
| 239                  "text/html", | 199                  "text/html", | 
| 240                  HTTP_OK)); | 200                  HTTP_OK)); | 
| 241   ASSERT_TRUE(server_->Start()); |  | 
| 242 | 201 | 
| 243   scoped_ptr<URLFetcher> fetcher = | 202   scoped_ptr<URLFetcher> fetcher = | 
| 244       URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this); | 203       URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this); | 
| 245   fetcher->SetRequestContext(request_context_getter_.get()); | 204   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 246   fetcher->Start(); | 205   fetcher->Start(); | 
| 247   WaitForResponses(1); | 206   WaitForResponses(1); | 
| 248 | 207 | 
| 249   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 208   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 
| 250   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 209   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 
| 251   EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); | 210   EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); | 
| 252   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 211   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 
| 253 | 212 | 
| 254   EXPECT_EQ("/test?q=foo", request_relative_url_); | 213   EXPECT_EQ("/test?q=foo", request_relative_url_); | 
| 255 } | 214 } | 
| 256 | 215 | 
| 257 TEST_P(EmbeddedTestServerTest, ServeFilesFromDirectory) { | 216 TEST_F(EmbeddedTestServerTest, ServeFilesFromDirectory) { | 
| 258   base::FilePath src_dir; | 217   base::FilePath src_dir; | 
| 259   ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 218   ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 
| 260   server_->ServeFilesFromDirectory( | 219   server_->ServeFilesFromDirectory( | 
| 261       src_dir.AppendASCII("net").AppendASCII("data")); | 220       src_dir.AppendASCII("net").AppendASCII("data")); | 
| 262   ASSERT_TRUE(server_->Start()); |  | 
| 263 | 221 | 
| 264   scoped_ptr<URLFetcher> fetcher = | 222   scoped_ptr<URLFetcher> fetcher = | 
| 265       URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this); | 223       URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this); | 
| 266   fetcher->SetRequestContext(request_context_getter_.get()); | 224   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 267   fetcher->Start(); | 225   fetcher->Start(); | 
| 268   WaitForResponses(1); | 226   WaitForResponses(1); | 
| 269 | 227 | 
| 270   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 228   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 
| 271   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 229   EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); | 
| 272   EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher)); | 230   EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher)); | 
| 273   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 231   EXPECT_EQ("", GetContentTypeFromFetcher(*fetcher)); | 
| 274 } | 232 } | 
| 275 | 233 | 
| 276 TEST_P(EmbeddedTestServerTest, DefaultNotFoundResponse) { | 234 TEST_F(EmbeddedTestServerTest, DefaultNotFoundResponse) { | 
| 277   ASSERT_TRUE(server_->Start()); |  | 
| 278 |  | 
| 279   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 235   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 
| 280       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 236       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 
| 281   fetcher->SetRequestContext(request_context_getter_.get()); | 237   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 282 | 238 | 
| 283   fetcher->Start(); | 239   fetcher->Start(); | 
| 284   WaitForResponses(1); | 240   WaitForResponses(1); | 
| 285   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 241   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 
| 286   EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode()); | 242   EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode()); | 
| 287 } | 243 } | 
| 288 | 244 | 
| 289 TEST_P(EmbeddedTestServerTest, ConnectionListenerAccept) { | 245 TEST_F(EmbeddedTestServerTest, ConnectionListenerAccept) { | 
| 290   ASSERT_TRUE(server_->Start()); |  | 
| 291 |  | 
| 292   TestNetLog net_log; | 246   TestNetLog net_log; | 
| 293   net::AddressList address_list; | 247   net::AddressList address_list; | 
| 294   EXPECT_TRUE(server_->GetAddressList(&address_list)); | 248   EXPECT_TRUE(server_->GetAddressList(&address_list)); | 
| 295 | 249 | 
| 296   scoped_ptr<StreamSocket> socket = | 250   scoped_ptr<StreamSocket> socket = | 
| 297       ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket( | 251       ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket( | 
| 298           address_list, &net_log, NetLog::Source()); | 252           address_list, &net_log, NetLog::Source()); | 
| 299   TestCompletionCallback callback; | 253   TestCompletionCallback callback; | 
| 300   ASSERT_EQ(OK, callback.GetResult(socket->Connect(callback.callback()))); | 254   ASSERT_EQ(OK, callback.GetResult(socket->Connect(callback.callback()))); | 
| 301 | 255 | 
| 302   connection_listener_.WaitUntilFirstConnectionAccepted(); | 256   connection_listener_.WaitUntilFirstConnectionAccepted(); | 
| 303 | 257 | 
| 304   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 258   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 
| 305   EXPECT_FALSE(connection_listener_.DidReadFromSocket()); | 259   EXPECT_FALSE(connection_listener_.DidReadFromSocket()); | 
| 306 } | 260 } | 
| 307 | 261 | 
| 308 TEST_P(EmbeddedTestServerTest, ConnectionListenerRead) { | 262 TEST_F(EmbeddedTestServerTest, ConnectionListenerRead) { | 
| 309   ASSERT_TRUE(server_->Start()); |  | 
| 310 |  | 
| 311   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 263   scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( | 
| 312       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 264       server_->GetURL("/non-existent"), URLFetcher::GET, this); | 
| 313   fetcher->SetRequestContext(request_context_getter_.get()); | 265   fetcher->SetRequestContext(request_context_getter_.get()); | 
| 314 | 266 | 
| 315   fetcher->Start(); | 267   fetcher->Start(); | 
| 316   WaitForResponses(1); | 268   WaitForResponses(1); | 
| 317   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 269   EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); | 
| 318   EXPECT_TRUE(connection_listener_.DidReadFromSocket()); | 270   EXPECT_TRUE(connection_listener_.DidReadFromSocket()); | 
| 319 } | 271 } | 
| 320 | 272 | 
| 321 TEST_P(EmbeddedTestServerTest, ConcurrentFetches) { | 273 TEST_F(EmbeddedTestServerTest, ConcurrentFetches) { | 
| 322   server_->RegisterRequestHandler( | 274   server_->RegisterRequestHandler( | 
| 323       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 275       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 324                  base::Unretained(this), | 276                  base::Unretained(this), | 
| 325                  "/test1", | 277                  "/test1", | 
| 326                  "Raspberry chocolate", | 278                  "Raspberry chocolate", | 
| 327                  "text/html", | 279                  "text/html", | 
| 328                  HTTP_OK)); | 280                  HTTP_OK)); | 
| 329   server_->RegisterRequestHandler( | 281   server_->RegisterRequestHandler( | 
| 330       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 282       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 331                  base::Unretained(this), | 283                  base::Unretained(this), | 
| 332                  "/test2", | 284                  "/test2", | 
| 333                  "Vanilla chocolate", | 285                  "Vanilla chocolate", | 
| 334                  "text/html", | 286                  "text/html", | 
| 335                  HTTP_OK)); | 287                  HTTP_OK)); | 
| 336   server_->RegisterRequestHandler( | 288   server_->RegisterRequestHandler( | 
| 337       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 289       base::Bind(&EmbeddedTestServerTest::HandleRequest, | 
| 338                  base::Unretained(this), | 290                  base::Unretained(this), | 
| 339                  "/test3", | 291                  "/test3", | 
| 340                  "No chocolates", | 292                  "No chocolates", | 
| 341                  "text/plain", | 293                  "text/plain", | 
| 342                  HTTP_NOT_FOUND)); | 294                  HTTP_NOT_FOUND)); | 
| 343   ASSERT_TRUE(server_->Start()); |  | 
| 344 | 295 | 
| 345   scoped_ptr<URLFetcher> fetcher1 = | 296   scoped_ptr<URLFetcher> fetcher1 = | 
| 346       URLFetcher::Create(server_->GetURL("/test1"), URLFetcher::GET, this); | 297       URLFetcher::Create(server_->GetURL("/test1"), URLFetcher::GET, this); | 
| 347   fetcher1->SetRequestContext(request_context_getter_.get()); | 298   fetcher1->SetRequestContext(request_context_getter_.get()); | 
| 348   scoped_ptr<URLFetcher> fetcher2 = | 299   scoped_ptr<URLFetcher> fetcher2 = | 
| 349       URLFetcher::Create(server_->GetURL("/test2"), URLFetcher::GET, this); | 300       URLFetcher::Create(server_->GetURL("/test2"), URLFetcher::GET, this); | 
| 350   fetcher2->SetRequestContext(request_context_getter_.get()); | 301   fetcher2->SetRequestContext(request_context_getter_.get()); | 
| 351   scoped_ptr<URLFetcher> fetcher3 = | 302   scoped_ptr<URLFetcher> fetcher3 = | 
| 352       URLFetcher::Create(server_->GetURL("/test3"), URLFetcher::GET, this); | 303       URLFetcher::Create(server_->GetURL("/test3"), URLFetcher::GET, this); | 
| 353   fetcher3->SetRequestContext(request_context_getter_.get()); | 304   fetcher3->SetRequestContext(request_context_getter_.get()); | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 367   EXPECT_EQ(HTTP_OK, fetcher2->GetResponseCode()); | 318   EXPECT_EQ(HTTP_OK, fetcher2->GetResponseCode()); | 
| 368   EXPECT_EQ("Vanilla chocolate", GetContentFromFetcher(*fetcher2)); | 319   EXPECT_EQ("Vanilla chocolate", GetContentFromFetcher(*fetcher2)); | 
| 369   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); | 320   EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); | 
| 370 | 321 | 
| 371   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher3->GetStatus().status()); | 322   EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher3->GetStatus().status()); | 
| 372   EXPECT_EQ(HTTP_NOT_FOUND, fetcher3->GetResponseCode()); | 323   EXPECT_EQ(HTTP_NOT_FOUND, fetcher3->GetResponseCode()); | 
| 373   EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); | 324   EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); | 
| 374   EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); | 325   EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); | 
| 375 } | 326 } | 
| 376 | 327 | 
| 377 namespace { |  | 
| 378 |  | 
| 379 class CancelRequestDelegate : public TestDelegate { |  | 
| 380  public: |  | 
| 381   CancelRequestDelegate() {} |  | 
| 382   ~CancelRequestDelegate() override {} |  | 
| 383 |  | 
| 384   void OnResponseStarted(URLRequest* request) override { |  | 
| 385     TestDelegate::OnResponseStarted(request); |  | 
| 386     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |  | 
| 387         FROM_HERE, run_loop_.QuitClosure(), base::TimeDelta::FromSeconds(1)); |  | 
| 388   } |  | 
| 389 |  | 
| 390   void WaitUntilDone() { run_loop_.Run(); } |  | 
| 391 |  | 
| 392  private: |  | 
| 393   base::RunLoop run_loop_; |  | 
| 394 |  | 
| 395   DISALLOW_COPY_AND_ASSIGN(CancelRequestDelegate); |  | 
| 396 }; |  | 
| 397 |  | 
| 398 class InfiniteResponse : public BasicHttpResponse { |  | 
| 399  public: |  | 
| 400   InfiniteResponse() : weak_ptr_factory_(this) {} |  | 
| 401 |  | 
| 402   void SendResponse(const SendBytesCallback& send, |  | 
| 403                     const SendCompleteCallback& done) override { |  | 
| 404     send.Run(ToResponseString(), |  | 
| 405              base::Bind(&InfiniteResponse::SendInfinite, |  | 
| 406                         weak_ptr_factory_.GetWeakPtr(), send)); |  | 
| 407   } |  | 
| 408 |  | 
| 409  private: |  | 
| 410   void SendInfinite(const SendBytesCallback& send) { |  | 
| 411     base::ThreadTaskRunnerHandle::Get()->PostTask( |  | 
| 412         FROM_HERE, |  | 
| 413         base::Bind(send, "echo", |  | 
| 414                    base::Bind(&InfiniteResponse::SendInfinite, |  | 
| 415                               weak_ptr_factory_.GetWeakPtr(), send))); |  | 
| 416   } |  | 
| 417 |  | 
| 418   base::WeakPtrFactory<InfiniteResponse> weak_ptr_factory_; |  | 
| 419 |  | 
| 420   DISALLOW_COPY_AND_ASSIGN(InfiniteResponse); |  | 
| 421 }; |  | 
| 422 |  | 
| 423 scoped_ptr<HttpResponse> HandleInfiniteRequest(const HttpRequest& request) { |  | 
| 424   return make_scoped_ptr(new InfiniteResponse); |  | 
| 425 } |  | 
| 426 } |  | 
| 427 |  | 
| 428 // Tests the case the connection is closed while the server is sending a |  | 
| 429 // response.  May non-deterministically end up at one of three paths |  | 
| 430 // (Discover the close event synchronously, asynchronously, or server |  | 
| 431 // shutting down before it is discovered). |  | 
| 432 TEST_P(EmbeddedTestServerTest, CloseDuringWrite) { |  | 
| 433   CancelRequestDelegate cancel_delegate; |  | 
| 434   TestURLRequestContext context; |  | 
| 435   cancel_delegate.set_cancel_in_response_started(true); |  | 
| 436   server_->RegisterRequestHandler(base::Bind( |  | 
| 437       &HandlePrefixedRequest, "/infinite", base::Bind(&HandleInfiniteRequest))); |  | 
| 438   ASSERT_TRUE(server_->Start()); |  | 
| 439 |  | 
| 440   scoped_ptr<URLRequest> request = context.CreateRequest( |  | 
| 441       server_->GetURL("/infinite"), DEFAULT_PRIORITY, &cancel_delegate); |  | 
| 442   request->Start(); |  | 
| 443   cancel_delegate.WaitUntilDone(); |  | 
| 444 } |  | 
| 445 |  | 
| 446 struct CertificateValuesEntry { |  | 
| 447   const EmbeddedTestServer::ServerCertificate server_cert; |  | 
| 448   const bool is_expired; |  | 
| 449   const char* common_name; |  | 
| 450   const char* root; |  | 
| 451 }; |  | 
| 452 |  | 
| 453 const CertificateValuesEntry kCertificateValuesEntry[] = { |  | 
| 454     {EmbeddedTestServer::CERT_OK, false, "127.0.0.1", "Test Root CA"}, |  | 
| 455     {EmbeddedTestServer::CERT_MISMATCHED_NAME, false, "127.0.0.1", |  | 
| 456      "Test Root CA"}, |  | 
| 457     {EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN, false, "localhost", |  | 
| 458      "Test Root CA"}, |  | 
| 459     {EmbeddedTestServer::CERT_EXPIRED, true, "127.0.0.1", "Test Root CA"}, |  | 
| 460     {EmbeddedTestServer::CERT_CHAIN_WRONG_ROOT, false, "127.0.0.1", "B CA"}, |  | 
| 461 #if !defined(OS_WIN) |  | 
| 462     {EmbeddedTestServer::CERT_BAD_VALIDITY, true, "Leaf Certificate", |  | 
| 463      "Test Root CA"}, |  | 
| 464 #endif |  | 
| 465 }; |  | 
| 466 |  | 
| 467 TEST_P(EmbeddedTestServerTest, GetCertificate) { |  | 
| 468   if (GetParam() != EmbeddedTestServer::TYPE_HTTPS) |  | 
| 469     return; |  | 
| 470 |  | 
| 471   for (const auto& certEntry : kCertificateValuesEntry) { |  | 
| 472     server_->SetSSLConfig(certEntry.server_cert); |  | 
| 473     scoped_refptr<X509Certificate> cert = server_->GetCertificate(); |  | 
| 474     DCHECK(cert.get()); |  | 
| 475     EXPECT_EQ(cert->HasExpired(), certEntry.is_expired); |  | 
| 476     EXPECT_EQ(cert->subject().common_name, certEntry.common_name); |  | 
| 477     EXPECT_EQ(cert->issuer().common_name, certEntry.root); |  | 
| 478   } |  | 
| 479 } |  | 
| 480 |  | 
| 481 INSTANTIATE_TEST_CASE_P(EmbeddedTestServerTestInstantiation, |  | 
| 482                         EmbeddedTestServerTest, |  | 
| 483                         testing::Values(EmbeddedTestServer::TYPE_HTTP, |  | 
| 484                                         EmbeddedTestServer::TYPE_HTTPS)); |  | 
| 485 |  | 
| 486 // Below test exercises EmbeddedTestServer's ability to cope with the situation | 328 // Below test exercises EmbeddedTestServer's ability to cope with the situation | 
| 487 // where there is no MessageLoop available on the thread at EmbeddedTestServer | 329 // where there is no MessageLoop available on the thread at EmbeddedTestServer | 
| 488 // initialization and/or destruction. | 330 // initialization and/or destruction. | 
| 489 | 331 | 
| 490 typedef std::tr1::tuple<bool, bool, EmbeddedTestServer::Type> | 332 typedef std::tr1::tuple<bool, bool> ThreadingTestParams; | 
| 491     ThreadingTestParams; |  | 
| 492 | 333 | 
| 493 class EmbeddedTestServerThreadingTest | 334 class EmbeddedTestServerThreadingTest | 
| 494     : public testing::TestWithParam<ThreadingTestParams> { | 335     : public testing::TestWithParam<ThreadingTestParams> {}; | 
| 495   void SetUp() override { |  | 
| 496 #if defined(USE_NSS_CERTS) || defined(OS_IOS) |  | 
| 497     // This is needed so NSS's HTTP client functions are initialized on the |  | 
| 498     // right thread. These tests create SSLClientSockets on a different thread. |  | 
| 499     // TODO(davidben): Initialization can't be deferred to SSLClientSocket. See |  | 
| 500     // https://crbug.com/539520. |  | 
| 501     crypto::EnsureNSSInit(); |  | 
| 502     EnsureNSSHttpIOInit(); |  | 
| 503 #endif |  | 
| 504   } |  | 
| 505 |  | 
| 506   void TearDown() override { |  | 
| 507 #if defined(USE_NSS_CERTS) || defined(OS_IOS) |  | 
| 508     ShutdownNSSHttpIO(); |  | 
| 509 #endif |  | 
| 510   } |  | 
| 511 }; |  | 
| 512 | 336 | 
| 513 class EmbeddedTestServerThreadingTestDelegate | 337 class EmbeddedTestServerThreadingTestDelegate | 
| 514     : public base::PlatformThread::Delegate, | 338     : public base::PlatformThread::Delegate, | 
| 515       public URLFetcherDelegate { | 339       public URLFetcherDelegate { | 
| 516  public: | 340  public: | 
| 517   EmbeddedTestServerThreadingTestDelegate( | 341   EmbeddedTestServerThreadingTestDelegate( | 
| 518       bool message_loop_present_on_initialize, | 342       bool message_loop_present_on_initialize, | 
| 519       bool message_loop_present_on_shutdown, | 343       bool message_loop_present_on_shutdown) | 
| 520       EmbeddedTestServer::Type type) |  | 
| 521       : message_loop_present_on_initialize_(message_loop_present_on_initialize), | 344       : message_loop_present_on_initialize_(message_loop_present_on_initialize), | 
| 522         message_loop_present_on_shutdown_(message_loop_present_on_shutdown), | 345         message_loop_present_on_shutdown_(message_loop_present_on_shutdown) {} | 
| 523         type_(type) {} |  | 
| 524 | 346 | 
| 525   // base::PlatformThread::Delegate: | 347   // base::PlatformThread::Delegate: | 
| 526   void ThreadMain() override { | 348   void ThreadMain() override { | 
| 527     scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner; | 349     scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner; | 
| 528     base::Thread io_thread("io_thread"); | 350     base::Thread io_thread("io_thread"); | 
| 529     base::Thread::Options thread_options; | 351     base::Thread::Options thread_options; | 
| 530     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 352     thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 
| 531     ASSERT_TRUE(io_thread.StartWithOptions(thread_options)); | 353     ASSERT_TRUE(io_thread.StartWithOptions(thread_options)); | 
| 532     io_thread_runner = io_thread.task_runner(); | 354     io_thread_runner = io_thread.task_runner(); | 
| 533 | 355 | 
| 534     scoped_ptr<base::MessageLoop> loop; | 356     scoped_ptr<base::MessageLoop> loop; | 
| 535     if (message_loop_present_on_initialize_) | 357     if (message_loop_present_on_initialize_) | 
| 536       loop.reset(new base::MessageLoopForIO); | 358       loop.reset(new base::MessageLoopForIO); | 
| 537 | 359 | 
| 538     // Create the test server instance. | 360     // Create the test server instance. | 
| 539     EmbeddedTestServer server(type_); | 361     EmbeddedTestServer server; | 
| 540     base::FilePath src_dir; | 362     base::FilePath src_dir; | 
| 541     ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 363     ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 
| 542     ASSERT_TRUE(server.Start()); | 364     ASSERT_TRUE(server.InitializeAndWaitUntilReady()); | 
| 543 | 365 | 
| 544     // Make a request and wait for the reply. | 366     // Make a request and wait for the reply. | 
| 545     if (!loop) | 367     if (!loop) | 
| 546       loop.reset(new base::MessageLoopForIO); | 368       loop.reset(new base::MessageLoopForIO); | 
| 547 | 369 | 
| 548     scoped_ptr<URLFetcher> fetcher = | 370     scoped_ptr<URLFetcher> fetcher = | 
| 549         URLFetcher::Create(server.GetURL("/test?q=foo"), URLFetcher::GET, this); | 371         URLFetcher::Create(server.GetURL("/test?q=foo"), URLFetcher::GET, this); | 
| 550     fetcher->SetRequestContext( | 372     fetcher->SetRequestContext( | 
| 551         new TestURLRequestContextGetter(loop->task_runner())); | 373         new TestURLRequestContextGetter(loop->task_runner())); | 
| 552     fetcher->Start(); | 374     fetcher->Start(); | 
| 553     loop->Run(); | 375     loop->Run(); | 
| 554     fetcher.reset(); | 376     fetcher.reset(); | 
| 555 | 377 | 
| 556     // Shut down. | 378     // Shut down. | 
| 557     if (message_loop_present_on_shutdown_) | 379     if (message_loop_present_on_shutdown_) | 
| 558       loop.reset(); | 380       loop.reset(); | 
| 559 | 381 | 
| 560     ASSERT_TRUE(server.ShutdownAndWaitUntilComplete()); | 382     ASSERT_TRUE(server.ShutdownAndWaitUntilComplete()); | 
| 561   } | 383   } | 
| 562 | 384 | 
| 563   // URLFetcherDelegate override. | 385   // URLFetcherDelegate override. | 
| 564   void OnURLFetchComplete(const URLFetcher* source) override { | 386   void OnURLFetchComplete(const URLFetcher* source) override { | 
| 565     base::MessageLoop::current()->QuitWhenIdle(); | 387     base::MessageLoop::current()->QuitWhenIdle(); | 
| 566   } | 388   } | 
| 567 | 389 | 
| 568  private: | 390  private: | 
| 569   const bool message_loop_present_on_initialize_; | 391   bool message_loop_present_on_initialize_; | 
| 570   const bool message_loop_present_on_shutdown_; | 392   bool message_loop_present_on_shutdown_; | 
| 571   const EmbeddedTestServer::Type type_; |  | 
| 572 | 393 | 
| 573   DISALLOW_COPY_AND_ASSIGN(EmbeddedTestServerThreadingTestDelegate); | 394   DISALLOW_COPY_AND_ASSIGN(EmbeddedTestServerThreadingTestDelegate); | 
| 574 }; | 395 }; | 
| 575 | 396 | 
| 576 TEST_P(EmbeddedTestServerThreadingTest, RunTest) { | 397 TEST_P(EmbeddedTestServerThreadingTest, RunTest) { | 
| 577   // The actual test runs on a separate thread so it can screw with the presence | 398   // The actual test runs on a separate thread so it can screw with the presence | 
| 578   // of a MessageLoop - the test suite already sets up a MessageLoop for the | 399   // of a MessageLoop - the test suite already sets up a MessageLoop for the | 
| 579   // main test thread. | 400   // main test thread. | 
| 580   base::PlatformThreadHandle thread_handle; | 401   base::PlatformThreadHandle thread_handle; | 
| 581   EmbeddedTestServerThreadingTestDelegate delegate( | 402   EmbeddedTestServerThreadingTestDelegate delegate( | 
| 582       std::tr1::get<0>(GetParam()), std::tr1::get<1>(GetParam()), | 403       std::tr1::get<0>(GetParam()), | 
| 583       std::tr1::get<2>(GetParam())); | 404       std::tr1::get<1>(GetParam())); | 
| 584   ASSERT_TRUE(base::PlatformThread::Create(0, &delegate, &thread_handle)); | 405   ASSERT_TRUE(base::PlatformThread::Create(0, &delegate, &thread_handle)); | 
| 585   base::PlatformThread::Join(thread_handle); | 406   base::PlatformThread::Join(thread_handle); | 
| 586 } | 407 } | 
| 587 | 408 | 
| 588 INSTANTIATE_TEST_CASE_P( | 409 INSTANTIATE_TEST_CASE_P(EmbeddedTestServerThreadingTestInstantiation, | 
| 589     EmbeddedTestServerThreadingTestInstantiation, | 410                         EmbeddedTestServerThreadingTest, | 
| 590     EmbeddedTestServerThreadingTest, | 411                         testing::Combine(testing::Bool(), testing::Bool())); | 
| 591     testing::Combine(testing::Bool(), |  | 
| 592                      testing::Bool(), |  | 
| 593                      testing::Values(EmbeddedTestServer::TYPE_HTTP, |  | 
| 594                                      EmbeddedTestServer::TYPE_HTTPS))); |  | 
| 595 | 412 | 
| 596 }  // namespace test_server | 413 }  // namespace test_server | 
| 597 }  // namespace net | 414 }  // namespace net | 
| OLD | NEW | 
|---|