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

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

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

Powered by Google App Engine
This is Rietveld 408576698