Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(419)

Side by Side Diff: net/test/embedded_test_server/embedded_test_server_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698