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