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

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: Fixing RunLoop and check. 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/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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698