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